/ Hex Artifact Content
Login

Artifact 306fafa709ced14b1c816d38b96a8f4446ec1eeb:


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 37 37   where.c,v 1.277
0340: 20 32 30 30 38 2f 30 31 2f 30 37 20 31 39 3a 32   2008/01/07 19:2
0350: 30 3a 32 35 20 64 72 68 20 45 78 70 20 24 0a 2a  0:25 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  )../*.** Trace o
03f0: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0410: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0420: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0430: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68  ).int sqlite3_wh
0440: 65 72 65 5f 74 72 61 63 65 20 3d 20 30 3b 0a 23  ere_trace = 0;.#
0450: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0460: 43 45 28 58 29 20 20 69 66 28 73 71 6c 69 74 65  CE(X)  if(sqlite
0470: 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29 20 73  3_where_trace) s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  f X.#else.# defi
04a0: 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29  ne WHERETRACE(X)
04b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
04c0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f  ard reference.*/
04d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04e0: 57 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72  WhereClause Wher
04f0: 65 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66  eClause;.typedef
0500: 20 73 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b   struct ExprMask
0510: 53 65 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b  Set ExprMaskSet;
0520: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0530: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0540: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0550: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
0560: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
0570: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
0580: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
0590: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05a0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05b0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
05c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
05d0: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
05e0: 20 6f 74 68 65 72 73 20 62 79 20 61 6e 20 41 4e   others by an AN
05f0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  D operator..**.*
0600: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
0610: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
0620: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
0630: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
0640: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
0650: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
0660: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
0670: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
0680: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
0690: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
06a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
06b0: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
06c0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
06d0: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
06e0: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
06f0: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
0700: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
0710: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
0720: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
0730: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
0740: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
0750: 65 72 6d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72  erm.leftColumn r
0760: 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75 72  ecord the.** cur
0770: 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  sor number and c
0780: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72  olumn number for
0790: 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d 2e 6f   X.  WhereTerm.o
07a0: 70 65 72 61 74 6f 72 20 72 65 63 6f 72 64 73 0a  perator records.
07b0: 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e  ** the <op> usin
07c0: 67 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  g a bitmask enco
07d0: 64 69 6e 67 20 64 65 66 69 6e 65 64 20 62 79 20  ding defined by 
07e0: 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20 20 54  WO_xxx below.  T
07f0: 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61 20 62  he.** use of a b
0800: 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20  itmask encoding 
0810: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
0820: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 65   allows us to se
0830: 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20  arch.** quickly 
0840: 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 6d  for terms that m
0850: 61 74 63 68 20 61 6e 79 20 6f 66 20 73 65 76 65  atch any of seve
0860: 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 6f 70  ral different op
0870: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70  erators..**.** p
0880: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
0890: 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64 20  rereqAll record 
08a0: 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20 6e  sets of cursor n
08b0: 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74  umbers,.** but t
08c0: 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72 65  hey do so indire
08d0: 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ctly.  A single 
08e0: 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75  ExprMaskSet stru
08f0: 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74 65 73  cture translates
0900: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
0910: 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e 64 20  r into bits and 
0920: 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20 62  the translated b
0930: 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
0940: 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20 66 69  the prereq.** fi
0950: 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61 6e 73  elds.  The trans
0960: 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  lation is used i
0970: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78 69 6d  n order to maxim
0980: 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ize the number o
0990: 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74 20 77  f.** bits that w
09a0: 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42 69 74  ill fit in a Bit
09b0: 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42 45 20  mask.  The VDBE 
09c0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
09d0: 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72 65 61  ight be.** sprea
09e0: 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20 6e  d out over the n
09f0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
0a00: 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  gers.  For examp
0a10: 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  le, the cursor.*
0a20: 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  * numbers might 
0a30: 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20  be 3, 8, 9, 10, 
0a40: 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64 20  20, 23, 41, and 
0a50: 34 35 2e 20 20 54 68 65 20 45 78 70 72 4d 61 73  45.  The ExprMas
0a60: 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  kSet.** translat
0a70: 65 73 20 74 68 65 73 65 20 73 70 61 72 73 65 20  es these sparse 
0a80: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
0a90: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
0aa0: 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65 67 69  integers.** begi
0ab0: 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69 6e 20  nning with 0 in 
0ac0: 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68  order to make th
0ad0: 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  e best possible 
0ae0: 75 73 65 20 6f 66 20 74 68 65 20 61 76 61 69 6c  use of the avail
0af0: 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20  able.** bits in 
0b00: 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f  the Bitmask.  So
0b10: 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  , in the example
0b20: 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75 72 73   above, the curs
0b30: 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f  or numbers.** wo
0b40: 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 69 6e  uld be mapped in
0b50: 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20 74 68  to integers 0 th
0b60: 72 6f 75 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65  rough 7..*/.type
0b70: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0b80: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0b90: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0ba0: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0bc0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0bd0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
0be0: 20 20 69 31 36 20 69 50 61 72 65 6e 74 3b 20 20    i16 iParent;  
0bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
0c00: 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72  able pWC->a[iPar
0c10: 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74  ent] when this t
0c20: 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  erm disabled */.
0c30: 20 20 69 31 36 20 6c 65 66 74 43 75 72 73 6f 72    i16 leftCursor
0c40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
0c50: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  sor number of X 
0c60: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
0c70: 3e 22 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74  >" */.  i16 left
0c80: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
0c90: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
0ca0: 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e   of X in "X <op>
0cb0: 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31   <expr>" */.  u1
0cc0: 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20  6 eOperator;    
0cd0: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
0ce0: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
0cf0: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66  g <op> */.  u8 f
0d00: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
0d10: 20 20 20 20 2f 2a 20 42 69 74 20 66 6c 61 67 73      /* Bit flags
0d20: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
0d30: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
0d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0d50: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
0d60: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
0d70: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
0d80: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
0d90: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
0da0: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
0db0: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
0dc0: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
0dd0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
0de0: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
0df0: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
0e00: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
0e10: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
0e20: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
0e30: 65 64 20 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f  ed by p */.};../
0e40: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0e50: 75 65 73 20 6f 66 20 57 68 65 72 65 54 65 72 6d  ues of WhereTerm
0e60: 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  .flags.*/.#defin
0e70: 65 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20  e TERM_DYNAMIC  
0e80: 20 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64    0x01   /* Need
0e90: 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
0ea0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
0eb0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
0ec0: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
0ed0: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
0ee0: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
0ef0: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
0f00: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
0f10: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
0f20: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
0f30: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
0f40: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
0f50: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
0f60: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
0f70: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
0f80: 4f 4b 20 20 20 20 20 20 30 78 31 30 20 20 20 2f  OK      0x10   /
0f90: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
0fa0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
0fb0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ng */../*.** An 
0fc0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0fe0: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
0ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1000: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
1010: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
1020: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
1030: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
1040: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
1050: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
1060: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
1070: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
1080: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1090: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  ext */.  ExprMas
10a0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
10b0: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20    /* Mapping of 
10c0: 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f  table indices to
10d0: 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 69   bitmasks */.  i
10e0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
10f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1100: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1110: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1130: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1140: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1150: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1160: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1170: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1180: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1190: 61 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ase */.  WhereTe
11a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20  rm aStatic[10]; 
11b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
11c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
11d0: 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ] */.};../*.** A
11e0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
11f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1200: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
1210: 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a  k of a mapping.*
1220: 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63  * between VDBE c
1230: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e  ursor numbers an
1240: 64 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69  d bits of the bi
1250: 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54  tmasks in WhereT
1260: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  erm..**.** The V
1270: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1280: 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74  rs are small int
1290: 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  egers contained 
12a0: 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69  in .** SrcList_i
12b0: 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20  tem.iCursor and 
12c0: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
12d0: 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76  ds.  For any giv
12e0: 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61  en WHERE .** cla
12f0: 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  use, the cursor 
1300: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f  numbers might no
1310: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
1320: 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a  nd they might.**
1330: 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e   contain gaps in
1340: 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73   the numbering s
1350: 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65  equence.  But we
1360: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61   want to make ma
1370: 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20  ximum.** use of 
1380: 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20  the bits in our 
1390: 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20  bitmasks.  This 
13a0: 73 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64  structure provid
13b0: 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  es a mapping.** 
13c0: 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20  from the sparse 
13d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
13e0: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
13f0: 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69  integers beginni
1400: 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a  ng.** with 0..**
1410: 0a 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53  .** If ExprMaskS
1420: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
1430: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
1440: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
1450: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
1460: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
1470: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
1480: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
1490: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
14a0: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
14b0: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
14c0: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
14d0: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
14e0: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
14f0: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
1500: 20 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72    Then the  Expr
1510: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
1520: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
1530: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
1540: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
1550: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
1560: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
1570: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
1580: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
1590: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
15a0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
15b0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
15c0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
15d0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
15e0: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
15f0: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
1600: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
1610: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
1620: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
1630: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
1640: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
1650: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
1660: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
1670: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
1680: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
1690: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
16a0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
16b0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
16c0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45  aps..*/.struct E
16d0: 78 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69  xprMaskSet {.  i
16e0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1700: 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e  Number of assign
1710: 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73  ed cursor values
1720: 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a   */.  int ix[siz
1730: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b  eof(Bitmask)*8];
1740: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73      /* Cursor as
1750: 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62  signed to each b
1760: 69 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  it */.};.../*.**
1770: 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68   Bitmasks for th
1780: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
1790: 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c   indices are abl
17a0: 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41  e to exploit.  A
17b0: 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69  n.** OR-ed combi
17c0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  nation of these 
17d0: 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73  values can be us
17e0: 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  ed when searchin
17f0: 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69  g for.** terms i
1800: 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  n the where clau
1810: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se..*/.#define W
1820: 4f 5f 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69  O_IN     1.#defi
1830: 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 32 0a 23  ne WO_EQ     2.#
1840: 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20  define WO_LT    
1850: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d   (WO_EQ<<(TK_LT-
1860: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
1870: 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_LE     (WO_EQ
1880: 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29  <<(TK_LE-TK_EQ))
1890: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20  .#define WO_GT  
18a0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18b0: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
18c0: 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f  e WO_GE     (WO_
18d0: 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51  EQ<<(TK_GE-TK_EQ
18e0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41  )).#define WO_MA
18f0: 54 43 48 20 20 36 34 0a 23 64 65 66 69 6e 65 20  TCH  64.#define 
1900: 57 4f 5f 49 53 4e 55 4c 4c 20 31 32 38 0a 0a 2f  WO_ISNULL 128../
1910: 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 66  *.** Value for f
1920: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1930: 20 62 65 73 74 49 6e 64 65 78 28 29 2e 20 20 0a   bestIndex().  .
1940: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74 20  **.** The least 
1950: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65  significant byte
1960: 20 69 73 20 72 65 73 65 72 76 65 64 20 61 73 20   is reserved as 
1970: 61 20 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76  a mask for WO_ v
1980: 61 6c 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  alues above..** 
1990: 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 66  The WhereLevel.f
19a0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 75 73  lags field is us
19b0: 75 61 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f  ually set to WO_
19c0: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  IN|WO_EQ|WO_ISNU
19d0: 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  LL..** But if th
19e0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  e table is the r
19f0: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
1a00: 6c 65 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65  left join, Where
1a10: 4c 65 76 65 6c 2e 66 6c 61 67 73 0a 2a 2a 20 69  Level.flags.** i
1a20: 73 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57  s set to WO_IN|W
1a30: 4f 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65  O_EQ.  The Where
1a40: 4c 65 76 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c  Level.flags fiel
1a50: 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73  d can then be us
1a60: 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70  ed as.** the "op
1a70: 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66  " parameter to f
1a80: 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20  indTerm when we 
1a90: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71  are resolving eq
1aa0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ab0: 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f  ts..** ISNULL co
1ac0: 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74  nstraints will t
1ad0: 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20  hen not be used 
1ae0: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  on the right tab
1af0: 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20  le of a left.** 
1b00: 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23  join.  Tickets #
1b10: 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a  2177 and #2189..
1b20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1b30: 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78  _ROWID_EQ     0x
1b40: 30 30 30 31 30 30 20 20 20 2f 2a 20 72 6f 77 69  000100   /* rowi
1b50: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
1b60: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1b70: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
1b80: 52 41 4e 47 45 20 20 30 78 30 30 30 32 30 30 20  RANGE  0x000200 
1b90: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
1ba0: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
1bb0: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1bc0: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
1bd0: 30 78 30 30 31 30 30 30 20 20 20 2f 2a 20 78 3d  0x001000   /* x=
1be0: 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e  EXPR or x IN (..
1bf0: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1c00: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1c10: 20 30 78 30 30 32 30 30 30 20 20 20 2f 2a 20 78   0x002000   /* x
1c20: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45  <EXPR and/or x>E
1c30: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
1c40: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20  HERE_COLUMN_IN  
1c50: 20 20 30 78 30 30 34 30 30 30 20 20 20 2f 2a 20    0x004000   /* 
1c60: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
1c70: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f  efine WHERE_TOP_
1c80: 4c 49 4d 49 54 20 20 20 20 30 78 30 31 30 30 30  LIMIT    0x01000
1c90: 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72  0   /* x<EXPR or
1ca0: 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x<=EXPR constra
1cb0: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
1cc0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20  HERE_BTM_LIMIT  
1cd0: 20 20 30 78 30 32 30 30 30 30 20 20 20 2f 2a 20    0x020000   /* 
1ce0: 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50  x>EXPR or x>=EXP
1cf0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
1d00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
1d10: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 38 30  X_ONLY     0x080
1d20: 30 30 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64  000   /* Use ind
1d30: 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74  ex only - omit t
1d40: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
1d50: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20  WHERE_ORDERBY   
1d60: 20 20 20 30 78 31 30 30 30 30 30 20 20 20 2f 2a     0x100000   /*
1d70: 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70   Output will app
1d80: 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f  ear in correct o
1d90: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1da0: 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20  WHERE_REVERSE   
1db0: 20 20 20 30 78 32 30 30 30 30 30 20 20 20 2f 2a     0x200000   /*
1dc0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
1dd0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
1de0: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
1df0: 20 20 20 20 20 30 78 34 30 30 30 30 30 20 20 20       0x400000   
1e00: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
1e10: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
1e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1e30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
1e40: 38 30 30 30 30 30 20 20 20 2f 2a 20 55 73 65 20  800000   /* Use 
1e50: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72  virtual-table pr
1e60: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a  ocessing */../*.
1e70: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
1e80: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
1e90: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1ea0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1eb0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
1ec0: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
1ed0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
1ee0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
1ef0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
1f00: 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  zed */.  Parse *
1f10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1f20: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1f30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1f40: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
1f50: 53 65 74 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e  Set    /* Mappin
1f60: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64  g from table ind
1f70: 69 63 65 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  ices to bitmasks
1f80: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
1f90: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1fa0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
1fb0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
1fc0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
1fd0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
1fe0: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
1ff0: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2000: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a  pWC->aStatic;.}.
2010: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2020: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
2030: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
2040: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2050: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
2060: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
2070: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2080: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
2090: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
20a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20b0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
20c0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
20d0: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
20e0: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66  hereTerm *a;.  f
20f0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
2100: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
2110: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
2120: 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26    if( a->flags &
2130: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
2140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2150: 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78 70  prDelete(a->pExp
2160: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2170: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
2180: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
2190: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 43  sqlite3_free(pWC
21a0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
21b0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
21c0: 72 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72  ries to the Wher
21d0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
21e0: 65 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65  e.  Increase the
21f0: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70   allocated.** sp
2200: 61 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  ace as necessary
2210: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2220: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
2230: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
2240: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
2250: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
2260: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
2270: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
2280: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
2290: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 2a  Clause object..*
22a0: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
22b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
22c0: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
22d0: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
22e0: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
22f0: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
2300: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
2310: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
2320: 64 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ded after.** cal
2330: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
2340: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
2350: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
2360: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
2370: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
2380: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
2390: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
23a0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
23b0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
23c0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
23d0: 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  s){.  WhereTerm 
23e0: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64  *pTerm;.  int id
23f0: 78 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  x;.  if( pWC->nT
2400: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
2410: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
2420: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
2430: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
2440: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2450: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
2460: 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a  pWC->nSlot*2 );.
2470: 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d      if( pWC->a==
2480: 30 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e  0 ){.      pWC->
2490: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
24a0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
24b0: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
24c0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
24d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24e0: 78 70 72 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  xprDelete(p);.  
24f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d      }.      pWC-
2500: 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  >a = pOld;.     
2510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2520: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d  .    memcpy(pWC-
2530: 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66  >a, pOld, sizeof
2540: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
2550: 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  >nTerm);.    if(
2560: 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61   pOld!=pWC->aSta
2570: 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tic ){.      sql
2580: 69 74 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b  ite3_free(pOld);
2590: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
25a0: 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a  nSlot *= 2;.  }.
25b0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
25c0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
25d0: 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  rm];.  pWC->nTer
25e0: 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45  m++;.  pTerm->pE
25f0: 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d  xpr = p;.  pTerm
2600: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
2610: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
2620: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
2630: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
2640: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
2650: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2660: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
2670: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2680: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
2690: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
26a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
26b0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
26c0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
26d0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
26e0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
26f0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
2700: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
2710: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2720: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
2730: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
2740: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
2750: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2760: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
2770: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
2780: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
2790: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
27a0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
27b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
27c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
27d0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
27e0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
27f0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
2800: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2820: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
2830: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
2840: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
2850: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
2860: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
2870: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
2880: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
2890: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
28a0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
28b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
28c0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
28d0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
28e0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
28f0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
2900: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
2910: 61 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72  array.  This arr
2920: 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64  ay grows as need
2930: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a  ed to contain.**
2940: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
2950: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
2960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2970: 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43  hereSplit(WhereC
2980: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
2990: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29   *pExpr, int op)
29a0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
29b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
29c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
29d0: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
29e0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
29f0: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
2a00: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
2a10: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
2a20: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
2a30: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
2a40: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
2a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
2a60: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
2a70: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a  ssion mask set.*
2a80: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
2a90: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
2aa0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
2ab0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
2ac0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2ad0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
2ae0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
2af0: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
2b00: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
2b10: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
2b20: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45  itmask getMask(E
2b30: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2b40: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
2b50: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
2b60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
2b70: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
2b80: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
2b90: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
2ba0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
2bb0: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  Bitmask)1)<<i;. 
2bc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bd0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
2be0: 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20  eate a new mask 
2bf0: 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73  for cursor iCurs
2c00: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  or..**.** There 
2c10: 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65  is one cursor pe
2c20: 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  r table in the F
2c30: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
2c40: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61   number of.** ta
2c50: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2c60: 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
2c70: 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72  ed by a test ear
2c80: 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ly in the.** sql
2c90: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2ca0: 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65   routine.  So we
2cb0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70   know that the p
2cc0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a  MaskSet->ix[].**
2cd0: 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65   array will neve
2ce0: 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73  r overflow..*/.s
2cf0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
2d00: 65 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65  eMask(ExprMaskSe
2d10: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
2d20: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73   iCursor){.  ass
2d30: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
2d40: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61   < ArraySize(pMa
2d50: 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20  skSet->ix) );.  
2d60: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61  pMaskSet->ix[pMa
2d70: 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43  skSet->n++] = iC
2d80: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
2d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
2da0: 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29  ks (recursively)
2db0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2dc0: 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65  ree and generate
2dd0: 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69  s.** a bitmask i
2de0: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
2df0: 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  tables are used 
2e00: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
2e10: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a  on.** tree..**.*
2e20: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
2e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77  his routine to w
2e40: 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ork, the calling
2e50: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68   function must h
2e60: 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  ave.** previousl
2e70: 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65  y invoked sqlite
2e80: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
2e90: 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65  s() on the expre
2ea0: 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74  ssion.  See.** t
2eb0: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
2ec0: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
2ed0: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
2ee0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2ef0: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
2f00: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72  ResolveNames() r
2f10: 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f  outines looks fo
2f20: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  r column names a
2f30: 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72  nd.** sets their
2f40: 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43   opcodes to TK_C
2f50: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20  OLUMN and their 
2f60: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
2f70: 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42  ds to.** the VDB
2f80: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
2f90: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
2fa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
2fb0: 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73   has to.** trans
2fc0: 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  late the cursor 
2fd0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
2fe0: 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20  mask values and 
2ff0: 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69  OR all.** the bi
3000: 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e  tmasks together.
3010: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
3020: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
3030: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
3040: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
3050: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
3060: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
3070: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a  age(ExprMaskSet*
3080: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
3090: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
30a0: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
30b0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
30c0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
30d0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
30e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
30f0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
3100: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
3110: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
3120: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
3130: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
3140: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
3150: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
3160: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
3170: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
3180: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
3190: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
31a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b  ->pLeft);.  mask
31b0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
31c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
31d0: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61   p->pList);.  ma
31e0: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
31f0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3200: 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29  Set, p->pSelect)
3210: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  ;.  return mask;
3220: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
3230: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
3240: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
3250: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
3260: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
3270: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
3280: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
3290: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
32a0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
32b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
32c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
32d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
32e0: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
32f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3300: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
3310: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
3320: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
3330: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
3340: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65  et *pMaskSet, Se
3350: 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74  lect *pS){.  Bit
3360: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
3370: 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20   while( pS ){.  
3380: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
3390: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
33a0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
33b0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
33c0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
33d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
33e0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
33f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
3400: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3410: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
3420: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
3430: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
3440: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
3450: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
3460: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3470: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
3480: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20  Having);.    pS 
3490: 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  = pS->pPrior;.  
34a0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
34b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34c0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
34d0: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
34e0: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
34f0: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
3500: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
3510: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
3520: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
3530: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
3540: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
3550: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
3560: 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f  =", and "IN"..*/
3570: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
3580: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
3590: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
35a0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
35b0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
35c0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
35d0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
35e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
35f0: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
3600: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
3610: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
3620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
3630: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
3640: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
3650: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
3660: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
3670: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
3680: 20 74 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66   type T..*/.#def
3690: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
36a0: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
36b0: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
36c0: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
36d0: 69 73 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  ision operator. 
36e0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
36f0: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
3700: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
3710: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
3720: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c  ..**.** If a col
3730: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
3740: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
3750: 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65  th either the le
3760: 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73  ft or right.** s
3770: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
3780: 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e  rison, it remain
3790: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
37a0: 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20  h the same side 
37b0: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d  after.** the com
37c0: 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20  mutation. So "Y 
37d0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
37e0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a  p X" becomes .**
37f0: 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "X collate NOCA
3800: 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  SE op Y". This i
3810: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
3820: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
3830: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
3840: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
3850: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
3860: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
3870: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
3880: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
3890: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
38a0: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
38b0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67  _ExpCollate flag
38c0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75  .** is not commu
38d0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
38e0: 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28  oid exprCommute(
38f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
3900: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
3910: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
3920: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
3930: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
3940: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
3950: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
3960: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  _ExpCollate);.  
3970: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
3980: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
3990: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
39a0: 20 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53   );.  SWAP(CollS
39b0: 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  eq*,pExpr->pRigh
39c0: 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e  t->pColl,pExpr->
39d0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20  pLeft->pColl);. 
39e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
39f0: 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e  flags = (pExpr->
3a00: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
3a10: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
3a20: 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78  | expLeft;.  pEx
3a30: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
3a40: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
3a50: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
3a60: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52  pCollate) | expR
3a70: 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70  ight;.  SWAP(Exp
3a80: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
3a90: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
3aa0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
3ab0: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
3ac0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
3ad0: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
3ae0: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
3af0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
3b00: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
3b10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3b20: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
3b30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
3b40: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
3b50: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
3b60: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3b70: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
3b80: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
3b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
3ba0: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
3bb0: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
3bc0: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
3bd0: 74 69 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72  tic int operator
3be0: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
3bf0: 69 6e 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28  int c;.  assert(
3c00: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
3c10: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
3c20: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
3c30: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
3c40: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
3c50: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
3c60: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
3c70: 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d   c = WO_EQ<<(op-
3c80: 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73  TK_EQ);.  }.  as
3c90: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e  sert( op!=TK_ISN
3ca0: 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e  ULL || c==WO_ISN
3cb0: 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
3cc0: 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d   op!=TK_IN || c=
3cd0: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65  =WO_IN );.  asse
3ce0: 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  rt( op!=TK_EQ ||
3cf0: 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61   c==WO_EQ );.  a
3d00: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54  ssert( op!=TK_LT
3d10: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a   || c==WO_LT );.
3d20: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3d30: 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20  _LE || c==WO_LE 
3d40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3d50: 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GT || c==WO_
3d60: 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GT );.  assert( 
3d70: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d  op!=TK_GE || c==
3d80: 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72  WO_GE );.  retur
3d90: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n c;.}../*.** Se
3da0: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
3db0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3dc0: 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74  use that is of t
3dd0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
3de0: 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65  <expr>".** where
3df0: 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63   X is a referenc
3e00: 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e  e to the iColumn
3e10: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61   of table iCur a
3e20: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
3e30: 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f  f.** the WO_xx o
3e40: 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70  perator codes sp
3e50: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f  ecified by the o
3e60: 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  p parameter..** 
3e70: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
3e80: 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52   to the term.  R
3e90: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66  eturn 0 if not f
3ea0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
3eb0: 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54  WhereTerm *findT
3ec0: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
3ed0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
3ee0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3ef0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
3f00: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
3f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3f20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
3f30: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
3f40: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
3f50: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3f60: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
3f70: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
3f80: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
3f90: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
3fa0: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36  is mask */.  u16
3fb0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3fc0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
3fd0: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
3fe0: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
3ff0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
4010: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
4020: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
4030: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
4040: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
4050: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a  pTerm;.  int k;.
4060: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
4070: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
4080: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
4090: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
40a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
40b0: 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70  Cur.       && (p
40c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
40d0: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
40e0: 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d  .       && pTerm
40f0: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  ->leftColumn==iC
4100: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20  olumn.       && 
4110: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
4120: 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29  r & op)!=0.    )
4130: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 75 72  {.      if( iCur
4140: 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 70  >=0 && pIdx && p
4150: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
4160: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =WO_ISNULL ){.  
4170: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
4180: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
4190: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
41a0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63  pColl;.        c
41b0: 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20  har idxaff;.    
41c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
41d0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
41e0: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
41f0: 0a 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20  .        idxaff 
4200: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
4210: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
4220: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
4230: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
4240: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
4250: 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e  idxaff) ) contin
4260: 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ue;..        /* 
4270: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63  Figure out the c
4280: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4290: 65 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  e required from 
42a0: 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20  an index for.   
42b0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
42c0: 20 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69   useful for opti
42d0: 6d 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f  mising expressio
42e0: 6e 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73  n pX. Store this
42f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
4300: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
4310: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  oll..        */.
4320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
4330: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
4340: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
4350: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
4360: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4370: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
4380: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69  ight);.        i
4390: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
43a0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
43b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
43c0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Coll;.        }.
43d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
43e0: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
43f0: 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  n && pIdx->aiCol
4400: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
4410: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
4420: 61 73 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e  assert( j<pIdx->
4430: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
4440: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4450: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
4460: 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
4470: 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  [j]) ) continue;
4480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
4490: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
44a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
44b0: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
44c0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
44d0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
44e0: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
44f0: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
4500: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
4510: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
4520: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
4530: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
4540: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
4550: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
4560: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
4570: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
4580: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
4590: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
45a0: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
45b0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
45c0: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
45d0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
45e0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
45f0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
4600: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
4610: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
4620: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
4630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4640: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4650: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
4660: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
4670: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
4680: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
4690: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
46a0: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
46b0: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
46c0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
46d0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
46e0: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
46f0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
4700: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
4710: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
4720: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
4730: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
4740: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
4750: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
4760: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
4770: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
4780: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
4790: 4f 72 47 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  OrGlob(.  sqlite
47a0: 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 54  3 *db,      /* T
47b0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
47c0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
47d0: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
47e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
47f0: 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20  int *pnPattern, 
4800: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
4810: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
4820: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
4830: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
4840: 65 74 65 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ete  /* True if 
4850: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
4860: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
4870: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
4880: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
4890: 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  *z;.  Expr *pRig
48a0: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78  ht, *pLeft;.  Ex
48b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
48c0: 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 69   int c, cnt;.  i
48d0: 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 63 68 61  nt noCase;.  cha
48e0: 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53  r wc[3];.  CollS
48f0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66  eq *pColl;..  if
4900: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
4910: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
4920: 70 72 2c 20 26 6e 6f 43 61 73 65 2c 20 77 63 29  pr, &noCase, wc)
4930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4940: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
4950: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
4960: 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e  pRight = pList->
4970: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
4980: 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ( pRight->op!=TK
4990: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72  _STRING ){.    r
49a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
49b0: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
49c0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
49d0: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
49e0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
49f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  rn 0;.  }.  pCol
4a00: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
4a10: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
4a20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   ){.    /* TODO:
4a30: 20 43 6f 76 65 72 61 67 65 20 74 65 73 74 69 6e   Coverage testin
4a40: 67 20 64 6f 65 73 6e 27 74 20 67 65 74 20 74 68  g doesn't get th
4a50: 69 73 20 63 61 73 65 2e 20 49 73 20 69 74 20 61  is case. Is it a
4a60: 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
4a70: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 20 65  .    ** for an e
4a80: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70  xpression of typ
4a90: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 6f 20 6e  e TK_COLUMN to n
4aa0: 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  ot have an assig
4ab0: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ned collation . 
4ac0: 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 61     ** sequence a
4ad0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3f 0a 20 20  t this point?.  
4ae0: 20 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c 20 3d    */.    pColl =
4af0: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
4b00: 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c    }.  if( (pColl
4b10: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
4b20: 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 6e 6f  OLL_BINARY || no
4b30: 43 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28  Case) &&.      (
4b40: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
4b50: 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20  ITE_COLL_NOCASE 
4b60: 7c 7c 20 21 6e 6f 43 61 73 65 29 20 29 7b 0a 20  || !noCase) ){. 
4b70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4b80: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
4b90: 65 45 78 70 72 28 64 62 2c 20 70 52 69 67 68 74  eExpr(db, pRight
4ba0: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  );.  z = (char *
4bb0: 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  )pRight->token.z
4bc0: 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  ;.  cnt = 0;.  i
4bd0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c  f( z ){.    whil
4be0: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
4bf0: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
4c00: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
4c10: 63 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d  c[2] ){ cnt++; }
4c20: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  .  }.  if( cnt==
4c30: 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b  0 || 255==(u8)z[
4c40: 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75  cnt] ){.    retu
4c50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73  rn 0;.  }.  *pis
4c60: 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74  Complete = z[cnt
4c70: 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  ]==wc[0] && z[cn
4c80: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61  t+1]==0;.  *pnPa
4c90: 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72  ttern = cnt;.  r
4ca0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
4cb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
4cc0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4cd0: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
4ce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4cf0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
4d00: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
4d10: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
4d20: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
4d30: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
4d40: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
4d50: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
4d60: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
4d70: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
4d80: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
4d90: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
4da0: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
4db0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
4dc0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
4dd0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
4de0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
4df0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
4e00: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
4e10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4e20: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f  .  if( pExpr->to
4e30: 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20  ken.n!=5 ||.    
4e40: 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43     sqlite3StrNIC
4e50: 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  mp((const char*)
4e60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
4e70: 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a  match",5)!=0 ){.
4e80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4e90: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
4ea0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
4eb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
4ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4ed0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
4ee0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
4ef0: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
4f00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
4f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4f30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4f40: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
4f50: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
4f60: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
4f70: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
4f80: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
4f90: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
4fa0: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
4fb0: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
4fc0: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
4fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4fe0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
4ff0: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
5000: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
5010: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
5020: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
5030: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
5040: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
5050: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
5060: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
5070: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
5080: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5090: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
50a0: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
50b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
50c0: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 52  UBQUERY)./*.** R
50d0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
50e0: 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f 66 20  e given term of 
50f0: 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63 61 6e  an OR clause can
5100: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a   be converted.**
5110: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 63 6c 61 75   into an IN clau
5120: 73 65 2e 20 20 54 68 65 20 69 43 75 72 73 6f 72  se.  The iCursor
5130: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 20 64 65 66   and iColumn def
5140: 69 6e 65 20 74 68 65 20 6c 65 66 74 2d 68 61 6e  ine the left-han
5150: 64 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65  d.** side of the
5160: 20 49 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   IN clause..**.*
5170: 2a 20 54 68 65 20 63 6f 6e 74 65 78 74 20 69 73  * The context is
5180: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6d 75   that we have mu
5190: 6c 74 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65 63  ltiple OR-connec
51a0: 74 65 64 20 65 71 75 61 6c 69 74 79 20 74 65 72  ted equality ter
51b0: 6d 73 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ms.** like this:
51c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
51d0: 20 61 3d 3c 65 78 70 72 31 3e 20 4f 52 20 20 61   a=<expr1> OR  a
51e0: 3d 3c 65 78 70 72 32 3e 20 4f 52 20 62 3d 3c 65  =<expr2> OR b=<e
51f0: 78 70 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a 2a  xpr3>  OR ....**
5200: 0a 2a 2a 20 54 68 65 20 70 4f 72 54 65 72 6d 20  .** The pOrTerm 
5210: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
5220: 75 74 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64  utine correspond
5230: 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 74 65  s to a single te
5240: 72 6d 20 6f 66 0a 2a 2a 20 74 68 69 73 20 4f 52  rm of.** this OR
5250: 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64   clause.  In ord
5260: 65 72 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  er for the term 
5270: 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 64 61 74  to be a condidat
5280: 65 20 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72 73  e for.** convers
5290: 69 6f 6e 20 74 6f 20 61 6e 20 49 4e 20 6f 70 65  ion to an IN ope
52a0: 72 61 74 6f 72 2c 20 74 68 65 20 66 6f 6c 6c 6f  rator, the follo
52b0: 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75  wing must be tru
52c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  e:.**.**     *  
52d0: 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
52e0: 64 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6d  de of the term m
52f0: 75 73 74 20 62 65 20 74 68 65 20 63 6f 6c 75 6d  ust be the colum
5300: 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 20 20 20  n which.**      
5310: 20 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20    is identified 
5320: 62 79 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69  by iCursor and i
5330: 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  Column..**.**   
5340: 20 20 2a 20 20 49 66 20 74 68 65 20 72 69 67 68    *  If the righ
5350: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
5360: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
5370: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
5380: 73 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 62  s.**        of b
5390: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
53a0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
53b0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
53c0: 70 65 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e  pe.**        con
53d0: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
53e0: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
53f0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
5400: 34 39 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74  49).**.** If bot
5410: 68 20 6f 66 20 74 68 65 73 65 20 63 6f 6e 64 69  h of these condi
5420: 74 69 6f 6e 73 20 61 72 65 20 74 72 75 65 2c 20  tions are true, 
5430: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 72 75 65  then return true
5440: 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
5450: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f  return false..*/
5460: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 72 54 65  .static int orTe
5470: 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65  rmIsOptCandidate
5480: 28 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54  (WhereTerm *pOrT
5490: 65 72 6d 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  erm, int iCursor
54a0: 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b 0a  , int iColumn){.
54b0: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
54c0: 66 66 52 69 67 68 74 3b 0a 20 20 61 73 73 65 72  ffRight;.  asser
54d0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
54e0: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
54f0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
5500: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
5510: 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
5520: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f   0;.  }.  if( pO
5530: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  rTerm->leftColum
5540: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
5550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5560: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
5570: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5580: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
5590: 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20  >pRight);.  if( 
55a0: 61 66 66 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  affRight==0 ){. 
55b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
55c0: 0a 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c  .  affLeft = sql
55d0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
55e0: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
55f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 61  >pLeft);.  if( a
5600: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
5610: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
5630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5640: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
5650: 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f  ven term of an O
5660: 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20  R clause can be 
5670: 69 67 6e 6f 72 65 64 20 64 75 72 69 6e 67 0a 2a  ignored during.*
5680: 2a 20 61 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  * a check to mak
5690: 65 20 73 75 72 65 20 61 6c 6c 20 4f 52 20 74 65  e sure all OR te
56a0: 72 6d 73 20 61 72 65 20 63 61 6e 64 69 64 61 74  rms are candidat
56b0: 65 73 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74  es for optimizat
56c0: 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ion..** In other
56d0: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74   words, return t
56e0: 72 75 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  rue if a call to
56f0: 20 74 68 65 20 6f 72 54 65 72 6d 49 73 4f 70 74   the orTermIsOpt
5700: 43 61 6e 64 69 64 61 74 65 28 29 0a 2a 2a 20 61  Candidate().** a
5710: 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 66 61  bove returned fa
5720: 6c 73 65 20 62 75 74 20 69 74 20 69 73 20 6e 6f  lse but it is no
5730: 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  t necessary to d
5740: 69 73 71 75 61 6c 69 66 79 20 74 68 65 0a 2a 2a  isqualify the.**
5750: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
5760: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
5770: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 70 68 72   original OR phr
5780: 61 73 65 20 77 61 73 20 74 68 69 73 3a 0a 2a 2a  ase was this:.**
5790: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d  .**           a=
57a0: 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20  4  OR  a=11  OR 
57b0: 20 61 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e   a=b.**.** Durin
57c0: 67 20 61 6e 61 6c 79 73 69 73 2c 20 74 68 65 20  g analysis, the 
57d0: 74 68 69 72 64 20 74 65 72 6d 20 67 65 74 73 20  third term gets 
57e0: 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64 20 61  flipped around a
57f0: 6e 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20  nd duplicate.** 
5800: 73 6f 20 74 68 61 74 20 77 65 20 61 72 65 20 6c  so that we are l
5810: 65 66 74 20 77 69 74 68 20 74 68 69 73 3a 0a 2a  eft with this:.*
5820: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
5830: 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52  =4  OR  a=11  OR
5840: 20 20 61 3d 62 20 20 4f 52 20 20 62 3d 61 0a 2a    a=b  OR  b=a.*
5850: 2a 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  *.** Since the l
5860: 61 73 74 20 74 77 6f 20 74 65 72 6d 73 20 61 72  ast two terms ar
5870: 65 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f 6e  e duplicates, on
5880: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 2a  ly one of them.*
5890: 2a 20 68 61 73 20 74 6f 20 71 75 61 6c 69 66 79  * has to qualify
58a0: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   in order for th
58b0: 65 20 77 68 6f 6c 65 20 70 68 72 61 73 65 20 74  e whole phrase t
58c0: 6f 20 71 75 61 6c 69 66 79 2e 20 20 57 68 65 6e  o qualify.  When
58d0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
58e0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 6b   is called, we k
58f0: 6e 6f 77 20 74 68 61 74 20 70 4f 72 54 65 72 6d  now that pOrTerm
5900: 20 64 69 64 20 6e 6f 74 20 71 75 61 6c 69 66 79   did not qualify
5910: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5920: 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20  e merely checks 
5930: 74 6f 20 73 65 65 20 69 66 20 70 4f 72 54 65 72  to see if pOrTer
5940: 6d 20 68 61 73 20 61 20 64 75 70 6c 69 63 61 74  m has a duplicat
5950: 65 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  e that.** might 
5960: 71 75 61 6c 69 66 79 2e 20 20 49 66 20 74 68 65  qualify.  If the
5970: 72 65 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  re is a duplicat
5980: 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  e that has not y
5990: 65 74 20 62 65 65 6e 0a 2a 2a 20 64 69 73 71 75  et been.** disqu
59a0: 61 6c 69 66 69 65 64 2c 20 74 68 65 6e 20 72 65  alified, then re
59b0: 74 75 72 6e 20 74 72 75 65 2e 20 20 49 66 20 74  turn true.  If t
59c0: 68 65 72 65 20 61 72 65 20 6e 6f 20 64 75 70 6c  here are no dupl
59d0: 69 63 61 74 65 73 2c 20 6f 72 0a 2a 2a 20 74 68  icates, or.** th
59e0: 65 20 64 75 70 6c 69 63 61 74 65 20 68 61 73 20  e duplicate has 
59f0: 61 6c 73 6f 20 62 65 65 6e 20 64 69 73 71 75 61  also been disqua
5a00: 6c 69 66 65 64 2c 20 72 65 74 75 72 6e 20 66 61  lifed, return fa
5a10: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
5a20: 6e 74 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75  nt orTermHasOkDu
5a30: 70 6c 69 63 61 74 65 28 57 68 65 72 65 43 6c 61  plicate(WhereCla
5a40: 75 73 65 20 2a 70 4f 72 2c 20 57 68 65 72 65 54  use *pOr, WhereT
5a50: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a 20  erm *pOrTerm){. 
5a60: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66 6c   if( pOrTerm->fl
5a70: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
5a80: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  D ){.    /* This
5a90: 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
5aa0: 20 74 65 72 6d 2e 20 20 54 68 65 20 64 75 70 6c   term.  The dupl
5ab0: 69 63 61 74 65 20 69 73 20 74 6f 20 74 68 65 20  icate is to the 
5ac0: 6c 65 66 74 20 68 61 64 0a 20 20 20 20 2a 2a 20  left had.    ** 
5ad0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
5ae0: 20 61 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74 68   analyzed and th
5af0: 75 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  us has not yet b
5b00: 65 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64  een disqualified
5b10: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
5b20: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4f  1;.  }.  if( (pO
5b30: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
5b40: 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 0a  ERM_VIRTUAL)!=0.
5b50: 20 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61 5b       && (pOr->a[
5b60: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
5b70: 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  ].flags & TERM_O
5b80: 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20  R_OK)!=0 ){.    
5b90: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 64 75 70  /* This is a dup
5ba0: 6c 69 63 61 74 65 20 74 65 72 6d 2e 20 20 54 68  licate term.  Th
5bb0: 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c 69  e original quali
5bc0: 66 69 65 64 20 73 6f 20 74 68 69 73 20 6f 6e 65  fied so this one
5bd0: 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
5be0: 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20 20   have to. */.   
5bf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5c00: 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69 74 68   /* This is eith
5c10: 65 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20 74  er a singleton t
5c20: 65 72 6d 20 6f 72 20 65 6c 73 65 20 69 74 20 69  erm or else it i
5c30: 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 6f  s a duplicate fo
5c40: 72 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  r.  ** which the
5c50: 20 6f 72 69 67 69 6e 61 6c 20 64 69 64 20 6e 6f   original did no
5c60: 74 20 71 75 61 6c 69 66 79 2e 20 20 45 69 74 68  t qualify.  Eith
5c70: 65 72 20 77 61 79 20 77 65 20 61 72 65 20 64 6f  er way we are do
5c80: 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65 74  ne for. */.  ret
5c90: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
5ca0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
5cb0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
5cc0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
5cd0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
5ce0: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
5cf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5d00: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
5d10: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
5d20: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
5d30: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
5d40: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
5d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
5d60: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
5d70: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
5d80: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
5d90: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
5da0: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
5db0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
5dc0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
5dd0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
5de0: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
5df0: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
5e00: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
5e10: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
5e20: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
5e30: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
5e40: 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74 68  sion is of.** th
5e50: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
5e60: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
5e70: 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e 73  nd Y are columns
5e80: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
5e90: 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  nal.** expressio
5ea0: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
5eb0: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
5ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
5ed0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
5ee0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
5ef0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
5f00: 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64 20  se and analyzed 
5f10: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
5f20: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5f30: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
5f40: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
5f50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
5f60: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
5f70: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
5f80: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
5f90: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
5fa0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
5fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5fc0: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
5fd0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
5fe0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
5ff0: 70 54 65 72 6d 3b 0a 20 20 45 78 70 72 4d 61 73  pTerm;.  ExprMas
6000: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 0a  kSet *pMaskSet;.
6010: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
6020: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
6030: 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70  eft;.  Bitmask p
6040: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20  rereqAll;.  int 
6050: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20  nPattern;.  int 
6060: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 69 6e  isComplete;.  in
6070: 74 20 6f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70  t op;.  Parse *p
6080: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
6090: 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
60a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
60b0: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
60c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
60d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
60e0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
60f0: 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53  xTerm];.  pMaskS
6100: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
6110: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
6120: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72  erm->pExpr;.  pr
6130: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
6140: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
6150: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
6160: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
6170: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
6180: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
6190: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
61a0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 65 72  t==0 );.    pTer
61b0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
61c0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
61d0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
61e0: 78 70 72 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20  xpr->pList).    
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 7c 20 65 78 70 72 53 65 6c 65        | exprSele
6210: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
6220: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 53  skSet, pExpr->pS
6230: 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 20  elect);.  }else 
6240: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
6250: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
6260: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
6270: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
6280: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
6290: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
62a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
62b0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
62c0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
62d0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
62e0: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
62f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6300: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6310: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
6320: 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67 65 74  prereqAll |= get
6330: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
6340: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
6350: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 70 54  Table);.  }.  pT
6360: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
6370: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
6380: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
6390: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
63a0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
63b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
63c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
63d0: 65 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65  edOp(op) && (pTe
63e0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
63f0: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
6400: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
6410: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
6420: 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ft;.    Expr *pR
6430: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
6440: 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ight;.    if( pL
6450: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
6460: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
6470: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
6480: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
6490: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
64a0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
64b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
64c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
64d0: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
64e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
64f0: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
6500: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
6510: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
6520: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
6530: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
6540: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
6550: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
6560: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
6570: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
6580: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
6590: 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  p(db, pExpr);.  
65a0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
65b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
65c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
65d0: 78 70 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b  xprDelete(pDup);
65e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
65f0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
6600: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
6610: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6620: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
6630: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
6640: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
6650: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
6660: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
6670: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
6680: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
6690: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
66a0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
66b0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
66c0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
66d0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
66e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
66f0: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
6700: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
6710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6720: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
6730: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
6740: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
6750: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44 75   exprCommute(pDu
6760: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
6770: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
6780: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
6790: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
67a0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
67b0: 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  w->leftColumn = 
67c0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
67d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
67e0: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
67f0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
6800: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
6810: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
6820: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
6830: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44   operatorMask(pD
6840: 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  up->op);.    }. 
6850: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
6860: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
6870: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
6880: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74  * If a term is t
6890: 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61  he BETWEEN opera
68a0: 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20  tor, create two 
68b0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
68c0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69  s.  ** that defi
68d0: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61  ne the range tha
68e0: 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d  t the BETWEEN im
68f0: 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  plements..  */. 
6900: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
6910: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
6920: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
6930: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
6940: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
6950: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
6960: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
6970: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
6980: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
6990: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
69a0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
69b0: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
69c0: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
69d0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
69e0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
69f0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
6a00: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
6a10: 72 28 64 62 2c 20 6f 70 73 5b 69 5d 2c 20 73 71  r(db, ops[i], sq
6a20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6a30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a   pExpr->pLeft),.
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6a60: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
6a70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
6a80: 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  r), 0);.      id
6a90: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
6aa0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
6ab0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
6ac0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
6ad0: 43 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  C);.      exprAn
6ae0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
6af0: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
6b00: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
6b10: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
6b20: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
6b30: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
6b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
6b50: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
6b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
6b70: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
6b80: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
6b90: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
6bb0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
6bc0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6bd0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
6be0: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
6bf0: 6e 76 65 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  nvert OR-connect
6c00: 65 64 20 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e  ed terms into an
6c10: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
6c20: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 63  that.  ** they c
6c30: 61 6e 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 69  an make use of i
6c40: 6e 64 69 63 65 73 2e 20 20 45 78 61 6d 70 6c 65  ndices.  Example
6c50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
6c60: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
6c70: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
6c80: 20 3d 20 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20   = expr3.  **.  
6c90: 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  ** is converted 
6ca0: 69 6e 74 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  into.  **.  **  
6cb0: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
6cc0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 20 20 2a  expr2,expr3).  *
6cd0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69  *.  ** This opti
6ce0: 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  mization must be
6cf0: 20 6f 6d 69 74 74 65 64 20 69 66 20 4f 4d 49 54   omitted if OMIT
6d00: 5f 53 55 42 51 55 45 52 59 20 69 73 20 64 65 66  _SUBQUERY is def
6d10: 69 6e 65 64 20 62 65 63 61 75 73 65 0a 20 20 2a  ined because.  *
6d20: 2a 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66  * the compiler f
6d30: 6f 72 20 74 68 65 20 74 68 65 20 49 4e 20 6f 70  or the the IN op
6d40: 65 72 61 74 6f 72 20 69 73 20 70 61 72 74 20 6f  erator is part o
6d50: 66 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a 20  f sub-queries.. 
6d60: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
6d70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
6d80: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20  ){.    int ok;. 
6d90: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6da0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43   int iColumn, iC
6db0: 75 72 73 6f 72 3b 0a 20 20 20 20 57 68 65 72 65  ursor;.    Where
6dc0: 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20 20 20 20  Clause sOr;.    
6dd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
6de0: 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  rm;..    assert(
6df0: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
6e00: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d   TERM_DYNAMIC)==
6e10: 30 20 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c  0 );.    whereCl
6e20: 61 75 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70  auseInit(&sOr, p
6e30: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73  WC->pParse, pMas
6e40: 6b 53 65 74 29 3b 0a 20 20 20 20 77 68 65 72 65  kSet);.    where
6e50: 53 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70  Split(&sOr, pExp
6e60: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65  r, TK_OR);.    e
6e70: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
6e80: 72 63 2c 20 26 73 4f 72 29 3b 0a 20 20 20 20 61  rc, &sOr);.    a
6e90: 73 73 65 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d  ssert( sOr.nTerm
6ea0: 3e 3d 32 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  >=2 );.    j = 0
6eb0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
6ec0: 61 73 73 65 72 74 28 20 6a 3c 73 4f 72 2e 6e 54  assert( j<sOr.nT
6ed0: 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 43 6f  erm );.      iCo
6ee0: 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  lumn = sOr.a[j].
6ef0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
6f00: 20 20 69 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e    iCursor = sOr.
6f10: 61 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b  a[j].leftCursor;
6f20: 0a 20 20 20 20 20 20 6f 6b 20 3d 20 69 43 75 72  .      ok = iCur
6f30: 73 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f  sor>=0;.      fo
6f40: 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c  r(i=sOr.nTerm-1,
6f50: 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20   pOrTerm=sOr.a; 
6f60: 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c  i>=0 && ok; i--,
6f70: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
6f80: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
6f90: 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
6fa0: 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EQ ){.          
6fb0: 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73  goto or_not_poss
6fc0: 69 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ible;.        }.
6fd0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 72 54 65          if( orTe
6fe0: 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65  rmIsOptCandidate
6ff0: 28 70 4f 72 54 65 72 6d 2c 20 69 43 75 72 73 6f  (pOrTerm, iCurso
7000: 72 2c 20 69 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20  r, iColumn) ){. 
7010: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
7020: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
7030: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
7040: 65 6c 73 65 20 69 66 28 20 6f 72 54 65 72 6d 48  else if( orTermH
7050: 61 73 4f 6b 44 75 70 6c 69 63 61 74 65 28 26 73  asOkDuplicate(&s
7060: 4f 72 2c 20 70 4f 72 54 65 72 6d 29 20 29 7b 0a  Or, pOrTerm) ){.
7070: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
7080: 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45 52  m->flags &= ~TER
7090: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
70a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
70b0: 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20    ok = 0;.      
70c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
70d0: 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26 26 20 28  }while( !ok && (
70e0: 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73  sOr.a[j++].flags
70f0: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21   & TERM_COPIED)!
7100: 3d 30 20 26 26 20 6a 3c 32 20 29 3b 0a 20 20 20  =0 && j<2 );.   
7110: 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20   if( ok ){.     
7120: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7130: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
7140: 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20   *pNew, *pDup;. 
7150: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
7160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
7170: 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70  i=sOr.nTerm-1, p
7180: 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e  OrTerm=sOr.a; i>
7190: 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70  =0 && ok; i--, p
71a0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
71b0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
71c0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  >flags & TERM_OR
71d0: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
71e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ue;.        pDup
71f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7200: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
7210: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
7220: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
7230: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7240: 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65  pend(pWC->pParse
7250: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30  , pList, pDup, 0
7260: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
7270: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
7280: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
7290: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
72a0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
72b0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
72c0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
72d0: 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  t);.      pNew =
72e0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
72f0: 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c   TK_IN, pDup, 0,
7300: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
7310: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
7320: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
7330: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
7340: 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45  arkings(pNew, pE
7350: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
7360: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
7370: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
7380: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
7390: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
73a0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
73b0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
73c0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
73d0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
73e0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
73f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7400: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
7410: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
7420: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
7430: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
7440: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
7450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7460: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7470: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
7480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f       }.    }.or_
7490: 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20  not_possible:.  
74a0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
74b0: 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65  ar(&sOr);.  }.#e
74c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
74d0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
74e0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
74f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
7500: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
7510: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
7520: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
7530: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
7540: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
7550: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
7560: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65   */.  if( isLike
7570: 4f 72 47 6c 6f 62 28 64 62 2c 20 70 45 78 70 72  OrGlob(db, pExpr
7580: 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73  , &nPattern, &is
7590: 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20  Complete) ){.   
75a0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
75b0: 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20  Right;.    Expr 
75c0: 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a  *pStr1, *pStr2;.
75d0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
75e0: 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b  pr1, *pNewExpr2;
75f0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
7600: 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20  , idxNew2;..    
7610: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
7620: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7630: 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ;.    pRight = p
7640: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
7650: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
7660: 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
7670: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52  r(pParse, TK_STR
7680: 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ING, 0, 0, 0);. 
7690: 20 20 20 69 66 28 20 70 53 74 72 31 20 29 7b 0a     if( pStr1 ){.
76a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
76b0: 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 53 74 72  enCopy(db, &pStr
76c0: 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68  1->token, &pRigh
76d0: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
76e0: 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20   pStr1->token.n 
76f0: 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20  = nPattern;.    
7700: 20 20 70 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d    pStr1->flags =
7710: 20 45 50 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20   EP_Dequoted;.  
7720: 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20    }.    pStr2 = 
7730: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7740: 62 2c 20 70 53 74 72 31 29 3b 0a 20 20 20 20 69  b, pStr1);.    i
7750: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
7760: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 61 73  iled ){.      as
7770: 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b  sert( pStr2->tok
7780: 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20  en.dyn );.      
7790: 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e  ++*(u8*)&pStr2->
77a0: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
77b0: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
77c0: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
77d0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
77e0: 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78  TK_GE, sqlite3Ex
77f0: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c  prDup(db,pLeft),
7800: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
7810: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
7820: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
7830: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
7840: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
7850: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72  NAMIC);.    expr
7860: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
7870: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
7880: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
7890: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
78a0: 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33  , TK_LT, sqlite3
78b0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
78c0: 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20  ), pStr2, 0);.  
78d0: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
78e0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
78f0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
7900: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
7910: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78  DYNAMIC);.    ex
7920: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
7930: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
7940: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
7950: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
7960: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
7970: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
7980: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
7990: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
79a0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
79b0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
79c0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
79d0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
79e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
79f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
7a00: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
7a10: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7a20: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7a30: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
7a40: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
7a50: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
7a60: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
7a70: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
7a80: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
7a90: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
7aa0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
7ab0: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
7ac0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
7ad0: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
7ae0: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
7af0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
7b00: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
7b10: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
7b20: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
7b30: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
7b40: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
7b50: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
7b60: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
7b70: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
7b80: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
7b90: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
7ba0: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
7bb0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
7bc0: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
7bd0: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
7be0: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
7bf0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
7c00: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7c10: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
7c20: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
7c30: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
7c40: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
7c50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
7c60: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
7c70: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
7c80: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7c90: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
7ca0: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
7cb0: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
7cc0: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7cd0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
7ce0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
7cf0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d  te3Expr(db, TK_M
7d00: 41 54 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33  ATCH, 0, sqlite3
7d10: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
7d20: 68 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ht), 0);.      i
7d30: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
7d40: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
7d50: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
7d60: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
7d70: 49 43 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IC);.      pNewT
7d80: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
7d90: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
7da0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
7db0: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
7dc0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
7dd0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
7de0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
7df0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
7e00: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
7e10: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
7e20: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
7e30: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
7e40: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
7e50: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7e60: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
7e70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7e80: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
7e90: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
7ea0: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
7eb0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
7ec0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
7ed0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
7ee0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
7ef0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
7f00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7f10: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a  TUALTABLE */.}..
7f20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
7f30: 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  E if any of the 
7f40: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
7f50: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e  List->a[iFirst..
7f60: 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20  .] contain.** a 
7f70: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
7f80: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
7f90: 6e 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c  n the iBase tabl
7fa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7fb0: 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72   referencesOther
7fc0: 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69  Tables(.  ExprLi
7fd0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
7fe0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78      /* Search ex
7ff0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73  pressions in ths
8000: 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d   list */.  ExprM
8010: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
8020: 2c 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  ,    /* Mapping 
8030: 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62  from tables to b
8040: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20  itmaps */.  int 
8050: 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
8060: 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72        /* Be sear
8070: 63 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69  ching with the i
8080: 46 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73  First-th express
8090: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  ion */.  int iBa
80a0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
80b0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66     /* Ignore ref
80c0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
80d0: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69  table */.){.  Bi
80e0: 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20  tmask allowed = 
80f0: 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  ~getMask(pMaskSe
8100: 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69  t, iBase);.  whi
8110: 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74  le( iFirst<pList
8120: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
8130: 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61  f( (exprTableUsa
8140: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
8150: 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e  st->a[iFirst++].
8160: 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21  pExpr)&allowed)!
8170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
8180: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
81a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
81b0: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
81c0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
81d0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
81e0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
81f0: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
8200: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
8210: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
8220: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
8230: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
8240: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
8250: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
8260: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
8270: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
8280: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8290: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
82a0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
82b0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
82c0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
82d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
82e0: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
82f0: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
8300: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
8310: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
8320: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
8330: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
8340: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
8350: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
8360: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
8370: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
8380: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
8390: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
83a0: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
83b0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
83c0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
83d0: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
83e0: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
83f0: 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** All terms of 
8400: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61  the ORDER BY tha
8410: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
8420: 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
8430: 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20  e either.** ASC 
8440: 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73  or DESC.  (Terms
8450: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8460: 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65   clause past the
8470: 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45   end of a UNIQUE
8480: 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74  .** index do not
8490: 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79   need to satisfy
84a0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
84b0: 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76  .)  The *pbRev v
84c0: 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
84d0: 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52  o 1 if the ORDER
84e0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
84f0: 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73  l DESC and it is
8500: 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20   set to 0 if.** 
8510: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8520: 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a  use is all ASC..
8530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
8540: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
8550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8560: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8570: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8580: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
8590: 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69  skSet,  /* Mappi
85a0: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e  ng from table in
85b0: 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73  dices to bitmaps
85c0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
85d0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
85e0: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
85f0: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
8600: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
8610: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
8620: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
8630: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
8640: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
8650: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
8660: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8670: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
8680: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
8690: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
86a0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
86b0: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
86c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
86d0: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
86e0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
86f0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
8700: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
8710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8730: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
8740: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8760: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
8770: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
8780: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
8790: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
87c0: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
87d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
87e0: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
87f0: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
8800: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8810: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8820: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8830: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
8840: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
8850: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
8860: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
8870: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
8880: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
8890: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
88a0: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
88b0: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
88c0: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
88d0: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
88e0: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
88f0: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
8900: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
8910: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
8920: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
8930: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
8940: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
8950: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
8960: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
8970: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
8980: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
8990: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
89a0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
89b0: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
89c0: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
89d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
89e0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
89f0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
8a00: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
8a10: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
8a20: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
8a30: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
8a40: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8a50: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
8a60: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
8a70: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
8a80: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
8a90: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
8aa0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
8ab0: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
8ac0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
8ad0: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
8ae0: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
8af0: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
8b00: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
8b10: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
8b20: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
8b30: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
8b40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8b50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8b60: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
8b70: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
8b80: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
8b90: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
8ba0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
8bb0: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
8bc0: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
8bd0: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
8be0: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
8bf0: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
8c00: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
8c10: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
8c20: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
8c30: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
8c40: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
8c50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
8c60: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
8c70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8c80: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
8c90: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
8ca0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
8cb0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
8cc0: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
8cd0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
8ce0: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
8cf0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
8d00: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
8d10: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
8d20: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
8d30: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
8d40: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
8d50: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
8d60: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
8d70: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
8d80: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
8d90: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
8da0: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
8db0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
8dc0: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
8dd0: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
8de0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
8df0: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
8e00: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
8e10: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
8e20: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
8e30: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
8e40: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8e50: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
8e60: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
8e70: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
8e80: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
8e90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
8ea0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
8eb0: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
8ec0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
8ed0: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
8ee0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
8ef0: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
8f00: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
8f10: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
8f20: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
8f30: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
8f40: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
8f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
8f60: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
8f70: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
8f80: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
8f90: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
8fa0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
8fb0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
8fc0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
8fd0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
8fe0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
8ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
9000: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
9010: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
9020: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  der!=0 );.    as
9030: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
9040: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
9050: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
9060: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9070: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
9080: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
9090: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
90a0: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
90b0: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
90c0: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
90d0: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
90e0: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
90f0: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
9100: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
9110: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
9120: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
9130: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
9140: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
9150: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
9160: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
9170: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
9180: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9190: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
91a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
91b0: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
91c0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
91d0: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
91e0: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
91f0: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
9200: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
9210: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
9220: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
9230: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
9240: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
9250: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9260: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
9270: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
9280: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
9290: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
92a0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
92b0: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
92c0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
92d0: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
92e0: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
92f0: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
9300: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
9310: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
9320: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
9330: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
9340: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
9350: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
9360: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
9370: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
9380: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
9390: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
93a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
93b0: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
93c0: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
93d0: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
93e0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
93f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
9400: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
9410: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
9420: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
9430: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
9440: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
9450: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9460: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
9470: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
9480: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
9490: 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65     && !reference
94a0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
94b0: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
94c0: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
94d0: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
94e0: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63   this index matc
94f0: 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66  h some prefix of
9500: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9510: 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ause.    ** and 
9520: 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49  the index is UNI
9530: 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73  QUE and no terms
9540: 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20   on the tail of 
9550: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
9560: 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72   ** clause refer
9570: 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65  ence other table
9580: 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66  s in a join.  If
9590: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75   this is all tru
95a0: 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  e then.    ** th
95b0: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
95c0: 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  e is superfluous
95d0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
95e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
95f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  0;.}../*.** Chec
9600: 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69  k table to see i
9610: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
9620: 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42  lause in pOrderB
9630: 79 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  y can be satisfi
9640: 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67  ed.** by sorting
9650: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57   in order of ROW
9660: 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ID.  Return true
9670: 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a   if so and set *
9680: 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74  pbRev to be.** t
9690: 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20  rue for reverse 
96a0: 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20  ROWID and false 
96b0: 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49  for forward ROWI
96c0: 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  D order..*/.stat
96d0: 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42  ic int sortableB
96e0: 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61  yRowid(.  int ba
96f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
9700: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
9710: 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20  er for table to 
9720: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45  be sorted */.  E
9730: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9740: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
9750: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
9760: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
9770: 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61  pMaskSet,  /* Ma
9780: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
9790: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
97a0: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
97b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
97c0: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
97d0: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
97e0: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
97f0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
9800: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9810: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
9820: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
9830: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
9840: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
9850: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
9860: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
9870: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20  iColumn==-1.    
9880: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
9890: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
98a0: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c  By, pMaskSet, 1,
98b0: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70   base) ){.    *p
98c0: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
98d0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
98e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
98f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9900: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
9910: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
9920: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
9930: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
9940: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
9950: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
9960: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
9970: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
9980: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
9990: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
99a0: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
99b0: 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ings with O(logN
99c0: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
99d0: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
99e0: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
99f0: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
9a00: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
9a10: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
9a20: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
9a30: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
9a40: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
9a50: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
9a60: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
9a70: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
9a80: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
9a90: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
9aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
9ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
9ac0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
9ad0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
9ae0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
9af0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
9b00: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
9b10: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
9b20: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
9b30: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
9b40: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
9b50: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
9b60: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
9b70: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
9b80: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
9b90: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9ba0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9bb0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
9bc0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
9bd0: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
9be0: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
9bf0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
9c00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
9c10: 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  !sqlite3_where_t
9c20: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
9c30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9c40: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
9c50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
9c60: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
9c70: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
9c80: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
9c90: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
9ca0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
9cb0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
9cc0: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
9cd0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
9ce0: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
9cf0: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
9d00: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
9d10: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
9d20: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
9d30: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
9d40: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
9d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9d60: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
9d70: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
9d80: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
9d90: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
9da0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
9db0: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
9dc0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
9dd0: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
9de0: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
9df0: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
9e00: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
9e10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
9e20: 28 20 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65  ( !sqlite3_where
9e30: 5f 74 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  _trace ) return;
9e40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9e50: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
9e60: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
9e70: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
9e80: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
9e90: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
9ea0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9eb0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
9ec0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
9ed0: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
9ee0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
9ef0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
9f00: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
9f10: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
9f20: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
9f30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
9f40: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
9f50: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
9f60: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
9f70: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
9f80: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
9f90: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
9fa0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
9fb0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
9fc0: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
9fd0: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
9fe0: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
9ff0: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
a000: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
a010: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
a020: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  S(A).#endif..#if
a030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a040: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
a050: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a060: 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61  best index for a
a070: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
a080: 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69  **.** The best i
a090: 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64  ndex is computed
a0a0: 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
a0b0: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ex method of the
a0c0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
a0d0: 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20  e module.  This 
a0e0: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c  routine is reall
a0f0: 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72  y just a wrapper
a100: 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a   that sets up.**
a110: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a120: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a130: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  e that is used t
a140: 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69  o communicate wi
a150: 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  th.** xBestIndex
a160: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69  ..**.** In a joi
a170: 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
a180: 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20  might be called 
a190: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66  multiple times f
a1a0: 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76  or the.** same v
a1b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
a1c0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a1d0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
a1e0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
a1f0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e  d initialized on
a200: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
a210: 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ation and reused
a220: 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   on all subseque
a230: 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  nt.** invocation
a240: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
a250: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a260: 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65  ture is also use
a270: 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69  d when.** code i
a280: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61  s generated to a
a290: 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61  ccess the virtua
a2a0: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68  l table.  The wh
a2b0: 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20  ereInfoDelete() 
a2c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65  .** routine take
a2d0: 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e  s care of freein
a2e0: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  g the sqlite3_in
a2f0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
a300: 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72  re after.** ever
a310: 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68  ybody has finish
a320: 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73  ed with it..*/.s
a330: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73  tatic double bes
a340: 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
a350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
a380: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
a390: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a3b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a3c0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
a3d0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
a3e0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
a3f0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
a400: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
a410: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
a430: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
a440: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
a450: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
a460: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
a470: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
a480: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
a490: 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79 55 73  .  int orderByUs
a4a0: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
a4b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
a4c0: 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f  can potential so
a4d0: 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rt */.  sqlite3_
a4e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
a4f0: 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20  dxInfo /* Index 
a500: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
a510: 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
a520: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a530: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
a540: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
a550: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
a560: 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
a570: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
a580: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
a590: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
a5a0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
a5b0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
a5c0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
a5d0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
a5e0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
a5f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
a600: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
a610: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
a620: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66  int rc;..  /* If
a630: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a640: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a650: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  e has not been p
a660: 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  reviously.  ** a
a670: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69  llocated and ini
a680: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69  tialized for thi
a690: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  s virtual table,
a6a0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20   then allocate. 
a6b0: 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69   ** and initiali
a6c0: 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20  ze it now.  */. 
a6d0: 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49   pIdxInfo = *ppI
a6e0: 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
a6f0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
a700: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a710: 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  m;.    int nTerm
a720: 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
a730: 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69  (("Recomputing i
a740: 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73  ndex info for %s
a750: 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ...\n", pTab->zN
a760: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
a770: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
a780: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
a790: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
a7a0: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
a7b0: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69     ** to this vi
a7c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
a7d0: 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30     for(i=nTerm=0
a7e0: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
a7f0: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
a800: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
a810: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a820: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
a830: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
a840: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
a850: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a860: 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e  ==WO_IN ) contin
a870: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
a880: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
a890: 57 4f 5f 49 53 4e 55 4c 4c 20 29 20 63 6f 6e 74  WO_ISNULL ) cont
a8a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72  inue;.      nTer
a8b0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
a8c0: 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
a8d0: 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
a8e0: 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
a8f0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
a900: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
a910: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
a920: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
a930: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
a940: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c  f.    ** the sql
a950: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a960: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
a970: 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  /.    nOrderBy =
a980: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
a990: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
a9a0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
a9b0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
a9c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
a9d0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
a9e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a9f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
aa00: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
aa10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
aa20: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
aa30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
aa40: 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
aa50: 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
aa60: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
aa70: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
aa80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aa90: 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
aaa0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
aab0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
aac0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  e.    */.    pId
aad0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
aae0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
aaf0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
ab00: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
ab30: 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
ab40: 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
ab50: 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
ab80: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
ab90: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  y );.    if( pId
aba0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
abb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
abc0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
abd0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
abe0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
abf0: 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e    }.    *ppIdxIn
ac00: 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a  fo = pIdxInfo;..
ac10: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
ac20: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
ac30: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
ac40: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
ac50: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  re contains.    
ac60: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
ac70: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
ac80: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
ac90: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
aca0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67  rom.    ** chang
acb0: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
acc0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
acd0: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
ace0: 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69  rder to.    ** i
acf0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
ad00: 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  fields..    */. 
ad10: 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73     pIdxCons = (s
ad20: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
ad30: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
ad40: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
ad50: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
ad60: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
ad70: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
ad80: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
ad90: 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73  .    pUsage = (s
ada0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
adb0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
adc0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
add0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
ade0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
adf0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
ae00: 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69  = nTerm;.    *(i
ae10: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
ae20: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
ae30: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
ae40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
ae50: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
ae60: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
ae70: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
ae80: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
ae90: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
aea0: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
aeb0: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
aec0: 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72  derBy;.    *(str
aed0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
aee0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
aef0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
af00: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
af10: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
af60: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  .    for(i=j=0, 
af70: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
af80: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
af90: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
afa0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
afb0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
afc0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
afd0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
afe0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
aff0: 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65  WO_IN ) continue
b000: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
b010: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
b020: 5f 49 53 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  _ISNULL ) contin
b030: 75 65 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f  ue;.      pIdxCo
b040: 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
b050: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  pTerm->leftColum
b060: 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  n;.      pIdxCon
b070: 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
b080: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
b090: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65  Cons[j].op = pTe
b0a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20  rm->eOperator;. 
b0b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65       /* The dire
b0c0: 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
b0d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
b0e0: 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
b0f0: 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
b100: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
b110: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
b120: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
b130: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
b140: 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  The.      ** fol
b150: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
b160: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
b170: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
b180: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
b190: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b1a0: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _EQ );.      ass
b1b0: 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
b1c0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b1d0: 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  INT_LT );.      
b1e0: 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
b1f0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b200: 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
b210: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
b220: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
b230: 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
b240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
b250: 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
b260: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
b270: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b280: 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
b290: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b2a0: 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
b2b0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
b2c0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
b2d0: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
b2e0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
b2f0: 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a  ATCH) );.      j
b300: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
b310: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
b320: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  y; i++){.      E
b330: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
b340: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
b350: 72 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64  r;.      pIdxOrd
b360: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
b370: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
b380: 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65  ;.      pIdxOrde
b390: 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
b3a0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
b3b0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
b3c0: 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
b3d0: 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  point, the sqlit
b3e0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
b3f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64  ructure that pId
b400: 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a  xInfo points.  *
b410: 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62  * to will have b
b420: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  een initialized,
b430: 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74   either during t
b440: 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
b450: 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75  ation or.  ** du
b460: 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20  ring some prior 
b470: 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77  invocation.  Now
b480: 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f   we just have to
b490: 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20   customize the. 
b4a0: 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70   ** details of p
b4b0: 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20  IdxInfo for the 
b4c0: 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
b4d0: 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74  on and pass it t
b4e0: 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65  o.  ** xBestInde
b4f0: 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  x..  */..  /* Th
b500: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75  e module name mu
b510: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41  st be defined. A
b520: 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69  lso, by this poi
b530: 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20  nt there must.  
b540: 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  ** be a pointer 
b550: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  to an sqlite3_vt
b560: 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74  ab structure. Ot
b570: 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c  herwise.  ** sql
b580: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
b590: 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68  nNames() would h
b5a0: 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74 68  ave picked up th
b5b0: 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20  e error. .  */. 
b5c0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61   assert( pTab->a
b5d0: 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54  zModuleArg && pT
b5e0: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
b5f0: 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0] );.  assert( 
b600: 70 54 61 62 2d 3e 70 56 74 61 62 20 29 3b 0a 23  pTab->pVtab );.#
b610: 69 66 20 30 0a 20 20 69 66 28 20 70 54 61 62 2d  if 0.  if( pTab-
b620: 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20  >pVtab==0 ){.   
b630: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b640: 28 70 50 61 72 73 65 2c 20 22 75 6e 64 65 66 69  (pParse, "undefi
b650: 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f  ned module %s fo
b660: 72 20 74 61 62 6c 65 20 25 73 22 2c 0a 20 20 20  r table %s",.   
b670: 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64       pTab->azMod
b680: 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d  uleArg[0], pTab-
b690: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
b6a0: 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e  urn 0.0;.  }.#en
b6b0: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  dif..  /* Set th
b6c0: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  e aConstraint[].
b6d0: 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e  usable fields an
b6e0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c  d initialize all
b6f0: 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61   .  ** output va
b700: 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e  riables to zero.
b710: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73  .  **.  ** aCons
b720: 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
b730: 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73  is true for cons
b740: 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68  traints where th
b750: 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a  e right-hand.  *
b760: 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20  * side contains 
b770: 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20  only references 
b780: 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  to tables to the
b790: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72   left of the cur
b7a0: 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  rent.  ** table.
b7b0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
b7c0: 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61  , if the constra
b7d0: 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  int is of the fo
b7e0: 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
b7f0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
b800: 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20   expr.  **.  ** 
b810: 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75  and we are evalu
b820: 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68  ating a join, th
b830: 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
b840: 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a  t on column is .
b850: 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20    ** only valid 
b860: 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65  if all tables re
b870: 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72  ferenced in expr
b880: 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65   occur to the le
b890: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  ft.  ** of the t
b8a0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
b8b0: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  column..  **.  *
b8c0: 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  * The aConstrain
b8d0: 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ts[] array conta
b8e0: 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
b8f0: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
b900: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72    ** on the curr
b910: 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74  ent table.  That
b920: 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76   way we only hav
b930: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20  e to compute it 
b940: 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74  once.  ** even t
b950: 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
b960: 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
b970: 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
b980: 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46  le times..  ** F
b990: 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20  or each attempt 
b9a0: 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e  at picking an in
b9b0: 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f  dex, the order o
b9c0: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  f tables in the.
b9d0: 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20    ** join might 
b9e0: 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20  be different so 
b9f0: 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d  we have to recom
ba00: 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20  pute the usable 
ba10: 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74  flag.  ** each t
ba20: 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ime..  */.  pIdx
ba30: 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
ba40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
ba50: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
ba60: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
ba70: 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  t;.  pUsage = pI
ba80: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
ba90: 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28  intUsage;.  for(
baa0: 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
bab0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
bac0: 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
bad0: 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
bae0: 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
baf0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bb00: 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43  >a[j];.    pIdxC
bb10: 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28  ons->usable =  (
bb20: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
bb30: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
bb40: 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  0;.  }.  memset(
bb50: 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
bb60: 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
bb70: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
bb80: 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
bb90: 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
bba0: 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
bbb0: 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
bbc0: 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
bbd0: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
bbe0: 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
bbf0: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
bc00: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
bc10: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
bc20: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
bc30: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
bc40: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
bc50: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
bc60: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
bc70: 20 32 2e 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79   2.0;.  nOrderBy
bc80: 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72   = pIdxInfo->nOr
bc90: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 49 64  derBy;.  if( pId
bca0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
bcb0: 26 26 20 21 6f 72 64 65 72 42 79 55 73 61 62 6c  && !orderByUsabl
bcc0: 65 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  e ){.    *(int*)
bcd0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
bce0: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
bcf0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
bd00: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
bd10: 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42 65  WHERETRACE(("xBe
bd20: 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e  stIndex for %s\n
bd30: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
bd40: 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ;.  TRACE_IDX_IN
bd50: 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a  PUTS(pIdxInfo);.
bd60: 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70 56 74    rc = pTab->pVt
bd70: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
bd80: 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e 70 56  stIndex(pTab->pV
bd90: 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  tab, pIdxInfo);.
bda0: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
bdb0: 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20  UTS(pIdxInfo);. 
bdc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bdd0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
bde0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
bdf0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
be00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
be10: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
be20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
be30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
be40: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
be50: 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 0a  Str(rc));.    }.
be60: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
be70: 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  yOn(pParse->db);
be80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
be90: 20 3d 20 73 71 6c 69 74 65 33 53 61 66 65 74 79   = sqlite3Safety
bea0: 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  On(pParse->db);.
beb0: 20 20 7d 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49    }.  *(int*)&pI
bec0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
bed0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = nOrderBy;..  
bee0: 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d  return pIdxInfo-
bef0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a  >estimatedCost;.
bf00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bf10: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
bf20: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  ABLE */../*.** F
bf30: 69 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64  ind the best ind
bf40: 65 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  ex for accessing
bf50: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
bf60: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ble.  Return a p
bf70: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
bf80: 20 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68   index, flags th
bf90: 61 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20  at describe how 
bfa0: 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
bfb0: 20 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a   be used, the.**
bfc0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
bfd0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
bfe0: 20 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20   and the "cost" 
bff0: 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  for this index..
c000: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
c010: 20 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73   cost index wins
c020: 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61  .  The cost is a
c030: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
c040: 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43  e amount of.** C
c050: 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20  PU and disk I/O 
c060: 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  need to process 
c070: 74 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e  the request usin
c080: 67 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69  g the selected i
c090: 6e 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73  ndex..** Factors
c0a0: 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20   that influence 
c0b0: 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  cost include:.**
c0c0: 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73  .**    *  The es
c0d0: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
c0e0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
c0f0: 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20   be retrieved.  
c100: 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65  (The.**       fe
c110: 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29  wer the better.)
c120: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
c130: 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74  ther or not sort
c140: 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a  ing must occur..
c150: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
c160: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
c170: 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74   must be separat
c180: 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65  e lookups in the
c190: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20  .**       index 
c1a0: 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  and in the main 
c1b0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  table..**.*/.sta
c1c0: 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49  tic double bestI
c1d0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
c1e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c1f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
c200: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c210: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
c220: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
c230: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c240: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
c250: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
c260: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
c270: 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
c280: 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
c290: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
c2a0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
c2b0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
c2c0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
c2d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
c2e0: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f  derBy,         /
c2f0: 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63  * The order by c
c300: 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  lause */.  Index
c310: 20 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20   **ppIndex,     
c320: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a         /* Make *
c330: 70 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f  ppIndex point to
c340: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
c350: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73  */.  int *pFlags
c360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c370: 20 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65   /* Put flags de
c380: 73 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68  scribing this ch
c390: 6f 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20  oice in *pFlags 
c3a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20  */.  int *pnEq  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62   /* Put the numb
c3d0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
c3e0: 6f 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20  onstraints here 
c3f0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
c400: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65  m *pTerm;.  Inde
c410: 78 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20  x *bestIdx = 0; 
c420: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c430: 20 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20   that gives the 
c440: 6c 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20  lowest cost */. 
c450: 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f   double lowestCo
c460: 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
c470: 54 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  The cost of usin
c480: 67 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69  g bestIdx */.  i
c490: 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30  nt bestFlags = 0
c4a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
c4b0: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
c4c0: 69 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20  ith bestIdx */. 
c4d0: 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30   int bestNEq = 0
c4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c4f0: 42 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e  Best value for n
c500: 45 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  Eq */.  int iCur
c510: 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
c520: 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
c530: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
c540: 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
c550: 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c570: 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
c580: 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
c590: 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20    int rev;      
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5b0: 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e   True to scan in
c5c0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
c5d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
c600: 74 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20  ted with pProbe 
c610: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  */.  int nEq;   
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
c640: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
c650: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65  ts */.  int eqTe
c660: 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
c670: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
c680: 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
c690: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75  erators */.  dou
c6a0: 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
c6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
c6c0: 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65   of using pProbe
c6d0: 20 2a 2f 0a 0a 20 20 57 48 45 52 45 54 52 41 43   */..  WHERETRAC
c6e0: 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20 74  E(("bestIndex: t
c6f0: 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d 25  bl=%s notReady=%
c700: 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62  x\n", pSrc->pTab
c710: 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64  ->zName, notRead
c720: 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73  y));.  lowestCos
c730: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
c740: 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20 70  BL;.  pProbe = p
c750: 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
c760: 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  x;..  /* If the 
c770: 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64  table has no ind
c780: 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
c790: 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74  re no terms in t
c7a0: 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c  he where.  ** cl
c7b0: 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 20  ause that refer 
c7c0: 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20 74 68  to the ROWID, th
c7d0: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72  en we will never
c7e0: 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20   be able to do. 
c7f0: 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   ** anything oth
c800: 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74  er than a full t
c810: 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68 69  able scan on thi
c820: 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d 69 67  s table.  We mig
c830: 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20  ht as.  ** well 
c840: 70 75 74 20 69 74 20 66 69 72 73 74 20 69 6e 20  put it first in 
c850: 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20  the join order. 
c860: 20 54 68 61 74 20 77 61 79 2c 20 70 65 72 68 61   That way, perha
c870: 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20 20 2a  ps it can be.  *
c880: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  * referenced by 
c890: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20  other tables in 
c8a0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
c8b0: 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20 26   if( pProbe==0 &
c8c0: 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d 28  &.     findTerm(
c8d0: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
c8e0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  , WO_EQ|WO_IN|WO
c8f0: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
c900: 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20  WO_GE,0)==0 &&. 
c910: 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d 30      (pOrderBy==0
c920: 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79 52   || !sortableByR
c930: 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65  owid(iCur, pOrde
c940: 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53  rBy, pWC->pMaskS
c950: 65 74 2c 20 26 72 65 76 29 29 20 29 7b 0a 20 20  et, &rev)) ){.  
c960: 20 20 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20    *pFlags = 0;. 
c970: 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b     *ppIndex = 0;
c980: 0a 20 20 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a  .    *pnEq = 0;.
c990: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
c9a0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
c9b0: 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58 50 52  for a rowid=EXPR
c9c0: 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e   or rowid IN (..
c9d0: 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  .) constraints. 
c9e0: 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69   */.  pTerm = fi
c9f0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
ca00: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
ca10: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
ca20: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
ca30: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
ca40: 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20  .    *ppIndex = 
ca50: 30 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73  0;.    bestFlags
ca60: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   = WHERE_ROWID_E
ca70: 51 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  Q;.    if( pTerm
ca80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ca90: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
caa0: 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79  Rowid== is alway
cab0: 73 20 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e  s the best pick.
cac0: 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65    Look no furthe
cad0: 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79  r.  Because only
cae0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  .      ** a sing
caf0: 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61  le row is genera
cb00: 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20 61  ted, output is a
cb10: 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64 20  lways in sorted 
cb20: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a  order */.      *
cb30: 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  pFlags = WHERE_R
cb40: 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52 45 5f  OWID_EQ | WHERE_
cb50: 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 2a 70  UNIQUE;.      *p
cb60: 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 57  nEq = 1;.      W
cb70: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
cb80: 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22  best is rowid\n"
cb90: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
cba0: 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   0.0;.    }else 
cbb0: 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65  if( (pExpr = pTe
cbc0: 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73  rm->pExpr)->pLis
cbd0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t!=0 ){.      /*
cbe0: 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29   Rowid IN (LIST)
cbf0: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
cc00: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
cc10: 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20  umber of list.  
cc20: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
cc30: 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73    */.      lowes
cc40: 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  tCost = pExpr->p
cc50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
cc60: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d     lowestCost *=
cc70: 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f   estLog(lowestCo
cc80: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
cc90: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
cca0: 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74  N (SELECT): cost
ccb0: 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
ccc0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
ccd0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
cce0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f   in the result o
ccf0: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65  f the inner sele
cd00: 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20  ct.  We have no 
cd10: 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a  way to estimate.
cd20: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61        ** that va
cd30: 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69  lue so make a wi
cd40: 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20  ld guess. */.   
cd50: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
cd60: 32 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  200;.    }.    W
cd70: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
cd80: 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25  rowid IN cost: %
cd90: 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f  .9g\n", lowestCo
cda0: 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
cdb0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73  Estimate the cos
cdc0: 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61  t of a table sca
cdd0: 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  n.  If we do not
cde0: 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20   know how many. 
cdf0: 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20   ** entries are 
ce00: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73  in the table, us
ce10: 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61  e 1 million as a
ce20: 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63   guess..  */.  c
ce30: 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70  ost = pProbe ? p
ce40: 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
ce50: 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20  0] : 1000000;.  
ce60: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
ce70: 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65   table scan base
ce80: 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
ce90: 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20  cost));.  flags 
cea0: 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
ceb0: 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  NGE;..  /* Check
cec0: 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
ced0: 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72   on a range of r
cee0: 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65  owids in a table
cef0: 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   scan..  */.  pT
cf00: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
cf10: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
cf20: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
cf30: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
cf40: 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
cf50: 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64   ){.    if( find
cf60: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
cf70: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
cf80: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b  _LT|WO_LE, 0) ){
cf90: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
cfa0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
cfb0: 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33  .      cost /= 3
cfc0: 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
cfd0: 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d   rowid<EXPR elim
cfe0: 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
cff0: 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s or rows */.   
d000: 20 7d 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54   }.    if( findT
d010: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
d020: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
d030: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a  GT|WO_GE, 0) ){.
d040: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
d050: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
d060: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
d070: 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20    /* Guess that 
d080: 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69  rowid>EXPR elimi
d090: 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73  nates two-thirds
d0a0: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   of rows */.    
d0b0: 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  }.    WHERETRACE
d0c0: 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e  (("... rowid ran
d0d0: 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ge reduces cost 
d0e0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
d0f0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
d100: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a   flags = 0;.  }.
d110: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
d120: 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74  le scan does not
d130: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
d140: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e  ER BY clause, in
d150: 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20  crease.  ** the 
d160: 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f  cost by NlogN to
d170: 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e   cover the expen
d180: 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a  se of sorting. *
d190: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
d1a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74   ){.    if( sort
d1b0: 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72  ableByRowid(iCur
d1c0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d  , pOrderBy, pWC-
d1d0: 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29  >pMaskSet, &rev)
d1e0: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
d1f0: 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
d200: 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
d210: 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  GE;.      if( re
d220: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  v ){.        fla
d230: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
d240: 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
d250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d260: 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
d270: 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 57  g(cost);.      W
d280: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
d290: 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
d2a0: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
d2b0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d  ", cost));.    }
d2c0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c  .  }.  if( cost<
d2d0: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
d2e0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
d2f0: 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  ost;.    bestFla
d300: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
d310: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72  .  /* If the pSr
d320: 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  c table is the r
d330: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
d340: 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77  LEFT JOIN then w
d350: 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75  e may not.  ** u
d360: 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73  se an index to s
d370: 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63  atisfy IS NULL c
d380: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
d390: 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  at table.  This 
d3a0: 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  is.  ** because 
d3b0: 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e  columns might en
d3c0: 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20  d up being NULL 
d3d0: 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  if the table doe
d3e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20  s not match -.  
d3f0: 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63  ** a circumstanc
d400: 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  e which the inde
d410: 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73  x cannot help us
d420: 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b   discover.  Tick
d430: 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20  et #2177..  */. 
d440: 20 69 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e   if( (pSrc->join
d450: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
d460: 3d 30 20 29 7b 0a 20 20 20 20 65 71 54 65 72 6d  =0 ){.    eqTerm
d470: 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
d480: 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
d490: 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
d4a0: 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
d4b0: 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ULL;.  }..  /* L
d4c0: 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65  ook at each inde
d4d0: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  x..  */.  for(; 
d4e0: 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
d4f0: 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
d500: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d530: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e  */.    double in
d540: 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a  Multiplier = 1;.
d550: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
d560: 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c  ("... index %s:\
d570: 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  n", pProbe->zNam
d580: 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75  e));..    /* Cou
d590: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
d5a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d5b0: 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 73  index that are s
d5c0: 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a 20  atisfied.    ** 
d5d0: 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74 72  by x=EXPR constr
d5e0: 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e  aints or x IN (.
d5f0: 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ..) constraints.
d600: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  .    */.    flag
d610: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
d620: 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; i<pProbe->nC
d630: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
d640: 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
d650: 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  e->aiColumn[i];.
d660: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
d670: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
d680: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65  , j, notReady, e
d690: 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50 72 6f 62  qTermMask, pProb
d6a0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
d6b0: 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
d6c0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
d6d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
d6e0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
d6f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
d700: 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  IN ){.        Ex
d710: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
d720: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
d730: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
d740: 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
d750: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
d760: 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20  Select!=0 ){.   
d770: 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
d780: 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  ier *= 25;.     
d790: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
d7a0: 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  pr->pList!=0 ){.
d7b0: 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
d7c0: 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d  iplier *= pExpr-
d7d0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20  >pList->nExpr + 
d7e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
d7f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
d800: 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ost = pProbe->ai
d810: 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75  RowEst[i] * inMu
d820: 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f  ltiplier * estLo
d830: 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b  g(inMultiplier);
d840: 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20  .    nEq = i;.  
d850: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e    if( pProbe->on
d860: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
d870: 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
d880: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20  _COLUMN_IN)==0. 
d890: 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d          && nEq==
d8a0: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
d8b0: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
d8c0: 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
d8d0: 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54      }.    WHERET
d8e0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45  RACE(("...... nE
d8f0: 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67  q=%d inMult=%.9g
d900: 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e 45   cost=%.9g\n",nE
d910: 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 63  q,inMultiplier,c
d920: 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ost));..    /* L
d930: 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f  ook for range co
d940: 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f  nstraints.    */
d950: 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
d960: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
d970: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
d980: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
d990: 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
d9a0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
d9b0: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
d9c0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
d9d0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
d9e0: 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
d9f0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  pTerm ){.       
da00: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
da10: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20  COLUMN_RANGE;.  
da20: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
da30: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
da40: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
da50: 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20  |WO_LE, pProbe) 
da60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
da70: 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
da80: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
da90: 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20   cost /= 3;.    
daa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
dab0: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
dac0: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
dad0: 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
dae0: 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
daf0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
db00: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
db10: 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d           cost /=
db20: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
db30: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
db40: 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20  (("...... range 
db50: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
db60: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
db70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
db80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61      /* Add the a
db90: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f  dditional cost o
dba0: 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61  f sorting if tha
dbb0: 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20  t is a factor.. 
dbc0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f     */.    if( pO
dbd0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
dbe0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
dbf0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
dc00: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 69   &&.           i
dc10: 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  sSortingIndex(pP
dc20: 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53  arse,pWC->pMaskS
dc30: 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70  et,pProbe,iCur,p
dc40: 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76  OrderBy,nEq,&rev
dc50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
dc60: 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20   flags==0 ){.   
dc70: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
dc80: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
dc90: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
dca0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
dcb0: 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
dcc0: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
dcd0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
dce0: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
dcf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dd00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dd10: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
dd20: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
dd30: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
dd40: 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20  "...... orderby 
dd50: 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
dd60: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
dd70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dd80: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
dd90: 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20  o see if we can 
dda0: 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73  get away with us
ddb0: 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
ddc0: 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ex without.    *
ddd0: 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74  * ever reading t
dde0: 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  he table.  If th
ddf0: 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
de00: 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20  then halve the. 
de10: 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68     ** cost of th
de20: 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  is index..    */
de30: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
de40: 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  & pSrc->colUsed 
de50: 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  < (((Bitmask)1)<
de60: 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
de70: 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
de80: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  Src->colUsed;.  
de90: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
dea0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f   for(j=0; j<pPro
deb0: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  be->nColumn; j++
dec0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
ded0: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
dee0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
def0: 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20  if( x<BMS-1 ){. 
df00: 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28           m &= ~(
df10: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29  ((Bitmask)1)<<x)
df20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d    }.      if( m=
df40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
df50: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
df60: 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63  _ONLY;.        c
df70: 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  ost /= 2;.      
df80: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
df90: 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72  ..... idx-only r
dfa0: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
dfb0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
dfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
dfd0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
dfe0: 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64  dex has achieved
dff0: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
e000: 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73   so far, then us
e010: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
e020: 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 63 6f   if( flags && co
e030: 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20  st < lowestCost 
e040: 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78  ){.      bestIdx
e050: 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20   = pProbe;.     
e060: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f   lowestCost = co
e070: 73 74 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c  st;.      bestFl
e080: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
e090: 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71     bestNEq = nEq
e0a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e0b0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73  * Report the bes
e0c0: 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20  t result.  */.  
e0d0: 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49  *ppIndex = bestI
e0e0: 64 78 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  dx;.  WHERETRACE
e0f0: 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73  (("best index is
e100: 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20   %s, cost=%.9g, 
e110: 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64  flags=%x, nEq=%d
e120: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65 73  \n",.        bes
e130: 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d 3e  tIdx ? bestIdx->
e140: 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22  zName : "(none)"
e150: 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62 65  , lowestCost, be
e160: 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e 45 71  stFlags, bestNEq
e170: 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20  ));.  *pFlags = 
e180: 62 65 73 74 46 6c 61 67 73 20 7c 20 65 71 54 65  bestFlags | eqTe
e190: 72 6d 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45 71 20  rmMask;.  *pnEq 
e1a0: 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74  = bestNEq;.  ret
e1b0: 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a  urn lowestCost;.
e1c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  }.../*.** Disabl
e1d0: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
e1e0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
e1f0: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
e200: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
e210: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
e220: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
e230: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
e240: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
e250: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
e260: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
e270: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
e280: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
e290: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
e2a0: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
e2b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
e2c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
e2d0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
e2e0: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
e2f0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
e300: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
e310: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
e320: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
e330: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
e340: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
e350: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
e360: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
e370: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
e380: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
e390: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
e3a0: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
e3b0: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
e3c0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
e3d0: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
e3e0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
e3f0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
e400: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
e410: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
e420: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
e430: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
e440: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
e450: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
e460: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
e470: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
e480: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
e490: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
e4a0: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
e4b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
e4c0: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
e4d0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
e4e0: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
e4f0: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
e500: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
e510: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
e520: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
e530: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
e540: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
e550: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
e560: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
e570: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
e580: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
e590: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
e5a0: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
e5b0: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
e5c0: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
e5d0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
e5e0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
e5f0: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
e600: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
e610: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
e620: 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
e630: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
e640: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
e650: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
e660: 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
e670: 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
e680: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
e690: 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
e6a0: 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
e6b0: 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
e6c0: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
e6d0: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
e6e0: 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
e6f0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
e700: 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
e710: 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
e720: 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
e730: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
e740: 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
e750: 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
e760: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
e770: 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
e780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
e790: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
e7a0: 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
e7c0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e7d0: 6f 64 65 20 74 68 61 74 20 62 75 69 6c 64 73 20  ode that builds 
e7e0: 61 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69  a probe for an i
e7f0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ndex..**.** Ther
e800: 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 43 6f 6c  e should be nCol
e810: 75 6d 6e 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  umn values on th
e820: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 69 6e  e stack.  The in
e830: 64 65 78 0a 2a 2a 20 74 6f 20 62 65 20 70 72 6f  dex.** to be pro
e840: 62 65 64 20 69 73 20 70 49 64 78 2e 20 20 50 6f  bed is pIdx.  Po
e850: 70 20 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f  p the values fro
e860: 6d 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 0a  m the stack and.
e870: 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 6d 20  ** replace them 
e880: 61 6c 6c 20 77 69 74 68 20 61 20 73 69 6e 67 6c  all with a singl
e890: 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 69 73  e record that is
e8a0: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 72   the index.** pr
e8b0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
e8c0: 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65 78   void buildIndex
e8d0: 50 72 6f 62 65 28 0a 20 20 56 64 62 65 20 2a 76  Probe(.  Vdbe *v
e8e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ,        /* Gene
e8f0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
e900: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
e910: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 54  nColumn,    /* T
e920: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e930: 75 6d 6e 73 20 74 6f 20 63 68 65 63 6b 20 66 6f  umns to check fo
e940: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 6e 64 65  r NULL */.  Inde
e950: 78 20 2a 70 49 64 78 20 20 20 20 20 2f 2a 20 49  x *pIdx     /* I
e960: 6e 64 65 78 20 74 68 61 74 20 77 65 20 77 69 6c  ndex that we wil
e970: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 2a  l be searching *
e980: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  /.){.  sqlite3Vd
e990: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
e9a0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
e9b0: 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mn, 0);.  sqlite
e9c0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
e9d0: 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a  r(v, pIdx);.}...
e9e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e9f0: 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
ea00: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
ea10: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
ea20: 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
ea30: 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
ea40: 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
ea50: 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
ea60: 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
ea70: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
ea80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
ea90: 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
eaa0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
eab0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  left on the top 
eac0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
ead0: 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
eae0: 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
eaf0: 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
eb00: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
eb10: 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
eb20: 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
eb30: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
eb40: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
eb50: 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
eb60: 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
eb70: 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
eb80: 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
eb90: 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
eba0: 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
ebb0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45  tatic void codeE
ebc0: 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
ebd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ebe0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
ebf0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
ec00: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
ec10: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
ec20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
ec30: 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
ec40: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
ec50: 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20  pLevel  /* When 
ec60: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
ec70: 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
ec80: 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b  working on */.){
ec90: 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
eca0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
ecb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ecc0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 58 2d  pVdbe;.  if( pX-
ecd0: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
ece0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ecf0: 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
ed00: 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  ight, 0);.  }els
ed10: 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
ed20: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  _ISNULL ){.    s
ed30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ed40: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ed50: 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
ed60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ed70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
ed80: 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
ed90: 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
eda0: 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
edb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
edc0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
edd0: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
ede0: 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
edf0: 73 65 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20 20  se, pX, 1);.    
ee00: 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
ee10: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
ee20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
ee30: 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
ee40: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ee50: 28 28 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d  ((v, "%.*s", pX-
ee60: 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61  >span.n, pX->spa
ee70: 6e 2e 7a 29 29 3b 0a 20 20 20 20 69 66 28 20 70  n.z));.    if( p
ee80: 4c 65 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b  Level->nIn==0 ){
ee90: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  .      pLevel->n
eea0: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
eeb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eec0: 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
eed0: 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
eee0: 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c  l->aInLoop = sql
eef0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
ef00: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
ef10: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c  pLevel->aInLoop,
ef20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
ef50: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  el->aInLoop[0])*
ef60: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20  pLevel->nIn);.  
ef70: 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
ef80: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
ef90: 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e   pIn ){.      in
efa0: 74 20 6f 70 20 3d 20 28 28 65 54 79 70 65 3d 3d  t op = ((eType==
efb0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3f  IN_INDEX_ROWID)?
efc0: 4f 50 5f 52 6f 77 69 64 3a 4f 50 5f 43 6f 6c 75  OP_Rowid:OP_Colu
efd0: 6d 6e 29 3b 0a 20 20 20 20 20 20 70 49 6e 20 2b  mn);.      pIn +
efe0: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20  = pLevel->nIn - 
eff0: 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
f000: 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
f010: 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20   pIn->topAddr = 
f020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f030: 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 2c 20 30  2(v, op, iTab, 0
f040: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f050: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f060: 5f 53 74 61 63 6b 49 73 4e 75 6c 6c 2c 20 2d 31  _StackIsNull, -1
f070: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
f080: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  .      pLevel->n
f090: 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
f0a0: 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
f0b0: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
f0c0: 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Term);.}../*.** 
f0d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f0e0: 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
f0f0: 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
f100: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
f110: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65  n.** index.  The
f120: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
f130: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
f140: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
f150: 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  k..**.** For exa
f160: 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
f170: 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
f180: 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
f190: 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
f1a0: 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
f1b0: 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
f1c0: 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
f1d0: 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
f1e0: 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
f1f0: 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
f200: 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
f210: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
f220: 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
f230: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
f240: 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
f250: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
f260: 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
f270: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
f280: 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
f290: 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
f2a0: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f2b0: 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
f2c0: 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
f2d0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
f2e0: 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
f2f0: 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20  l be left.** on 
f300: 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73  the stack - a is
f310: 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64   the deepest and
f320: 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73   b the shallowes
f330: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  t..**.** In the 
f340: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
f350: 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
f360: 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
f370: 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
f380: 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
f390: 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
f3a0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
f3b0: 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
f3c0: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
f3d0: 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
f3e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
f3f0: 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
f400: 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cell..**.** This
f410: 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
f420: 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
f430: 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
f440: 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74  ll and puts.** t
f450: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
f460: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
f470: 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20  n pLevel->iMem. 
f480: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
f490: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
f4a0: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c  tine will use pL
f4b0: 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74  evel->iMem to st
f4c0: 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
f4d0: 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
f4e0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
f4f0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
f500: 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
f510: 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
f520: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
f530: 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
f540: 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
f550: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
f560: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
f570: 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61  void codeAllEqua
f580: 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
f590: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f5a0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f5b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
f5c0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
f5d0: 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
f5e0: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
f5f0: 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
f600: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
f610: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
f620: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
f630: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
f640: 65 61 64 79 20 20 20 20 20 20 2f 2a 20 57 68 69  eady      /* Whi
f650: 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d  ch parts of FROM
f660: 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
f670: 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  en coded */.){. 
f680: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
f690: 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f  l->nEq;        /
f6a0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
f6b0: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
f6c0: 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
f6d0: 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d    int termsInMem
f6e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f6f0: 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72  /* If true, stor
f700: 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d  e value in mem[]
f710: 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65   cells */.  Vdbe
f720: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f730: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
f740: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f750: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f760: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
f770: 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
f780: 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  Idx;   /* The in
f790: 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66  dex being used f
f7a0: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
f7b0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65    int iCur = pLe
f7c0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20  vel->iTabCur;   
f7d0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
f7e0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
f7f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f810: 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
f820: 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  aint term */.  i
f830: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f850: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f860: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
f870: 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
f880: 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
f890: 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
f8a0: 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20  e them..  ** We 
f8b0: 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c  always need at l
f8c0: 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f  east one used to
f8d0: 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20   store the loop 
f8e0: 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20  terminator.  ** 
f8f0: 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65  value.  If there
f900: 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   are IN operator
f910: 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65  s we'll need one
f920: 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a   for each == or.
f930: 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69    ** IN constrai
f940: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65  nt..  */.  pLeve
f950: 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
f960: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20  se->nMem;.  if( 
f970: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
f980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
f990: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
f9a0: 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  Mem += pLevel->n
f9b0: 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d  Eq;.    termsInM
f9c0: 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  em = 1;.  }..  /
f9d0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
f9e0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f9f0: 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
fa00: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
fa10: 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
fa20: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
fa30: 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64  .    int k = pId
fa40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
fa50: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
fa60: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
fa70: 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  k, notReady, pLe
fa80: 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64 78  vel->flags, pIdx
fa90: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
faa0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
fab0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
fac0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
fad0: 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63  DED)==0 );.    c
fae0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
faf0: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
fb00: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  Level);.    if( 
fb10: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
fb20: 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
fb30: 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
fb40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb50: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 74 61 63 6b  dOp2(v, OP_Stack
fb60: 49 73 4e 75 6c 6c 2c 20 74 65 72 6d 73 49 6e 4d  IsNull, termsInM
fb70: 65 6d 20 3f 20 2d 31 20 3a 20 2d 28 6a 2b 31 29  em ? -1 : -(j+1)
fb80: 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a  , pLevel->brk);.
fb90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
fba0: 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  rmsInMem ){.    
fbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbc0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
fbd0: 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b  0, pLevel->iMem+
fbe0: 6a 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  j+1);.    }.  }.
fbf0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
fc00: 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  all the constrai
fc10: 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e  nt values are on
fc20: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
fc30: 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28  stack.  */.  if(
fc40: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20   termsInMem ){. 
fc50: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
fc60: 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  q; j++){.      s
fc70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc80: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 70 4c  (v, OP_SCopy, pL
fc90: 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20  evel->iMem+j+1, 
fca0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  0);.    }.  }.}.
fcb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
fcc0: 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
fcd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
fce0: 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
fcf0: 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
fd00: 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
fd10: 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
fd20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
fd30: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
fd40: 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
fd50: 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
fd60: 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
fd70: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
fd80: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
fd90: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
fda0: 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
fdb0: 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
fdc0: 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
fdd0: 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
fde0: 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
fdf0: 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
fe00: 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
fe30: 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
fe40: 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
fe50: 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
fe60: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
fe70: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
fe80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe90: 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 57 68  whereInfoFree(Wh
fea0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
feb0: 7b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  {.  if( pWInfo )
fec0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fed0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
fee0: 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
fef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ff00: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
ff10: 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
ff20: 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
ff30: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
ff40: 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
ff50: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
ff60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
ff70: 2a 20 43 6f 76 65 72 61 67 65 3a 20 44 6f 6e 27  * Coverage: Don'
ff80: 74 20 74 68 69 6e 6b 20 74 68 69 73 20 63 61 6e  t think this can
ff90: 20 62 65 20 72 65 61 63 68 65 64 2e 20 42 79 20   be reached. By 
ffa0: 74 68 65 20 74 69 6d 65 20 74 68 69 73 0a 20 20  the time this.  
ffb0: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
ffc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
ffd0: 68 65 20 69 6e 64 65 78 2d 73 74 72 69 6e 67 73  he index-strings
ffe0: 20 68 61 76 65 20 62 65 65 6e 20 70 61 73 73 65   have been passe
fff0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  d.          ** t
10000 6f 20 74 68 65 20 76 64 62 65 20 6c 61 79 65 72  o the vdbe layer
10010 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e 2e 0a 20   for deletion.. 
10020 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
10030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10040 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72  ee(pInfo->idxStr
10050 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10070 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  e(pInfo);.      
10080 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10090 74 65 33 5f 66 72 65 65 28 70 57 49 6e 66 6f 29  te3_free(pWInfo)
100a0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
100b0 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
100c0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
100d0 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
100e0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
100f0 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
10100 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
10110 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
10120 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
10130 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
10140 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
10150 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
10160 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
10170 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
10180 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
10190 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
101a0 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
101b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
101c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
101d0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
101e0 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
101f0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
10200 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
10210 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
10220 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
10230 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
10240 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
10250 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
10260 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
10270 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
10280 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
10290 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
102a0 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
102b0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
102c0 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
102d0 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
102e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
102f0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
10300 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
10310 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
10320 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
10330 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
10340 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
10350 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
10360 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
10370 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
10380 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
10390 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
103a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
103b0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
103c0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
103d0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
103e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
103f0 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
10400 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
10410 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
10420 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
10430 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
10440 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
10450 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
10460 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
10470 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
10480 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
10490 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
104c0 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
104d0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
104f0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
10500 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
10510 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
10520 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
10530 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
10540 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
10550 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
10560 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
10570 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
10580 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
10590 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
105a0 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
105b0 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
105c0 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
105d0 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
105e0 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
105f0 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
10600 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
10610 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
10620 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
10630 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
10640 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
10650 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
10660 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
10670 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
10680 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
10690 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
106a0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
106b0 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
106c0 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
106d0 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
106e0 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
106f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10700 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
10710 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
10720 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
10730 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
10740 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
10750 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
10760 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
10770 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
10780 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
10790 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
107a0 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
107b0 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
107c0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
107d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
107e0 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
107f0 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
10800 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
10810 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
10820 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
10830 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
10840 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
10850 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
10860 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
10870 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
10880 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
10890 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
108a0 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
108b0 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
108c0 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
108d0 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
108e0 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
108f0 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
10900 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
10910 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
10920 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
10930 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10940 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
10950 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
10960 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
10970 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
10980 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
10990 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
109a0 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
109b0 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
109c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
109d0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
109e0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
109f0 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
10a00 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
10a10 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
10a20 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
10a30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
10a40 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
10a50 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
10a60 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
10a70 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
10a80 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
10a90 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
10aa0 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
10ab0 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
10ac0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10ad0 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
10ae0 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
10af0 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
10b00 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
10b10 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
10b20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
10b30 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
10b40 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
10b50 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
10b60 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
10b70 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
10b80 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
10b90 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
10ba0 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
10bb0 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
10bc0 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
10bd0 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
10be0 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
10bf0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
10c00 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
10c10 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
10c20 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
10c30 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
10c40 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
10c50 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
10c60 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
10c70 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
10c80 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
10c90 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
10ca0 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
10cb0 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
10cc0 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
10cd0 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
10ce0 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
10cf0 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
10d00 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
10d10 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70  ESSING.**.** *pp
10d20 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
10d30 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
10d40 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61  R BY clause of a
10d50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10d60 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  t,.** if there i
10d70 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
10d80 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
10d90 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
10da0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
10db0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
10dc0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
10dd0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
10de0 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c  ppOrderBy is NUL
10df0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  L..**.** If an i
10e00 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
10e10 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74   so that the nat
10e20 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65  ural output orde
10e30 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  r of the table.*
10e40 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63  * scan is correc
10e50 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  t for the ORDER 
10e60 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
10e70 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73  that index is us
10e80 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64  ed and.** *ppOrd
10e90 65 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e  erBy is set to N
10ea0 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e  ULL.  This is an
10eb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68   optimization th
10ec0 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a  at prevents an.*
10ed0 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f  * unnecessary so
10ee0 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
10ef0 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78   set if an index
10f00 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
10f10 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
10f20 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
10f30 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  exists..**.** If
10f40 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
10f50 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62  e loops cannot b
10f60 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72  e arranged to pr
10f70 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63  ovide the correc
10f80 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65  t.** output orde
10f90 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f  r, then the *ppO
10fa0 72 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e  rderBy is unchan
10fb0 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  ged..*/.WhereInf
10fc0 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
10fd0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
10fe0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
10ff0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
11000 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
11010 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
11020 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
11030 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
11040 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
11050 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
11060 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11070 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
11080 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f  t **ppOrderBy, /
11090 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
110a0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
110b0 0a 20 20 75 38 20 6f 62 66 6c 61 67 20 20 20 20  .  u8 obflag    
110c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
110d0 6f 66 20 4f 52 44 45 52 42 59 5f 4d 49 4e 2c 20  of ORDERBY_MIN, 
110e0 4f 52 44 45 52 42 59 5f 4d 41 58 20 6f 72 20 4f  ORDERBY_MAX or O
110f0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 2a 2f  RDERBY_NORMAL */
11100 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11130 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
11140 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
11150 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
11160 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11170 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
11180 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
11190 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
111a0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
111b0 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
111c0 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63   */.  int brk, c
111d0 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ont = 0;        
111e0 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73   /* Addresses us
111f0 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ed during code g
11200 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  eneration */.  B
11210 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
11220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11230 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
11240 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
11250 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11260 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
11270 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11280 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
11290 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d  lause */.  ExprM
112a0 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20  askSet maskSet; 
112b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
112c0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
112d0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
112e0 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20  e wc;           
112f0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
11300 61 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20  ause is divided 
11310 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73  into these terms
11320 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11330 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
11340 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
11350 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
11360 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
11370 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
11380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11390 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
113a0 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
113b0 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
113e0 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
113f0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
11400 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
11410 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
11420 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
11430 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61  f all wc.a[].fla
11440 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
11450 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
11460 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
11470 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
11480 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11490 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  y = 0;..  /* The
114a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
114b0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
114c0 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
114d0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
114e0 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
114f0 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
11500 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
11510 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
11520 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11530 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
11540 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
11550 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
11560 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
11570 69 66 28 20 70 70 4f 72 64 65 72 42 79 20 29 7b  if( ppOrderBy ){
11580 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
11590 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  *ppOrderBy;.  }.
115a0 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
115b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
115c0 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
115d0 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
115e0 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
115f0 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
11600 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
11610 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
11620 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73  initMaskSet(&mas
11630 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
11640 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50  auseInit(&wc, pP
11650 61 72 73 65 2c 20 26 6d 61 73 6b 53 65 74 29 3b  arse, &maskSet);
11660 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77  .  whereSplit(&w
11670 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  c, pWhere, TK_AN
11680 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c  D);.    .  /* Al
11690 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
116a0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
116b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
116c0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
116d0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
116e0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  alue..  */.  db 
116f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11700 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
11710 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11720 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
11730 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11740 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
11750 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
11760 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
11770 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11780 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11790 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
117a0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Mem;.  }.  pWInf
117b0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
117c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
117d0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
117e0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
117f0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
11800 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
11810 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11820 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11830 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
11840 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
11850 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
11860 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
11870 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
11880 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
11890 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
118a0 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
118b0 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
118c0 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54  f( pWhere && (pT
118d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20  abList->nSrc==0 
118e0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
118f0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
11900 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
11910 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11920 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
11930 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
11940 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68 65 72  k, 1);.    pWher
11950 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11960 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
11970 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
11980 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
11990 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
119a0 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
119b0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
119c0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
119d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
119e0 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
119f0 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
11a00 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
11a10 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
11a20 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
11a30 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
11a40 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
11a50 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
11a60 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
11a70 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
11a80 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
11a90 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
11aa0 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
11ab0 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
11ac0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
11ad0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78  ursor);.  }.  ex
11ae0 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
11af0 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20 20 69  bList, &wc);.  i
11b00 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11b10 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
11b20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
11b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
11b40 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
11b50 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
11b60 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11b70 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
11b80 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
11b90 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
11ba0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
11bb0 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
11bc0 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
11bd0 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
11be0 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
11bf0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
11c00 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66     pWInfo->a[].f
11c10 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78  lags     WHERE_x
11c20 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
11c30 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
11c40 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
11c50 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
11c60 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
11c70 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
11c80 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
11c90 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e  ].iFrom     When
11ca0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
11cb0 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
11cc0 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
11cd0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
11ce0 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
11cf0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
11d00 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
11d10 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
11d20 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
11d30 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
11d40 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a   index.  **.  **
11d50 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
11d60 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
11d70 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
11d80 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
11d90 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
11da0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
11db0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
11dc0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
11dd0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
11de0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
11df0 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
11e00 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
11e10 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
11e20 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
11e30 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
11e40 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
11e50 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
11e60 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
11e70 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
11e80 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
11e90 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
11ea0 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
11eb0 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
11ec0 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
11ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
11ee0 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77  gs asssociated w
11ef0 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  ith pIdx */.    
11f00 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
11f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11f20 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
11f30 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
11f40 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
11f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f60 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72   /* The cost for
11f70 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
11f80 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
11f90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11fa0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
11fb0 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
11fc0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
11fd0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11fe0 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65  he best index se
11ff0 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
12000 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d   int bestFlags =
12010 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
12020 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
12030 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
12040 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d     int bestNEq =
12050 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
12060 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64  * nEq associated
12070 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
12080 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74     double lowest
12090 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
120a0 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42  * Cost of the pB
120b0 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
120c0 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20  estJ = 0;       
120d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
120e0 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
120f0 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
12100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12110 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
12120 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
12130 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b     int once = 0;
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12150 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73  * True when firs
12160 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20  t table is seen 
12170 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
12180 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 64 65  ndex_info *pInde
12190 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 69  x; /* Current vi
121a0 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a  rtual index */..
121b0 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
121c0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
121d0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d  .    for(j=iFrom
121e0 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
121f0 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
12200 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
12210 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
12220 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52        int doNotR
12230 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65  eorder;  /* True
12240 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73   if this table s
12250 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f  hould not be reo
12260 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20 20 20  rdered */..     
12270 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20   doNotReorder = 
12280 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e   (pTabItem->join
12290 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
122a0 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20  JT_CROSS))!=0;. 
122b0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26 26       if( once &&
122c0 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
122d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d  break;.      m =
122e0 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
122f0 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
12300 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
12310 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d   (m & notReady)=
12320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
12330 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
12340 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  om++;.        co
12350 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
12360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
12370 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a  abItem->pTab );.
12380 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12390 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
123a0 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
123b0 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
123c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
123d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
123e0 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d  fo **ppIdxInfo =
123f0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70   &pWInfo->a[j].p
12400 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
12410 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69 72 74   cost = bestVirt
12420 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
12430 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20   &wc, pTabItem, 
12440 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 20 20 20 20 70 70 4f 72 64 65            ppOrde
12470 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42 79  rBy ? *ppOrderBy
12480 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20   : 0, i==0,.    
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 70 70 49 64              ppId
124b0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  xInfo);.        
124c0 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  flags = WHERE_VI
124d0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20  RTUALTABLE;.    
124e0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a 70 70      pIndex = *pp
124f0 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
12500 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
12510 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79 43 6f  Index->orderByCo
12520 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20  nsumed ){.      
12530 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
12540 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c  E_VIRTUALTABLE |
12550 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
12560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12570 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
12580 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20 20 20      nEq = 0;.   
12590 20 20 20 20 20 69 66 28 20 28 53 51 4c 49 54 45       if( (SQLITE
125a0 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c 63 6f  _BIG_DBL/2.0)<co
125b0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
125c0 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
125d0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
125e0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
125f0 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
12600 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
12610 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
12620 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
12630 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
12640 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
12650 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77  ** the (cost<low
12660 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
12670 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
12680 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 20  e true and.     
12690 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c 2d 3e       ** pLevel->
126a0 70 42 65 73 74 49 64 78 20 6e 65 76 65 72 20 73  pBestIdx never s
126b0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  et..          */
126c0 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74   .          cost
126d0 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
126e0 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20 20 20  BL/2.0);.       
126f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a   }.      }else .
12700 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
12710 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65         cost = be
12720 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
12730 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  &wc, pTabItem, n
12740 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64    (i==0 && ppOrd
12770 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72  erBy) ? *ppOrder
12780 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  By : 0,.        
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20   &pIdx, &flags, 
127b0 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70  &nEq);.        p
127c0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
127d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73   }.      if( cos
127e0 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  t<lowestCost ){.
127f0 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31          once = 1
12800 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74  ;.        lowest
12810 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
12820 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
12830 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46  x;.        bestF
12840 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
12850 20 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20        bestNEq = 
12860 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73  nEq;.        bes
12870 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  tJ = j;.        
12880 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
12890 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20   = pIndex;.     
128a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 4e   }.      if( doN
128b0 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61  otReorder ) brea
128c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45  k;.    }.    WHE
128d0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
128e0 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74  timizer choose t
128f0 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70  able %d for loop
12900 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20   %d\n", bestJ,. 
12910 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
12920 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20  -pWInfo->a));.  
12930 20 20 69 66 28 20 28 62 65 73 74 46 6c 61 67 73    if( (bestFlags
12940 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
12950 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  )!=0 ){.      *p
12960 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
12970 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73    }.    andFlags
12980 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20   &= bestFlags;. 
12990 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73     pLevel->flags
129a0 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20   = bestFlags;.  
129b0 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d    pLevel->pIdx =
129c0 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76   pBest;.    pLev
129d0 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45  el->nEq = bestNE
129e0 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  q;.    pLevel->a
129f0 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  InLoop = 0;.    
12a00 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
12a10 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29  .    if( pBest )
12a20 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
12a30 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
12a40 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
12a50 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
12a60 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
12a70 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
12a80 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
12a90 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
12aa0 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
12ab0 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
12ac0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a  l->iFrom = bestJ
12ad0 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  ;.  }.  WHERETRA
12ae0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
12af0 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
12b00 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  n"));..  /* If t
12b10 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f  he total query o
12b20 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69  nly selects a si
12b30 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74  ngle row, then t
12b40 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
12b50 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c   clause is irrel
12b60 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  evant..  */.  if
12b70 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  ( (andFlags & WH
12b80 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26  ERE_UNIQUE)!=0 &
12b90 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  & ppOrderBy ){. 
12ba0 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
12bb0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  0;.  }..  /* Ope
12bc0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
12bd0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
12be0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
12bf0 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
12c00 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
12c10 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
12c20 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
12c30 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
12c40 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
12c50 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
12c60 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69   Goto */.  for(i
12c70 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
12c80 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
12c90 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
12ca0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
12cb0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
12cc0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
12cd0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b  .    Index *pIx;
12ce0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
12cf0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 54  sed to access pT
12d00 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  ab (if any) */. 
12d10 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
12d20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12d30 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
12d40 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
12d50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
12d60 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
12d70 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53  xCur;..#ifndef S
12d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12d90 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  IN.    if( pPars
12da0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
12db0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  .      char *zMs
12dc0 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  g;.      struct 
12dd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
12de0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
12df0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
12e00 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ];.      zMsg = 
12e10 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
12e20 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70  b, "TABLE %s", p
12e30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
12e40 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
12e50 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
12e60 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
12e70 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 41  Printf(db, "%z A
12e80 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
12e90 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
12ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
12eb0 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
12ec0 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
12ed0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
12ee0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  MPrintf(db, "%z 
12ef0 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20  WITH INDEX %s", 
12f00 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  zMsg, pIx->zName
12f10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
12f20 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
12f30 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
12f40 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
12f50 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ANGE) ){.       
12f60 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
12f70 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 55  Printf(db, "%z U
12f80 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59  SING PRIMARY KEY
12f90 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
12fa0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12fb0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12fc0 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  LE.      else if
12fd0 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  ( pLevel->pBestI
12fe0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
12ff0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13000 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65   *pBestIdx = pLe
13010 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20  vel->pBestIdx;. 
13020 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
13030 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13040 20 22 25 7a 20 56 49 52 54 55 41 4c 20 54 41 42   "%z VIRTUAL TAB
13050 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
13060 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
13070 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13080 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65  Idx->idxNum, pBe
13090 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  stIdx->idxStr);.
130a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
130b0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
130c0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  >flags & WHERE_O
130d0 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20  RDERBY ){.      
130e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
130f0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  MPrintf(db, "%z 
13100 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29  ORDER BY", zMsg)
13110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13130 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
13140 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
13150 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  m, 0, zMsg, P4_D
13160 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
13170 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13180 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
13190 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
131a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
131b0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
131c0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
131d0 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
131e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
131f0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13200 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13210 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
13220 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d  isEphem || pTab-
13230 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
13240 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
13250 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13260 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c  TABLE.    if( pL
13270 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29  evel->pBestIdx )
13280 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  {.      int iCur
13290 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
132a0 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
132b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
132c0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
132d0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
132f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62  const char*)pTab
13300 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42  ->pVtab, P4_VTAB
13310 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
13320 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
13330 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13340 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
13350 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13360 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
13370 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
13380 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
13390 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
133a0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
133b0 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61  ol<(sizeof(Bitma
133c0 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20  sk)*8) ){.      
133d0 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
133e0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
133f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
13400 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
13410 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
13420 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
13430 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
13440 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
13450 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
13460 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
13470 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
13480 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
13490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
134a0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
134b0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
134c0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
134d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
134e0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
134f0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
13500 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
13510 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  (pIx = pLevel->p
13520 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Idx)!=0 ){.     
13530 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
13540 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
13550 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
13560 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13570 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
13580 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
13590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
135a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
135b0 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
135c0 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
135d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
135f0 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
13600 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
13610 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13620 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
13630 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
13640 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13650 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
13660 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
13670 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20  nColumn+1);.    
13680 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
13690 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
136a0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
136b0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
136c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
136d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
136e0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
136f0 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
13700 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
13710 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
13720 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
13730 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
13740 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
13750 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
13760 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
13770 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
13780 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
13790 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
137a0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
137b0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
137c0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
137d0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
137e0 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
137f0 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20  m->iCursor;  /* 
13800 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
13810 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
13820 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
13830 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
13840 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
13850 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
13860 20 6e 78 74 3b 20 20 20 20 20 20 20 20 20 20 20   nxt;           
13870 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
13880 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
13890 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
138a0 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  se */.    int iI
138b0 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20  dxCur;       /* 
138c0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
138d0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
138e0 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  .    int omitTab
138f0 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  le;     /* True 
13900 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
13910 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20  dex only */.    
13920 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
13930 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
13940 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
13950 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
13960 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  /..    pTabItem 
13970 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
13980 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
13990 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74     iCur = pTabIt
139a0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
139b0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
139c0 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75  pIdx;.    iIdxCu
139d0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
139e0 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  Cur;.    bRev = 
139f0 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
13a00 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
13a10 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c  =0;.    omitTabl
13a20 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  e = (pLevel->fla
13a30 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
13a40 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  NLY)!=0;..    /*
13a50 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
13a60 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
13a70 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
13a80 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a  structions.    *
13a90 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
13aa0 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
13ab0 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75   brk to break ou
13ac0 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20  t of a loop..   
13ad0 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
13ae0 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
13af0 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
13b00 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
13b10 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20      ** loop..   
13b20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20   **.    ** When 
13b30 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
13b40 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
13b50 20 68 61 76 65 20 61 20 22 6e 78 74 22 20 6c 61   have a "nxt" la
13b60 62 65 6c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  bel that.    ** 
13b70 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
13b80 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
13b90 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
13ba0 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20  tion.  When.    
13bb0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
13bc0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
13bd0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
13be0 20 74 68 65 20 22 6e 78 74 22 20 6c 61 62 65 6c   the "nxt" label
13bf0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
13c00 61 6d 65 20 61 73 20 22 62 72 6b 22 2e 0a 20 20  ame as "brk"..  
13c10 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70    */.    brk = p
13c20 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65  Level->brk = pLe
13c30 76 65 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74  vel->nxt = sqlit
13c40 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13c50 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70  v);.    cont = p
13c60 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71  Level->cont = sq
13c70 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13c80 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  el(v);..    /* I
13c90 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
13ca0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
13cb0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
13cc0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20  allocate and.   
13cd0 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
13ce0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
13cf0 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
13d00 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
13d10 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f  any.    ** row o
13d20 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
13d30 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
13d40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
13d50 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
13d60 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69  (pTabItem[0].joi
13d70 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
13d80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  !=0 ){.      pLe
13d90 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
13da0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13dd0 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
13de0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
13df0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13e00 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
13e10 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
13e20 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  ag"));.    }..#i
13e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13e40 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13e50 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
13e60 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20  BestIdx ){.     
13e70 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65   /* Case 0:  The
13e80 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
13e90 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
13ea0 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
13eb0 56 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20  VNext.      **  
13ec0 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
13ed0 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
13ee0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
13ef0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67  ;.      int iReg
13f00 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
13f10 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
13f20 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
13f30 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73  index_info *pBes
13f40 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  tIdx = pLevel->p
13f50 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69  BestIdx;.      i
13f60 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
13f70 20 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73   pBestIdx->nCons
13f80 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74  traint;.      st
13f90 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13fa0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
13fb0 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74  pBestIdx->aConst
14000 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20  raintUsage;.    
14010 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
14020 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14030 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72  straint *aConstr
14040 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20  aint =.         
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14080 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->aConstraint;.
14090 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
140a0 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
140b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
140c0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t k;.        for
140d0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
140e0 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
140f0 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
14100 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20  k].argvIndex==j 
14110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
14120 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
14130 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f  traint[k].iTermO
14140 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
14150 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14160 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61 5b  de(pParse, wc.a[
14170 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52  iTerm].pExpr->pR
14180 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
14190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
141a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
141b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
141c0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20  ==nConstraint ) 
141d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
141e0 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50       iReg = ++pP
141f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
14200 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b    pParse->nMem++
14210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
14220 74 61 63 6b 54 6f 52 65 67 28 70 50 61 72 73 65  tackToReg(pParse
14230 2c 20 6a 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  , j-1);.      sq
14240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14250 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
14260 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  BestIdx->idxNum,
14270 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71   iReg);.      sq
14280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14290 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
142a0 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  -1, iReg+1);.   
142b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
142c0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
142d0 65 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69  er, iCur, brk, i
142e0 52 65 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69  Reg, pBestIdx->i
142f0 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14310 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46  BestIdx->needToF
14320 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d  reeIdxStr ? P4_M
14330 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
14340 49 43 29 3b 0a 20 20 20 20 20 20 70 42 65 73 74  IC);.      pBest
14350 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
14360 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
14370 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 42 65 73   for(j=0; j<pBes
14380 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  tIdx->nConstrain
14390 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
143a0 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f   if( aUsage[j].o
143b0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
143c0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
143d0 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
143e0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
143f0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
14400 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54 65  Level, &wc.a[iTe
14410 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rm]);.        }.
14420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
14430 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
14440 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
14450 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
14460 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
14470 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14480 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14490 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
144a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
144b0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 20  UALTABLE */..   
144c0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
144d0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
144e0 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
144f0 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
14500 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
14510 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
14520 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a  using an.      *
14530 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
14540 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
14550 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
14560 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
14570 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
14580 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
14590 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
145a0 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
145b0 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ".      **      
145c0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
145d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 54       */.      pT
145e0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
145f0 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
14600 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
14610 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  _IN, 0);.      a
14620 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
14630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14640 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
14650 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14660 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
14670 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
14680 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
14690 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
146a0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
146b0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
146c0 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
146d0 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78  nxt = pLevel->nx
146e0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
146f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14700 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20 6e  _MustBeInt, 1, n
14710 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
14720 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14730 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
14740 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20  ur, nxt);.      
14750 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
14760 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c  "pk"));.      pL
14770 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f  evel->op = OP_No
14780 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  op;.    }else if
14790 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
147a0 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  & WHERE_ROWID_RA
147b0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
147c0 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
147d0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
147e0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
147f0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
14800 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14810 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
14820 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e  P_Noop;.      in
14830 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 57  t start;.      W
14840 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
14850 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20  , *pEnd;..      
14860 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
14870 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  e==0 );.      pS
14880 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  tart = findTerm(
14890 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
148a0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
148b0 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_GE, 0);.      
148c0 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  pEnd = findTerm(
148d0 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
148e0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
148f0 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_LE, 0);.      
14900 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
14910 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61      pTerm = pSta
14920 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74 61  rt;.        pSta
14930 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  rt = pEnd;.     
14940 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
14950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14960 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
14970 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
14980 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61         pX = pSta
14990 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
149a0 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
149b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
149c0 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
149d0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
149e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
149f0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14a00 70 58 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pX->pRight, 0);.
14a10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14a20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14a30 46 6f 72 63 65 49 6e 74 2c 20 30 2c 20 62 72 6b  ForceInt, 0, brk
14a40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pX->op==TK_LE ||
14a70 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 29 3b   pX->op==TK_GT);
14a80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14a90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
14aa0 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a  ev ? OP_MoveLt :
14ab0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
14ac0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
14ad0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
14ae0 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 20 20  "pk"));.        
14af0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
14b00 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20  el, pStart);.   
14b10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b30 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
14b40 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
14b50 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  d, iCur, brk);. 
14b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14b70 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   pEnd ){.       
14b80 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
14b90 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45     pX = pEnd->pE
14ba0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  xpr;.        ass
14bb0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
14bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14bd0 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
14be0 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iCur );.        
14bf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
14c00 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
14c10 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
14c20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 2b  pLevel->iMem = +
14c30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14c50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
14c60 6f 76 65 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ove, 0, pLevel->
14c70 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  iMem);.        i
14c80 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
14c90 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
14ca0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  T ){.          t
14cb0 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
14cc0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
14cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ce0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
14cf0 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
14d00 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  P_Gt;.        }.
14d10 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
14d20 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
14d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14d40 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
14d50 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
14d60 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v);.      pLevel
14d70 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
14d80 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
14d90 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
14da0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
14db0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
14dc0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  rt;.      if( te
14dd0 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
14de0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14e00 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29  _Rowid, iCur, 0)
14e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14e20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14e30 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d  P_SCopy, pLevel-
14e40 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
14e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e60 64 4f 70 32 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp2(v, testOp, 
14e70 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
14e80 49 43 7c 30 78 31 30 30 2c 20 62 72 6b 29 3b 0a  IC|0x100, brk);.
14e90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14ea0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
14eb0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14ec0 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
14ed0 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 54 68 65    /* Case 3: The
14ee0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
14ef0 72 6d 20 74 68 61 74 20 72 65 66 65 72 73 20 74  rm that refers t
14f00 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
14f10 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
14f20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20    column of the 
14f30 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6e 65 71  index is an ineq
14f40 75 61 6c 69 74 79 2e 20 20 46 6f 72 20 65 78 61  uality.  For exa
14f50 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20 20 20 2a  mple, if.      *
14f60 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 69 6e  *         the in
14f70 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
14f80 29 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  ) and the WHERE 
14f90 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
14fa0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
14fb0 20 20 66 6f 72 6d 20 22 78 3d 35 20 41 4e 44 20    form "x=5 AND 
14fc0 79 3c 31 30 22 20 74 68 65 6e 20 74 68 69 73 20  y<10" then this 
14fd0 63 61 73 65 20 69 73 20 75 73 65 64 2e 20 20 4f  case is used.  O
14fe0 6e 6c 79 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nly the.      **
14ff0 20 20 20 20 20 20 20 20 20 72 69 67 68 74 2d 6d           right-m
15000 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
15010 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
15020 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
15030 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15040 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
15050 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
15060 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
15070 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
15080 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
15090 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
150a0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
150b0 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
150c0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
150d0 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
150e0 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
150f0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  in order.      *
15100 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
15110 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
15120 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
15130 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
15140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
15150 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
15160 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
15170 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e 74 20  >nEq;.      int 
15180 74 6f 70 45 71 3d 30 3b 20 20 20 20 20 20 20 20  topEq=0;        
15190 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 70 20 6c  /* True if top l
151a0 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61  imit uses ==. Fa
151b0 6c 73 65 20 69 73 20 73 74 72 69 63 74 6c 79 20  lse is strictly 
151c0 3c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  < */.      int b
151d0 74 6d 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f  tmEq=0;        /
151e0 2a 20 54 72 75 65 20 69 66 20 62 74 6d 20 6c 69  * True if btm li
151f0 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c  mit uses ==. Fal
15200 73 65 20 69 66 20 73 74 72 69 63 74 6c 79 20 3e  se if strictly >
15210 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
15220 70 4f 70 2c 20 62 74 6d 4f 70 3b 20 20 20 2f 2a  pOp, btmOp;   /*
15230 20 4f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   Operators for t
15240 68 65 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f  he top and botto
15250 6d 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73 20  m search bounds 
15260 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  */.      int tes
15270 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  tOp;.      int t
15280 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65  opLimit = (pLeve
15290 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
152a0 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a  _TOP_LIMIT)!=0;.
152b0 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d        int btmLim
152c0 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  it = (pLevel->fl
152d0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
152e0 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20  LIMIT)!=0;.     
152f0 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20   int isMinQuery 
15300 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 66 20  = 0;      /* If 
15310 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  this is an optim
15320 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28  ized SELECT min(
15330 78 29 20 2e 2e 2e 20 2a 2f 0a 0a 20 20 20 20 20  x) ... */..     
15340 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
15350 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
15360 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
15370 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
15380 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c  N.      ** and l
15390 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65 73 20  evel the values 
153a0 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f  of those terms o
153b0 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  n the stack..   
153c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65     */.      code
153d0 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
153e0 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c  (pParse, pLevel,
153f0 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 29 3b   &wc, notReady);
15400 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75 70 6c 69  ..      /* Dupli
15410 63 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  cate the equalit
15420 79 20 74 65 72 6d 20 76 61 6c 75 65 73 20 62 65  y term values be
15430 63 61 75 73 65 20 74 68 65 79 20 77 69 6c 6c 20  cause they will 
15440 61 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  all be.      ** 
15450 75 73 65 64 20 74 77 69 63 65 3a 20 6f 6e 63 65  used twice: once
15460 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65 72   to make the ter
15470 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64  mination key and
15480 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68   once to make th
15490 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74  e.      ** start
154a0 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   key..      */. 
154b0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
154c0 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nEq; j++){.     
154d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
154e0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp1(v, OP_Copy,
154f0 20 31 2d 6e 45 71 29 3b 0a 20 20 20 20 20 20 7d   1-nEq);.      }
15500 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72  ..      /* Figur
15510 65 20 6f 75 74 20 77 68 61 74 20 63 6f 6d 70 61  e out what compa
15520 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20  rison operators 
15530 74 6f 20 75 73 65 20 66 6f 72 20 74 6f 70 20 61  to use for top a
15540 6e 64 20 62 6f 74 74 6f 6d 20 0a 20 20 20 20 20  nd bottom .     
15550 20 2a 2a 20 73 65 61 72 63 68 20 62 6f 75 6e 64   ** search bound
15560 73 2e 20 46 6f 72 20 61 6e 20 61 73 63 65 6e 64  s. For an ascend
15570 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 20 62  ing index, the b
15580 6f 74 74 6f 6d 20 62 6f 75 6e 64 20 69 73 20 61  ottom bound is a
15590 20 3e 20 6f 72 20 3e 3d 0a 20 20 20 20 20 20 2a   > or >=.      *
155a0 2a 20 6f 70 65 72 61 74 6f 72 20 61 6e 64 20 74  * operator and t
155b0 68 65 20 74 6f 70 20 62 6f 75 6e 64 20 69 73 20  he top bound is 
155c0 61 20 3c 20 6f 72 20 3c 3d 20 6f 70 65 72 61 74  a < or <= operat
155d0 6f 72 2e 20 20 46 6f 72 20 61 20 64 65 73 63 65  or.  For a desce
155e0 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69  nding.      ** i
155f0 6e 64 65 78 20 74 68 65 20 6f 70 65 72 61 74 6f  ndex the operato
15600 72 73 20 61 72 65 20 72 65 76 65 72 73 65 64 2e  rs are reversed.
15610 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15620 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  if( pIdx->aSortO
15630 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
15640 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20  E_SO_ASC ){.    
15650 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c      topOp = WO_L
15660 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20  T|WO_LE;.       
15670 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57   btmOp = WO_GT|W
15680 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  O_GE;.      }els
15690 65 7b 0a 20 20 20 20 20 20 20 20 74 6f 70 4f 70  e{.        topOp
156a0 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a   = WO_GT|WO_GE;.
156b0 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20 3d 20          btmOp = 
156c0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_LT|WO_LE;.   
156d0 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20 74       SWAP(int, t
156e0 6f 70 4c 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69  opLimit, btmLimi
156f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
15700 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f     /* If this lo
15710 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73  op satisfies a s
15720 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65  ort order (pOrde
15730 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61  rBy) request tha
15740 74 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  t .      ** was 
15750 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
15760 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
15770 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
15780 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
15790 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
157a0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
157b0 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
157c0 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
157d0 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c        ** a singl
157e0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
157f0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
15800 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
15810 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  ned.      ** sho
15820 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
15830 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
15840 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
15850 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 20 20  mn 'x' is.      
15860 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
15870 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
15880 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15890 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
158a0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  ,.      ** this 
158b0 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
158c0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
158d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
158e0 66 28 20 28 6f 62 66 6c 61 67 3d 3d 4f 52 44 45  f( (obflag==ORDE
158f0 52 42 59 5f 4d 49 4e 29 0a 20 20 20 20 20 20 20  RBY_MIN).       
15900 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  && (pLevel->flag
15910 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29  s&WHERE_ORDERBY)
15920 0a 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78  .       && (pIdx
15930 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20  ->nColumn>nEq). 
15940 20 20 20 20 20 20 26 26 20 28 70 4f 72 64 65 72        && (pOrder
15950 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
15960 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
15970 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 0a 20 20  iColumn[nEq]).  
15980 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
15990 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20  sMinQuery = 1;. 
159a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
159b0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 65   Generate the te
159c0 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20  rmination key.  
159d0 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20  This is the key 
159e0 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20  value that.     
159f0 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65   ** will end the
15a00 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20   search.  There 
15a10 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f  is no terminatio
15a20 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20  n key if there. 
15a30 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65       ** are no e
15a40 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e  quality terms an
15a50 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72  d no "X<..." ter
15a60 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  m..      **.    
15a70 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34    ** 2002-Dec-04
15a80 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f  : On a reverse-o
15a90 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73  rder scan, the s
15aa0 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e  o-called "termin
15ab0 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20  ation".      ** 
15ac0 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72  key computed her
15ad0 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70  e really ends up
15ae0 20 62 65 69 6e 67 20 74 68 65 20 73 74 61 72 74   being the start
15af0 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   key..      */. 
15b00 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76 65       nxt = pLeve
15b10 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20 69 66  l->nxt;.      if
15b20 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ( topLimit ){.  
15b30 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
15b40 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
15b50 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
15b60 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
15b70 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
15b80 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
15b90 64 79 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29  dy, topOp, pIdx)
15ba0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15bb0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
15bc0 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
15bd0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
15be0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
15bf0 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
15c00 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DED)==0 );.     
15c10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15c20 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
15c30 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
15c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15c50 64 4f 70 32 28 76 2c 20 4f 50 5f 53 74 61 63 6b  dOp2(v, OP_Stack
15c60 49 73 4e 75 6c 6c 2c 20 2d 28 6e 45 71 2a 32 2b  IsNull, -(nEq*2+
15c70 31 29 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20  1), nxt);.      
15c80 20 20 74 6f 70 45 71 20 3d 20 70 54 65 72 6d 2d    topEq = pTerm-
15c90 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
15ca0 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
15cb0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
15cc0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
15cd0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
15ce0 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20   OP_IdxGE;.     
15cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15d00 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e 30 20 3f  testOp = nEq>0 ?
15d10 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e   OP_IdxGE : OP_N
15d20 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 74 6f 70  oop;.        top
15d30 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Eq = 1;.      }.
15d40 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70        if( testOp
15d50 21 3d 4f 50 5f 4e 6f 6f 70 20 7c 7c 20 28 69 73  !=OP_Noop || (is
15d60 4d 69 6e 51 75 65 72 79 26 26 62 52 65 76 29 20  MinQuery&&bRev) 
15d70 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
15d80 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c  Col = nEq + topL
15d90 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c  imit;.        pL
15da0 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  evel->iMem = ++p
15db0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
15dc0 20 20 20 20 20 69 66 28 20 69 73 4d 69 6e 51 75       if( isMinQu
15dd0 65 72 79 20 26 26 20 21 74 6f 70 4c 69 6d 69 74  ery && !topLimit
15de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 43   ){.          nC
15df0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
15e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e10 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
15e20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74   0);.          t
15e30 6f 70 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20  opEq = 0;.      
15e40 20 20 7d 0a 20 20 20 20 20 20 20 20 62 75 69 6c    }.        buil
15e50 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e  dIndexProbe(v, n
15e60 43 6f 6c 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  Col, pIdx);.    
15e70 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
15e80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
15e90 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f   = topEq ? OP_Mo
15ea0 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74  veLe : OP_MoveLt
15eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
15ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ed0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78   op, iIdxCur, nx
15ee0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
15ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
15f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15f10 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 70 4c  , OP_Move, 0, pL
15f20 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  evel->iMem);.   
15f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
15f40 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
15f50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15f60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c  beAddOp2(v, OP_L
15f70 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ast, iIdxCur, br
15f80 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  k);.      }.   .
15f90 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15fa0 65 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e  e the start key.
15fb0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65    This is the ke
15fc0 79 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  y that defines t
15fd0 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a  he lower.      *
15fe0 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73  * bound on the s
15ff0 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
16000 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66   no start key if
16010 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
16020 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20      ** equality 
16030 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65  terms and if the
16040 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22  re is no "X>..."
16050 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20   term.  In.     
16060 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67   ** that case, g
16070 65 6e 65 72 61 74 65 20 61 20 22 52 65 77 69 6e  enerate a "Rewin
16080 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  d" instruction i
16090 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20  n place of the. 
160a0 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65       ** start ke
160b0 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20  y search..      
160c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32  **.      ** 2002
160d0 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20  -Dec-04: In the 
160e0 63 61 73 65 20 6f 66 20 61 20 72 65 76 65 72 73  case of a revers
160f0 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20  e-order search, 
16100 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20  the so-called.  
16110 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b      ** "start" k
16120 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  ey really ends u
16130 70 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20  p being used as 
16140 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  the termination 
16150 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
16160 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74      if( btmLimit
16170 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
16180 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e   *pX;.        in
16190 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
161a0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
161b0 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
161c0 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20  m(&wc, iCur, k, 
161d0 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c  notReady, btmOp,
161e0 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
161f0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
16200 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d   );.        pX =
16210 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
16220 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
16230 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
16240 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
16250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16260 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
16270 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b   pX->pRight, 0);
16280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16290 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
162a0 5f 53 74 61 63 6b 49 73 4e 75 6c 6c 2c 20 2d 28  _StackIsNull, -(
162b0 6e 45 71 2b 31 29 2c 20 6e 78 74 29 3b 0a 20 20  nEq+1), nxt);.  
162c0 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54        btmEq = pT
162d0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
162e0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
162f0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
16300 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
16310 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
16320 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d  .        btmEq =
16330 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16340 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62    if( nEq>0 || b
16350 74 6d 4c 69 6d 69 74 20 7c 7c 20 28 69 73 4d 69  tmLimit || (isMi
16360 6e 51 75 65 72 79 26 26 21 62 52 65 76 29 20 29  nQuery&&!bRev) )
16370 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
16380 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69  ol = nEq + btmLi
16390 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
163a0 20 69 73 4d 69 6e 51 75 65 72 79 20 26 26 20 21   isMinQuery && !
163b0 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
163c0 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
163d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
163e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
163f0 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
16400 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 30         btmEq = 0
16410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16420 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
16430 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64  obe(v, nCol, pId
16440 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
16450 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
16460 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
16470 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
16480 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16490 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
164a0 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20 70 4c 65 76  OP_Move, 0, pLev
164b0 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  el->iMem);.     
164c0 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50       testOp = OP
164d0 5f 49 64 78 4c 54 3b 0a 20 20 20 20 20 20 20 20  _IdxLT;.        
164e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
164f0 20 69 6e 74 20 6f 70 20 3d 20 62 74 6d 45 71 20   int op = btmEq 
16500 3f 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50  ? OP_MoveGe : OP
16510 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20  _MoveGt;.       
16520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16530 64 4f 70 32 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp2(v, op, iIdx
16540 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  Cur, nxt);.     
16550 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16560 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
16570 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50       testOp = OP
16580 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c  _Noop;.      }el
16590 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
165a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78   OP_Rewind, iIdx
165c0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
165d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
165e0 65 72 61 74 65 20 74 68 65 20 74 68 65 20 74 6f  erate the the to
165f0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  p of the loop.  
16600 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65  If there is a te
16610 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  rmination.      
16620 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65 20 74  ** key we have t
16630 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61 74 20  o test for that 
16640 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74  key and abort at
16650 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
16660 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20        ** loop.. 
16670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16680 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
16690 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
166a0 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
166b0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
166c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
166d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
166e0 6f 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  opy, pLevel->iMe
166f0 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
16700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16710 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49 64 78  (v, testOp, iIdx
16720 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  Cur, nxt);.     
16730 20 20 20 69 66 28 20 28 74 6f 70 45 71 20 26 26     if( (topEq &&
16740 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62 74 6d   !bRev) || (!btm
16750 45 71 20 26 26 20 62 52 65 76 29 20 29 7b 0a 20  Eq && bRev) ){. 
16760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16770 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
16780 2d 31 2c 20 22 2b 22 2c 20 50 34 5f 53 54 41 54  -1, "+", P4_STAT
16790 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
167a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
167b0 20 74 6f 70 4c 69 6d 69 74 20 7c 20 62 74 6d 4c   topLimit | btmL
167c0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
167d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
167e0 32 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  2(v, OP_Column, 
167f0 69 49 64 78 43 75 72 2c 20 6e 45 71 29 3b 0a 20  iIdxCur, nEq);. 
16800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16820 74 61 63 6b 49 73 4e 75 6c 6c 2c 20 31 2c 20 63  tackIsNull, 1, c
16830 6f 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ont);.      }.  
16840 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
16850 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
16860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16870 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
16880 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
16890 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
168a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp2(v, OP_Mov
168b0 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
168c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
168d0 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
168e0 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
168f0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
16900 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
16910 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
16920 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
16930 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
16940 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
16950 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  xCur;.      pLev
16960 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
16970 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
16980 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
16990 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b  ERE_COLUMN_EQ ){
169a0 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34  .      /* Case 4
169b0 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
169c0 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72  ndex and all ter
169d0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
169e0 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20 20  clause that.    
169f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65    **          re
16a00 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78  fer to the index
16a10 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d 22 20   using the "==" 
16a20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
16a30 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
16a40 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
16a50 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
16a60 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20  vel->nEq;.      
16a70 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
16a80 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 66 20 74   0;      /* If t
16a90 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
16aa0 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  zed SELECT min(x
16ab0 29 20 2e 2e 2e 20 2a 2f 0a 0a 20 20 20 20 20 20  ) ... */..      
16ac0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16ad0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
16ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
16af0 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
16b00 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65  .      ** and le
16b10 61 76 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ave the values o
16b20 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e  f those terms on
16b30 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
16b40 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41    */.      codeA
16b50 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
16b60 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20  pParse, pLevel, 
16b70 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a  &wc, notReady);.
16b80 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76        nxt = pLev
16b90 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20 20 20 20  el->nxt;..      
16ba0 69 66 28 20 28 6f 62 66 6c 61 67 3d 3d 4f 52 44  if( (obflag==ORD
16bb0 45 52 42 59 5f 4d 49 4e 29 0a 20 20 20 20 20 20  ERBY_MIN).      
16bc0 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61   && (pLevel->fla
16bd0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
16be0 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 49  ) .       && (pI
16bf0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
16c00 0a 20 20 20 20 20 20 20 26 26 20 28 70 4f 72 64  .       && (pOrd
16c10 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
16c20 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d  ->iColumn==pIdx-
16c30 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 0a  >aiColumn[nEq]).
16c40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16c50 20 69 6e 74 20 68 3b 0a 20 20 20 20 20 20 20 20   int h;.        
16c60 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
16c70 20 20 20 20 20 20 20 20 66 6f 72 28 68 3d 30 3b          for(h=0;
16c80 20 68 3c 6e 45 71 3b 20 68 2b 2b 29 7b 0a 20 20   h<nEq; h++){.  
16c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16ca0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16cb0 43 6f 70 79 2c 20 31 2d 6e 45 71 29 3b 0a 20 20  Copy, 1-nEq);.  
16cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16cd0 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
16ce0 76 2c 20 6e 45 71 2c 20 70 49 64 78 29 3b 0a 20  v, nEq, pIdx);. 
16cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16d00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
16d10 6f 70 79 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  opy, 0, pLevel->
16d20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
16d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16d40 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
16d50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16d60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16d70 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
16d80 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64          buildInd
16d90 65 78 50 72 6f 62 65 28 76 2c 20 6e 45 71 2b 31  exProbe(v, nEq+1
16da0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  , pIdx);.      }
16db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
16dc0 20 47 65 6e 65 72 61 74 65 20 61 20 73 69 6e 67   Generate a sing
16dd0 6c 65 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c  le key that will
16de0 20 62 65 20 75 73 65 64 20 74 6f 20 62 6f 74 68   be used to both
16df0 20 73 74 61 72 74 20 61 6e 64 20 0a 20 20 20 20   start and .    
16e00 20 20 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 65      ** terminate
16e10 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
16e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62      */.        b
16e30 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76  uildIndexProbe(v
16e40 2c 20 6e 45 71 2c 20 70 49 64 78 29 3b 0a 20 20  , nEq, pIdx);.  
16e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16e60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
16e70 70 79 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69  py, 0, pLevel->i
16e80 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Mem);.      }.. 
16e90 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
16ea0 20 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f 76   code (1) to mov
16eb0 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6d  e to the first m
16ec0 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20  atching element 
16ed0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
16ee0 20 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65      ** Then gene
16ef0 72 61 74 65 20 63 6f 64 65 20 28 32 29 20 74 68  rate code (2) th
16f00 61 74 20 6a 75 6d 70 73 20 74 6f 20 22 6e 78 74  at jumps to "nxt
16f10 22 20 61 66 74 65 72 20 74 68 65 20 63 75 72 73  " after the curs
16f20 6f 72 20 69 73 20 70 61 73 74 0a 20 20 20 20 20  or is past.     
16f30 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61 74   ** the last mat
16f40 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66  ching element of
16f50 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
16f60 20 63 6f 64 65 20 28 31 29 20 69 73 20 65 78 65   code (1) is exe
16f70 63 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f  cuted.      ** o
16f80 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
16f90 65 20 74 68 65 20 73 65 61 72 63 68 2c 20 74 68  e the search, th
16fa0 65 20 63 6f 64 65 20 28 32 29 20 69 73 20 65 78  e code (2) is ex
16fb0 65 63 75 74 65 64 20 62 65 66 6f 72 65 20 65 61  ecuted before ea
16fc0 63 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65 72  ch.      ** iter
16fd0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 61  ation of the sca
16fe0 6e 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  n to see if the 
16ff0 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65  scan has finishe
17000 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  d. */.      if( 
17010 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
17020 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72  /* Scan in rever
17030 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
17040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17050 64 64 4f 70 32 28 76 2c 20 28 69 73 4d 69 6e 51  ddOp2(v, (isMinQ
17060 75 65 72 79 3f 4f 50 5f 4d 6f 76 65 4c 74 3a 4f  uery?OP_MoveLt:O
17070 50 5f 4d 6f 76 65 4c 65 29 2c 20 69 49 64 78 43  P_MoveLe), iIdxC
17080 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20  ur, nxt);.      
17090 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
170a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
170b0 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d  P_SCopy, pLevel-
170c0 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
170d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 4c 54  dOp2(v, OP_IdxLT
170f0 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b  , iIdxCur, nxt);
17100 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
17110 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20  >op = OP_Prev;. 
17120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17130 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74      /* Scan in t
17140 68 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  he forward order
17150 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
17160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17170 20 28 69 73 4d 69 6e 51 75 65 72 79 3f 4f 50 5f   (isMinQuery?OP_
17180 4d 6f 76 65 47 74 3a 4f 50 5f 4d 6f 76 65 47 65  MoveGt:OP_MoveGe
17190 29 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29  ), iIdxCur, nxt)
171a0 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20  ;.        start 
171b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
171c0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
171d0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
171e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
171f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17200 4f 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75  OP_IdxGE, iIdxCu
17210 72 2c 20 6e 78 74 2c 20 30 2c 20 22 2b 22 2c 20  r, nxt, 0, "+", 
17220 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
17230 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
17240 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
17250 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69  }.      if( !omi
17260 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
17270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17280 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
17290 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
172a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
172b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
172c0 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
172d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
172e0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
172f0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65  dxCur;.      pLe
17300 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b  vel->p2 = start;
17310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17320 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
17330 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
17340 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
17350 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
17360 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
17370 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
17380 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  ire table..     
17390 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
173a0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
173b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
173c0 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20  bRev==0 );.     
173d0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
173e0 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  _Next;.      pLe
173f0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
17400 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
17410 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
17420 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17430 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b  ewind, iCur, brk
17440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  );.    }.    not
17450 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
17460 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75 72  k(&maskSet, iCur
17470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17480 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
17490 74 61 63 6b 44 65 70 74 68 2c 20 2d 31 2c 20 30  tackDepth, -1, 0
174a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
174b0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
174c0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
174d0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
174e0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a 2a  ompletely.    **
174f0 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
17500 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
17510 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  of tables..    *
17520 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  /.    for(pTerm=
17530 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d  wc.a, j=wc.nTerm
17540 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
17550 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  m++){.      Expr
17560 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
17570 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28  pTerm->flags & (
17580 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
17590 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
175a0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
175b0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
175c0 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
175d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
175e0 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
175f0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
17600 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
17610 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
17620 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
17630 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
17640 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
17650 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17670 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
17680 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 63  se(pParse, pE, c
17690 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ont, 1);.      p
176a0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
176b0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
176c0 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c  ..    /* For a L
176d0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
176e0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
176f0 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
17700 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20  he fact that.   
17710 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
17720 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
17730 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
17740 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
17750 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  le.  .    */.   
17760 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
17770 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
17780 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71  pLevel->top = sq
17790 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
177a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
177b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
177c0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
177d0 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
177e0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  Join);.      Vdb
177f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
17800 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
17810 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  it"));.      for
17820 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30  (pTerm=wc.a, j=0
17830 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b  ; j<wc.nTerm; j+
17840 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
17850 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
17860 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  flags & (TERM_VI
17870 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
17880 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
17890 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
178a0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
178b0 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e  tReady)!=0 ) con
178c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
178d0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
178e0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73  xpr );.        s
178f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
17900 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d  e(pParse, pTerm-
17910 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20 31 29  >pExpr, cont, 1)
17920 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
17930 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
17940 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ODED;.      }.  
17950 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
17960 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
17970 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
17980 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
17990 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
179a0 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
179b0 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
179c0 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
179d0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
179e0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
179f0 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
17a00 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
17a10 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
17a20 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
17a30 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
17a40 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
17a50 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
17a60 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
17a70 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
17a80 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
17a90 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
17aa0 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
17ab0 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
17ac0 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
17ad0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
17ae0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
17af0 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
17b00 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
17b10 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
17b20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
17b30 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
17b40 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
17b50 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
17b60 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
17b70 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
17b80 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a      n = strlen(z
17b90 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  );.    if( n+nQP
17ba0 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
17bb0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
17bc0 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  -10 ){.      if(
17bd0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
17be0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
17bf0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
17c00 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
17c10 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
17c20 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
17c30 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
17c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c50 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
17c60 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17c70 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
17c80 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
17c90 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
17ca0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
17cb0 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
17cc0 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ' ';.    }.    i
17cd0 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
17ce0 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
17cf0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
17d00 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d  ANGE) ){.      m
17d10 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
17d20 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
17d30 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20  ], "* ", 2);.   
17d40 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
17d50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
17d60 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b  evel->pIdx==0 ){
17d70 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
17d80 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
17d90 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22  n[nQPlan], "{} "
17da0 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 3);.      nQPl
17db0 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c  an += 3;.    }el
17dc0 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74  se{.      n = st
17dd0 72 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49 64  rlen(pLevel->pId
17de0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
17df0 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
17e00 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
17e10 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a  uery_plan)-2 ){.
17e20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
17e30 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
17e40 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76  an[nQPlan], pLev
17e50 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  el->pIdx->zName,
17e60 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   n);.        nQP
17e70 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
17e80 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
17e90 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
17ea0 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ' ';.      }.  
17eb0 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28    }.  }.  while(
17ec0 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c   nQPlan>0 && sql
17ed0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
17ee0 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29  nQPlan-1]==' ' )
17ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75  {.    sqlite3_qu
17f00 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61  ery_plan[--nQPla
17f10 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  n] = 0;.  }.  sq
17f20 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
17f30 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  [nQPlan] = 0;.  
17f40 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64  nQPlan = 0;.#end
17f50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
17f60 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64  T // Testing and
17f70 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
17f80 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63  nly */..  /* Rec
17f90 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ord the continua
17fa0 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20  tion address in 
17fb0 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
17fc0 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20  ructure.  Then. 
17fd0 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64   ** clean up and
17fe0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
17ff0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
18000 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68 65 72  e = cont;.  wher
18010 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63  eClauseClear(&wc
18020 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
18030 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
18040 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
18050 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
18060 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72 65 43  nNoMem:.  whereC
18070 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b  lauseClear(&wc);
18080 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
18090 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  (pWInfo);.  retu
180a0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
180b0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
180c0 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
180d0 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
180e0 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
180f0 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
18100 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18110 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
18120 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
18130 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
18140 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
18150 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
18160 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
18170 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
18180 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20  evel;.  SrcList 
18190 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
181a0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a 20  fo->pTabList;.. 
181b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
181c0 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
181d0 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  de..  */.  for(i
181e0 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d  =pTabList->nSrc-
181f0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
18200 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
18210 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  nfo->a[i];.    s
18220 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18230 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
18240 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28  ->cont);.    if(
18250 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f   pLevel->op!=OP_
18260 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Noop ){.      sq
18270 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18280 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
18290 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
182a0 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20  l->p2);.    }.  
182b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49    if( pLevel->nI
182c0 6e 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  n ){.      struc
182d0 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20  t InLoop *pIn;. 
182e0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
182f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18300 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
18310 76 65 6c 2d 3e 6e 78 74 29 3b 0a 20 20 20 20 20  vel->nxt);.     
18320 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e   for(j=pLevel->n
18330 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
18340 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  >aInLoop[j-1]; j
18350 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
18360 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18370 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18380 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2b 31 29 3b  pIn->topAddr+1);
18390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
183a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
183b0 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43 75 72  _Next, pIn->iCur
183c0 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 29 3b  , pIn->topAddr);
183d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
183e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
183f0 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2d 31 29 3b  pIn->topAddr-1);
18400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
18410 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 65 76  qlite3_free(pLev
18420 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  el->aInLoop);.  
18430 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
18440 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18450 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b  v, pLevel->brk);
18460 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
18470 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
18480 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
18490 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
184a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
184b0 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65  OP_IfMemPos, pLe
184c0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20  vel->iLeftJoin, 
184d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
184e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
184f0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
18500 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
18510 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
18520 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
18530 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
18540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18550 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
18560 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
18570 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
18580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18590 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
185a0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29   0, pLevel->top)
185b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
185c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
185d0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
185e0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
185f0 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
18600 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
18610 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
18620 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
18630 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
18640 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18650 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
18660 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
18670 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
18680 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
18690 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
186a0 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
186b0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
186c0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
186d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
186e0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
186f0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
18700 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
18710 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
18720 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
18730 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
18740 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
18750 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
18760 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
18770 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20  ( pTab->isEphem 
18780 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
18790 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
187a0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
187b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
187c0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
187d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
187e0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
187f0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
18800 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  or, 0);.    }.  
18810 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49    if( pLevel->pI
18820 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  dx!=0 ){.      s
18830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18840 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
18850 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30  evel->iIdxCur, 0
18860 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18870 20 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73   If this scan us
18880 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b  es an index, mak
18890 65 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  e code substitut
188a0 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
188b0 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
188c0 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65  e index in prefe
188d0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62  rence to the tab
188e0 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74  le. Sometimes, t
188f0 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
18900 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20   the table need 
18910 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72  never be read fr
18920 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65  om. This is a pe
18930 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c  rformance boost,
18940 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76  .    ** as the v
18950 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20  dbe level waits 
18960 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20  until the table 
18970 69 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61  is read before a
18980 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73  ctually.    ** s
18990 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eeking the table
189a0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72   cursor to the r
189b0 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64  ecord correspond
189c0 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
189d0 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69  nt.    ** positi
189e0 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  on in the index.
189f0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
18a00 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64  Calls to the cod
18a10 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62  e generator in b
18a20 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68  etween sqlite3Wh
18a30 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20  ereBegin and.   
18a40 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
18a50 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72  End will have cr
18a60 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  eated code that 
18a70 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74  references the t
18a80 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65  able.    ** dire
18a90 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70  ctly.  This loop
18aa0 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20   scans all that 
18ab0 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  code looking for
18ac0 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20   opcodes.    ** 
18ad0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
18ae0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e  he table and con
18af0 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20  verts them into 
18b00 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20  opcodes that.   
18b10 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68   ** reference th
18b20 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a  e index..    */.
18b30 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
18b40 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e  pIdx ){.      in
18b50 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20  t k, j, last;.  
18b60 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
18b70 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
18b80 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
18b90 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65  x;.      int use
18ba0 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76  IndexOnly = pLev
18bb0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
18bc0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20  E_IDX_ONLY;..   
18bd0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21     assert( pIdx!
18be0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20  =0 );.      pOp 
18bf0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
18c00 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
18c10 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
18c20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18c30 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
18c40 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d     for(k=pWInfo-
18c50 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b  >iTop; k<last; k
18c60 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
18c70 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
18c80 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
18c90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
18ca0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
18cb0 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
18cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
18cd0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
18ce0 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
18cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
18d00 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  ->p2==pIdx->aiCo
18d10 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  lumn[j] ){.     
18d20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
18d30 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
18d40 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
18d50 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
18d70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
18d80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
18d90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
18da0 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20  useIndexOnly || 
18db0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  j<pIdx->nColumn)
18dc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
18dd0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
18de0 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20  =OP_Rowid ){.   
18df0 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
18e00 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
18e10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
18e20 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78  >opcode = OP_Idx
18e30 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
18e40 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
18e50 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77  code==OP_NullRow
18e60 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79   && useIndexOnly
18e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
18e80 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
18e90 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oop;.        }. 
18ea0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18eb0 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65  ..  /* Final cle
18ec0 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72  anup.  */.  wher
18ed0 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f  eInfoFree(pWInfo
18ee0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.