System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact ec6209c4858d071696f9866eca8da5ed767fcd8a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 33 20   where.c,v 1.23 
0340: 32 30 30 36 2f 30 36 2f 30 38 20 30 34 3a 31 39  2006/06/08 04:19
0350: 3a 35 33 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78  :53 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: 32 35 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  25;.        }els
8ad0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
8ae0: 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st!=0 ){.       
8af0: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
8b00: 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  *= pExpr->pList-
8b10: 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20 20  >nExpr + 1;.    
8b20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8b30: 20 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20 70    }.    cost = p
8b40: 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
8b50: 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65  i] * inMultiplie
8b60: 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c  r * estLog(inMul
8b70: 74 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45  tiplier);.    nE
8b80: 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20 70  q = i;.    if( p
8b90: 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Probe->onError!=
8ba0: 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67  OE_None && (flag
8bb0: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
8bc0: 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  _IN)==0.        
8bd0: 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d   && nEq==pProbe-
8be0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
8bf0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8c00: 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
8c10: 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e     TRACE((".....
8c20: 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d  . nEq=%d inMult=
8c30: 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e  %.9g cost=%.9g\n
8c40: 22 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70  ", nEq, inMultip
8c50: 6c 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20  lier, cost));.. 
8c60: 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
8c70: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
8c80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8c90: 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  nEq<pProbe->nCol
8ca0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  umn ){.      int
8cb0: 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
8cc0: 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
8cd0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
8ce0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
8cf0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
8d00: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
8d10: 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20  GE, pProbe);.   
8d20: 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a     if( pTerm ){.
8d30: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8d40: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
8d50: 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NGE;.        if(
8d60: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
8d70: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
8d80: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70  , WO_LT|WO_LE, p
8d90: 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20  Probe) ){.      
8da0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
8db0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
8dc0: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
8dd0: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
8de0: 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
8df0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
8e00: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
8e10: 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29  WO_GE, pProbe) )
8e20: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
8e30: 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c  s |= WHERE_BTM_L
8e40: 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
8e50: 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20  cost /= 3;.     
8e60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
8e70: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
8e80: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
8e90: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
8ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8eb0: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
8ec0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74   additional cost
8ed0: 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74   of sorting if t
8ee0: 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e  hat is a factor.
8ef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8f00: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
8f10: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57    if( (flags & W
8f20: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
8f30: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
8f40: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
8f50: 70 50 61 72 73 65 2c 70 50 72 6f 62 65 2c 69 43  pParse,pProbe,iC
8f60: 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c  ur,pOrderBy,nEq,
8f70: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  &rev) ){.       
8f80: 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b   if( flags==0 ){
8f90: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
8fa0: 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
8fb0: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d  RANGE;.        }
8fc0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
8fd0: 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b  = WHERE_ORDERBY;
8fe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76  .        if( rev
8ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
9000: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
9010: 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERSE;.        }.
9020: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9030: 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
9040: 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
9050: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
9060: 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69  ...... orderby i
9070: 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f  ncreases cost to
9080: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
9090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
90a0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
90b0: 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67   see if we can g
90c0: 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69  et away with usi
90d0: 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65  ng just the inde
90e0: 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  x without.    **
90f0: 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68   ever reading th
9100: 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61  e table.  If tha
9110: 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
9120: 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20  hen halve the.  
9130: 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69    ** cost of thi
9140: 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  s index..    */.
9150: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26      if( flags &&
9160: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c   pSrc->colUsed <
9170: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
9180: 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20  (BMS-1)) ){.    
9190: 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
91a0: 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
91b0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
91c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62  for(j=0; j<pProb
91d0: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  e->nColumn; j++)
91e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
91f0: 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
9200: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
9210: 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
9220: 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
9230: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
9240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9250: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
9260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  0 ){.        fla
9270: 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
9280: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f  ONLY;.        co
9290: 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20  st /= 2;.       
92a0: 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20   TRACE(("...... 
92b0: 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73  idx-only reduces
92c0: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
92d0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
92e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
92f0: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  If this index ha
9300: 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c  s achieved the l
9310: 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61  owest cost so fa
9320: 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a  r, then use it..
9330: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
9340: 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74  ost < lowestCost
9350: 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64   ){.      bestId
9360: 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
9370: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
9380: 6f 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ost;.      asser
9390: 74 28 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20  t( flags!=0 );. 
93a0: 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
93b0: 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65   flags;.      be
93c0: 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
93d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
93e0: 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
93f0: 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e  ult.  */.  *ppIn
9400: 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20  dex = bestIdx;. 
9410: 20 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e   TRACE(("best in
9420: 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
9430: 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20  %.9g, flags=%x, 
9440: 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
9450: 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73     bestIdx ? bes
9460: 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28  tIdx->zName : "(
9470: 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f  none)", lowestCo
9480: 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62  st, bestFlags, b
9490: 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c  estNEq));.  *pFl
94a0: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
94b0: 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e  .  *pnEq = bestN
94c0: 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77  Eq;.  return low
94d0: 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  estCost;.}.../*.
94e0: 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
94f0: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
9500: 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
9510: 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
9520: 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
9530: 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
9540: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
9550: 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
9560: 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
9570: 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
9580: 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
9590: 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
95a0: 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
95b0: 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
95c0: 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
95d0: 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
95e0: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
95f0: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
9600: 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
9610: 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
9620: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
9630: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
9640: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
9650: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
9660: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9670: 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
9680: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
9690: 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
96a0: 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
96b0: 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
96c0: 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
96d0: 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
96e0: 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
96f0: 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
9700: 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
9710: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
9720: 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
9730: 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
9740: 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
9750: 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
9760: 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
9770: 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
9780: 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
9790: 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
97a0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
97b0: 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
97c0: 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
97d0: 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
97e0: 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
97f0: 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
9800: 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
9810: 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
9820: 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
9830: 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
9840: 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
9850: 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
9860: 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
9870: 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
9880: 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
9890: 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
98a0: 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
98b0: 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
98c0: 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
98d0: 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
98e0: 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
98f0: 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
9900: 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
9910: 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
9920: 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
9930: 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
9940: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
9950: 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
9960: 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
9970: 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
9980: 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
9990: 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  && (pTerm->flags
99a0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
99b0: 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
99c0: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
99d0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
99e0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
99f0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
9a00: 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
9a10: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
9a20: 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
9a30: 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
9a40: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
9a50: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
9a60: 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
9a70: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
9a80: 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
9a90: 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
9aa0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
9ab0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
9ac0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
9ad0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
9ae0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
9af0: 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65  t builds a probe
9b00: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20 20   for an index.  
9b10: 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20  Details:.**.**  
9b20: 20 20 2a 20 20 43 68 65 63 6b 20 74 68 65 20 74    *  Check the t
9b30: 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69  op nColumn entri
9b40: 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  es on the stack.
9b50: 20 20 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20    If any.**     
9b60: 20 20 6f 66 20 74 68 6f 73 65 20 65 6e 74 72 69    of those entri
9b70: 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d  es are NULL, jum
9b80: 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
9b90: 20 62 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77   brk,.**       w
9ba0: 68 69 63 68 20 69 73 20 74 68 65 20 6c 6f 6f 70  hich is the loop
9bb0: 20 65 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20   exit, since no 
9bc0: 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c  index entry will
9bd0: 20 6d 61 74 63 68 0a 2a 2a 20 20 20 20 20 20 20   match.**       
9be0: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
9bf0: 68 65 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 20  he key is NULL. 
9c00: 50 6f 70 20 28 6e 43 6f 6c 75 6d 6e 2b 6e 45 78  Pop (nColumn+nEx
9c10: 74 72 61 29 20 0a 2a 2a 20 20 20 20 20 20 20 65  tra) .**       e
9c20: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  lements from the
9c30: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20   stack..**.**   
9c40: 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20   *  Construct a 
9c50: 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d  probe entry from
9c60: 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e   the top nColumn
9c70: 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20   entries in.**  
9c80: 20 20 20 20 20 74 68 65 20 73 74 61 63 6b 20 77       the stack w
9c90: 69 74 68 20 61 66 66 69 6e 69 74 69 65 73 20 61  ith affinities a
9ca0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
9cb0: 6e 64 65 78 20 70 49 64 78 2e 20 0a 2a 2a 20 20  ndex pIdx. .**  
9cc0: 20 20 20 20 20 4f 6e 6c 79 20 6e 43 6f 6c 75 6d       Only nColum
9cd0: 6e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 70  n elements are p
9ce0: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73  opped from the s
9cf0: 74 61 63 6b 20 69 6e 20 74 68 69 73 20 63 61 73  tack in this cas
9d00: 65 0a 2a 2a 20 20 20 20 20 20 20 28 62 79 20 4f  e.**       (by O
9d10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 29 2e 0a 2a  P_MakeRecord)..*
9d20: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
9d30: 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
9d40: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 0a 20 20  (.  Vdbe *v, .  
9d50: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20  int nColumn, .  
9d60: 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69  int nExtra, .  i
9d70: 6e 74 20 62 72 6b 2c 20 0a 20 20 49 6e 64 65 78  nt brk, .  Index
9d80: 20 2a 70 49 64 78 0a 29 7b 0a 20 20 73 71 6c 69   *pIdx.){.  sqli
9d90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9da0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f  OP_NotNull, -nCo
9db0: 6c 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62  lumn, sqlite3Vdb
9dc0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
9dd0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
9de0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
9df0: 2c 20 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61  , nColumn+nExtra
9e00: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
9e10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
9e20: 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20  oto, 0, brk);.  
9e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9e40: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9e50: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
9e60: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
9e70: 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
9e80: 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  x);.}.../*.** Ge
9e90: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
9ea0: 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
9eb0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
9ec0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
9ed0: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
9ee0: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
9ef0: 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
9f00: 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
9f10: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
9f20: 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
9f30: 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
9f40: 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
9f50: 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  aint is left on 
9f60: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
9f70: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
9f80: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
9f90: 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
9fa0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9fb0: 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
9fc0: 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
9fd0: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
9fe0: 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
9ff0: 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
a000: 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
a010: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
a020: 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
a030: 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
a040: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
a050: 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   X..*/.static vo
a060: 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  id codeEqualityT
a070: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
a080: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
a090: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
a0a0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
a0b0: 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
a0c0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
a0d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
a0e0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
a0f0: 62 72 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  brk,            
a100: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
a110: 61 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f 70  abandon the loop
a120: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
a130: 20 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65   *pLevel  /* Whe
a140: 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  n level of the F
a150: 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
a160: 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
a170: 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
a180: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
a190: 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49  if( pX->op!=TK_I
a1a0: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
a1b0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
a1c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
a1d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
a1e0: 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69 66 6e 64  ->pRight);.#ifnd
a1f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
a200: 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
a210: 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
a220: 20 20 20 69 6e 74 20 2a 61 49 6e 3b 0a 20 20 20     int *aIn;.   
a230: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a240: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20 73  e->pVdbe;..    s
a250: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
a260: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b  ect(pParse, pX);
a270: 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
a280: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
a290: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a2a0: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
a2b0: 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d   0);.    VdbeCom
a2c0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 2e 2a 73  ment((v, "# %.*s
a2d0: 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70  ", pX->span.n, p
a2e0: 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20  X->span.z));.   
a2f0: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a   pLevel->nIn++;.
a300: 20 20 20 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f      sqliteReallo
a310: 63 4f 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29  cOrFree((void**)
a320: 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  &pLevel->aInLoop
a330: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
a360: 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 32 2a  ->aInLoop[0])*2*
a370: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20  pLevel->nIn);.  
a380: 20 20 61 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    aIn = pLevel->
a390: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
a3a0: 20 61 49 6e 20 29 7b 0a 20 20 20 20 20 20 61 49   aIn ){.      aI
a3b0: 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  n += pLevel->nIn
a3c0: 2a 32 20 2d 20 32 3b 0a 20 20 20 20 20 20 61 49  *2 - 2;.      aI
a3d0: 6e 5b 30 5d 20 3d 20 69 54 61 62 3b 0a 20 20 20  n[0] = iTab;.   
a3e0: 20 20 20 61 49 6e 5b 31 5d 20 3d 20 73 71 6c 69     aIn[1] = sqli
a3f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a400: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
a410: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
a420: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49        pLevel->nI
a430: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
a440: 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
a450: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
a460: 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  erm);.}../*.** G
a470: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
a480: 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
a490: 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
a4a0: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
a4b0: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20  .** index.  The 
a4c0: 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63  values for all c
a4d0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c  onstraints are l
a4e0: 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
a4f0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
a500: 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
a510: 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
a520: 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
a530: 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
a540: 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
a550: 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
a560: 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
a570: 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
a580: 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
a590: 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
a5a0: 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
a5b0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
a5c0: 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
a5d0: 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
a5e0: 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
a5f0: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
a600: 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
a610: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
a620: 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
a630: 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
a640: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
a650: 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
a660: 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
a670: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
a680: 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
a690: 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74   be left.** on t
a6a0: 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20  he stack - a is 
a6b0: 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64 20  the deepest and 
a6c0: 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74  b the shallowest
a6d0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
a6e0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
a6f0: 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
a700: 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
a710: 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
a720: 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
a730: 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
a740: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a750: 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
a760: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
a770: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
a780: 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
a790: 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
a7a0: 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ell..**.** This 
a7b0: 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
a7c0: 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
a7d0: 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
a7e0: 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68  l and puts.** th
a7f0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 61  e address of tha
a800: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
a810: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20   pLevel->iMem.  
a820: 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
a830: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
a840: 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65  ine will use pLe
a850: 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f  vel->iMem to sto
a860: 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
a870: 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
a880: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
a890: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
a8a0: 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
a8b0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
a8c0: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
a8d0: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
a8e0: 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
a8f0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
a900: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
a910: 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  oid codeAllEqual
a920: 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
a930: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a940: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a950: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
a960: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
a970: 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
a980: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
a990: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
a9a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a9b0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
a9c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
a9d0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
a9e0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
a9f0: 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
aa00: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
aa10: 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
aa20: 20 62 72 6b 20 20 20 20 20 20 20 20 20 20 20 20   brk            
aa30: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
aa40: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
aa50: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20  */.){.  int nEq 
aa60: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20  = pLevel->nEq;  
aa70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
aa80: 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
aa90: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
aaa0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72  ode */.  int ter
aab0: 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20  msInMem = 0;    
aac0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
aad0: 65 2c 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69  e, store value i
aae0: 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f  n mem[] cells */
aaf0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ab00: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
ab10: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
ab20: 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
ab30: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
ab40: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
ab50: 65 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a  evel->pIdx;   /*
ab60: 20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   The index being
ab70: 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c   used for this l
ab80: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  oop */.  int iCu
ab90: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  r = pLevel->iTab
aba0: 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  Cur;   /* The cu
abb0: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
abc0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
abd0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
abe0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
abf0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
ac00: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ac30: 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ter */..  /* Fig
ac40: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
ac50: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
ac60: 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
ac70: 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
ac80: 20 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65   ** We always ne
ac90: 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ed at least one 
aca0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
acb0: 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f  e loop terminato
acc0: 72 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49  r.  ** value.  I
acd0: 66 20 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f  f there are IN o
ace0: 70 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e  perators we'll n
acf0: 65 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68  eed one for each
ad00: 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63   == or.  ** IN c
ad10: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a  onstraint..  */.
ad20: 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
ad30: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
ad40: 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  .  if( pLevel->f
ad50: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
ad60: 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50  UMN_IN ){.    pP
ad70: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c  arse->nMem += pL
ad80: 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74  evel->nEq;.    t
ad90: 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20  ermsInMem = 1;. 
ada0: 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
adb0: 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
adc0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
add0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
ade0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
adf0: 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  {.    int k = pI
ae00: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
ae10: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
ae20: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
ae30: 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   k, notReady, WO
ae40: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 49 64 78 29  _EQ|WO_IN, pIdx)
ae50: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d  ;.    if( pTerm=
ae60: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ae70: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
ae80: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
ae90: 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f  ED)==0 );.    co
aea0: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
aeb0: 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72  Parse, pTerm, br
aec0: 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  k, pLevel);.    
aed0: 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29  if( termsInMem )
aee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
aef0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
af00: 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
af10: 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20  >iMem+j+1, 1);. 
af20: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
af30: 74 28 20 6a 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20  t( j==nEq );..  
af40: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
af50: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
af60: 76 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68  values are on th
af70: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
af80: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65  ck.  */.  if( te
af90: 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  rmsInMem ){.    
afa0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
afb0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
afc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
afd0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
afe0: 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29  el->iMem+j+1, 0)
aff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
b000: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b010: 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
b020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
b030: 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
b040: 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
b050: 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
b060: 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
b070: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
b080: 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
b090: 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
b0a0: 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
b0b0: 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
b0c0: 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
b0d0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
b0e0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
b0f0: 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
b100: 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
b110: 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
b120: 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
b130: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
b140: 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
b150: 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b170: 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
b180: 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
b190: 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
b1a0: 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a 2f  ITE_TEST */..../
b1b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
b1c0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
b1d0: 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
b1e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
b1f0: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
b200: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
b210: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
b220: 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
b230: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
b240: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
b250: 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
b260: 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
b270: 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
b280: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
b290: 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
b2a0: 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
b2b0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
b2c0: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
b2d0: 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
b2e0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
b2f0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
b300: 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
b310: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b320: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
b330: 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
b340: 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
b350: 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
b360: 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
b370: 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
b380: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
b390: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
b3a0: 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
b3b0: 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
b3c0: 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
b3d0: 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
b3e0: 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
b3f0: 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
b400: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
b410: 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
b420: 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
b430: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
b440: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
b450: 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
b460: 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
b470: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
b480: 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
b490: 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
b4a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
b4b0: 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
b4c0: 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
b4d0: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
b4e0: 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
b4f0: 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
b500: 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
b510: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
b520: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
b530: 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
b540: 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
b550: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
b560: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
b570: 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
b580: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
b590: 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
b5c0: 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
b5d0: 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
b600: 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
b610: 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
b620: 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
b630: 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
b640: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
b650: 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
b660: 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
b670: 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
b680: 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
b690: 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
b6a0: 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
b6b0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
b6c0: 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
b6d0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
b6e0: 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
b6f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
b700: 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
b710: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
b720: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
b730: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
b740: 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
b750: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
b760: 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
b770: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
b780: 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
b790: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
b7a0: 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
b7b0: 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
b7c0: 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
b7d0: 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
b7e0: 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
b7f0: 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
b800: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
b810: 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
b820: 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
b830: 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
b840: 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
b850: 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
b860: 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
b870: 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
b880: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
b890: 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
b8a0: 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
b8b0: 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
b8c0: 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
b8d0: 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
b8e0: 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
b8f0: 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
b900: 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
b910: 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
b920: 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
b930: 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
b940: 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
b950: 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
b960: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
b970: 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
b980: 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
b990: 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
b9a0: 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
b9b0: 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
b9c0: 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
b9d0: 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
b9e0: 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
b9f0: 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
ba00: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
ba10: 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
ba20: 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
ba30: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
ba40: 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
ba50: 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
ba60: 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
ba70: 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
ba80: 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
ba90: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
baa0: 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
bab0: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
bac0: 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
bad0: 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
bae0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
baf0: 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
bb00: 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
bb10: 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
bb20: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
bb30: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
bb40: 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
bb50: 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
bb60: 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
bb70: 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
bb80: 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
bb90: 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
bba0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
bbb0: 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
bbc0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
bbd0: 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
bbe0: 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
bbf0: 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
bc00: 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
bc10: 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
bc20: 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
bc30: 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
bc40: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
bc50: 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
bc60: 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
bc70: 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
bc80: 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
bc90: 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
bca0: 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
bcb0: 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
bcc0: 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
bcd0: 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
bce0: 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
bcf0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
bd00: 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
bd10: 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
bd20: 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
bd30: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
bd40: 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
bd50: 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
bd60: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
bd70: 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
bd80: 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
bd90: 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
bda0: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
bdb0: 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
bdc0: 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
bdd0: 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
bde0: 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
bdf0: 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
be00: 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
be10: 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
be20: 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
be30: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
be40: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
be50: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
be60: 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
be70: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
be80: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
be90: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
bea0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
beb0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
bec0: 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
bed0: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
bee0: 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69  then ppOrderBy i
bef0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
bf00: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
bf10: 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68   used so that th
bf20: 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74  e natural output
bf30: 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61   order of the ta
bf40: 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63  ble.** scan is c
bf50: 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f  orrect for the O
bf60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
bf70: 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20  then that index 
bf80: 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a  is used and.** *
bf90: 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74  ppOrderBy is set
bfa0: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20   to NULL.  This 
bfb0: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
bfc0: 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
bfd0: 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61   an.** unnecessa
bfe0: 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
bff0: 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20  esult set if an 
c000: 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
c010: 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44  e for the.** ORD
c020: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
c030: 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
c040: 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
c050: 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
c060: 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
c070: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
c080: 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
c090: 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
c0a0: 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75   *ppOrderBy is u
c0b0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65  nchanged..*/.Whe
c0c0: 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
c0d0: 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
c0e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c0f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
c100: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
c110: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
c120: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
c130: 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
c140: 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
c150: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
c160: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
c170: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
c180: 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72  prList **ppOrder
c190: 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  By  /* An ORDER 
c1a0: 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
c1b0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  LL */.){.  int i
c1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c1d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c1e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65  unter */.  Where
c1f0: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
c200: 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65        /* Will be
c210: 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20  come the return 
c220: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
c230: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65  nction */.  Vdbe
c240: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c250: 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  dbe;   /* The vi
c260: 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65  rtual database e
c270: 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62  ngine */.  int b
c280: 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20  rk, cont = 0;   
c290: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
c2a0: 65 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 63  es used during c
c2b0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ode generation *
c2c0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
c2d0: 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
c2e0: 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
c2f0: 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
c300: 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
c310: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
c320: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
c330: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  e term in the WH
c340: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
c350: 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b  ExprMaskSet mask
c360: 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Set;       /* Th
c370: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
c380: 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
c390: 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20  Clause wc;      
c3a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
c3b0: 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76  RE clause is div
c3c0: 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20  ided into these 
c3d0: 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
c3e0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
c3f0: 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
c400: 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
c410: 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
c420: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
c430: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
c440: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
c450: 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
c460: 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
c470: 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
c480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c490: 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
c4a0: 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
c4b0: 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c4d0: 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
c4e0: 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b  ion of all wc.a[
c4f0: 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a  ].flags */..  /*
c500: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
c510: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
c520: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
c530: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
c540: 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
c550: 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
c560: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
c570: 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
c580: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c590: 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
c5a0: 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
c5b0: 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
c5c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c5d0: 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65  ..  /* Split the
c5e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
c5f0: 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65  to separate sube
c600: 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65  xpressions where
c610: 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78   each.  ** subex
c620: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
c630: 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20  rated by an AND 
c640: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
c650: 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61   initMaskSet(&ma
c660: 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43  skSet);.  whereC
c670: 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70  lauseInit(&wc, p
c680: 50 61 72 73 65 29 3b 0a 20 20 77 68 65 72 65 53  Parse);.  whereS
c690: 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65  plit(&wc, pWhere
c6a0: 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
c6b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
c6c0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
c6d0: 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
c6e0: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
c6f0: 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
c700: 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a  eturn value..  *
c710: 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
c720: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
c730: 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70  f(WhereInfo) + p
c740: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69  TabList->nSrc*si
c750: 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
c760: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
c770: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
c780: 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
c790: 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a  BeginNoMem;.  }.
c7a0: 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
c7b0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
c7c0: 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
c7d0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
c7e0: 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
c7f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c800: 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  l(v);..  /* Spec
c810: 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
c820: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
c830: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
c840: 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
c850: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
c860: 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
c870: 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
c880: 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
c890: 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
c8a0: 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
c8b0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
c8c0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 57 68  prIsConstant(pWh
c8d0: 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ere)) ){.    sql
c8e0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
c8f0: 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20  pParse, pWhere, 
c900: 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
c910: 31 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  1);.    pWhere =
c920: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e   0;.  }..  /* An
c930: 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
c940: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
c950: 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
c960: 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
c970: 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
c980: 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
c990: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
c9a0: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
c9b0: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
c9c0: 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
c9d0: 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
c9e0: 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
c9f0: 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
ca00: 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
ca10: 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
ca20: 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
ca30: 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
ca40: 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
ca50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
ca60: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
ca70: 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73  ){.    createMas
ca80: 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
ca90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
caa0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41  or);.  }.  exprA
cab0: 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69  nalyzeAll(pTabLi
cac0: 73 74 2c 20 26 6d 61 73 6b 53 65 74 2c 20 26 77  st, &maskSet, &w
cad0: 63 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  c);.  if( sqlite
cae0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
caf0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  ){.    goto wher
cb00: 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d  eBeginNoMem;.  }
cb10: 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65  ..  /* Chose the
cb20: 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75   best index to u
cb30: 73 65 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  se for each tabl
cb40: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
cb50: 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
cb60: 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20  This loop fills 
cb70: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
cb80: 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20   fields:.  **.  
cb90: 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
cba0: 2e 70 49 64 78 20 20 20 20 20 20 54 68 65 20 69  .pIdx      The i
cbb0: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
cbc0: 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68  this level of th
cbd0: 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70  e loop..  **   p
cbe0: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73  WInfo->a[].flags
cbf0: 20 20 20 20 20 57 48 45 52 45 5f 78 78 78 20 66       WHERE_xxx f
cc00: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
cc10: 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20  with pIdx.  **  
cc20: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71   pWInfo->a[].nEq
cc30: 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65         The numbe
cc40: 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63  r of == and IN c
cc50: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
cc60: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46    pWInfo->a[].iF
cc70: 72 6f 6d 20 20 20 20 20 57 68 65 6e 20 74 65 72  rom     When ter
cc80: 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
cc90: 61 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f  ause is being co
cca0: 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ded.  **   pWInf
ccb0: 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20  o->a[].iTabCur  
ccc0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
ccd0: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
cce0: 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70  e table.  **   p
ccf0: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43  WInfo->a[].iIdxC
cd00: 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
cd10: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
cd20: 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  ex.  **.  ** Thi
cd30: 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75  s loop also figu
cd40: 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74  res out the nest
cd50: 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62  ing order of tab
cd60: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
cd70: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
cd80: 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
cd90: 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54  (Bitmask)0;.  pT
cda0: 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  abItem = pTabLis
cdb0: 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d  t->a;.  pLevel =
cdc0: 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e   pWInfo->a;.  an
cdd0: 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 54  dFlags = ~0;.  T
cde0: 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
cdf0: 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e  izer Start ***\n
ce00: 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72  "));.  for(i=iFr
ce10: 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  om=0, pLevel=pWI
ce20: 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
ce30: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
ce40: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e  Level++){.    In
ce50: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
ce60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ce70: 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c  ex for FROM tabl
ce80: 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f  e at pTabItem */
ce90: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  .    int flags; 
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63   /* Flags asssoc
cec0: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
ced0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20  */.    int nEq; 
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
cf00: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
cf10: 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62  ints */.    doub
cf20: 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
cf30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
cf40: 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ost for pIdx */.
cf50: 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
cf80: 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20  ver FROM tables 
cf90: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42  */.    Index *pB
cfa0: 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
cfb0: 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69     /* The best i
cfc0: 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72  ndex seen so far
cfd0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
cfe0: 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
cff0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
d000: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65  ociated with pBe
d010: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  st */.    int be
d020: 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20  stNEq = 0;      
d030: 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73        /* nEq ass
d040: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65  ociated with pBe
d050: 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  st */.    double
d060: 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20   lowestCost;    
d070: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
d080: 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20   the pBest */.  
d090: 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b    int bestJ = 0;
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0b0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20   The value of j 
d0c0: 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  */.    Bitmask m
d0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d0e0: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61     /* Bitmask va
d0f0: 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73  lue for j or bes
d100: 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e  tJ */.    int on
d110: 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
d120: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68        /* True wh
d130: 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 69  en first table i
d140: 73 20 73 65 65 6e 20 2a 2f 0a 0a 20 20 20 20 6c  s seen */..    l
d150: 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49  owestCost = SQLI
d160: 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20  TE_BIG_DBL;.    
d170: 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61  for(j=iFrom, pTa
d180: 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d  bItem=&pTabList-
d190: 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73  >a[j]; j<pTabLis
d1a0: 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54  t->nSrc; j++, pT
d1b0: 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20  abItem++){.     
d1c0: 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65   int doNotReorde
d1d0: 72 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  r;  /* True if t
d1e0: 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  his table should
d1f0: 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65   not be reordere
d200: 64 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f  d */..      doNo
d210: 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61  tReorder =  (pTa
d220: 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bItem->jointype 
d230: 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
d240: 4f 53 53 29 29 21 3d 30 0a 20 20 20 20 20 20 20  OSS))!=0.       
d250: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
d260: 6a 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  j>0 && (pTabItem
d270: 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  [-1].jointype & 
d280: 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
d290: 53 29 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 69  S))!=0);.      i
d2a0: 66 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74  f( once && doNot
d2b0: 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b  Reorder ) break;
d2c0: 0a 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61  .      m = getMa
d2d0: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
d2e0: 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
d2f0: 0a 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20  .      if( (m & 
d300: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
d310: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69          if( j==i
d320: 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a  From ) iFrom++;.
d330: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
d340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d350: 63 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78  cost = bestIndex
d360: 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54  (pParse, &wc, pT
d370: 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
d380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d390: 20 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26           (i==0 &
d3a0: 26 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a  & ppOrderBy) ? *
d3b0: 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20  ppOrderBy : 0,. 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c        &pIdx, &fl
d3e0: 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20  ags, &nEq);.    
d3f0: 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73    if( cost<lowes
d400: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tCost ){.       
d410: 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
d420: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
d430: 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 42  cost;.        pB
d440: 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
d450: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
d460: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62  flags;.        b
d470: 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20  estNEq = nEq;.  
d480: 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b        bestJ = j;
d490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d4a0: 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  f( doNotReorder 
d4b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
d4c0: 20 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f     TRACE(("*** O
d4d0: 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20  ptimizer choose 
d4e0: 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f  table %d for loo
d4f0: 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a  p %d\n", bestJ,.
d500: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
d510: 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20  l-pWInfo->a));. 
d520: 20 20 20 69 66 28 20 28 62 65 73 74 46 6c 61 67     if( (bestFlag
d530: 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
d540: 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  Y)!=0 ){.      *
d550: 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
d560: 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67     }.    andFlag
d570: 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a  s &= bestFlags;.
d580: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67      pLevel->flag
d590: 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20  s = bestFlags;. 
d5a0: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20     pLevel->pIdx 
d5b0: 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65  = pBest;.    pLe
d5c0: 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e  vel->nEq = bestN
d5d0: 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  Eq;.    pLevel->
d5e0: 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  aInLoop = 0;.   
d5f0: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30   pLevel->nIn = 0
d600: 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 20  ;.    if( pBest 
d610: 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
d620: 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
d630: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
d640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
d650: 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31  el->iIdxCur = -1
d660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52  ;.    }.    notR
d670: 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
d680: 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c  (&maskSet, pTabL
d690: 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43  ist->a[bestJ].iC
d6a0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76  ursor);.    pLev
d6b0: 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74  el->iFrom = best
d6c0: 4a 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28  J;.  }.  TRACE((
d6d0: 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
d6e0: 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
d6f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
d700: 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20  otal query only 
d710: 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65  selects a single
d720: 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f   row, then the O
d730: 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
d740: 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e  use is irrelevan
d750: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61  t..  */.  if( (a
d760: 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
d770: 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70  UNIQUE)!=0 && pp
d780: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a  OrderBy ){.    *
d790: 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
d7a0: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c   }..  /* Open al
d7b0: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
d7c0: 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79  pTabList and any
d7d0: 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65   indices selecte
d7e0: 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63  d for.  ** searc
d7f0: 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65  hing those table
d800: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
d810: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
d820: 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f  a(pParse, -1); /
d830: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f  * Insert the coo
d840: 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74  kie verifier Got
d850: 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20  o */.  pLevel = 
d860: 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72  pWInfo->a;.  for
d870: 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
d880: 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
d890: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
d8a0: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
d8b0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
d8c0: 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
d8d0: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
d8e0: 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  x;      /* Index
d8f0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
d900: 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f  pTab (if any) */
d910: 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
d920: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
d930: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
d940: 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
d950: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  x */.    int iId
d960: 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
d970: 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66  IdxCur;..#ifndef
d980: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
d990: 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61  LAIN.    if( pPa
d9a0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
d9b0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
d9c0: 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63  Msg;.      struc
d9d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
d9e0: 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
d9f0: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
da00: 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  om];.      zMsg 
da10: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
da20: 28 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74  ("TABLE %s", pIt
da30: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
da40: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
da50: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ias ){.        z
da60: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
da70: 69 6e 74 66 28 22 25 7a 20 41 53 20 25 73 22 2c  intf("%z AS %s",
da80: 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
da90: 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
daa0: 20 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20       if( (pIx = 
dab0: 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30  pLevel->pIdx)!=0
dac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
dad0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
dae0: 66 28 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58  f("%z WITH INDEX
daf0: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d   %s", zMsg, pIx-
db00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
db10: 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
db20: 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  >flags & (WHERE_
db30: 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
db40: 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
db50: 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
db60: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
db70: 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
db80: 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
db90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
dba0: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
dbb0: 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20  ERE_ORDERBY ){. 
dbc0: 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
dbd0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
dbe0: 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67   ORDER BY", zMsg
dbf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dc00: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
dc10: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
dc20: 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
dc30: 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49   zMsg, P3_DYNAMI
dc40: 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
dc50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
dc60: 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70  EXPLAIN */.    p
dc70: 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
dc80: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
dc90: 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
dca0: 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
dcb0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
dcc0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
dcd0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
dce0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
dcf0: 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61   if( pTab->isTra
dd00: 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e  nsient || pTab->
dd10: 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
dd20: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65  ue;.    if( (pLe
dd30: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
dd40: 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
dd50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dd60: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
dd70: 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
dd80: 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
dd90: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
dda0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
ddb0: 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61  ol<(sizeof(Bitma
ddc0: 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20  sk)*8) ){.      
ddd0: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
dde0: 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
ddf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
de00: 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
de10: 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
de20: 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
de30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
de40: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
de50: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
de60: 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
de70: 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
de80: 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
de90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
dea0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
deb0: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
dec0: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
ded0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
dee0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
def0: 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
df00: 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
df10: 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  (pIx = pLevel->p
df20: 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Idx)!=0 ){.     
df30: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
df40: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
df50: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
df60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
df70: 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
df80: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
df90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dfa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
dfb0: 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
dfc0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
dfd0: 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78  ((v, "# %s", pIx
dfe0: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
dff0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
e000: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
e010: 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e  iIdxCur, pIx->tn
e020: 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
e030: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
e040: 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
e050: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d  _HANDOFF);.    }
e060: 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
e070: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
e080: 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  IDX_ONLY)!=0 ){.
e090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e0a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
e0b0: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78  NumColumns, iIdx
e0c0: 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d  Cur, pIx->nColum
e0d0: 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n+1);.    }.    
e0e0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
e0f0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
e100: 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
e110: 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
e120: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e130: 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  r(v);..  /* Gene
e140: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
e150: 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20   do the search. 
e160: 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   Each iteration 
e170: 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20  of the for.  ** 
e180: 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72  loop below gener
e190: 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20  ates code for a 
e1a0: 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f  single nested lo
e1b0: 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a  op of the VM.  *
e1c0: 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a  * program..  */.
e1d0: 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
e1e0: 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28  itmask)0;.  for(
e1f0: 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
e200: 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
e210: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
e220: 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
e230: 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72   j;.    int iCur
e240: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
e250: 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44  rsor;  /* The VD
e260: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
e270: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49  e table */.    I
e280: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
e290: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
e2a0: 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
e2b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
e2c0: 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
e2d0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
e2e0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
e2f0: 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
e300: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
e310: 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
e320: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74   only */.    int
e330: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
e340: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
e350: 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
e360: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a  verse order */..
e370: 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
e380: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
e390: 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
e3a0: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
e3b0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49  >iCursor;.    pI
e3c0: 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
e3d0: 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
e3e0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
e3f0: 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c  ;.    bRev = (pL
e400: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
e410: 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
e420: 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  .    omitTable =
e430: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
e440: 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
e450: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  )!=0;..    /* Cr
e460: 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
e470: 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
e480: 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
e490: 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66  uctions.    ** f
e4a0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
e4b0: 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72  oop.  Jump to br
e4c0: 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
e4d0: 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a  f a loop..    **
e4e0: 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
e4f0: 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
e500: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
e510: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20  ation of the.   
e520: 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f   ** loop..    */
e530: 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65  .    brk = pLeve
e540: 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  l->brk = sqlite3
e550: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e560: 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65  ;.    cont = pLe
e570: 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69  vel->cont = sqli
e580: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e590: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  (v);..    /* If 
e5a0: 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
e5b0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
e5c0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
e5d0: 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a  locate and.    *
e5e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
e5f0: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
e600: 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
e610: 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
e620: 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20  y.    ** row of 
e630: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
e640: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20  f the join..    
e650: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
e660: 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
e670: 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e  TabItem[-1].join
e680: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
e690: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
e6a0: 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20  !pParse->nMem ) 
e6b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
e6c0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
e6d0: 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65  eftJoin = pParse
e6e0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
e6f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e700: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
e710: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
e720: 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  oin);.      Vdbe
e730: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
e740: 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
e750: 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
e760: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
e770: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
e780: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
e790: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
e7a0: 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
e7b0: 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
e7c0: 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
e7d0: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
e7e0: 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
e7f0: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
e800: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
e810: 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
e820: 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
e830: 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
e840: 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
e850: 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
e860: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
e870: 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
e880: 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  /.      pTerm = 
e890: 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
e8a0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
e8b0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
e8c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e8d0: 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
e8e0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
e8f0: 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
e900: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
e910: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
e920: 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
e930: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
e940: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  0 );.      codeE
e950: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
e960: 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20  se, pTerm, brk, 
e970: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73  pLevel);.      s
e980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e990: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
e9a0: 20 31 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20   1, brk);.      
e9b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e9c0: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
e9d0: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
e9e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e9f0: 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
ea00: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
ea10: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
ea20: 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
ea30: 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
ea40: 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  D_RANGE ){.     
ea50: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
ea60: 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
ea70: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
ea80: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
ea90: 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
eaa0: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
eab0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
eac0: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
ead0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53     WhereTerm *pS
eae0: 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  tart, *pEnd;..  
eaf0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
eb00: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
eb10: 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
eb20: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
eb30: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
eb40: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
eb50: 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54      pEnd = findT
eb60: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
eb70: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
eb80: 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20  LT|WO_LE, 0);.  
eb90: 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
eba0: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
ebb0: 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  pStart;.        
ebc0: 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
ebd0: 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54         pEnd = pT
ebe0: 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
ebf0: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
ec00: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
ec10: 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
ec20: 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
ec30: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ec40: 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
ec50: 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e  assert( pStart->
ec60: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
ec70: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
ec80: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ec90: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
eca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ecb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ecc0: 46 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70  ForceInt, pX->op
ecd0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LE || pX->o
ece0: 70 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a  p==TK_GT, brk);.
ecf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ed00: 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76  dbeAddOp(v, bRev
ed10: 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f   ? OP_MoveLt : O
ed20: 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20  P_MoveGe, iCur, 
ed30: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64  brk);.        Vd
ed40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
ed50: 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69  k"));.        di
ed60: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
ed70: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , pStart);.     
ed80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eda0: 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
edb0: 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
edc0: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
edd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
ede0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  nd ){.        Ex
edf0: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
ee00: 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
ee10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ee20: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
ee30: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
ee40: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
ee50: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
ee60: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ee70: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
ee80: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
ee90: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
eea0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
eeb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eec0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
eed0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
eee0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
eef0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
ef00: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
ef10: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
ef20: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
ef30: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
ef40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ef50: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
ef60: 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
ef70: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
ef80: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
ef90: 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a  (pLevel, pEnd);.
efa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
efb0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
efc0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
efd0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
efe0: 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
eff0: 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
f000: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
f010: 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
f020: 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
f030: 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
f040: 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
f050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f060: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
f070: 69 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20  id, iCur, 0);.  
f080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f090: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
f0a0: 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
f0b0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
f0c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0d0: 28 76 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c 49  (v, testOp, SQLI
f0e0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20  TE_AFF_NUMERIC, 
f0f0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
f100: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
f110: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
f120: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
f130: 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
f140: 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  3: The WHERE cla
f150: 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72 65  use term that re
f160: 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67 68  fers to the righ
f170: 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20  t-most.      ** 
f180: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f          column o
f190: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
f1a0: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46  n inequality.  F
f1b0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20  or example, if. 
f1c0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f1d0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20  the index is on 
f1e0: 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20  (x,y,z) and the 
f1f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
f200: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
f210: 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d          form "x=
f220: 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e  5 AND y<10" then
f230: 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75 73   this case is us
f240: 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20  ed.  Only the.  
f250: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72      **         r
f260: 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  ight-most column
f270: 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75   can be an inequ
f280: 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74  ality - the rest
f290: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20   must.      **  
f2a0: 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
f2b0: 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
f2c0: 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a  rators..      **
f2d0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
f2e0: 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20 61    This case is a
f2f0: 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68  lso used when th
f300: 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45  ere are no WHERE
f310: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a   clause.      **
f320: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
f330: 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
f340: 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
f350: 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
f360: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f370: 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74  to force the out
f380: 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e  put order to con
f390: 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52  form to an ORDER
f3a0: 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   BY..      */.  
f3b0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
f3c0: 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70       int nEq = p
f3d0: 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20  Level->nEq;.    
f3e0: 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20    int topEq=0;  
f3f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f400: 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65 73 20   top limit uses 
f410: 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73 74 72  ==. False is str
f420: 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20  ictly < */.     
f430: 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20 20   int btmEq=0;   
f440: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
f450: 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73 20 3d  btm limit uses =
f460: 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74 72 69  =. False if stri
f470: 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20  ctly > */.      
f480: 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70  int topOp, btmOp
f490: 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73  ;   /* Operators
f4a0: 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61 6e 64   for the top and
f4b0: 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68 20 62   bottom search b
f4c0: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounds */.      i
f4d0: 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20  nt testOp;.     
f4e0: 20 69 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20   int nNotNull;  
f4f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f500: 66 20 72 6f 77 73 20 6f 66 20 69 6e 64 65 78 20  f rows of index 
f510: 74 68 61 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e  that must be non
f520: 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69  -NULL */.      i
f530: 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70  nt topLimit = (p
f540: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
f550: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21  HERE_TOP_LIMIT)!
f560: 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 74  =0;.      int bt
f570: 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c  mLimit = (pLevel
f580: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
f590: 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a  BTM_LIMIT)!=0;..
f5a0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
f5b0: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f5c0: 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
f5d0: 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
f5e0: 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20   or IN.      ** 
f5f0: 61 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61  and level the va
f600: 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65  lues of those te
f610: 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  rms on the stack
f620: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f630: 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
f640: 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c  Terms(pParse, pL
f650: 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65  evel, &wc, notRe
f660: 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20  ady, brk);..    
f670: 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74    /* Duplicate t
f680: 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
f690: 20 76 61 6c 75 65 73 20 62 65 63 61 75 73 65 20   values because 
f6a0: 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65  they will all be
f6b0: 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74  .      ** used t
f6c0: 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61  wice: once to ma
f6d0: 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ke the terminati
f6e0: 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20  on key and once 
f6f0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  to make the.    
f700: 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a    ** start key..
f710: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
f720: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
f730: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
f740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f750: 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20   OP_Dup, nEq-1, 
f760: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
f770: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
f780: 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e   what comparison
f790: 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73   operators to us
f7a0: 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f  e for top and bo
f7b0: 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73  ttom .      ** s
f7c0: 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f  earch bounds. Fo
f7d0: 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69  r an ascending i
f7e0: 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d  ndex, the bottom
f7f0: 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72   bound is a > or
f800: 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65   >=.      ** ope
f810: 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f  rator and the to
f820: 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f  p bound is a < o
f830: 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20  r <= operator.  
f840: 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67  For a descending
f850: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  .      ** index 
f860: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72  the operators ar
f870: 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20  e reversed..    
f880: 20 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e    */.      nNotN
f890: 75 6c 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c  ull = nEq + topL
f8a0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  imit;.      if( 
f8b0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
f8c0: 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
f8d0: 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  _ASC ){.        
f8e0: 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f  topOp = WO_LT|WO
f8f0: 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d  _LE;.        btm
f900: 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  Op = WO_GT|WO_GE
f910: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f920: 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57         topOp = W
f930: 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20  O_GT|WO_GE;.    
f940: 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c      btmOp = WO_L
f950: 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
f960: 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69   SWAP(int, topLi
f970: 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a  mit, btmLimit);.
f980: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f990: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
f9a0: 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20  ermination key. 
f9b0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
f9c0: 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20   value that.    
f9d0: 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68    ** will end th
f9e0: 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
f9f0: 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69   is no terminati
fa00: 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a  on key if there.
fa10: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20        ** are no 
fa20: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
fa30: 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65  nd no "X<..." te
fa40: 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rm..      **.   
fa50: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
fa60: 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d  4: On a reverse-
fa70: 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20  order scan, the 
fa80: 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69  so-called "termi
fa90: 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a  nation".      **
faa0: 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65   key computed he
fab0: 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  re really ends u
fac0: 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61 72  p being the star
fad0: 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  t key..      */.
fae0: 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d        if( topLim
faf0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  it ){.        Ex
fb00: 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
fb10: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
fb20: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
fb30: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
fb40: 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b  erm(&wc, iCur, k
fb50: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f  , notReady, topO
fb60: 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  p, pIdx);.      
fb70: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21    assert( pTerm!
fb80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58  =0 );.        pX
fb90: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
fba0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fbb0: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
fbc0: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
fbd0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
fbe0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
fbf0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
fc00: 20 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20          topEq = 
fc10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
fc20: 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
fc30: 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  ;.        disabl
fc40: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
fc50: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  erm);.        te
fc60: 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b  stOp = OP_IdxGE;
fc70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fc80: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e        testOp = n
fc90: 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20  Eq>0 ? OP_IdxGE 
fca0: 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  : OP_Noop;.     
fcb0: 20 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20     topEq = 1;.  
fcc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fcd0: 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
fce0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
fcf0: 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c  Col = nEq + topL
fd00: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c  imit;.        pL
fd10: 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
fd20: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
fd30: 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
fd40: 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45  robe(v, nCol, nE
fd50: 71 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  q, brk, pIdx);. 
fd60: 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20         if( bRev 
fd70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
fd80: 20 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50   op = topEq ? OP
fd90: 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveLe : OP_Mov
fda0: 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eLt;.          s
fdb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fdc0: 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
fdd0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  brk);.        }e
fde0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
fdf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fe00: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
fe10: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
fe20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fe30: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
fe40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
fe50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fe60: 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72  OP_Last, iIdxCur
fe70: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
fe80: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
fe90: 74 65 20 74 68 65 20 73 74 61 72 74 20 6b 65 79  te the start key
fea0: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b  .  This is the k
feb0: 65 79 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  ey that defines 
fec0: 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20  the lower.      
fed0: 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  ** bound on the 
fee0: 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69  search.  There i
fef0: 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69  s no start key i
ff00: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
ff10: 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
ff20: 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68   terms and if th
ff30: 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e  ere is no "X>...
ff40: 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20  " term.  In.    
ff50: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20    ** that case, 
ff60: 67 65 6e 65 72 61 74 65 20 61 20 22 52 65 77 69  generate a "Rewi
ff70: 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nd" instruction 
ff80: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a  in place of the.
ff90: 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b        ** start k
ffa0: 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20  ey search..     
ffb0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30   **.      ** 200
ffc0: 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65  2-Dec-04: In the
ffd0: 20 63 61 73 65 20 6f 66 20 61 20 72 65 76 65 72   case of a rever
ffe0: 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c  se-order search,
fff0: 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20   the so-called. 
10000 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20       ** "start" 
10010 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20  key really ends 
10020 75 70 20 62 65 69 6e 67 20 75 73 65 64 20 61 73  up being used as
10030 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
10040 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   key..      */. 
10050 20 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69       if( btmLimi
10060 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  t ){.        Exp
10070 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69  r *pX;.        i
10080 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
10090 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
100a0 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
100b0 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c  rm(&wc, iCur, k,
100c0 20 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70   notReady, btmOp
100d0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
100e0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
100f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
10100 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
10110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10120 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
10130 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
10140 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10150 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10160 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
10170 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70         btmEq = p
10180 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
10190 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
101a0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
101b0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
101c0 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
101d0 7b 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71 20  {.        btmEq 
101e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
101f0 20 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20     if( nEq>0 || 
10200 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
10210 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e      int nCol = n
10220 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20  Eq + btmLimit;. 
10230 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65         buildInde
10240 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20  xProbe(v, nCol, 
10250 30 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  0, brk, pIdx);. 
10260 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20         if( bRev 
10270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  ){.          pLe
10280 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
10290 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
102c0 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Store, pLevel->i
102d0 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Mem, 1);.       
102e0 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49     testOp = OP_I
102f0 64 78 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  dxLT;.        }e
10300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
10310 6e 74 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20  nt op = btmEq ? 
10320 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d  OP_MoveGe : OP_M
10330 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20  oveGt;.         
10340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10350 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  p(v, op, iIdxCur
10360 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
10370 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
10380 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
10390 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f    testOp = OP_No
103a0 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  op;.      }else{
103b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
103c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
103d0 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c  Rewind, iIdxCur,
103e0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a   brk);.      }..
103f0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
10400 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66  e the the top of
10410 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74   the loop.  If t
10420 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e  here is a termin
10430 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b  ation.      ** k
10440 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74 65  ey we have to te
10450 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20  st for that key 
10460 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68 65  and abort at the
10470 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20   top of the.    
10480 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20    ** loop..     
10490 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20   */.      start 
104a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
104b0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
104c0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
104d0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
104e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
104f0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
10500 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
10510 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
10520 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10530 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c  testOp, iIdxCur,
10540 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69   brk);.        i
10550 66 28 20 28 74 6f 70 45 71 20 26 26 20 21 62 52  f( (topEq && !bR
10560 65 76 29 20 7c 7c 20 28 21 62 74 6d 45 71 20 26  ev) || (!btmEq &
10570 26 20 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20  & bRev) ){.     
10580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10590 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
105a0 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  "+", P3_STATIC);
105b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
105c0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
105d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
105e0 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c  RowKey, iIdxCur,
105f0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10600 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10610 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f  P_IdxIsNull, nNo
10620 74 4e 75 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20  tNull, cont);.  
10630 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
10640 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
10650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10660 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
10670 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
10680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10690 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
106a0 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20  e, iCur, 0);.   
106b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52     }..      /* R
106c0 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
106d0 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
106e0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
106f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10700 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
10710 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
10720 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c  P_Next;.      pL
10730 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
10740 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
10750 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
10760 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
10770 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
10780 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20  E_COLUMN_EQ ){. 
10790 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20       /* Case 4: 
107a0 20 54 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64   There is an ind
107b0 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73  ex and all terms
107c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
107d0 61 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20  ause that.      
107e0 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65 66 65  **          refe
107f0 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 75  r to the index u
10800 73 69 6e 67 20 74 68 65 20 22 3d 3d 22 20 6f 72  sing the "==" or
10810 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
10820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10830 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20  int start;.     
10840 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
10850 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f  l->nEq;..      /
10860 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10870 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
10880 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
10890 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
108a0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61        ** and lea
108b0 76 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  ve the values of
108c0 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20   those terms on 
108d0 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20  the stack..     
108e0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c   */.      codeAl
108f0 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
10900 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26  Parse, pLevel, &
10910 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72  wc, notReady, br
10920 6b 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  k);..      /* Ge
10930 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c 65 20  nerate a single 
10940 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  key that will be
10950 20 75 73 65 64 20 74 6f 20 62 6f 74 68 20 73 74   used to both st
10960 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  art and terminat
10970 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  e.      ** the s
10980 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20  earch.      */. 
10990 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
109a0 72 6f 62 65 28 76 2c 20 6e 45 71 2c 20 30 2c 20  robe(v, nEq, 0, 
109b0 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
109c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
109d0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
109e0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
109f0 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47   0);..      /* G
10a00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 31 29  enerate code (1)
10a10 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65 20   to move to the 
10a20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 65  first matching e
10a30 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
10a40 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ble..      ** Th
10a50 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  en generate code
10a60 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70 73 20   (2) that jumps 
10a70 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72 20 74  to "brk" after t
10a80 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  he cursor is pas
10a90 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  t.      ** the l
10aa0 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65  ast matching ele
10ab0 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
10ac0 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28 31 29  e.  The code (1)
10ad0 20 69 73 20 65 78 65 63 75 74 65 64 0a 20 20 20   is executed.   
10ae0 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e     ** once to in
10af0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 65 61  itialize the sea
10b00 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20 28 32  rch, the code (2
10b10 29 20 69 73 20 65 78 65 63 75 74 65 64 20 62 65  ) is executed be
10b20 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20 20 20  fore each.      
10b30 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ** iteration of 
10b40 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65 65 20  the scan to see 
10b50 69 66 20 74 68 65 20 73 63 61 6e 20 68 61 73 20  if the scan has 
10b60 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20  finished. */.   
10b70 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
10b80 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69         /* Scan i
10b90 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
10ba0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
10bb0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10bc0 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75  P_MoveLe, iIdxCu
10bd0 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
10be0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
10bf0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10c00 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
10c10 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
10c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c30 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c  dOp(v, OP_IdxLT,
10c40 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
10c50 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
10c60 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
10c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c80 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68     /* Scan in th
10c90 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  e forward order 
10ca0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
10cb0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10cc0 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75  P_MoveGe, iIdxCu
10cd0 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
10ce0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
10cf0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10d00 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
10d10 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
10d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10d30 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69  3(v, OP_IdxGE, i
10d40 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22  IdxCur, brk, "+"
10d50 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10d60 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
10d70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
10d80 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10d90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10da0 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72  _RowKey, iIdxCur
10db0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10dc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10dd0 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45  OP_IdxIsNull, nE
10de0 71 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20  q, cont);.      
10df0 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
10e00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10e10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10e20 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
10e30 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
10e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10e50 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
10e60 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
10e70 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
10e80 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
10e90 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
10ea0 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  start;.    }else
10eb0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
10ec0 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  5:  There is no 
10ed0 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
10ee0 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
10ef0 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  lete.      **   
10f00 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
10f10 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
10f20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10f30 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
10f40 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  e==0 );.      as
10f50 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b  sert( bRev==0 );
10f60 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
10f70 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
10f80 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
10f90 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
10fa0 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
10fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10fc0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
10fd0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  , brk);.    }.  
10fe0 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
10ff0 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
11000 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20   iCur);..    /* 
11010 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
11020 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
11030 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
11040 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
11050 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75     ** computed u
11060 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
11070 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
11080 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
11090 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e  Term=wc.a, j=wc.
110a0 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
110b0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
110c0 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
110d0 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67   if( pTerm->flag
110e0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
110f0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
11100 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11110 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
11120 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
11130 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
11140 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72  .      pE = pTer
11150 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11160 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
11170 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
11180 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
11190 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
111a0 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
111b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
111c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
111d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
111e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
111f0 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20  pE, cont, 1);.  
11200 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
11210 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
11220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f      }..    /* Fo
11230 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
11240 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
11250 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
11260 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
11270 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73  t.    ** at leas
11280 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
11290 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
112a0 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
112b0 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a  t table.  .    *
112c0 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
112d0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
112e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70       pLevel->top
112f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11300 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11320 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
11330 74 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  t, 1, pLevel->iL
11340 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
11350 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11360 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a  "# record LEFT J
11370 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20  OIN hit"));.    
11380 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61    for(pTerm=wc.a
11390 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72  , j=0; j<wc.nTer
113a0 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
113b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
113c0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45  erm->flags & (TE
113d0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
113e0 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
113f0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
11400 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
11410 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
11420 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
11430 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
11440 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
11450 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
11460 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
11470 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e  Term->pExpr, con
11480 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 1);.        p
11490 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
114a0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20  ERM_CODED;.     
114b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
114c0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
114d0 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67    /* For testing
114e0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
114f0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20  se only */.  /* 
11500 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75  Record in the qu
11510 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61  ery plan informa
11520 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
11530 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a  urrent table.  *
11540 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
11550 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69  used to access i
11560 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20  t (if any).  If 
11570 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
11580 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
11590 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a  d, its name is j
115a0 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f  ust '{}'.  If no
115b0 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20   index is used. 
115c0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
115d0 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e   listed as "{}".
115e0 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79    If the primary
115f0 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65   key is used the
11600 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65  .  ** index name
11610 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20   is '*'..  */.  
11620 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
11630 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
11640 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
11650 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65    int n;.    pLe
11660 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
11670 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65  [i];.    pTabIte
11680 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
11690 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
116a0 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65  .    z = pTabIte
116b0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69  m->zAlias;.    i
116c0 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54  f( z==0 ) z = pT
116d0 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
116e0 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  ame;.    n = str
116f0 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  len(z);.    if( 
11700 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
11710 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
11720 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20  plan)-10 ){.    
11730 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
11740 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
11750 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
11760 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
11770 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
11780 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20  n], "{}");.     
11790 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
117a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
117b0 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c       strcpy(&sql
117c0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
117d0 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20  nQPlan], z);.   
117e0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
117f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11800 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11810 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
11820 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   ';.    }.    if
11830 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
11840 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
11850 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
11860 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 73 74  NGE) ){.      st
11870 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
11880 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
11890 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e  , "* ");.      n
118a0 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20  QPlan += 2;.    
118b0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
118c0 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ->pIdx==0 ){.   
118d0 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
118e0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
118f0 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20  Plan], "{} ");. 
11900 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
11910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11920 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c     n = strlen(pL
11930 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
11940 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b  e);.      if( n+
11950 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
11960 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11970 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
11980 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
11990 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
119a0 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64  an], pLevel->pId
119b0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
119c0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
119d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
119e0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
119f0 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
11a00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11a10 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20  while( nQPlan>0 
11a20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  && sqlite3_query
11a30 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d  _plan[nQPlan-1]=
11a40 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  =' ' ){.    sqli
11a50 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d  te3_query_plan[-
11a60 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  -nQPlan] = 0;.  
11a70 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72  }.  sqlite3_quer
11a80 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d  y_plan[nQPlan] =
11a90 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30   0;.  nQPlan = 0
11aa0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
11ab0 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69  TE_TEST // Testi
11ac0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
11ad0 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20   use only */..  
11ae0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f  /* Record the co
11af0 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65  ntinuation addre
11b00 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49  ss in the WhereI
11b10 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
11b20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20  Then.  ** clean 
11b30 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  up and return.. 
11b40 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43   */.  pWInfo->iC
11b50 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a  ontinue = cont;.
11b60 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
11b70 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72  ar(&wc);.  retur
11b80 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
11b90 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
11ba0 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
11bb0 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20  reBeginNoMem:.  
11bc0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
11bd0 28 26 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 46  (&wc);.  sqliteF
11be0 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72  ree(pWInfo);.  r
11bf0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
11c00 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
11c10 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
11c20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
11c30 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
11c40 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
11c50 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
11c60 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
11c70 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
11c80 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
11c90 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
11ca0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
11cb0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
11cc0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
11cd0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
11ce0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
11cf0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
11d00 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
11d10 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
11d20 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   code..  */.  fo
11d30 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  r(i=pTabList->nS
11d40 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rc-1; i>=0; i--)
11d50 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
11d60 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
11d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11d80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
11d90 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20  vel->cont);.    
11da0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
11db0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
11dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11dd0 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  p(v, pLevel->op,
11de0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
11df0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  vel->p2);.    }.
11e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
11e10 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
11e20 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20  Level->brk);.   
11e30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e   if( pLevel->nIn
11e40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   ){.      int *a
11e50 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
11e60 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
11e70 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65  l->nIn, a=&pLeve
11e80 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 32 2d 32  l->aInLoop[j*2-2
11e90 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d  ]; j>0; j--, a-=
11ea0 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
11eb0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11ec0 4f 50 5f 4e 65 78 74 2c 20 61 5b 30 5d 2c 20 61  OP_Next, a[0], a
11ed0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [1]);.        sq
11ee0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11ef0 65 28 76 2c 20 61 5b 31 5d 2d 31 29 3b 0a 20 20  e(v, a[1]-1);.  
11f00 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11f10 74 65 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61  teFree(pLevel->a
11f20 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
11f30 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
11f40 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
11f50 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
11f60 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
11f70 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11f80 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65 6c  IfMemPos, pLevel
11f90 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b  ->iLeftJoin, 0);
11fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11fb0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
11fc0 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
11fd0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30  >a[i].iCursor, 0
11fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
11ff0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
12000 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12010 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12020 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
12030 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  l->iIdxCur, 0);.
12040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12060 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
12070 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20  evel->top);.    
12080 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12090 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
120a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
120b0 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
120c0 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
120d0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
120e0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
120f0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
12100 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
12110 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
12120 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
12130 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
12140 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
12150 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
12160 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
12170 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  egin..  */.  for
12180 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
12190 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
121a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
121b0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74  Level++){.    st
121c0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
121d0 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
121e0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
121f0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
12200 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
12210 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
12220 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
12230 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   );.    if( pTab
12240 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c  ->isTransient ||
12250 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
12260 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
12270 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  f( (pLevel->flag
12280 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
12290 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
122a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
122b0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
122c0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
122d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
122e0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21  f( pLevel->pIdx!
122f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
12300 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12310 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
12320 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  ->iIdxCur, 0);. 
12330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
12340 65 20 63 75 72 73 6f 72 20 73 75 62 73 74 69 74  e cursor substit
12350 75 74 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73  utions for cases
12360 20 77 68 65 72 65 20 77 65 20 77 61 6e 74 20 74   where we want t
12370 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73  o use.    ** jus
12380 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  t the index and 
12390 6e 65 76 65 72 20 72 65 66 65 72 65 6e 63 65 20  never reference 
123a0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
123b0 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
123c0 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
123d0 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
123e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
123f0 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
12400 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
12410 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
12420 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
12430 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
12440 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
12450 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
12460 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
12470 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
12480 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
12490 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
124a0 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
124b0 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
124c0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
124d0 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
124e0 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
124f0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
12500 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
12510 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c   ){.      int k,
12520 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
12530 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
12540 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
12550 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a   pLevel->pIdx;..
12560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12570 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  dx!=0 );.      p
12580 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
12590 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d  GetOp(v, pWInfo-
125a0 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61  >iTop);.      la
125b0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
125c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
125d0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e        for(k=pWIn
125e0 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74  fo->iTop; k<last
125f0 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
12600 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
12610 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
12620 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
12630 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
12640 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
12650 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
12660 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
12670 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
12680 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
12690 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
126a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
126b0 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
126c0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
126d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
126e0 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
126f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12700 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
12710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12720 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
12730 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
12740 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
12750 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
12760 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
12770 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
12780 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
12790 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
127a0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
127b0 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20  =OP_NullRow ){. 
127c0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
127d0 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
127e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
127f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
12800 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
12810 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65    */.  sqliteFre
12820 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  e(pWInfo);.  ret
12830 75 72 6e 3b 0a 7d 0a                             urn;.}.