System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 6c397cd40032d90014bf592787b1aacc62d8bece:


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 30 20   where.c,v 1.20 
0340: 32 30 30 36 2f 30 32 2f 30 32 20 32 32 3a 34 35  2006/02/02 22:45
0350: 3a 31 30 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78  :10 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: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
6650: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
6660: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
6670: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  d */.  int base,
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6690: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
66a0: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 45 78  for pTab */.  Ex
66b0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
66c0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
66d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
66e0: 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20    int nEqCol,   
66f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6700: 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c  ber of index col
6710: 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e  umns with == con
6720: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
6730: 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20  t *pbRev        
6740: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
6750: 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73  1 if ORDER BY is
6760: 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e   DESC */.){.  in
6770: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6790: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
67a0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
67b0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
67c0: 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e      /* XOR of in
67d0: 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59  dex and ORDER BY
67e0: 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20   sort direction 
67f0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20  */.  int nTerm; 
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6820: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
6830: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
6840: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
6850: 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  m;    /* A term 
6860: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
6870: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  clause */.  sqli
6880: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6890: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
68a0: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
68b0: 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64 65 72    nTerm = pOrder
68c0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  By->nExpr;.  ass
68d0: 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29 3b 0a  ert( nTerm>0 );.
68e0: 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d  .  /* Match term
68f0: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
6900: 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74  Y clause against
6910: 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a   columns of.  **
6920: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   the index..  */
6930: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
6940: 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  erm=pOrderBy->a;
6950: 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 70 49   j<nTerm && i<pI
6960: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
6970: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
6980: 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  pr;       /* The
6990: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
69a0: 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72  he ORDER BY pTer
69b0: 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  m */.    CollSeq
69c0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54   *pColl;    /* T
69d0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
69e0: 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a  uence of pExpr *
69f0: 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f  /.    int termSo
6a00: 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74  rtOrder; /* Sort
6a10: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
6a20: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
6a30: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
6a40: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
6a50: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
6a60: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
6a70: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
6a80: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
6a90: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
6aa0: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
6ab0: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
6ac0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
6ad0: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
6ae0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
6af0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
6b00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43   0;.    }.    pC
6b10: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6b20: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6b30: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
6b40: 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
6b50: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
6b60: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
6b70: 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61  iColumn!=pIdx->a
6b80: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c 20 0a 20  iColumn[i] || . 
6b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
6ba0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
6bb0: 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
6bc0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  [i]) ){.      /*
6bd0: 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f   Term j of the O
6be0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64  RDER BY clause d
6bf0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f  oes not match co
6c00: 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e  lumn i of the in
6c10: 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
6c20: 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i<nEqCol ){.   
6c30: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
6c40: 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  dex column that 
6c50: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
6c60: 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61  y == fails to ma
6c70: 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a  tch an.        *
6c80: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c  * ORDER BY term,
6c90: 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75   that is OK.  Ju
6ca0: 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63  st ignore that c
6cb0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
6cc0: 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ex.        */.  
6cd0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6ce0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6cf0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e       /* If an in
6d00: 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73  dex column fails
6d10: 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69 73   to match and is
6d20: 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
6d30: 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a   by ==.        *
6d40: 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78  * then the index
6d50: 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20   cannot satisfy 
6d60: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f 6e  the ORDER BY con
6d70: 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20 20  straint..       
6d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
6d90: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6da0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
6db0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
6dc0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
6dd0: 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72  t( pTerm->sortOr
6de0: 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d 2d  der==0 || pTerm-
6df0: 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b  >sortOrder==1 );
6e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
6e10: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
6e20: 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f  ==0 || pIdx->aSo
6e30: 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 31 20 29 3b  rtOrder[i]==1 );
6e40: 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64  .    termSortOrd
6e50: 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  er = pIdx->aSort
6e60: 4f 72 64 65 72 5b 69 5d 20 5e 20 70 54 65 72 6d  Order[i] ^ pTerm
6e70: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
6e80: 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b   if( i>nEqCol ){
6e90: 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53  .      if( termS
6ea0: 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72  ortOrder!=sortOr
6eb0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  der ){.        /
6ec0: 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e  * Indices can on
6ed0: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  ly be used if al
6ee0: 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
6ef0: 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20   past the.      
6f00: 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f    ** equality co
6f10: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c  nstraints are al
6f20: 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72  l either DESC or
6f30: 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20   ASC. */.       
6f40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6f50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6f60: 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
6f70: 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20  termSortOrder;. 
6f80: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
6f90: 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    pTerm++;.  }..
6fa0: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63    /* The index c
6fb0: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
6fc0: 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20 74 65  orting if all te
6fd0: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6fe0: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
6ff0: 61 72 65 20 63 6f 76 65 72 65 64 2e 0a 20 20 2a  are covered..  *
7000: 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72 6d  /.  if( j>=nTerm
7010: 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d   ){.    *pbRev =
7020: 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20   sortOrder!=0;. 
7030: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
7040: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7050: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c  /*.** Check tabl
7060: 65 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  e to see if the 
7070: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
7080: 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20  in pOrderBy can 
7090: 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  be satisfied.** 
70a0: 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72  by sorting in or
70b0: 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52  der of ROWID.  R
70c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f  eturn true if so
70d0: 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20   and set *pbRev 
70e0: 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f  to be.** true fo
70f0: 72 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20  r reverse ROWID 
7100: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f  and false for fo
7110: 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65  rward ROWID orde
7120: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
7130: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
7140: 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  (.  int base,   
7150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7160: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
7170: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
7180: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
7190: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
71a0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
71b0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
71c0: 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20   *pbRev         
71d0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
71e0: 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20   if ORDER BY is 
71f0: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  DESC */.){.  Exp
7200: 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *p;..  assert(
7210: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
7220: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
7230: 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  By->nExpr>0 );. 
7240: 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
7250: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
7260: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
7270: 3d 3d 31 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b  ==1 && p->op==TK
7280: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54  _COLUMN && p->iT
7290: 61 62 6c 65 3d 3d 62 61 73 65 0a 20 20 20 20 20  able==base.     
72a0: 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75       && p->iColu
72b0: 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 2a 70  mn==-1 ){.    *p
72c0: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
72d0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
72e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
72f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7300: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
7310: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
7320: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
7330: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
7340: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
7350: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
7360: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
7370: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
7380: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
7390: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
73a0: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
73b0: 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ings with O(logN
73c0: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
73d0: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
73e0: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
73f0: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
7400: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
7410: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
7420: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
7430: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
7440: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
7450: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
7460: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
7470: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
7480: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
7490: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
74a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
74b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
74c0: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
74d0: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
74e0: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
74f0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
7500: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64  er.** to the ind
7510: 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64  ex, flags that d
7520: 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20  escribe how the 
7530: 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
7540: 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d  used, the.** num
7550: 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
7560: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64  constraints, and
7570: 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20   the "cost" for 
7580: 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  this index..**.*
7590: 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
75a0: 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54  t index wins.  T
75b0: 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73  he cost is an es
75c0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d  timate of the am
75d0: 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61  ount of.** CPU a
75e0: 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64  nd disk I/O need
75f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
7600: 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68  request using th
7610: 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  e selected index
7620: 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61  ..** Factors tha
7630: 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74  t influence cost
7640: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
7650: 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61     *  The estima
7660: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
7670: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
7680: 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65  retrieved.  (The
7690: 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20  .**       fewer 
76a0: 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a  the better.).**.
76b0: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
76c0: 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20   or not sorting 
76d0: 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a  must occur..**.*
76e0: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
76f0: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73  or not there mus
7700: 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f  t be separate lo
7710: 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20  okups in the.** 
7720: 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20        index and 
7730: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
7740: 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  e..**.*/.static 
7750: 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78  double bestIndex
7760: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7770: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7780: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
7790: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
77a0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
77b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
77c0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
77d0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
77e0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
77f0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
7800: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
7810: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
7820: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
7830: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
7840: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
7850: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
7860: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
7870: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
7880: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
7890: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70  e */.  Index **p
78a0: 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  pIndex,         
78b0: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e     /* Make *ppIn
78c0: 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  dex point to the
78d0: 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20   best index */. 
78e0: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7900: 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69  Put flags descri
7910: 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65  bing this choice
7920: 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20   in *pFlags */. 
7930: 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20   int *pnEq      
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7950: 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Put the number o
7960: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
7970: 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29  raints here */.)
7980: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
7990: 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62  Term;.  Index *b
79a0: 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20  estIdx = 0;     
79b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61      /* Index tha
79c0: 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65  t gives the lowe
79d0: 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75  st cost */.  dou
79e0: 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20  ble lowestCost; 
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a00: 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65  cost of using be
7a10: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
7a20: 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  estFlags = 0;   
7a30: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
7a40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7a50: 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74  bestIdx */.  int
7a60: 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20   bestNEq = 0;   
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
7a80: 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a   value for nEq *
7a90: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
7aa0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
7ab0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
7ac0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
7ad0: 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
7ae0: 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
7af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
7b00: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
7b10: 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  aluating */.  in
7b20: 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  t rev;          
7b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b40: 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  e to scan in rev
7b50: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
7b60: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7b80: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
7b90: 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20  with pProbe */. 
7ba0: 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bc0: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
7bd0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
7be0: 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b  /.  double cost;
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67  /* Cost of using
7c10: 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 54 52   pProbe */..  TR
7c20: 41 43 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a  ACE(("bestIndex:
7c30: 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79   tbl=%s notReady
7c40: 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54  =%x\n", pSrc->pT
7c50: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65  ab->zName, notRe
7c60: 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74 43  ady));.  lowestC
7c70: 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
7c80: 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  _DBL;..  /* Chec
7c90: 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58  k for a rowid=EX
7ca0: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
7cb0: 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73  ...) constraints
7cc0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
7cd0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
7ce0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
7cf0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
7d00: 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
7d10: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
7d20: 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20  r;.    *ppIndex 
7d30: 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  = 0;.    bestFla
7d40: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
7d50: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54 65  _EQ;.    if( pTe
7d60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7d70: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  WO_EQ ){.      /
7d80: 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77  * Rowid== is alw
7d90: 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69 63  ays the best pic
7da0: 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74  k.  Look no furt
7db0: 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e  her.  Because on
7dc0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  ly.      ** a si
7dd0: 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65  ngle row is gene
7de0: 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73  rated, output is
7df0: 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65   always in sorte
7e00: 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  d order */.     
7e10: 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45   *pFlags = WHERE
7e20: 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52  _ROWID_EQ | WHER
7e30: 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  E_UNIQUE;.      
7e40: 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  *pnEq = 1;.     
7e50: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73   TRACE(("... bes
7e60: 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b  t is rowid\n"));
7e70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
7e80: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
7e90: 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   (pExpr = pTerm-
7ea0: 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d  >pExpr)->pList!=
7eb0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  0 ){.      /* Ro
7ec0: 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63  wid IN (LIST): c
7ed0: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
7ee0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
7ef0: 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20  er of list.     
7f00: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
7f10: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
7f20: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
7f30: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
7f40: 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73  lowestCost *= es
7f50: 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29  tLog(lowestCost)
7f60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7f70: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
7f80: 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73  SELECT): cost is
7f90: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
7fa0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
7fb0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rows.      ** in
7fc0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
7fd0: 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e  he inner select.
7fe0: 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79    We have no way
7ff0: 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20   to estimate.   
8000: 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65     ** that value
8010: 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20   so make a wild 
8020: 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  guess. */.      
8030: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30  lowestCost = 200
8040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
8050: 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e  E(("... rowid IN
8060: 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
8070: 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a 20 20  lowestCost));.  
8080: 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  }..  /* Estimate
8090: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74   the cost of a t
80a0: 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77  able scan.  If w
80b0: 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  e do not know ho
80c0: 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74 72  w many.  ** entr
80d0: 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 74  ies are in the t
80e0: 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c  able, use 1 mill
80f0: 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e 0a  ion as a guess..
8100: 20 20 2a 2f 0a 20 20 70 50 72 6f 62 65 20 3d 20    */.  pProbe = 
8110: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
8120: 65 78 3b 0a 20 20 63 6f 73 74 20 3d 20 70 50 72  ex;.  cost = pPr
8130: 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69  obe ? pProbe->ai
8140: 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30 30  RowEst[0] : 1000
8150: 30 30 30 3b 0a 20 20 54 52 41 43 45 28 28 22 2e  000;.  TRACE((".
8160: 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61  .. table scan ba
8170: 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  se cost: %.9g\n"
8180: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67  , cost));.  flag
8190: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
81a0: 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65  RANGE;..  /* Che
81b0: 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ck for constrain
81c0: 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66  ts on a range of
81d0: 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62   rowids in a tab
81e0: 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20  le scan..  */.  
81f0: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
8200: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
8210: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
8220: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8230: 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  E, 0);.  if( pTe
8240: 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69  rm ){.    if( fi
8250: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
8260: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
8270: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20  WO_LT|WO_LE, 0) 
8280: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
8290: 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
82a0: 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  T;.      cost /=
82b0: 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68   3;  /* Guess th
82c0: 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c  at rowid<EXPR el
82d0: 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69  iminates two-thi
82e0: 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20  rds or rows */. 
82f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69 6e     }.    if( fin
8300: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
8310: 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
8320: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29  O_GT|WO_GE, 0) )
8330: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
8340: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
8350: 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20  ;.      cost /= 
8360: 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61  3;  /* Guess tha
8370: 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69  t rowid>EXPR eli
8380: 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72  minates two-thir
8390: 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  ds of rows */.  
83a0: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
83b0: 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20  ... rowid range 
83c0: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
83d0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
83e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
83f0: 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ags = 0;.  }..  
8400: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
8410: 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61  scan does not sa
8420: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
8430: 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
8440: 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73  ase.  ** the cos
8450: 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
8460: 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
8470: 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
8480: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
8490: 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c  .    if( sortabl
84a0: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
84b0: 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29 20 29  OrderBy, &rev) )
84c0: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
84d0: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57   WHERE_ORDERBY|W
84e0: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
84f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20  ;.      if( rev 
8500: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
8510: 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
8520: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
8530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74  else{.      cost
8540: 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
8550: 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 54 52 41  cost);.      TRA
8560: 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67  CE(("... sorting
8570: 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
8580: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
8590: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
85a0: 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43  if( cost<lowestC
85b0: 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73  ost ){.    lowes
85c0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
85d0: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c    bestFlags = fl
85e0: 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ags;.  }..  /* L
85f0: 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65  ook at each inde
8600: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  x..  */.  for(; 
8610: 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
8620: 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
8630: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8660: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e  */.    double in
8670: 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a  Multiplier = 1;.
8680: 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e  .    TRACE(("...
8690: 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70   index %s:\n", p
86a0: 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Probe->zName));.
86b0: 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
86c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
86d0: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
86e0: 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73 66   that are satisf
86f0: 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d  ied.    ** by x=
8700: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 73  EXPR constraints
8710: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63   or x IN (...) c
8720: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
8730: 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30  */.    flags = 0
8740: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8750: 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
8760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
8770: 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
8780: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
8790: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
87a0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
87b0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
87c0: 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29 3b 0a  WO_IN, pProbe);.
87d0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
87e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
87f0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
8800: 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
8810: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
8820: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
8830: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
8840: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
8850: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c  Expr;.        fl
8860: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
8870: 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
8880: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
8890: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
88a0: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
88b0: 2a 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 20 20  *= 100;.        
88c0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
88d0: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
88e0: 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
88f0: 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c  ier *= pExpr->pL
8900: 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a  ist->nExpr + 1;.
8910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8920: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74  }.    }.    cost
8930: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
8940: 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69  Est[i] * inMulti
8950: 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69  plier * estLog(i
8960: 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20  nMultiplier);.  
8970: 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69    nEq = i;.    i
8980: 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  f( pProbe->onErr
8990: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28  or!=OE_None && (
89a0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
89b0: 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20  LUMN_IN)==0.    
89c0: 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72       && nEq==pPr
89d0: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
89e0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
89f0: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
8a00: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
8a10: 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d  ..... nEq=%d inM
8a20: 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e  ult=%.9g cost=%.
8a30: 39 67 5c 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d 75  9g\n", nEq, inMu
8a40: 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73 74 29 29  ltiplier, cost))
8a50: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  ;..    /* Look f
8a60: 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  or range constra
8a70: 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ints.    */.    
8a80: 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  if( nEq<pProbe->
8a90: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
8aa0: 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
8ab0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
8ac0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
8ad0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
8ae0: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
8af0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
8b00: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b  |WO_GE, pProbe);
8b10: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
8b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
8b30: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
8b40: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
8b50: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
8b60: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
8b70: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
8b80: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
8b90: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8ba0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
8bb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
8bc0: 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d   /= 3;.        }
8bd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
8be0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
8bf0: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
8c00: 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62  _GT|WO_GE, pProb
8c10: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
8c20: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  flags |= WHERE_B
8c30: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
8c40: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20      cost /= 3;. 
8c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8c60: 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20   TRACE(("...... 
8c70: 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
8c80: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
8c90: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
8ca0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
8cb0: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
8cc0: 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
8cd0: 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
8ce0: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
8cf0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
8d00: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
8d10: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
8d20: 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  IN)==0 &&.      
8d30: 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e       isSortingIn
8d40: 64 65 78 28 70 50 61 72 73 65 2c 70 50 72 6f 62  dex(pParse,pProb
8d50: 65 2c 70 53 72 63 2d 3e 70 54 61 62 2c 69 43 75  e,pSrc->pTab,iCu
8d60: 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26  r,pOrderBy,nEq,&
8d70: 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rev) ){.        
8d80: 69 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a  if( flags==0 ){.
8d90: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
8da0: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
8db0: 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ANGE;.        }.
8dc0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
8dd0: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
8de0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
8df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
8e00: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
8e10: 52 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RSE;.        }. 
8e20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8e30: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
8e40: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
8e50: 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e         TRACE((".
8e60: 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e  ..... orderby in
8e70: 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
8e80: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
8e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8ea0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
8eb0: 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65  see if we can ge
8ec0: 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e  t away with usin
8ed0: 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  g just the index
8ee0: 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20   without.    ** 
8ef0: 65 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  ever reading the
8f00: 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74   table.  If that
8f10: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
8f20: 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20  en halve the.   
8f30: 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73   ** cost of this
8f40: 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
8f50: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20     if( flags && 
8f60: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20  pSrc->colUsed < 
8f70: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
8f80: 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20  BMS-1)) ){.     
8f90: 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
8fa0: 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
8fb0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
8fc0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65  or(j=0; j<pProbe
8fd0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
8fe0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
8ff0: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
9000: 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
9010: 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
9020: 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
9030: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
9040: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9050: 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
9060: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
9070: 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f  s |= WHERE_IDX_O
9080: 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73  NLY;.        cos
9090: 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  t /= 2;.        
90a0: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69  TRACE(("...... i
90b0: 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20  dx-only reduces 
90c0: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
90d0: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
90e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
90f0: 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73  f this index has
9100: 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f   achieved the lo
9110: 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72  west cost so far
9120: 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20  , then use it.. 
9130: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f     */.    if( co
9140: 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20  st < lowestCost 
9150: 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78  ){.      bestIdx
9160: 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20   = pProbe;.     
9170: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f   lowestCost = co
9180: 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
9190: 28 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20  ( flags!=0 );.  
91a0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
91b0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73  flags;.      bes
91c0: 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20  tNEq = nEq;.    
91d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f  }.  }..  /* Repo
91e0: 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75  rt the best resu
91f0: 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64  lt.  */.  *ppInd
9200: 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20  ex = bestIdx;.  
9210: 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e 64  TRACE(("best ind
9220: 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d 25  ex is %s, cost=%
9230: 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e  .9g, flags=%x, n
9240: 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  Eq=%d\n",.      
9250: 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73 74    bestIdx ? best
9260: 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e  Idx->zName : "(n
9270: 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73  one)", lowestCos
9280: 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62 65  t, bestFlags, be
9290: 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61  stNEq));.  *pFla
92a0: 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a  gs = bestFlags;.
92b0: 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45    *pnEq = bestNE
92c0: 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65  q;.  return lowe
92d0: 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  stCost;.}.../*.*
92e0: 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
92f0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
9300: 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
9310: 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
9320: 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
9330: 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
9340: 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
9350: 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
9360: 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
9370: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
9380: 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
9390: 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
93a0: 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
93b0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
93c0: 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
93d0: 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
93e0: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
93f0: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
9400: 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
9410: 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
9420: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
9430: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
9440: 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
9450: 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
9460: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
9470: 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
9480: 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
9490: 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
94a0: 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
94b0: 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
94c0: 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
94d0: 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
94e0: 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
94f0: 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
9500: 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
9510: 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
9520: 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
9530: 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
9540: 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
9550: 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
9560: 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
9570: 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
9580: 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
9590: 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
95a0: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
95b0: 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
95c0: 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
95d0: 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
95e0: 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
95f0: 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
9600: 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
9610: 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
9620: 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
9630: 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
9640: 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
9650: 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
9660: 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
9670: 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
9680: 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
9690: 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
96a0: 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
96b0: 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
96c0: 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
96d0: 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
96e0: 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
96f0: 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
9700: 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
9710: 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
9720: 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
9730: 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74  cket #813..*/.st
9740: 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
9750: 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
9760: 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
9770: 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
9780: 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26  f( pTerm.      &
9790: 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  & (pTerm->flags 
97a0: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
97b0: 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
97c0: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
97d0: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
97e0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
97f0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
9800: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66   ){.    pTerm->f
9810: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
9820: 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
9830: 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
9840: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
9850: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
9860: 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
9870: 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
9880: 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
9890: 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
98a0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
98b0: 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
98c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
98d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
98e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
98f0: 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20   builds a probe 
9900: 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 20 20 44  for an index.  D
9910: 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  etails:.**.**   
9920: 20 2a 20 20 43 68 65 63 6b 20 74 68 65 20 74 6f   *  Check the to
9930: 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65  p nColumn entrie
9940: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  s on the stack. 
9950: 20 49 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20   If any.**      
9960: 20 6f 66 20 74 68 6f 73 65 20 65 6e 74 72 69 65   of those entrie
9970: 73 20 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70  s are NULL, jump
9980: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
9990: 62 72 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68  brk,.**       wh
99a0: 69 63 68 20 69 73 20 74 68 65 20 6c 6f 6f 70 20  ich is the loop 
99b0: 65 78 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69  exit, since no i
99c0: 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20  ndex entry will 
99d0: 6d 61 74 63 68 0a 2a 2a 20 20 20 20 20 20 20 69  match.**       i
99e0: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
99f0: 65 20 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 20 50  e key is NULL. P
9a00: 6f 70 20 28 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74  op (nColumn+nExt
9a10: 72 61 29 20 0a 2a 2a 20 20 20 20 20 20 20 65 6c  ra) .**       el
9a20: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ements from the 
9a30: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  stack..**.**    
9a40: 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70  *  Construct a p
9a50: 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  robe entry from 
9a60: 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20  the top nColumn 
9a70: 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20  entries in.**   
9a80: 20 20 20 20 74 68 65 20 73 74 61 63 6b 20 77 69      the stack wi
9a90: 74 68 20 61 66 66 69 6e 69 74 69 65 73 20 61 70  th affinities ap
9aa0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
9ab0: 64 65 78 20 70 49 64 78 2e 20 0a 2a 2a 20 20 20  dex pIdx. .**   
9ac0: 20 20 20 20 4f 6e 6c 79 20 6e 43 6f 6c 75 6d 6e      Only nColumn
9ad0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 70 6f   elements are po
9ae0: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
9af0: 61 63 6b 20 69 6e 20 74 68 69 73 20 63 61 73 65  ack in this case
9b00: 0a 2a 2a 20 20 20 20 20 20 20 28 62 79 20 4f 50  .**       (by OP
9b10: 5f 4d 61 6b 65 52 65 63 6f 72 64 29 2e 0a 2a 2a  _MakeRecord)..**
9b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9b30: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
9b40: 0a 20 20 56 64 62 65 20 2a 76 2c 20 0a 20 20 69  .  Vdbe *v, .  i
9b50: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20 69  nt nColumn, .  i
9b60: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
9b70: 74 20 62 72 6b 2c 20 0a 20 20 49 6e 64 65 78 20  t brk, .  Index 
9b80: 2a 70 49 64 78 0a 29 7b 0a 20 20 73 71 6c 69 74  *pIdx.){.  sqlit
9b90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9ba0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c  P_NotNull, -nCol
9bb0: 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65  umn, sqlite3Vdbe
9bc0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
9bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9be0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
9bf0: 20 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 2c   nColumn+nExtra,
9c00: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
9c10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
9c20: 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20 73  to, 0, brk);.  s
9c30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9c40: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9c50: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
9c60: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
9c70: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
9c80: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
9c90: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
9ca0: 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
9cb0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
9cc0: 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
9cd0: 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
9ce0: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
9cf0: 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
9d00: 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
9d10: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
9d20: 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
9d30: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
9d40: 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
9d50: 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  int is left on t
9d60: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
9d70: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ack..**.** For a
9d80: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74   constraint of t
9d90: 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20  he form X=expr, 
9da0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9db0: 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
9dc0: 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73  its.** result is
9dd0: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
9de0: 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61  ck.  For constra
9df0: 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
9e00: 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74   X IN (...).** t
9e10: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
9e20: 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20   up a loop that 
9e30: 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65  will iterate ove
9e40: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
9e50: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  X..*/.static voi
9e60: 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  d codeEqualityTe
9e70: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
9e80: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
9e90: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
9ea0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
9eb0: 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
9ec0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
9ed0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
9ee0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62  coded */.  int b
9ef0: 72 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rk,            /
9f00: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 61  * Jump here to a
9f10: 62 61 6e 64 6f 6e 20 74 68 65 20 6c 6f 6f 70 20  bandon the loop 
9f20: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
9f30: 2a 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e  *pLevel  /* When
9f40: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
9f50: 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
9f60: 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29   working on */.)
9f70: 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70  {.  Expr *pX = p
9f80: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 69  Term->pExpr;.  i
9f90: 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  f( pX->op!=TK_IN
9fa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9fb0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  pX->op==TK_EQ );
9fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
9fd0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
9fe0: 3e 70 52 69 67 68 74 29 3b 0a 23 69 66 6e 64 65  >pRight);.#ifnde
9ff0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a000: 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
a010: 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
a020: 20 20 69 6e 74 20 2a 61 49 6e 3b 0a 20 20 20 20    int *aIn;.    
a030: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a040: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20 20 73 71  ->pVdbe;..    sq
a050: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
a060: 63 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b 0a  ct(pParse, pX);.
a070: 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
a080: 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
a090: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a0a0: 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
a0b0: 62 72 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  brk);.    VdbeCo
a0c0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 2e 2a  mment((v, "# %.*
a0d0: 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20  s", pX->span.n, 
a0e0: 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20  pX->span.z));.  
a0f0: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b    pLevel->nIn++;
a100: 0a 20 20 20 20 73 71 6c 69 74 65 52 65 61 6c 6c  .    sqliteReall
a110: 6f 63 4f 72 46 72 65 65 28 28 76 6f 69 64 2a 2a  ocOrFree((void**
a120: 29 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  )&pLevel->aInLoo
a130: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65      sizeof(pLeve
a160: 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 33  l->aInLoop[0])*3
a170: 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20  *pLevel->nIn);. 
a180: 20 20 20 61 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     aIn = pLevel-
a190: 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  >aInLoop;.    if
a1a0: 28 20 61 49 6e 20 29 7b 0a 20 20 20 20 20 20 61  ( aIn ){.      a
a1b0: 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49  In += pLevel->nI
a1c0: 6e 2a 33 20 2d 20 33 3b 0a 20 20 20 20 20 20 61  n*3 - 3;.      a
a1d0: 49 6e 5b 30 5d 20 3d 20 4f 50 5f 4e 65 78 74 3b  In[0] = OP_Next;
a1e0: 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20 3d 20  .      aIn[1] = 
a1f0: 69 54 61 62 3b 0a 20 20 20 20 20 20 61 49 6e 5b  iTab;.      aIn[
a200: 32 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  2] = sqlite3Vdbe
a210: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
a220: 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  mn, iTab, 0);.  
a230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
a240: 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a  Level->nIn = 0;.
a250: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a260: 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
a270: 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d  Level, pTerm);.}
a280: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a290: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
a2a0: 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
a2b0: 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
a2c0: 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
a2d0: 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20  ex.  The values 
a2e0: 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
a2f0: 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20  nts are left on 
a300: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
a310: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f   For example, co
a320: 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28  nsider table t1(
a330: 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74  a,b,c,d,e,f) wit
a340: 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63  h index i1(a,b,c
a350: 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  )..** Suppose th
a360: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
a370: 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e  s this:  a==5 AN
a380: 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41  D b IN (1,2,3) A
a390: 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a  ND c>5 AND c<10.
a3a0: 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73  ** The index has
a3b0: 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65   as many as thre
a3c0: 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
a3d0: 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74  raints, but in t
a3e0: 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  his.** example, 
a3f0: 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61  the third "c" va
a400: 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  lue is an inequa
a410: 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74  lity.  So only t
a420: 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  wo .** constrain
a430: 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54  ts are coded.  T
a440: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a450: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
a460: 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d  o evaluate.** a=
a470: 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32  =5 and b IN (1,2
a480: 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ,3).  The curren
a490: 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61  t values for a a
a4a0: 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 6c 65 66  nd b will be lef
a4b0: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
a4c0: 6b 20 2d 20 61 20 69 73 20 74 68 65 20 64 65 65  k - a is the dee
a4d0: 70 65 73 74 20 61 6e 64 20 62 20 74 68 65 20 73  pest and b the s
a4e0: 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a  hallowest..**.**
a4f0: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20   In the example 
a500: 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42  above nEq==2.  B
a510: 75 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  ut this subrouti
a520: 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
a530: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71   value.** of nEq
a540: 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49   including 0.  I
a550: 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72  f nEq==0, this r
a560: 6f 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79  outine is nearly
a570: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65   a no-op..** The
a580: 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64   only thing it d
a590: 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20  oes is allocate 
a5a0: 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  the pLevel->iMem
a5b0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a   memory cell..**
a5c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a5d0: 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
a5e0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
a5f0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 70  emory cell and p
a600: 75 74 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65  uts.** the addre
a610: 73 73 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ss of that memor
a620: 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c  y cell in pLevel
a630: 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64  ->iMem.  The cod
a640: 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
a650: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
a660: 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d  l use pLevel->iM
a670: 65 6d 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  em to store the 
a680: 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b  termination.** k
a690: 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
a6a0: 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72  loop.  If one or
a6b0: 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f   more IN operato
a6c0: 72 73 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a  rs appear, then.
a6d0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
a6e0: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64  allocates an add
a6f0: 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f  itional nEq memo
a700: 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74  ry cells for int
a710: 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f  ernal.** use..*/
a720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
a730: 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
a740: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
a750: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
a760: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a770: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
a780: 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
a790: 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
a7a0: 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
a7b0: 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65   coding */.  Whe
a7c0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
a7d0: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
a7e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d  clause */.  Bitm
a7f0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
a800: 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73    /* Which parts
a810: 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f   of FROM have no
a820: 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64  t yet been coded
a830: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 20 20 20   */.  int brk   
a840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
a850: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20  ump here to end 
a860: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  the loop */.){. 
a870: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
a880: 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f  l->nEq;        /
a890: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
a8a0: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
a8b0: 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
a8c0: 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d    int termsInMem
a8d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a8e0: 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72  /* If true, stor
a8f0: 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d  e value in mem[]
a900: 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65   cells */.  Vdbe
a910: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a920: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
a930: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a940: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
a950: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
a960: 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
a970: 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  Idx;   /* The in
a980: 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66  dex being used f
a990: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
a9a0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65    int iCur = pLe
a9b0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20  vel->iTabCur;   
a9c0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
a9d0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
a9e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
a9f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
aa00: 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
aa10: 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  aint term */.  i
aa20: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
aa50: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
aa60: 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
aa70: 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
aa80: 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
aa90: 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20  e them..  ** We 
aaa0: 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c  always need at l
aab0: 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f  east one used to
aac0: 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20   store the loop 
aad0: 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20  terminator.  ** 
aae0: 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65  value.  If there
aaf0: 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   are IN operator
ab00: 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65  s we'll need one
ab10: 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a   for each == or.
ab20: 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69    ** IN constrai
ab30: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65  nt..  */.  pLeve
ab40: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
ab50: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28 20  ->nMem++;.  if( 
ab60: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
ab70: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
ab80: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
ab90: 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  Mem += pLevel->n
aba0: 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d  Eq;.    termsInM
abb0: 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  em = 1;.  }..  /
abc0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
abd0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
abe0: 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6a  nts.  */.  for(j
abf0: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
ac00: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  umn; j++){.    i
ac10: 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
ac20: 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54  olumn[j];.    pT
ac30: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
ac40: 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
ac50: 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
ac60: 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  IN, pIdx);.    i
ac70: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
ac80: 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
ac90: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
aca0: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
acb0: 29 3b 0a 20 20 20 20 63 6f 64 65 45 71 75 61 6c  );.    codeEqual
acc0: 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
acd0: 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76  pTerm, brk, pLev
ace0: 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 74 65 72  el);.    if( ter
acf0: 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20  msInMem ){.     
ad00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad10: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
ad20: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a  , pLevel->iMem+j
ad30: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  +1, 1);.    }.  
ad40: 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
ad50: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  Eq );..  /* Make
ad60: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 63 6f   sure all the co
ad70: 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
ad80: 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  are on the top o
ad90: 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f  f the stack.  */
ada0: 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65  .  if( termsInMe
adb0: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  m ){.    for(j=0
adc0: 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
add0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ade0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
adf0: 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
ae00: 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d  m+j+1, 0);.    }
ae10: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
ae20: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
ae30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
ae40: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
ae50: 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
ae60: 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
ae70: 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
ae80: 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
ae90: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
aea0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
aeb0: 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
aec0: 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
aed0: 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
aee0: 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
aef0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
af00: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
af10: 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
af20: 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
af30: 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
af40: 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
af50: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
af60: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
af70: 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
af80: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
af90: 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
afa0: 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
afb0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
afc0: 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  T */..../*.** Ge
afd0: 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
afe0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
aff0: 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
b000: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
b010: 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
b020: 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
b030: 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
b040: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
b050: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
b060: 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
b070: 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
b080: 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
b090: 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
b0a0: 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
b0b0: 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
b0c0: 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
b0d0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
b0e0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
b0f0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
b100: 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
b110: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
b120: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
b130: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
b140: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
b150: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
b160: 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
b170: 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
b180: 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
b190: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
b1a0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
b1b0: 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
b1c0: 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
b1d0: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
b1e0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
b1f0: 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
b200: 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
b210: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
b220: 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
b230: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
b240: 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
b250: 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
b260: 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
b270: 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
b280: 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
b290: 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
b2a0: 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
b2b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
b2c0: 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
b2d0: 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
b2e0: 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
b2f0: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
b300: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
b310: 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
b320: 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
b330: 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
b340: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
b350: 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
b360: 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
b370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
b3a0: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
b3b0: 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
b3d0: 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
b3e0: 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
b3f0: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
b400: 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
b410: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
b420: 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
b430: 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
b440: 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
b450: 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
b460: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
b470: 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
b480: 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
b490: 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
b4a0: 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
b4b0: 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
b4c0: 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
b4d0: 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
b4e0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
b4f0: 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
b500: 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
b510: 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
b520: 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
b530: 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
b540: 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
b550: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
b560: 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
b570: 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
b580: 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
b590: 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
b5a0: 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
b5b0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
b5c0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
b5d0: 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
b5e0: 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
b5f0: 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
b600: 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
b610: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
b620: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
b630: 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
b640: 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
b650: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
b660: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
b670: 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
b680: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
b690: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
b6a0: 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
b6b0: 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
b6c0: 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
b6d0: 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
b6e0: 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
b6f0: 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
b700: 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
b710: 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
b720: 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
b730: 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
b740: 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
b750: 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
b760: 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
b770: 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
b780: 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
b790: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
b7a0: 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
b7b0: 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
b7c0: 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
b7d0: 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
b7e0: 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
b7f0: 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
b800: 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
b810: 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
b820: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
b830: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
b840: 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
b850: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
b860: 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
b870: 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
b880: 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
b890: 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
b8a0: 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
b8b0: 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
b8c0: 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
b8d0: 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
b8e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
b8f0: 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
b900: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
b910: 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
b920: 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
b930: 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
b940: 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
b950: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
b960: 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
b970: 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
b980: 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
b990: 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
b9a0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
b9b0: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
b9c0: 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
b9d0: 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
b9e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
b9f0: 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
ba00: 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
ba10: 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
ba20: 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
ba30: 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
ba40: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
ba50: 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
ba60: 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
ba70: 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
ba80: 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
ba90: 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
baa0: 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
bab0: 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
bac0: 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
bad0: 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
bae0: 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
baf0: 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
bb00: 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
bb10: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
bb20: 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
bb30: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
bb40: 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
bb50: 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
bb60: 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
bb70: 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
bb80: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
bb90: 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
bba0: 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
bbb0: 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
bbc0: 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
bbd0: 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
bbe0: 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
bbf0: 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
bc00: 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
bc10: 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
bc20: 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
bc30: 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
bc40: 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
bc50: 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
bc60: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
bc70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
bc80: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
bc90: 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
bca0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
bcb0: 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
bcc0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
bcd0: 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
bce0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
bcf0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
bd00: 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
bd10: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
bd20: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
bd30: 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
bd40: 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
bd50: 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
bd60: 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
bd70: 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
bd80: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
bd90: 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
bda0: 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
bdb0: 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
bdc0: 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
bdd0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
bde0: 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
bdf0: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
be00: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
be10: 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
be20: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
be30: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
be40: 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
be50: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
be60: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
be70: 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
be80: 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
be90: 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
bea0: 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
beb0: 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
bec0: 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
bed0: 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
bee0: 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
bef0: 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
bf00: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
bf10: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
bf20: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
bf30: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
bf40: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
bf50: 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
bf60: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
bf70: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
bf80: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
bf90: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
bfa0: 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a 20  **ppOrderBy  /* 
bfb0: 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
bfc0: 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  se, or NULL */.)
bfd0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bff0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c000: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
c010: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
c020: 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
c030: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
c040: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
c050: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
c060: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
c070: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
c080: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
c090: 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e  /.  int brk, con
c0a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
c0b0: 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65 64  * Addresses used
c0c0: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
c0d0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  eration */.  Bit
c0e0: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
c0f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
c100: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
c110: 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
c120: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
c130: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
c140: 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
c150: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
c160: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  use */.  ExprMas
c170: 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20 20  kSet maskSet;   
c180: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
c190: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
c1a0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
c1b0: 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  wc;            /
c1c0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
c1d0: 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  se is divided in
c1e0: 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20 2a  to these terms *
c1f0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
c200: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
c210: 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20  m;  /* A single 
c220: 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62 4c  entry from pTabL
c230: 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ist */.  WhereLe
c240: 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
c250: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
c260: 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74 68  ngle level in th
c270: 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f  e pWInfo list */
c280: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20  .  int iFrom;   
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
c2b0: 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ed FROM clause e
c2c0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
c2d0: 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20 20  andFlags;       
c2e0: 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64         /* AND-ed
c2f0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
c300: 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73  all wc.a[].flags
c310: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75   */..  /* The nu
c320: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
c330: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
c340: 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
c350: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
c360: 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
c370: 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28  mask .  */.  if(
c380: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
c390: 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
c3a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c3b0: 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
c3c0: 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
c3d0: 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
c3e0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
c3f0: 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
c400: 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
c410: 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
c420: 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
c430: 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
c440: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
c450: 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
c460: 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
c470: 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b  skSet(&maskSet);
c480: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
c490: 69 74 28 26 77 63 2c 20 70 50 61 72 73 65 29 3b  it(&wc, pParse);
c4a0: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77  .  whereSplit(&w
c4b0: 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  c, pWhere, TK_AN
c4c0: 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c  D);.    .  /* Al
c4d0: 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
c4e0: 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
c4f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
c500: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
c510: 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
c520: 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49  alue..  */.  pWI
c530: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
c540: 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65 72 65  oc( sizeof(Where
c550: 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74  Info) + pTabList
c560: 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68  ->nSrc*sizeof(Wh
c570: 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66  ereLevel));.  if
c580: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
c590: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
c5a0: 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
c5b0: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Mem;.  }.  pWInf
c5c0: 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72  o->pParse = pPar
c5d0: 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54  se;.  pWInfo->pT
c5e0: 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  abList = pTabLis
c5f0: 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
c600: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
c610: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
c620: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
c630: 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
c640: 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
c650: 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
c660: 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
c670: 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
c680: 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
c690: 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
c6a0: 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hru..  */.  if( 
c6b0: 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c  pWhere && (pTabL
c6c0: 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20  ist->nSrc==0 || 
c6d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
c6e0: 73 74 61 6e 74 28 70 57 68 65 72 65 29 29 20 29  stant(pWhere)) )
c6f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
c700: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
c710: 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
c720: 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20  >iBreak, 1);.   
c730: 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
c740: 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
c750: 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
c760: 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
c770: 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
c780: 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
c790: 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
c7a0: 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
c7b0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
c7c0: 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
c7d0: 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
c7e0: 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
c7f0: 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
c800: 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
c810: 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
c820: 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
c830: 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
c840: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
c850: 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
c860: 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
c870: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
c880: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
c890: 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b  createMask(&mask
c8a0: 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
c8b0: 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
c8c0: 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  }.  exprAnalyzeA
c8d0: 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 6d 61  ll(pTabList, &ma
c8e0: 73 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20 20 69  skSet, &wc);.  i
c8f0: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
c900: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
c910: 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e  goto whereBeginN
c920: 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oMem;.  }..  /* 
c930: 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
c940: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
c950: 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
c960: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
c970: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
c980: 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
c990: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
c9a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
c9b0: 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
c9c0: 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
c9d0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
c9e0: 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
c9f0: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
ca00: 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48  a[].flags     WH
ca10: 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
ca20: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
ca30: 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
ca40: 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
ca50: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
ca60: 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
ca70: 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
ca80: 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
ca90: 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68   When term of th
caa0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
cab0: 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
cac0: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
cad0: 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
cae0: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
caf0: 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
cb00: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
cb10: 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
cb20: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
cb30: 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
cb40: 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
cb50: 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
cb60: 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
cb70: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
cb80: 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
cb90: 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
cba0: 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
cbb0: 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
cbc0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
cbd0: 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
cbe0: 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
cbf0: 3d 20 7e 30 3b 0a 20 20 54 52 41 43 45 28 28 22  = ~0;.  TRACE(("
cc00: 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
cc10: 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
cc20: 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
cc30: 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
cc40: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
cc50: 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
cc60: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
cc70: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
cc80: 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
cc90: 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
cca0: 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
ccb0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
ccc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
ccd0: 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77  gs asssociated w
cce0: 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  ith pIdx */.    
ccf0: 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cd10: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
cd20: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
cd30: 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
cd40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd50: 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72   /* The cost for
cd60: 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
cd70: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
cd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
cd90: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
cda0: 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
cdb0: 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
cdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
cdd0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65  he best index se
cde0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
cdf0: 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d   int bestFlags =
ce00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
ce10: 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
ce20: 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
ce30: 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d     int bestNEq =
ce40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
ce50: 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64  * nEq associated
ce60: 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
ce70: 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74     double lowest
ce80: 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
ce90: 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42  * Cost of the pB
cea0: 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
ceb0: 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20  estJ = 0;       
cec0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
ced0: 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
cee0: 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cf00: 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
cf10: 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
cf20: 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b     int once = 0;
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf40: 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73  * True when firs
cf50: 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20  t table is seen 
cf60: 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f  */..    lowestCo
cf70: 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
cf80: 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  DBL;.    for(j=i
cf90: 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26  From, pTabItem=&
cfa0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
cfb0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
cfc0: 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
cfd0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  +){.      if( on
cfe0: 63 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ce && .         
cff0: 20 28 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69   ((pTabItem->joi
d000: 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
d010: 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 0a 20  |JT_CROSS))!=0. 
d020: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 6a 3e            || (j>
d030: 30 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 2d  0 && (pTabItem[-
d040: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  1].jointype & (J
d050: 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
d060: 29 21 3d 30 29 29 0a 20 20 20 20 20 20 29 7b 0a  )!=0)).      ){.
d070: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 20 3d       }.      m =
d090: 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
d0a0: 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
d0b0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
d0c0: 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d   (m & notReady)=
d0d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
d0e0: 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
d0f0: 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  om++;.        co
d100: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
d110: 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73        cost = bes
d120: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
d130: 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  wc, pTabItem, no
d140: 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d160: 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  i==0 && ppOrderB
d170: 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  y) ? *ppOrderBy 
d180: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
d190: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 49 64              &pId
d1a0: 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29  x, &flags, &nEq)
d1b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73 74  ;.      if( cost
d1c0: 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
d1d0: 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31 3b         once = 1;
d1e0: 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74 43  .        lowestC
d1f0: 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
d200: 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
d210: 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46 6c  ;.        bestFl
d220: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
d230: 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e       bestNEq = n
d240: 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  Eq;.        best
d250: 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  J = j;.      }. 
d260: 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
d270: 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63  "*** Optimizer c
d280: 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66  hoose table %d f
d290: 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62  or loop %d\n", b
d2a0: 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20  estJ,.          
d2b0: 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
d2c0: 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65  a));.    if( (be
d2d0: 73 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  stFlags & WHERE_
d2e0: 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20  ORDERBY)!=0 ){. 
d2f0: 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20       *ppOrderBy 
d300: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
d310: 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46  ndFlags &= bestF
d320: 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
d330: 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  ->flags = bestFl
d340: 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
d350: 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20  >pIdx = pBest;. 
d360: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d     pLevel->nEq =
d370: 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c   bestNEq;.    pL
d380: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20  evel->aInLoop = 
d390: 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  0;.    pLevel->n
d3a0: 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  In = 0;.    if( 
d3b0: 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70  pBest ){.      p
d3c0: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
d3d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d3e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d3f0: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
d400: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  r = -1;.    }.  
d410: 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
d420: 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
d430: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
d440: 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
d450: 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
d460: 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 54  = bestJ;.  }.  T
d470: 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
d480: 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
d490: 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  *\n"));..  /* If
d4a0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
d4b0: 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
d4c0: 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
d4d0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
d4e0: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
d4f0: 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
d500: 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
d510: 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
d520: 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
d530: 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
d540: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 0;.  }..  /* O
d550: 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
d560: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
d570: 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
d580: 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
d590: 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
d5a0: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
d5b0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
d5c0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
d5d0: 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
d5e0: 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
d5f0: 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65  er Goto */.  pLe
d600: 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
d610: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
d620: 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
d630: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
d640: 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
d650: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
d660: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
d670: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64   open */.    Ind
d680: 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a  ex *pIx;      /*
d690: 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61   Index used to a
d6a0: 63 63 65 73 73 20 70 54 61 62 20 28 69 66 20 61  ccess pTab (if a
d6b0: 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ny) */.    int i
d6c0: 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
d6d0: 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
d6e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
d6f0: 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e/index */.    i
d700: 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
d710: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23  vel->iIdxCur;..#
d720: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d730: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
d740: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
d750: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63  in==2 ){.      c
d760: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20  har *zMsg;.     
d770: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d780: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
d790: 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
d7a0: 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20  l->iFrom];.     
d7b0: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
d7c0: 50 72 69 6e 74 66 28 22 54 41 42 4c 45 20 25 73  Printf("TABLE %s
d7d0: 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
d7e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
d7f0: 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
d800: 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
d810: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 41  te3MPrintf("%z A
d820: 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
d830: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
d840: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
d850: 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
d860: 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
d870: 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
d880: 4d 50 72 69 6e 74 66 28 22 25 7a 20 57 49 54 48  MPrintf("%z WITH
d890: 20 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d 73 67   INDEX %s", zMsg
d8a0: 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  , pIx->zName);. 
d8b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
d8c0: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
d8d0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
d8e0: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
d8f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  ) ){.        zMs
d900: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
d910: 74 66 28 22 25 7a 20 55 53 49 4e 47 20 50 52 49  tf("%z USING PRI
d920: 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
d930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d940: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
d950: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c  , OP_Explain, i,
d960: 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
d970: 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43  zMsg, P3_DYNAMIC
d980: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
d990: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
d9a0: 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54  XPLAIN */.    pT
d9b0: 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
d9c0: 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
d9d0: 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
d9e0: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
d9f0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
da00: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
da10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
da20: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
da30: 69 66 28 20 70 54 61 62 2d 3e 69 73 54 72 61 6e  if( pTab->isTran
da40: 73 69 65 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70  sient || pTab->p
da50: 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
da60: 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  e;.    if( (pLev
da70: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
da80: 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
da90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
daa0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
dab0: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
dac0: 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  or, iDb, pTab, O
dad0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
dae0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
daf0: 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  l<(sizeof(Bitmas
db00: 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20  k)*8) ){.       
db10: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
db20: 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
db30: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
db40: 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
db50: 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
db60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
db70: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
db80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
db90: 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 6e 29  entAddr(v)-1, n)
dba0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
dbb0: 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
dbc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
dbe0: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
dbf0: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
dc00: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
dc10: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
dc20: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
dc30: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
dc40: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
dc50: 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
dc60: 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b  x)!=0 ){.      K
dc70: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
dc80: 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
dc90: 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
dca0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dcb0: 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
dcc0: 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
dcd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dce0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
dcf0: 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  er, iDb, 0);.   
dd00: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
dd10: 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e  v, "# %s", pIx->
dd20: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
dd30: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
dd40: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
dd50: 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
dd60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dd70: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
dd80: 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
dd90: 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20  ANDOFF);.    }. 
dda0: 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
ddb0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
ddc0: 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  X_ONLY)!=0 ){.  
ddd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dde0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
ddf0: 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75  mColumns, iIdxCu
de00: 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  r, pIx->nColumn+
de10: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
de20: 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
de30: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
de40: 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
de50: 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
de60: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
de70: 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  v);..  /* Genera
de80: 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
de90: 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
dea0: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
deb0: 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
dec0: 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
ded0: 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
dee0: 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
def0: 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
df00: 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
df10: 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
df20: 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
df30: 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
df40: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
df50: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
df60: 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a  el++){.    int j
df70: 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d  ;.    int iCur =
df80: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
df90: 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45  or;  /* The VDBE
dfa0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
dfb0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64  table */.    Ind
dfc0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
dfd0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
dfe0: 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
dff0: 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
e000: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56  ;       /* The V
e010: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
e020: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
e030: 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
e040: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
e050: 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f   use the index o
e060: 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  nly */.    int b
e070: 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Rev;          /*
e080: 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64   True if we need
e090: 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
e0a0: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20  rse order */..  
e0b0: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
e0c0: 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
e0d0: 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43  ->iFrom];.    iC
e0e0: 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
e0f0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78  Cursor;.    pIdx
e100: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b   = pLevel->pIdx;
e110: 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
e120: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
e130: 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76      bRev = (pLev
e140: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
e150: 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20  E_REVERSE)!=0;. 
e160: 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28     omitTable = (
e170: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
e180: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
e190: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  =0;..    /* Crea
e1a0: 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
e1b0: 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
e1c0: 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
e1d0: 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tions.    ** for
e1e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
e1f0: 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20  p.  Jump to brk 
e200: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
e210: 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a  a loop..    ** J
e220: 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
e230: 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
e240: 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
e250: 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ion of the.    *
e260: 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  * loop..    */. 
e270: 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d     brk = pLevel-
e280: 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  >brk = sqlite3Vd
e290: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
e2a0: 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65      cont = pLeve
e2b0: 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  l->cont = sqlite
e2c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
e2d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
e2e0: 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
e2f0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
e300: 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
e310: 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  cate and.    ** 
e320: 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
e330: 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
e340: 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
e350: 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
e360: 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68      ** row of th
e370: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
e380: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f  the join..    */
e390: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
e3a0: 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
e3b0: 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79  bItem[-1].jointy
e3c0: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
e3d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70   ){.      if( !p
e3e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50  Parse->nMem ) pP
e3f0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
e400: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
e410: 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  tJoin = pParse->
e420: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nMem++;.      sq
e430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e440: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
e450: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
e460: 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
e470: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69  mment((v, "# ini
e480: 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
e490: 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
e4a0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c 65    }..    if( pLe
e4b0: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
e4c0: 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
e4d0: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
e4e0: 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
e4f0: 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
e500: 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
e510: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
e520: 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
e530: 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
e540: 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
e550: 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   Or.      **    
e560: 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
e570: 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
e580: 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
e590: 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20  IN (...)".      
e5a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
e5b0: 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  truct..      */.
e5c0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
e5d0: 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
e5e0: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
e5f0: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
e600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e610: 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20  Term!=0 );.     
e620: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
e630: 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
e640: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
e650: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
e660: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
e670: 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
e680: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75  );.      codeEqu
e690: 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
e6a0: 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c  , pTerm, brk, pL
e6b0: 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  evel);.      sql
e6c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e6d0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31   OP_MustBeInt, 1
e6e0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71  , brk);.      sq
e6f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e700: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
e710: 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
e720: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e730: 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
e740: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
e750: 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
e760: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
e770: 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
e780: 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
e790: 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61  * Case 2:  We ha
e7a0: 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
e7b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
e7c0: 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
e7d0: 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eld..      */.  
e7e0: 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d      int testOp =
e7f0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
e800: 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20  int start;.     
e810: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61   WhereTerm *pSta
e820: 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  rt, *pEnd;..    
e830: 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
e840: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
e850: 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
e860: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
e870: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
e880: 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
e890: 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72    pEnd = findTer
e8a0: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
e8b0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
e8c0: 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_LE, 0);.    
e8d0: 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
e8e0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
e8f0: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53  tart;.        pS
e900: 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
e910: 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
e920: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
e930: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
e940: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
e950: 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53  .        pX = pS
e960: 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
e970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
e980: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
e990: 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65  sert( pStart->le
e9a0: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
e9b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
e9c0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e9d0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
e9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e9f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
ea00: 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d  rceInt, pX->op==
ea10: 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LE || pX->op=
ea20: 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20  =TK_GT, brk);.  
ea30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ea40: 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f  eAddOp(v, bRev ?
ea50: 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f   OP_MoveLt : OP_
ea60: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72  MoveGe, iCur, br
ea70: 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
ea80: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
ea90: 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  ));.        disa
eaa0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
eab0: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  pStart);.      }
eac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
ead0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
eae0: 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
eaf0: 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
eb00: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
eb10: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  }.      if( pEnd
eb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
eb30: 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58   *pX;.        pX
eb40: 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
eb50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
eb60: 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
eb70: 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
eb80: 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
eb90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
eba0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ebb0: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
ebc0: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
ebd0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
ebe0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Mem++;.        s
ebf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ec00: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
ec10: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
ec20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
ec30: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
ec40: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
ec50: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
ec60: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
ec70: 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20  : OP_Ge;.       
ec80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ec90: 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
eca0: 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
ecb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ecc0: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
ecd0: 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
ece0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
ecf0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
ed00: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ed10: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
ed20: 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
ed30: 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
ed40: 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
ed50: 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
ed60: 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
ed70: 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
ed80: 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
ed90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eda0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
edb0: 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
edc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
edd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
ede0: 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  ad, pLevel->iMem
edf0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
ee00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ee10: 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45  , testOp, SQLITE
ee20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 62 72  _AFF_NUMERIC, br
ee30: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
ee40: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
ee50: 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
ee60: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
ee70: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
ee80: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
ee90: 65 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65  e term that refe
eea0: 72 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  rs to the right-
eeb0: 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  most.      **   
eec0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20        column of 
eed0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20  the index is an 
eee0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72  inequality.  For
eef0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20   example, if.   
ef00: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
ef10: 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78  e index is on (x
ef20: 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48  ,y,z) and the WH
ef30: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66  ERE clause is of
ef40: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20   the.      **   
ef50: 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20        form "x=5 
ef60: 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74  AND y<10" then t
ef70: 68 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64  his case is used
ef80: 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20  .  Only the.    
ef90: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67    **         rig
efa0: 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
efb0: 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
efc0: 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
efd0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ust.      **    
efe0: 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
eff0: 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
f000: 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tors..      **. 
f010: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
f020: 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
f030: 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
f040: 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
f050: 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20  lause.      **  
f060: 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
f070: 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
f080: 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
f090: 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
f0a0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
f0b0: 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
f0c0: 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
f0d0: 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
f0e0: 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  Y..      */.    
f0f0: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
f100: 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
f110: 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20  vel->nEq;.      
f120: 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20  int topEq=0;    
f130: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
f140: 6f 70 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d  op limit uses ==
f150: 2e 20 46 61 6c 73 65 20 69 73 20 73 74 72 69 63  . False is stric
f160: 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69  tly < */.      i
f170: 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20  nt btmEq=0;     
f180: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74     /* True if bt
f190: 6d 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e  m limit uses ==.
f1a0: 20 46 61 6c 73 65 20 69 66 20 73 74 72 69 63 74   False if strict
f1b0: 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ly > */.      in
f1c0: 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20  t topOp, btmOp; 
f1d0: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66    /* Operators f
f1e0: 6f 72 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62  or the top and b
f1f0: 6f 74 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75  ottom search bou
f200: 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nds */.      int
f210: 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69   testOp;.      i
f220: 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  nt nNotNull;    
f230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f240: 72 6f 77 73 20 6f 66 20 69 6e 64 65 78 20 74 68  rows of index th
f250: 61 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e  at must be non-N
f260: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ULL */.      int
f270: 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65   topLimit = (pLe
f280: 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
f290: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30  RE_TOP_LIMIT)!=0
f2a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c  ;.      int btmL
f2b0: 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  imit = (pLevel->
f2c0: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  flags & WHERE_BT
f2d0: 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20  M_LIMIT)!=0;..  
f2e0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f2f0: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
f300: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
f310: 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
f320: 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
f330: 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75  d level the valu
f340: 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
f350: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
f360: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
f370: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
f380: 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
f390: 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
f3a0: 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20  y, brk);..      
f3b0: 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
f3c0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76   equality term v
f3d0: 61 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68  alues because th
f3e0: 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20  ey will all be. 
f3f0: 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69       ** used twi
f400: 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65  ce: once to make
f410: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
f420: 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f   key and once to
f430: 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20   make the.      
f440: 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20  ** start key..  
f450: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
f460: 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
f470: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f480: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f490: 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29  P_Dup, nEq-1, 0)
f4a0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
f4b0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
f4c0: 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  hat comparison o
f4d0: 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20  perators to use 
f4e0: 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74  for top and bott
f4f0: 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61  om .      ** sea
f500: 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20  rch bounds. For 
f510: 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
f520: 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62  ex, the bottom b
f530: 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e  ound is a > or >
f540: 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61  =.      ** opera
f550: 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20  tor and the top 
f560: 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20  bound is a < or 
f570: 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f  <= operator.  Fo
f580: 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20  r a descending. 
f590: 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68       ** index th
f5a0: 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  e operators are 
f5b0: 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20  reversed..      
f5c0: 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e 75 6c  */.      nNotNul
f5d0: 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
f5e0: 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  it;.      if( pI
f5f0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
f600: 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
f610: 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f  SC ){.        to
f620: 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  pOp = WO_LT|WO_L
f630: 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70  E;.        btmOp
f640: 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a   = WO_GT|WO_GE;.
f650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f660: 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f       topOp = WO_
f670: 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20  GT|WO_GE;.      
f680: 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c    btmOp = WO_LT|
f690: 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53  WO_LE;.        S
f6a0: 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69  WAP(int, topLimi
f6b0: 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20  t, btmLimit);.  
f6c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
f6d0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72  Generate the ter
f6e0: 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54  mination key.  T
f6f0: 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76  his is the key v
f700: 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20  alue that.      
f710: 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20  ** will end the 
f720: 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69  search.  There i
f730: 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e  s no termination
f740: 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20   key if there.  
f750: 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71      ** are no eq
f760: 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64  uality terms and
f770: 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d   no "X<..." term
f780: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
f790: 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a   ** 2002-Dec-04:
f7a0: 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72   On a reverse-or
f7b0: 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f  der scan, the so
f7c0: 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61  -called "termina
f7d0: 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b  tion".      ** k
f7e0: 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65  ey computed here
f7f0: 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
f800: 62 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  being the start 
f810: 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
f820: 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74      if( topLimit
f830: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
f840: 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e   *pX;.        in
f850: 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
f860: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
f870: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
f880: 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20  m(&wc, iCur, k, 
f890: 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c  notReady, topOp,
f8a0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
f8b0: 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
f8c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d   );.        pX =
f8d0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
f8e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
f8f0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
f900: 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
f910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f920: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f930: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
f940: 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54        topEq = pT
f950: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
f960: 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
f970: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
f980: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
f990: 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  m);.        test
f9a0: 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20  Op = OP_IdxGE;. 
f9b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f9c0: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71      testOp = nEq
f9d0: 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20  >0 ? OP_IdxGE : 
f9e0: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
f9f0: 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20 20   topEq = 1;.    
fa00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65    }.      if( te
fa10: 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
fa20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
fa30: 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
fa40: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  it;.        pLev
fa50: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
fa60: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
fa70: 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
fa80: 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71 2c  be(v, nCol, nEq,
fa90: 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
faa0: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
fab0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
fac0: 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d  p = topEq ? OP_M
fad0: 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c  oveLe : OP_MoveL
fae0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
faf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fb00: 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72   op, iIdxCur, br
fb10: 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  k);.        }els
fb20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
fb30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fb40: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
fb50: 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
fb60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb70: 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
fb80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fb90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fba0: 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20  _Last, iIdxCur, 
fbb0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  brk);.      }.. 
fbc0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
fbd0: 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20   the start key. 
fbe0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
fbf0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
fc00: 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a  e lower.      **
fc10: 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65   bound on the se
fc20: 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
fc30: 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20  no start key if 
fc40: 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20  there are no.   
fc50: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74     ** equality t
fc60: 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72  erms and if ther
fc70: 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20  e is no "X>..." 
fc80: 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20  term.  In.      
fc90: 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65  ** that case, ge
fca0: 6e 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64  nerate a "Rewind
fcb0: 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  " instruction in
fcc0: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20   place of the.  
fcd0: 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
fce0: 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a   search..      *
fcf0: 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d  *.      ** 2002-
fd00: 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63  Dec-04: In the c
fd10: 61 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65  ase of a reverse
fd20: 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74  -order search, t
fd30: 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20  he so-called.   
fd40: 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65     ** "start" ke
fd50: 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70  y really ends up
fd60: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74   being used as t
fd70: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
fd80: 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
fd90: 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20     if( btmLimit 
fda0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
fdb0: 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
fdc0: 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
fdd0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
fde0: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
fdf0: 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
fe00: 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20  otReady, btmOp, 
fe10: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61  pIdx);.        a
fe20: 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
fe30: 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  );.        pX = 
fe40: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
fe50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
fe60: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
fe70: 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
fe80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fe90: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
fea0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
feb0: 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65       btmEq = pTe
fec0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fed0: 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
fee0: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
fef0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
ff00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ff10: 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20          btmEq = 
ff20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
ff30: 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74   if( nEq>0 || bt
ff40: 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  mLimit ){.      
ff50: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71    int nCol = nEq
ff60: 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20   + btmLimit;.   
ff70: 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
ff80: 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c  robe(v, nCol, 0,
ff90: 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
ffa0: 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
ffb0: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65  .          pLeve
ffc0: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
ffd0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
ffe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fff0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
10000 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
10010 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  m, 1);.         
10020 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78   testOp = OP_Idx
10030 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  LT;.        }els
10040 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
10050 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50   op = btmEq ? OP
10060 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveGe : OP_Mov
10070 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eGt;.          s
10080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10090 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
100a0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  brk);.        }.
100b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
100c0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
100d0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
100e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
100f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10100 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
10110 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62  wind, iIdxCur, b
10120 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
10130 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10140 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74  the the top of t
10150 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65  he loop.  If the
10160 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74  re is a terminat
10170 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  ion.      ** key
10180 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74   we have to test
10190 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e   for that key an
101a0 64 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74  d abort at the t
101b0 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  op of the.      
101c0 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a  ** loop..      *
101d0 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20  /.      start = 
101e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
101f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
10200 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
10210 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
10220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10230 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
10240 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29  pLevel->iMem, 0)
10250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10260 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65  3VdbeAddOp(v, te
10270 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  stOp, iIdxCur, b
10280 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rk);.        if(
10290 20 28 74 6f 70 45 71 20 26 26 20 21 62 52 65 76   (topEq && !bRev
102a0 29 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20  ) || (!btmEq && 
102b0 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  bRev) ){.       
102c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
102d0 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b  angeP3(v, -1, "+
102e0 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
102f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10310 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
10320 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30  wKey, iIdxCur, 0
10330 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10340 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10350 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e  IdxIsNull, nNotN
10360 75 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  ull, cont);.    
10370 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
10380 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10390 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
103a0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
103b0 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
103c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
103d0 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
103e0 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
103f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63   }..      /* Rec
10400 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
10410 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
10420 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a  inate the loop..
10430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
10440 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
10450 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
10460 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
10470 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
10480 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
10490 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
104a0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
104b0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
104c0 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20  COLUMN_EQ ){.   
104d0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
104e0 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
104f0 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f   and all terms o
10500 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
10510 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  se that.      **
10520 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72 20            refer 
10530 74 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  to the index usi
10540 6e 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22  ng the "==" or "
10550 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20  IN" operators.. 
10560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
10570 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
10580 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
10590 3e 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  >nEq;..      /* 
105a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
105b0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
105c0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
105d0 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
105e0 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65      ** and leave
105f0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
10600 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68  hose terms on th
10610 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
10620 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45  /.      codeAllE
10630 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
10640 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63  rse, pLevel, &wc
10650 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29  , notReady, brk)
10660 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
10670 72 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65  rate a single ke
10680 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
10690 73 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72  sed to both star
106a0 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a  t and terminate.
106b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61        ** the sea
106c0 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rch.      */.   
106d0 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
106e0 62 65 28 76 2c 20 6e 45 71 2c 20 30 2c 20 62 72  be(v, nEq, 0, br
106f0 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
10700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10710 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
10720 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
10730 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
10740 65 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74  erate code (1) t
10750 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69  o move to the fi
10760 72 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65  rst matching ele
10770 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
10780 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  e..      ** Then
10790 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   generate code (
107a0 32 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  2) that jumps to
107b0 20 22 62 72 6b 22 20 61 66 74 65 72 20 74 68 65   "brk" after the
107c0 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a   cursor is past.
107d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
107e0 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65  t matching eleme
107f0 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  nt of the table.
10800 20 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69    The code (1) i
10810 73 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20  s executed.     
10820 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74   ** once to init
10830 69 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63  ialize the searc
10840 68 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20  h, the code (2) 
10850 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f  is executed befo
10860 72 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a  re each.      **
10870 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
10880 65 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66  e scan to see if
10890 20 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69   the scan has fi
108a0 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20  nished. */.     
108b0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
108c0 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
108d0 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
108e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
108f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10900 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c  MoveLe, iIdxCur,
10910 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
10920 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
10930 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
10940 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
10950 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
10960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10970 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69  p(v, OP_IdxLT, i
10980 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
10990 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
109a0 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
109b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
109c0 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20   /* Scan in the 
109d0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f  forward order */
109e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
109f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a00 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c  MoveGe, iIdxCur,
10a10 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
10a20 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
10a30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
10a40 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
10a50 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
10a60 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10a70 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64  v, OP_IdxGE, iId
10a80 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20  xCur, brk, "+", 
10a90 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10aa0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
10ab0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
10ac0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
10ad0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
10ae0 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20  owKey, iIdxCur, 
10af0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10b00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10b10 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c  _IdxIsNull, nEq,
10b20 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66   cont);.      if
10b30 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
10b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10b50 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10b60 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
10b70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
10b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10b90 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
10ba0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
10bb0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
10bc0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
10bd0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
10be0 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
10bf0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a        /* Case 5:
10c00 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
10c10 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
10c20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
10c30 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  te.      **     
10c40 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
10c50 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
10c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
10c70 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
10c80 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
10c90 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
10ca0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
10cb0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
10cc0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
10cd0 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
10ce0 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
10cf0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10d00 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
10d10 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  brk);.    }.    
10d20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
10d30 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69  Mask(&maskSet, i
10d40 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Cur);..    /* In
10d50 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
10d60 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
10d70 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
10d80 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20  e completely.   
10d90 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
10da0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
10db0 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
10dc0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65    */.    for(pTe
10dd0 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54  rm=wc.a, j=wc.nT
10de0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
10df0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Term++){.      E
10e00 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
10e10 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
10e20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
10e30 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
10e40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
10e50 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
10e60 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
10e70 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
10e80 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d       pE = pTerm-
10e90 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
10ea0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
10eb0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
10ec0 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
10ed0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10ee0 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
10ef0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  ){.        conti
10f00 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
10f10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
10f20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
10f30 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20  , cont, 1);.    
10f40 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
10f50 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
10f60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
10f70 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
10f80 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
10f90 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
10fa0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
10fb0 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
10fc0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
10fd0 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
10fe0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
10ff0 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a  table.  .    */.
11000 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
11010 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
11020 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d     pLevel->top =
11030 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11040 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
11050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11060 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
11070 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
11080 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64  tJoin);.      Vd
11090 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
110a0 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49   record LEFT JOI
110b0 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20  N hit"));.      
110c0 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20  for(pTerm=wc.a, 
110d0 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b  j=0; j<wc.nTerm;
110e0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
110f0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
11100 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
11110 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
11120 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
11130 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
11140 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
11150 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
11160 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11170 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
11180 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
11190 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
111a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
111b0 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c  rm->pExpr, cont,
111c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   1);.        pTe
111d0 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
111e0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d  M_CODED;.      }
111f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
11200 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20  ef SQLITE_TEST  
11210 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61  /* For testing a
11220 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
11230 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65   only */.  /* Re
11240 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72  cord in the quer
11250 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69  y plan informati
11260 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
11270 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  rent table.  ** 
11280 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73  and the index us
11290 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20  ed to access it 
112a0 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68  (if any).  If th
112b0 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20  e table itself. 
112c0 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c   ** is not used,
112d0 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73   its name is jus
112e0 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69  t '{}'.  If no i
112f0 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a  ndex is used.  *
11300 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c  * the index is l
11310 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20  isted as "{}".  
11320 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  If the primary k
11330 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20  ey is used the. 
11340 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69   ** index name i
11350 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s '*'..  */.  fo
11360 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
11370 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
11380 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
11390 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65  int n;.    pLeve
113a0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
113b0 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ];.    pTabItem 
113c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
113d0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
113e0 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d     z = pTabItem-
113f0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28  >zAlias;.    if(
11400 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62   z==0 ) z = pTab
11410 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
11420 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  e;.    n = strle
11430 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b  n(z);.    if( n+
11440 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
11450 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
11460 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20  an)-10 ){.      
11470 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
11480 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
11490 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  LY ){.        st
114a0 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
114b0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
114c0 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20  , "{}");.       
114d0 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
114e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
114f0 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
11500 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
11510 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  Plan], z);.     
11520 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
11530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11540 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
11550 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
11560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11570 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
11580 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
11590 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
115a0 45 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  E) ){.      strc
115b0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
115c0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
115d0 22 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50  "* ");.      nQP
115e0 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
115f0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
11600 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
11610 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
11620 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
11630 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20  an], "{} ");.   
11640 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
11650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11660 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76   n = strlen(pLev
11670 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  el->pIdx->zName)
11680 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
11690 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
116a0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
116b0 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  )-2 ){.        s
116c0 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
116d0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
116e0 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  ], pLevel->pIdx-
116f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
11700 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
11710 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
11720 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
11730 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
11740 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
11750 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
11760 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
11770 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
11780 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
11790 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
117a0 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
117b0 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
117c0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
117d0 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
117e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
117f0 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
11800 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
11810 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
11820 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
11830 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
11840 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
11850 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
11860 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
11870 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
11880 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
11890 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
118a0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
118b0 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
118c0 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
118d0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
118e0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
118f0 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
11900 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
11910 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  wc);.  sqliteFre
11920 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  e(pWInfo);.  ret
11930 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11940 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
11950 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
11960 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
11970 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
11980 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
11990 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
119a0 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
119b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
119c0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
119d0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
119e0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
119f0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
11a00 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
11a10 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
11a20 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
11a30 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a  nfo->pTabList;..
11a40 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
11a50 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
11a60 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ode..  */.  for(
11a70 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i=pTabList->nSrc
11a80 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
11a90 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
11aa0 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
11ab0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11ac0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
11ad0 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66  l->cont);.    if
11ae0 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50  ( pLevel->op!=OP
11af0 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73  _Noop ){.      s
11b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11b10 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
11b20 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
11b30 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p2);.    }.  
11b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11b50 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
11b60 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69  vel->brk);.    i
11b70 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29  f( pLevel->nIn )
11b80 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 3b 0a  {.      int *a;.
11b90 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
11ba0 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
11bb0 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65 6c 2d  >nIn, a=&pLevel-
11bc0 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 33 2d 33 5d 3b  >aInLoop[j*3-3];
11bd0 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d 33 29   j>0; j--, a-=3)
11be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11bf0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 61 5b  3VdbeAddOp(v, a[
11c00 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b  0], a[1], a[2]);
11c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11c20 71 6c 69 74 65 46 72 65 65 28 70 4c 65 76 65 6c  qliteFree(pLevel
11c30 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->aInLoop);.    
11c40 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
11c50 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
11c60 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
11c70 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
11c80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11c90 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65  OP_IfMemPos, pLe
11ca0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20  vel->iLeftJoin, 
11cb0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11cc0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11cd0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
11ce0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
11cf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
11d00 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
11d10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
11d20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11d30 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c  , OP_NullRow, pL
11d40 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30  evel->iIdxCur, 0
11d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d70 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
11d80 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20   pLevel->top);. 
11d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11da0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11db0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11dc0 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
11dd0 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
11de0 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
11df0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
11e00 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
11e10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
11e20 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11e30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
11e40 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
11e50 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
11e60 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
11e70 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
11e80 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
11e90 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
11ea0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
11eb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
11ec0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
11ed0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
11ee0 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
11ef0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
11f00 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
11f10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
11f20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
11f30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11f40 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
11f50 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
11f60 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
11f70 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
11f80 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66    if( (pLevel->f
11f90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
11fa0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  _ONLY)==0 ){.   
11fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11fc0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11fd0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
11fe0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  or, 0);.    }.  
11ff0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49    if( pLevel->pI
12000 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  dx!=0 ){.      s
12010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12020 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65  v, OP_Close, pLe
12030 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29  vel->iIdxCur, 0)
12040 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12050 4d 61 6b 65 20 63 75 72 73 6f 72 20 73 75 62 73  Make cursor subs
12060 74 69 74 75 74 69 6f 6e 73 20 66 6f 72 20 63 61  titutions for ca
12070 73 65 73 20 77 68 65 72 65 20 77 65 20 77 61 6e  ses where we wan
12080 74 20 74 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20  t to use.    ** 
12090 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 61  just the index a
120a0 6e 64 20 6e 65 76 65 72 20 72 65 66 65 72 65 6e  nd never referen
120b0 63 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  ce the table..  
120c0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
120d0 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
120e0 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
120f0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
12100 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
12110 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
12120 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
12130 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
12140 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
12150 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
12160 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
12170 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
12180 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
12190 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
121a0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
121b0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
121c0 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
121d0 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
121e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
121f0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
12200 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
12210 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
12220 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NLY ){.      int
12230 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
12240 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
12250 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
12260 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
12270 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
12280 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
12290 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
122a0 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
122b0 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
122c0 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
122d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
122e0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
122f0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
12300 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
12310 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
12320 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
12330 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
12340 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
12350 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
12360 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
12370 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
12380 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
12390 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
123a0 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
123b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
123c0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
123d0 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
123e0 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
123f0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
12400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
12410 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12420 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
12430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12440 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
12450 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
12460 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
12470 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
12480 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
12490 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
124a0 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  wid;.        }el
124b0 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
124c0 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29  de==OP_NullRow )
124d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
124e0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
124f0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
12500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12510 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
12520 75 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  up.  */.  sqlite
12530 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
12540 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.