/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fce0dad6b230eb7ea844e8b8667c074d07e3fdd5:


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 34 36   where.c,v 1.246
0340: 20 32 30 30 37 2f 30 34 2f 30 36 20 30 31 3a 30   2007/04/06 01:0
0350: 34 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  4:40 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 44 65 74 65 72 6d 69  )../*.** Determi
03f0: 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
0400: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
0410: 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  array..*/.#defin
0420: 65 20 41 52 52 41 59 53 49 5a 45 28 58 29 20 20  e ARRAYSIZE(X)  
0430: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
0440: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
0450: 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61 63  Trace output mac
0460: 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ros.*/.#if defin
0470: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
0480: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
0490: 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71 6c  E_DEBUG).int sql
04a0: 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61 63 65  ite3_where_trace
04b0: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 57   = 0;.# define W
04c0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
04d0: 28 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  (sqlite3_where_t
04e0: 72 61 63 65 29 20 73 71 6c 69 74 65 33 44 65 62  race) sqlite3Deb
04f0: 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65  ugPrintf X.#else
0500: 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45 54  .# define WHERET
0510: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
0520: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
0530: 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ence.*/.typedef 
0540: 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61 75  struct WhereClau
0550: 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a  se WhereClause;.
0560: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
0570: 78 70 72 4d 61 73 6b 53 65 74 20 45 78 70 72 4d  xprMaskSet ExprM
0580: 61 73 6b 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a 20 54  askSet;../*.** T
0590: 68 65 20 71 75 65 72 79 20 67 65 6e 65 72 61 74  he query generat
05a0: 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72 61 79  or uses an array
05b0: 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20 6f 66   of instances of
05c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
05d0: 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e  to.** help it an
05e0: 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65 78 70  alyze the subexp
05f0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
0600: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
0610: 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  ach WHERE.** cla
0620: 75 73 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  use subexpressio
0630: 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 66  n is separated f
0640: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 62  rom the others b
0650: 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
0660: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  r..**.** All Whe
0670: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
0680: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
0690: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
06a0: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
06b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
06c0: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
06d0: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
06e0: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
06f0: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
0700: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
0710: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
0720: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
0740: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
0750: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
0760: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
0770: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
0780: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
0790: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
07a0: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
07b0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
07c0: 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65  olumn record the
07d0: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
07e0: 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d  r and column num
07f0: 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72  ber for X.  Wher
0800: 65 54 65 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72  eTerm.operator r
0810: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0820: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0830: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0840: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0850: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0860: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0870: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0880: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0890: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
08a0: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
08b0: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08c0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08d0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08e0: 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 52 69 67 68  **.** prereqRigh
08f0: 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20  t and prereqAll 
0900: 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63  record sets of c
0910: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a  ursor numbers,.*
0920: 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f  * but they do so
0930: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20   indirectly.  A 
0940: 73 69 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53  single ExprMaskS
0950: 65 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61  et structure tra
0960: 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f  nslates.** curso
0970: 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69  r number into bi
0980: 74 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ts and the trans
0990: 6c 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f  lated bit is sto
09a0: 72 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65  red in the prere
09b0: 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68  q.** fields.  Th
09c0: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  e translation is
09d0: 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74   used in order t
09e0: 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e  o maximize the n
09f0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73  umber of.** bits
0a00: 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69   that will fit i
0a10: 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68  n a Bitmask.  Th
0a20: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
0a30: 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a  mbers might be.*
0a40: 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65  * spread out ove
0a50: 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69  r the non-negati
0a60: 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f  ve integers.  Fo
0a70: 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63  r example, the c
0a80: 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73  ursor.** numbers
0a90: 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20   might be 3, 8, 
0aa0: 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34  9, 10, 20, 23, 4
0ab0: 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20  1, and 45.  The 
0ac0: 45 78 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  ExprMaskSet.** t
0ad0: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0ae0: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0af0: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0b00: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0b10: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0b20: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0b30: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0b40: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0b50: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0b60: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0b70: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0b80: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0b90: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0ba0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0bb0: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0bc0: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0bd0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0be0: 74 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72  t WhereTerm Wher
0bf0: 65 54 65 72 6d 3b 0a 73 74 72 75 63 74 20 57 68  eTerm;.struct Wh
0c00: 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72  ereTerm {.  Expr
0c10: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
0c20: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
0c30: 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  o the subexpress
0c40: 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 69 50 61  ion */.  i16 iPa
0c50: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
0c60: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
0c70: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
0c80: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
0c90: 6c 65 64 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66  led */.  i16 lef
0ca0: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
0cb0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
0cc0: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
0cd0: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69  > <expr>" */.  i
0ce0: 31 36 20 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20  16 leftColumn;  
0cf0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
0d00: 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20   number of X in 
0d10: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  "X <op> <expr>" 
0d20: 2a 2f 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74  */.  u16 eOperat
0d30: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or;          /* 
0d40: 41 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65  A WO_xx value de
0d50: 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f  scribing <op> */
0d60: 0a 20 20 75 38 20 66 6c 61 67 73 3b 20 20 20 20  .  u8 flags;    
0d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
0d80: 74 20 66 6c 61 67 73 2e 20 20 53 65 65 20 62 65  t flags.  See be
0d90: 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69  low */.  u8 nChi
0da0: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
0db0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
0dc0: 69 6c 64 72 65 6e 20 74 68 61 74 20 6d 75 73 74  ildren that must
0dd0: 20 64 69 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20   disable us */. 
0de0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
0df0: 43 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C;       /* The 
0e00: 63 6c 61 75 73 65 20 74 68 69 73 20 74 65 72 6d  clause this term
0e10: 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20   is part of */. 
0e20: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 52   Bitmask prereqR
0e30: 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d  ight;    /* Bitm
0e40: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 75 73  ask of tables us
0e50: 65 64 20 62 79 20 70 52 69 67 68 74 20 2a 2f 0a  ed by pRight */.
0e60: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
0e70: 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74  All;      /* Bit
0e80: 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72  mask of tables r
0e90: 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 20 2a  eferenced by p *
0ea0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
0eb0: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
0ec0: 65 72 65 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f  ereTerm.flags.*/
0ed0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 44 59  .#define TERM_DY
0ee0: 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20 20 20  NAMIC    0x01   
0ef0: 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20  /* Need to call 
0f00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0f10: 65 28 70 45 78 70 72 29 20 2a 2f 0a 23 64 65 66  e(pExpr) */.#def
0f20: 69 6e 65 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ine TERM_VIRTUAL
0f30: 20 20 20 20 30 78 30 32 20 20 20 2f 2a 20 41 64      0x02   /* Ad
0f40: 64 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d  ded by the optim
0f50: 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f  izer.  Do not co
0f60: 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  de */.#define TE
0f70: 52 4d 5f 43 4f 44 45 44 20 20 20 20 20 20 30 78  RM_CODED      0x
0f80: 30 34 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72  04   /* This ter
0f90: 6d 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 64  m is already cod
0fa0: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  ed */.#define TE
0fb0: 52 4d 5f 43 4f 50 49 45 44 20 20 20 20 20 30 78  RM_COPIED     0x
0fc0: 30 38 20 20 20 2f 2a 20 48 61 73 20 61 20 63 68  08   /* Has a ch
0fd0: 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ild */.#define T
0fe0: 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30  ERM_OR_OK      0
0ff0: 78 31 30 20 20 20 2f 2a 20 55 73 65 64 20 64 75  x10   /* Used du
1000: 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 70  ring OR-clause p
1010: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a  rocessing */../*
1020: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1030: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1040: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
1050: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
1060: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
1070: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
1080: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
1090: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
10a0: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
10b0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
10c0: 65 43 6c 61 75 73 65 20 7b 0a 20 20 50 61 72 73  eClause {.  Pars
10d0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
10e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
1100: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
1110: 73 6b 53 65 74 3b 20 20 20 2f 2a 20 4d 61 70 70  skSet;   /* Mapp
1120: 69 6e 67 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  ing of table ind
1130: 69 63 65 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  ices to bitmasks
1140: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1170: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  s */.  int nSlot
1180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1190: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
11a0: 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  ries in a[] */. 
11b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20   WhereTerm *a;  
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
11d0: 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20  h a[] describes 
11e0: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  a term of the WH
11f0: 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20  ERE cluase */.  
1200: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1210: 63 5b 31 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 74  c[10];   /* Init
1220: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1230: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a   for a[] */.};..
1240: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
1250: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1260: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1270: 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61  ps track of a ma
1280: 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e  pping.** between
1290: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
12a0: 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66  bers and bits of
12b0: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e   the bitmasks in
12c0: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
12d0: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
12e0: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d  r numbers are sm
12f0: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e  all integers con
1300: 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72  tained in .** Sr
1310: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
1320: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
1330: 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20  le fields.  For 
1340: 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20  any given WHERE 
1350: 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20  .** clause, the 
1360: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
1370: 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77  ight not begin w
1380: 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d  ith 0 and they m
1390: 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  ight.** contain 
13a0: 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62  gaps in the numb
13b0: 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ering sequence. 
13c0: 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
13d0: 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20  make maximum.** 
13e0: 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20  use of the bits 
13f0: 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e  in our bitmasks.
1400: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
1410: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70   provides a mapp
1420: 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ing.** from the 
1430: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
1440: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
1450: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
1460: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
1470: 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78  h 0..**.** If Ex
1480: 70 72 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d  prMaskSet.ix[A]=
1490: 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =B it means that
14a0: 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66   The A-th bit of
14b0: 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f   a Bitmask.** co
14c0: 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63  rresponds VDBE c
14d0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20  ursor number B. 
14e0: 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66   The A-th bit of
14f0: 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c   a bitmask is 1<
1500: 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  <A..**.** For ex
1510: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48  ample, if the WH
1520: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
1530: 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65  ssion used these
1540: 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73   VDBE.** cursors
1550: 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20  :  4, 5, 8, 29, 
1560: 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68  57, 73.  Then th
1570: 65 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 73  e  ExprMaskSet s
1580: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1590: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
15a0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
15b0: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
15c0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
15d0: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
15e0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
15f0: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1600: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1610: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1620: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1630: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1640: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1650: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1660: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1670: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1680: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1690: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
16a0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
16b0: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
16c0: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
16d0: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
16e0: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
16f0: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1700: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1710: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1720: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1730: 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65  truct ExprMaskSe
1740: 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  t {.  int n;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1770: 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72   assigned cursor
1780: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74   values */.  int
1790: 20 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61   ix[sizeof(Bitma
17a0: 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75  sk)*8];    /* Cu
17b0: 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
17c0: 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a   each bit */.};.
17d0: 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73  ../*.** Bitmasks
17e0: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
17f0: 72 73 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  rs that indices 
1800: 61 72 65 20 61 62 6c 65 20 74 6f 20 65 78 70 6c  are able to expl
1810: 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65  oit.  An.** OR-e
1820: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
1830: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 63 61   these values ca
1840: 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 73  n be used when s
1850: 65 61 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20  earching for.** 
1860: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
1870: 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64  re clause..*/.#d
1880: 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20  efine WO_IN     
1890: 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20  1.#define WO_EQ 
18a0: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 57 4f      2.#define WO
18b0: 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LT     (WO_EQ<<
18c0: 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LT-TK_EQ)).#
18d0: 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20  define WO_LE    
18e0: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d   (WO_EQ<<(TK_LE-
18f0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
1900: 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_GT     (WO_EQ
1910: 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29  <<(TK_GT-TK_EQ))
1920: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20  .#define WO_GE  
1930: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
1940: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
1950: 65 20 57 4f 5f 4d 41 54 43 48 20 20 36 34 0a 23  e WO_MATCH  64.#
1960: 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c  define WO_ISNULL
1970: 20 31 32 38 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75   128../*.** Valu
1980: 65 20 66 6f 72 20 66 6c 61 67 73 20 72 65 74 75  e for flags retu
1990: 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e 64 65  rned by bestInde
19a0: 78 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  x().  .**.** The
19b0: 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63 61   least significa
19c0: 6e 74 20 62 79 74 65 20 69 73 20 72 65 73 65 72  nt byte is reser
19d0: 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f  ved as a mask fo
19e0: 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f  r WO_ values abo
19f0: 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65  ve..** The Where
1a00: 4c 65 76 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c  Level.flags fiel
1a10: 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73 65 74  d is usually set
1a20: 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c   to WO_IN|WO_EQ|
1a30: 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75  WO_ISNULL..** Bu
1a40: 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  t if the table i
1a50: 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
1a60: 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  e of a left join
1a70: 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61  , WhereLevel.fla
1a80: 67 73 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  gs.** is set to 
1a90: 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20 20 54 68  WO_IN|WO_EQ.  Th
1aa0: 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61  e WhereLevel.fla
1ab0: 67 73 20 66 69 65 6c 64 20 63 61 6e 20 74 68 65  gs field can the
1ac0: 6e 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20  n be used as.** 
1ad0: 74 68 65 20 22 6f 70 22 20 70 61 72 61 6d 65 74  the "op" paramet
1ae0: 65 72 20 74 6f 20 66 69 6e 64 54 65 72 6d 20 77  er to findTerm w
1af0: 68 65 6e 20 77 65 20 61 72 65 20 72 65 73 6f 6c  hen we are resol
1b00: 76 69 6e 67 20 65 71 75 61 6c 69 74 79 20 63 6f  ving equality co
1b10: 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 20 49 53  nstraints..** IS
1b20: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
1b30: 20 77 69 6c 6c 20 74 68 65 6e 20 6e 6f 74 20 62   will then not b
1b40: 65 20 75 73 65 64 20 6f 6e 20 74 68 65 20 72 69  e used on the ri
1b50: 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c  ght table of a l
1b60: 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69  eft.** join.  Ti
1b70: 63 6b 65 74 73 20 23 32 31 37 37 20 61 6e 64 20  ckets #2177 and 
1b80: 23 32 31 38 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e  #2189..*/.#defin
1b90: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51  e WHERE_ROWID_EQ
1ba0: 20 20 20 20 20 30 78 30 30 30 31 30 30 20 20 20       0x000100   
1bb0: 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72  /* rowid=EXPR or
1bc0: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
1bd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1be0: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 30 78  _ROWID_RANGE  0x
1bf0: 30 30 30 32 30 30 20 20 20 2f 2a 20 72 6f 77 69  000200   /* rowi
1c00: 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f  d<EXPR and/or ro
1c10: 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66  wid>EXPR */.#def
1c20: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
1c30: 5f 45 51 20 20 20 20 30 78 30 30 31 30 30 30 20  _EQ    0x001000 
1c40: 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20 78    /* x=EXPR or x
1c50: 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65   IN (...) */.#de
1c60: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
1c70: 4e 5f 52 41 4e 47 45 20 30 78 30 30 32 30 30 30  N_RANGE 0x002000
1c80: 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64     /* x<EXPR and
1c90: 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64  /or x>EXPR */.#d
1ca0: 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55  efine WHERE_COLU
1cb0: 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30 34 30 30  MN_IN    0x00400
1cc0: 30 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e  0   /* x IN (...
1cd0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  ) */.#define WHE
1ce0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20  RE_TOP_LIMIT    
1cf0: 30 78 30 31 30 30 30 30 20 20 20 2f 2a 20 78 3c  0x010000   /* x<
1d00: 45 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20  EXPR or x<=EXPR 
1d10: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
1d20: 65 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f  efine WHERE_BTM_
1d30: 4c 49 4d 49 54 20 20 20 20 30 78 30 32 30 30 30  LIMIT    0x02000
1d40: 30 20 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72  0   /* x>EXPR or
1d50: 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x>=EXPR constra
1d60: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
1d70: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20  HERE_IDX_ONLY   
1d80: 20 20 30 78 30 38 30 30 30 30 20 20 20 2f 2a 20    0x080000   /* 
1d90: 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d  Use index only -
1da0: 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23   omit table */.#
1db0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44  define WHERE_ORD
1dc0: 45 52 42 59 20 20 20 20 20 20 30 78 31 30 30 30  ERBY      0x1000
1dd0: 30 30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 77  00   /* Output w
1de0: 69 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63 6f  ill appear in co
1df0: 72 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23  rrect order */.#
1e00: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45 56  define WHERE_REV
1e10: 45 52 53 45 20 20 20 20 20 20 30 78 32 30 30 30  ERSE      0x2000
1e20: 30 30 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20  00   /* Scan in 
1e30: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
1e40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 55  .#define WHERE_U
1e50: 4e 49 51 55 45 20 20 20 20 20 20 20 30 78 34 30  NIQUE       0x40
1e60: 30 30 30 30 20 20 20 2f 2a 20 53 65 6c 65 63 74  0000   /* Select
1e70: 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
1e80: 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e  ne row */.#defin
1e90: 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  e WHERE_VIRTUALT
1ea0: 41 42 4c 45 20 30 78 38 30 30 30 30 30 20 20 20  ABLE 0x800000   
1eb0: 2f 2a 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74  /* Use virtual-t
1ec0: 61 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  able processing 
1ed0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
1ee0: 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61  lize a prealloca
1ef0: 74 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20  ted WhereClause 
1f00: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1f10: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
1f20: 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65  lauseInit(.  Whe
1f30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
1f40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65        /* The Whe
1f50: 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69  reClause to be i
1f60: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
1f70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f90: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1fa0: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
1fb0: 20 2a 70 4d 61 73 6b 53 65 74 20 20 20 20 2f 2a   *pMaskSet    /*
1fc0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
1fd0: 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f 20 62  ble indices to b
1fe0: 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20 20  itmasks */.){.  
1ff0: 70 57 43 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  pWC->pParse = pP
2000: 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61  arse;.  pWC->pMa
2010: 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b 53 65 74  skSet = pMaskSet
2020: 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d  ;.  pWC->nTerm =
2030: 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74   0;.  pWC->nSlot
2040: 20 3d 20 41 52 52 41 59 53 49 5a 45 28 70 57 43   = ARRAYSIZE(pWC
2050: 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57  ->aStatic);.  pW
2060: 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61  C->a = pWC->aSta
2070: 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  tic;.}../*.** De
2080: 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65  allocate a Where
2090: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
20a0: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
20b0: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
20c0: 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72  itself is not fr
20d0: 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eed.  This routi
20e0: 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72 73  ne is the invers
20f0: 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65  e of whereClause
2100: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
2110: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2120: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2130: 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74  use *pWC){.  int
2140: 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
2150: 2a 61 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d  *a;.  for(i=pWC-
2160: 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d  >nTerm-1, a=pWC-
2170: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61  >a; i>=0; i--, a
2180: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
2190: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e  flags & TERM_DYN
21a0: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71  AMIC ){.      sq
21b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
21c0: 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  a->pExpr);.    }
21d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e  .  }.  if( pWC->
21e0: 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20  a!=pWC->aStatic 
21f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2200: 65 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  e(pWC->a);.  }.}
2210: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2220: 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  w entries to the
2230: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2240: 75 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61 73  ucture.  Increas
2250: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a  e the allocated.
2260: 2a 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63 65  ** space as nece
2270: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
2280: 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
2290: 6e 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d  nt includes TERM
22a0: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72  _DYNAMIC, then r
22b0: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
22c0: 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
22d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73   expression p is
22e0: 20 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20   assumed by the 
22f0: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
2300: 63 74 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  ct..**.** WARNIN
2310: 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  G:  This routine
2320: 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74   might reallocat
2330: 65 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  e the space used
2340: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65   to store.** Whe
2350: 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f  reTerms.  All po
2360: 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54  inters to WhereT
2370: 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69  erms should be i
2380: 6e 76 61 6c 69 64 65 64 20 61 66 74 65 72 0a 2a  nvalided after.*
2390: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * calling this r
23a0: 6f 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f  outine.  Such po
23b0: 69 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65  inters may be re
23c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72  initialized by r
23d0: 65 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68  eferencing.** th
23e0: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
23f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2400: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
2410: 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  t(WhereClause *p
2420: 57 43 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  WC, Expr *p, int
2430: 20 66 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65   flags){.  Where
2440: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
2450: 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57  nt idx;.  if( pW
2460: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
2470: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
2480: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
2490: 43 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61  C->a;.    pWC->a
24a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
24b0: 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30   sizeof(pWC->a[0
24c0: 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20  ])*pWC->nSlot*2 
24d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e  );.    if( pWC->
24e0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
24f0: 28 20 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  ( flags & TERM_D
2500: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
2510: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2520: 65 74 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ete(p);.      }.
2530: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
2540: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
2550: 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73  (pWC->a, pOld, s
2560: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
2570: 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  *pWC->nTerm);.  
2580: 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d    if( pOld!=pWC-
2590: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
25a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 6c    sqliteFree(pOl
25b0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
25c0: 43 2d 3e 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20  C->nSlot *= 2;. 
25d0: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
25e0: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
25f0: 6e 54 65 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e  nTerm];.  pWC->n
2600: 54 65 72 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d  Term++;.  pTerm-
2610: 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54  >pExpr = p;.  pT
2620: 65 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  erm->flags = fla
2630: 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43  gs;.  pTerm->pWC
2640: 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d   = pWC;.  pTerm-
2650: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
2660: 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a   return idx;.}..
2670: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2680: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
2690: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
26a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
26b0: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
26c0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
26d0: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
26e0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
26f0: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
2700: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
2710: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
2720: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
2730: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
2740: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
2750: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
2760: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
2770: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
2780: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
2790: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
27a0: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
27b0: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
27c0: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
27d0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
27e0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
27f0: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
2800: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
2810: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
2820: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
2830: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
2840: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
2850: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
2860: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
2870: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
2880: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
2890: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
28a0: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
28b0: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
28c0: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
28d0: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
28e0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
28f0: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
2900: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
2910: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
2920: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
2930: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  [] array.  This 
2940: 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e  array grows as n
2950: 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  eeded to contain
2960: 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  .** all terms of
2970: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2980: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2990: 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65  d whereSplit(Whe
29a0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
29b0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
29c0: 6f 70 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  op){.  if( pExpr
29d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
29e0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f  if( pExpr->op!=o
29f0: 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  p ){.    whereCl
2a00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
2a10: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
2a20: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
2a30: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
2a40: 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77  Left, op);.    w
2a50: 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
2a60: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
2a70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a80: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78  Initialize an ex
2a90: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
2aa0: 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69  t.*/.#define ini
2ab0: 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d  tMaskSet(P)  mem
2ac0: 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66  set(P, 0, sizeof
2ad0: 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  (*P))../*.** Ret
2ae0: 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20  urn the bitmask 
2af0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
2b00: 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65  rsor number.  Re
2b10: 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75  turn 0 if.** iCu
2b20: 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74  rsor is not in t
2b30: 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  he set..*/.stati
2b40: 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73  c Bitmask getMas
2b50: 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  k(ExprMaskSet *p
2b60: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
2b70: 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rsor){.  int i;.
2b80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
2b90: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
2ba0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
2bb0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
2bc0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bd0: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69   ((Bitmask)1)<<i
2be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2bf0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2c00: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61   Create a new ma
2c10: 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43  sk for cursor iC
2c20: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2c30: 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72  re is one cursor
2c40: 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68   per table in th
2c50: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
2c60: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  The number of.**
2c70: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
2c80: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
2c90: 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20  mited by a test 
2ca0: 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20  early in the.** 
2cb0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2cc0: 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f  n() routine.  So
2cd0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
2ce0: 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d  e pMaskSet->ix[]
2cf0: 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e  .** array will n
2d00: 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a  ever overflow..*
2d10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
2d20: 65 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61 73  eateMask(ExprMas
2d30: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2d40: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2d50: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
2d60: 2d 3e 6e 20 3c 20 41 52 52 41 59 53 49 5a 45 28  ->n < ARRAYSIZE(
2d70: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
2d80: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
2d90: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
2da0: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
2db0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2dc0: 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65  walks (recursive
2dd0: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2de0: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
2df0: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
2e00: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
2e10: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
2e20: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
2e30: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
2e40: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
2e50: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
2e60: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c  o work, the call
2e70: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
2e80: 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  t have.** previo
2e90: 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c  usly invoked sql
2ea0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
2eb0: 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78  ames() on the ex
2ec0: 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a  pression.  See.*
2ed0: 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  * the header com
2ee0: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
2ef0: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
2f00: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2f10: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45  .** The sqlite3E
2f20: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
2f30: 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73  ) routines looks
2f40: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
2f50: 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68  s and.** sets th
2f60: 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54  eir opcodes to T
2f70: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
2f80: 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  ir Expr.iTable f
2f90: 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ields to.** the 
2fa0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
2fb0: 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  er of the table.
2fc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
2fd0: 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72  ust has to.** tr
2fe0: 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73  anslate the curs
2ff0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
3000: 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61  bitmask values a
3010: 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65  nd OR all.** the
3020: 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68   bitmasks togeth
3030: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  er..*/.static Bi
3040: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
3050: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
3060: 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  kSet*, ExprList*
3070: 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  );.static Bitmas
3080: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
3090: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
30a0: 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73  et*, Select*);.s
30b0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
30c0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 45 78 70  prTableUsage(Exp
30d0: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
30e0: 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  et, Expr *p){.  
30f0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
3100: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3110: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
3120: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
3130: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65  ){.    mask = ge
3140: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
3150: 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  p->iTable);.    
3160: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d  return mask;.  }
3170: 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61  .  mask = exprTa
3180: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3190: 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  t, p->pRight);. 
31a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
31b0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
31c0: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d  , p->pLeft);.  m
31d0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
31e0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
31f0: 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  et, p->pList);. 
3200: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
3210: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
3220: 61 73 6b 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65  askSet, p->pSele
3230: 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61  ct);.  return ma
3240: 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74  sk;.}.static Bit
3250: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
3260: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
3270: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
3280: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
3290: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d  .  int i;.  Bitm
32a0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
32b0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
32c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
32d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
32e0: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
32f0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3300: 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  skSet, pList->a[
3310: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  i].pExpr);.    }
3320: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
3330: 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74  sk;.}.static Bit
3340: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
3350: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
3360: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
3370: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
3380: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  Bitmask mask;.  
3390: 69 66 28 20 70 53 3d 3d 30 20 29 7b 0a 20 20 20  if( pS==0 ){.   
33a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c   mask = 0;.  }el
33b0: 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 65  se{.    mask = e
33c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
33d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
33e0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73  pEList);.    mas
33f0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
3400: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
3410: 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b  , pS->pGroupBy);
3420: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
3430: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
3440: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f  pMaskSet, pS->pO
3450: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73  rderBy);.    mas
3460: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
3470: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
3480: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d  ->pWhere);.    m
3490: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
34a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
34b0: 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  pS->pHaving);.  
34c0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
34d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34e0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
34f0: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
3500: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
3510: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
3520: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
3530: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
3540: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
3550: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
3560: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
3570: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
3580: 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f  =", and "IN"..*/
3590: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
35a0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
35b0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
35c0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
35d0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
35e0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
35f0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
3600: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
3610: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
3620: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
3630: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
3640: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
3650: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
3660: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
3670: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
3680: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
3690: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
36a0: 20 74 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66   type T..*/.#def
36b0: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
36c0: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
36d0: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
36e0: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
36f0: 69 73 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  ision operator. 
3700: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
3710: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
3720: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
3730: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
3740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3750: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70   exprCommute(Exp
3760: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73  r *pExpr){.  ass
3770: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70  ert( allowedOp(p
3780: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78  Expr->op) && pEx
3790: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b  pr->op!=TK_IN );
37a0: 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a  .  SWAP(CollSeq*
37b0: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  ,pExpr->pRight->
37c0: 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65  pColl,pExpr->pLe
37d0: 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57  ft->pColl);.  SW
37e0: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
37f0: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
3800: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
3810: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
3820: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
3830: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
3840: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
3850: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
3860: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
3870: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
3880: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
3890: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
38a0: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
38b0: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
38c0: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
38d0: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
38e0: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
38f0: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
3900: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
3910: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
3920: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
3930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
3940: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
3950: 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61  p){.  int c;.  a
3960: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
3970: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
3980: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
3990: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
39a0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
39b0: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
39c0: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
39d0: 65 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 45 51  e{.    c = WO_EQ
39e0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20  <<(op-TK_EQ);.  
39f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  }.  assert( op!=
3a00: 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d  TK_ISNULL || c==
3a10: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61  WO_ISNULL );.  a
3a20: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e  ssert( op!=TK_IN
3a30: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a   || c==WO_IN );.
3a40: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3a50: 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20  _EQ || c==WO_EQ 
3a60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3a70: 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LT || c==WO_
3a80: 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LT );.  assert( 
3a90: 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d  op!=TK_LE || c==
3aa0: 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72  WO_LE );.  asser
3ab0: 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  t( op!=TK_GT || 
3ac0: 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73  c==WO_GT );.  as
3ad0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20  sert( op!=TK_GE 
3ae0: 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20  || c==WO_GE );. 
3af0: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
3b00: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
3b10: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
3b20: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
3b30: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
3b40: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
3b50: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
3b60: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
3b70: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
3b80: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
3b90: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
3ba0: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
3bb0: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
3bc0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
3bd0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
3be0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
3bf0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
3c00: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
3c10: 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20  tatic WhereTerm 
3c20: 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  *findTerm(.  Whe
3c30: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3c40: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3c50: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3c60: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3c70: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3c80: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3c90: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3ca0: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3cb0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3cc0: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3cd0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
3ce0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
3cf0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
3d00: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
3d10: 0a 20 20 75 31 36 20 6f 70 2c 20 20 20 20 20 20  .  u16 op,      
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3d30: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3d40: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3d50: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3d60: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3d70: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3d80: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3d90: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3da0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3db0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
3dc0: 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72  nt k;.  for(pTer
3dd0: 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d  m=pWC->a, k=pWC-
3de0: 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20  >nTerm; k; k--, 
3df0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
3e00: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
3e10: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
3e20: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
3e30: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
3e40: 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  dy)==0.       &&
3e50: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75   pTerm->leftColu
3e60: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
3e70: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f     && (pTerm->eO
3e80: 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30  perator & op)!=0
3e90: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
3ea0: 28 20 69 43 75 72 3e 3d 30 20 26 26 20 70 49 64  ( iCur>=0 && pId
3eb0: 78 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  x && pTerm->eOpe
3ec0: 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c  rator!=WO_ISNULL
3ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
3ee0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
3ef0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  xpr;.        Col
3f00: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
3f10: 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
3f20: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
3f30: 0a 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a  .        Parse *
3f40: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
3f50: 61 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69  arse;..        i
3f60: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
3f70: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
3f80: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
3f90: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3fa0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
3fb0: 6b 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20  k(pX, idxaff) ) 
3fc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3fd0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
3fe0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
3ff0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b  rse, pX->pLeft);
4000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
4010: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
4020: 20 69 66 28 20 70 58 2d 3e 70 52 69 67 68 74 20   if( pX->pRight 
4030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
4040: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
4050: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
4060: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
4070: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4080: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
4090: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
40a0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
40b0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
40c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
40d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
40e0: 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
40f0: 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 61 69  lumn && pIdx->ai
4100: 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75  Column[j]!=iColu
4110: 6d 6e 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  mn; j++){}.     
4120: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 49 64     assert( j<pId
4130: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  x->nColumn );.  
4140: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4150: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
4160: 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
4170: 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e  oll[j]) ) contin
4180: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
4190: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
41a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
41b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
41c0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
41d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
41e0: 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74  rAnalyze(SrcList
41f0: 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c  *, WhereClause*,
4200: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   int);../*.** Ca
4210: 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f  ll exprAnalyze o
4220: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61  n all terms in a
4230: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
4240: 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .**.**.*/.static
4250: 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a   void exprAnalyz
4260: 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20  eAll(.  SrcList 
4270: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
4280: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
4290: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
42a0: 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20  ause *pWC       
42b0: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
42c0: 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c  lause to be anal
42d0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  yzed */.){.  int
42e0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   i;.  for(i=pWC-
42f0: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
4300: 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e  i--){.    exprAn
4310: 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20  alyze(pTabList, 
4320: 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC, i);.  }.}..
4330: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4340: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
4350: 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ATION./*.** Chec
4360: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
4370: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
4380: 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c   is a LIKE or GL
4390: 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74  OB operator that
43a0: 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  .** can be optim
43b0: 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75  ized using inequ
43c0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
43d0: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
43e0: 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61  if it is.** so a
43f0: 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
4400: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
4410: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
4420: 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62   to be optimizib
4430: 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74  le, the RHS must
4440: 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20   be a string.** 
4450: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65  literal that doe
4460: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
4470: 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a   a wildcard.  .*
4480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c  /.static int isL
4490: 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73 71 6c  ikeOrGlob(.  sql
44a0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
44b0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
44c0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
44d0: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
44e0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
44f0: 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74 65 72  .  int *pnPatter
4500: 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  n,   /* Number o
4510: 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70  f non-wildcard p
4520: 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73  refix characters
4530: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f   */.  int *pisCo
4540: 6d 70 6c 65 74 65 20 20 2f 2a 20 54 72 75 65 20  mplete  /* True 
4550: 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64  if the only wild
4560: 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65  card is % in the
4570: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
4580: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
4590: 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70  ar *z;.  Expr *p
45a0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
45b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
45c0: 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a  ;.  int c, cnt;.
45d0: 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20    int noCase;.  
45e0: 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f  char wc[3];.  Co
45f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
4600: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c   if( !sqlite3IsL
4610: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ikeFunction(db, 
4620: 70 45 78 70 72 2c 20 26 6e 6f 43 61 73 65 2c 20  pExpr, &noCase, 
4630: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  wc) ){.    retur
4640: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
4650: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
4660: 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73  .  pRight = pLis
4670: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
4680: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 21   if( pRight->op!
4690: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
46a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
46b0: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
46c0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
46d0: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
46e0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
46f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4700: 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43  Coll = pLeft->pC
4710: 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  oll;.  if( pColl
4720: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f  ==0 ){.    /* TO
4730: 44 4f 3a 20 43 6f 76 65 72 61 67 65 20 74 65 73  DO: Coverage tes
4740: 74 69 6e 67 20 64 6f 65 73 6e 27 74 20 67 65 74  ting doesn't get
4750: 20 74 68 69 73 20 63 61 73 65 2e 20 49 73 20 69   this case. Is i
4760: 74 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  t actually possi
4770: 62 6c 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61  ble.    ** for a
4780: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  n expression of 
4790: 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74  type TK_COLUMN t
47a0: 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73  o not have an as
47b0: 73 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  signed collation
47c0: 20 0a 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63   .    ** sequenc
47d0: 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 3f  e at this point?
47e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  .    */.    pCol
47f0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
4800: 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43  l;.  }.  if( (pC
4810: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
4820: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c  E_COLL_BINARY ||
4830: 20 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20 20   noCase) &&.    
4840: 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d    (pColl->type!=
4850: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41  SQLITE_COLL_NOCA
4860: 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65 29 20 29  SE || !noCase) )
4870: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4880: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
4890: 75 6f 74 65 45 78 70 72 28 70 52 69 67 68 74 29  uoteExpr(pRight)
48a0: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29  ;.  z = (char *)
48b0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b  pRight->token.z;
48c0: 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b 20 28 63  .  for(cnt=0; (c
48d0: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
48e0: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
48f0: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 3b  [1] && c!=wc[2];
4900: 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69 66 28 20   cnt++){}.  if( 
4910: 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d 28  cnt==0 || 255==(
4920: 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20 20  u8)z[cnt] ){.   
4930: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4940: 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   *pisComplete = 
4950: 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26  z[cnt]==wc[0] &&
4960: 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20   z[cnt+1]==0;.  
4970: 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e 74  *pnPattern = cnt
4980: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
4990: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
49a0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
49b0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66  IZATION */...#if
49c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
49d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
49e0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
49f0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
4a00: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
4a10: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
4a20: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54        column MAT
4a30: 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66  CH expr.**.** If
4a40: 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75   it is then retu
4a50: 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74  rn TRUE.  If not
4a60: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
4a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
4a80: 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20  MatchOfColumn(. 
4a90: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
4aa0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
4ab0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
4ac0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4ad0: 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t;..  if( pExpr-
4ae0: 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op!=TK_FUNCTION
4af0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4b00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
4b10: 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c  r->token.n!=5 ||
4b20: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  .       sqlite3S
4b30: 74 72 4e 49 43 6d 70 28 28 63 6f 6e 73 74 20 63  trNICmp((const c
4b40: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
4b50: 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29 21 3d  n.z,"match",5)!=
4b60: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4b70: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
4b80: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
4b90: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
4ba0: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
4bb0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
4bc0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
4bd0: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
4be0: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
4bf0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
4c00: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
4c10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4c20: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
4c30: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
4c40: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
4c50: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
4c60: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
4c70: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
4c80: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
4c90: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
4ca0: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
4cb0: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
4cc0: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
4cd0: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
4ce0: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
4cf0: 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76  pBase){.  pDeriv
4d00: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
4d10: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
4d20: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69  romJoin;.  pDeri
4d30: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
4d40: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
4d50: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d  ightJoinTable;.}
4d60: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4d70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
4d80: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
4d90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4da0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a  MIT_SUBQUERY)./*
4db0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
4dc0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 74 65 72  if the given ter
4dd0: 6d 20 6f 66 20 61 6e 20 4f 52 20 63 6c 61 75 73  m of an OR claus
4de0: 65 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72 74  e can be convert
4df0: 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 49 4e  ed.** into an IN
4e00: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 69 43   clause.  The iC
4e10: 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d  ursor and iColum
4e20: 6e 20 64 65 66 69 6e 65 20 74 68 65 20 6c 65 66  n define the lef
4e30: 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f  t-hand.** side o
4e40: 66 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65 2e  f the IN clause.
4e50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
4e60: 78 74 20 69 73 20 74 68 61 74 20 77 65 20 68 61  xt is that we ha
4e70: 76 65 20 6d 75 6c 74 69 70 6c 65 20 4f 52 2d 63  ve multiple OR-c
4e80: 6f 6e 6e 65 63 74 65 64 20 65 71 75 61 6c 69 74  onnected equalit
4e90: 79 20 74 65 72 6d 73 0a 2a 2a 20 6c 69 6b 65 20  y terms.** like 
4ea0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
4eb0: 20 20 20 20 20 20 61 3d 3c 65 78 70 72 31 3e 20        a=<expr1> 
4ec0: 4f 52 20 20 61 3d 3c 65 78 70 72 32 3e 20 4f 52  OR  a=<expr2> OR
4ed0: 20 62 3d 3c 65 78 70 72 33 3e 20 20 4f 52 20 2e   b=<expr3>  OR .
4ee0: 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4f 72  ...**.** The pOr
4ef0: 54 65 72 6d 20 69 6e 70 75 74 20 74 6f 20 74 68  Term input to th
4f00: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 72 72 65  is routine corre
4f10: 73 70 6f 6e 64 73 20 74 6f 20 61 20 73 69 6e 67  sponds to a sing
4f20: 6c 65 20 74 65 72 6d 20 6f 66 0a 2a 2a 20 74 68  le term of.** th
4f30: 69 73 20 4f 52 20 63 6c 61 75 73 65 2e 20 20 49  is OR clause.  I
4f40: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
4f50: 74 65 72 6d 20 74 6f 20 62 65 20 61 20 63 6f 6e  term to be a con
4f60: 64 69 64 61 74 65 20 66 6f 72 0a 2a 2a 20 63 6f  didate for.** co
4f70: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 61 6e 20 49  nversion to an I
4f80: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 20  N operator, the 
4f90: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62  following must b
4fa0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
4fb0: 20 20 2a 20 20 54 68 65 20 6c 65 66 74 2d 68 61    *  The left-ha
4fc0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  nd side of the t
4fd0: 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65 20  erm must be the 
4fe0: 63 6f 6c 75 6d 6e 20 77 68 69 63 68 0a 2a 2a 20  column which.** 
4ff0: 20 20 20 20 20 20 20 69 73 20 69 64 65 6e 74 69         is identi
5000: 66 69 65 64 20 62 79 20 69 43 75 72 73 6f 72 20  fied by iCursor 
5010: 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  and iColumn..**.
5020: 2a 2a 20 20 20 20 20 2a 20 20 49 66 20 74 68 65  **     *  If the
5030: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
5040: 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d   is also a colum
5050: 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  n, then the affi
5060: 6e 69 74 69 65 73 0a 2a 2a 20 20 20 20 20 20 20  nities.**       
5070: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
5080: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
5090: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
50a0: 6e 6f 20 74 79 70 65 0a 2a 2a 20 20 20 20 20 20  no type.**      
50b0: 20 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72    conversions ar
50c0: 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68  e required on th
50d0: 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65  e right.  (Ticke
50e0: 74 20 23 32 32 34 39 29 0a 2a 2a 0a 2a 2a 20 49  t #2249).**.** I
50f0: 66 20 62 6f 74 68 20 6f 66 20 74 68 65 73 65 20  f both of these 
5100: 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 74  conditions are t
5110: 72 75 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  rue, then return
5120: 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69 73   true.  Otherwis
5130: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 66 61 6c 73  e.** return fals
5140: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5150: 20 6f 72 54 65 72 6d 49 73 4f 70 74 43 61 6e 64   orTermIsOptCand
5160: 69 64 61 74 65 28 57 68 65 72 65 54 65 72 6d 20  idate(WhereTerm 
5170: 2a 70 4f 72 54 65 72 6d 2c 20 69 6e 74 20 69 43  *pOrTerm, int iC
5180: 75 72 73 6f 72 2c 20 69 6e 74 20 69 43 6f 6c 75  ursor, int iColu
5190: 6d 6e 29 7b 0a 20 20 69 6e 74 20 61 66 66 4c 65  mn){.  int affLe
51a0: 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20 20  ft, affRight;.  
51b0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
51c0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
51d0: 51 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 54 65  Q );.  if( pOrTe
51e0: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
51f0: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  iCursor ){.    r
5200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
5210: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
5220: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
5230: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5240: 0a 20 20 7d 0a 20 20 61 66 66 52 69 67 68 74 20  .  }.  affRight 
5250: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
5260: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
5270: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
5280: 20 69 66 28 20 61 66 66 52 69 67 68 74 3d 3d 30   if( affRight==0
5290: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
52a0: 3b 0a 20 20 7d 0a 20 20 61 66 66 4c 65 66 74 20  ;.  }.  affLeft 
52b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
52c0: 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70  inity(pOrTerm->p
52d0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
52e0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 61 66  if( affRight!=af
52f0: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 72 65 74  fLeft ){.    ret
5300: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
5310: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
5320: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
5330: 68 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f 66  he given term of
5340: 20 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63 61   an OR clause ca
5350: 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 64 75 72  n be ignored dur
5360: 69 6e 67 0a 2a 2a 20 61 20 63 68 65 63 6b 20 74  ing.** a check t
5370: 6f 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  o make sure all 
5380: 4f 52 20 74 65 72 6d 73 20 61 72 65 20 63 61 6e  OR terms are can
5390: 64 69 64 61 74 65 73 20 66 6f 72 20 6f 70 74 69  didates for opti
53a0: 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20  mization..** In 
53b0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
53c0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 20 63 61  urn true if a ca
53d0: 6c 6c 20 74 6f 20 74 68 65 20 6f 72 54 65 72 6d  ll to the orTerm
53e0: 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65 28 29  IsOptCandidate()
53f0: 0a 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e  .** above return
5400: 65 64 20 66 61 6c 73 65 20 62 75 74 20 69 74 20  ed false but it 
5410: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
5420: 20 74 6f 20 64 69 73 71 75 61 6c 69 66 79 20 74   to disqualify t
5430: 68 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  he.** optimizati
5440: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  on..**.** Suppos
5450: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f  e the original O
5460: 52 20 70 68 72 61 73 65 20 77 61 73 20 74 68 69  R phrase was thi
5470: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
5480: 20 20 20 61 3d 34 20 20 4f 52 20 20 61 3d 31 31     a=4  OR  a=11
5490: 20 20 4f 52 20 20 61 3d 62 0a 2a 2a 0a 2a 2a 20    OR  a=b.**.** 
54a0: 44 75 72 69 6e 67 20 61 6e 61 6c 79 73 69 73 2c  During analysis,
54b0: 20 74 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   the third term 
54c0: 67 65 74 73 20 66 6c 69 70 70 65 64 20 61 72 6f  gets flipped aro
54d0: 75 6e 64 20 61 6e 64 20 64 75 70 6c 69 63 61 74  und and duplicat
54e0: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 77 65 20  e.** so that we 
54f0: 61 72 65 20 6c 65 66 74 20 77 69 74 68 20 74 68  are left with th
5500: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
5510: 20 20 20 20 61 3d 34 20 20 4f 52 20 20 61 3d 31      a=4  OR  a=1
5520: 31 20 20 4f 52 20 20 61 3d 62 20 20 4f 52 20 20  1  OR  a=b  OR  
5530: 62 3d 61 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  b=a.**.** Since 
5540: 74 68 65 20 6c 61 73 74 20 74 77 6f 20 74 65 72  the last two ter
5550: 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
5560: 73 2c 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74  s, only one of t
5570: 68 65 6d 0a 2a 2a 20 68 61 73 20 74 6f 20 71 75  hem.** has to qu
5580: 61 6c 69 66 79 20 69 6e 20 6f 72 64 65 72 20 66  alify in order f
5590: 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 70 68 72  or the whole phr
55a0: 61 73 65 20 74 6f 20 71 75 61 6c 69 66 79 2e 20  ase to qualify. 
55b0: 20 57 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   When.** this ro
55c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
55d0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 70 4f   we know that pO
55e0: 72 54 65 72 6d 20 64 69 64 20 6e 6f 74 20 71 75  rTerm did not qu
55f0: 61 6c 69 66 79 2e 0a 2a 2a 20 54 68 69 73 20 72  alify..** This r
5600: 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68  outine merely ch
5610: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
5620: 4f 72 54 65 72 6d 20 68 61 73 20 61 20 64 75 70  OrTerm has a dup
5630: 6c 69 63 61 74 65 20 74 68 61 74 0a 2a 2a 20 6d  licate that.** m
5640: 69 67 68 74 20 71 75 61 6c 69 66 79 2e 20 20 49  ight qualify.  I
5650: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 75 70  f there is a dup
5660: 6c 69 63 61 74 65 20 74 68 61 74 20 68 61 73 20  licate that has 
5670: 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
5680: 64 69 73 71 75 61 6c 69 66 69 65 64 2c 20 74 68  disqualified, th
5690: 65 6e 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  en return true. 
56a0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
56b0: 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f 72 0a   duplicates, or.
56c0: 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
56d0: 20 68 61 73 20 61 6c 73 6f 20 62 65 65 6e 20 64   has also been d
56e0: 69 73 71 75 61 6c 69 66 65 64 2c 20 72 65 74 75  isqualifed, retu
56f0: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
5700: 74 69 63 20 69 6e 74 20 6f 72 54 65 72 6d 48 61  tic int orTermHa
5710: 73 4f 6b 44 75 70 6c 69 63 61 74 65 28 57 68 65  sOkDuplicate(Whe
5720: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 2c 20 57  reClause *pOr, W
5730: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
5740: 6d 29 7b 0a 20 20 69 66 28 20 70 4f 72 54 65 72  m){.  if( pOrTer
5750: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
5760: 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 2f 2a  COPIED ){.    /*
5770: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 72 69   This is the ori
5780: 67 69 6e 61 6c 20 74 65 72 6d 2e 20 20 54 68 65  ginal term.  The
5790: 20 64 75 70 6c 69 63 61 74 65 20 69 73 20 74 6f   duplicate is to
57a0: 20 74 68 65 20 6c 65 66 74 20 68 61 64 0a 20 20   the left had.  
57b0: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 79 65 74    ** has not yet
57c0: 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 20 61   been analyzed a
57d0: 6e 64 20 74 68 75 73 20 68 61 73 20 6e 6f 74 20  nd thus has not 
57e0: 79 65 74 20 62 65 65 6e 20 64 69 73 71 75 61 6c  yet been disqual
57f0: 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ified. */.    re
5800: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
5810: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67  ( (pOrTerm->flag
5820: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
5830: 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4f  )!=0.     && (pO
5840: 72 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  r->a[pOrTerm->iP
5850: 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20 54  arent].flags & T
5860: 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 20 29 7b  ERM_OR_OK)!=0 ){
5870: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
5880: 61 20 64 75 70 6c 69 63 61 74 65 20 74 65 72 6d  a duplicate term
5890: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
58a0: 71 75 61 6c 69 66 69 65 64 20 73 6f 20 74 68 69  qualified so thi
58b0: 73 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 64 6f 65  s one.    ** doe
58c0: 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 2e 20 2a  s not have to. *
58d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  /.    return 1;.
58e0: 20 20 7d 0a 20 20 2f 2a 20 54 68 69 73 20 69 73    }.  /* This is
58f0: 20 65 69 74 68 65 72 20 61 20 73 69 6e 67 6c 65   either a single
5900: 74 6f 6e 20 74 65 72 6d 20 6f 72 20 65 6c 73 65  ton term or else
5910: 20 69 74 20 69 73 20 61 20 64 75 70 6c 69 63 61   it is a duplica
5920: 74 65 20 66 6f 72 0a 20 20 2a 2a 20 77 68 69 63  te for.  ** whic
5930: 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  h the original d
5940: 69 64 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e 20  id not qualify. 
5950: 20 45 69 74 68 65 72 20 77 61 79 20 77 65 20 61   Either way we a
5960: 72 65 20 64 6f 6e 65 20 66 6f 72 2e 20 2a 2f 0a  re done for. */.
5970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
5980: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
5990: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
59a0: 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f  TION && !SQLITE_
59b0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
59c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75  ../*.** The inpu
59d0: 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
59e0: 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72  e is an WhereTer
59f0: 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  m structure with
5a00: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45   only the.** "pE
5a10: 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65  xpr" field fille
5a20: 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f  d in.  The job o
5a30: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
5a40: 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  s to analyze the
5a50: 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f  .** subexpressio
5a60: 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61  n and populate a
5a70: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65  ll the other fie
5a80: 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65  lds of the Where
5a90: 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72  Term.** structur
5aa0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5ab0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
5ac0: 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72   the form "<expr
5ad0: 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74  > <op> X" it get
5ae0: 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f  s commuted.** to
5af0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f   the standard fo
5b00: 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65  rm of "X <op> <e
5b10: 78 70 72 3e 22 2e 20 20 49 66 20 74 68 65 20 65  xpr>".  If the e
5b20: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a  xpression is of.
5b30: 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  ** the form "X <
5b40: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74  op> Y" where bot
5b50: 68 20 58 20 61 6e 64 20 59 20 61 72 65 20 63 6f  h X and Y are co
5b60: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  lumns, then the 
5b70: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72  original.** expr
5b80: 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e  ession is unchan
5b90: 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69  ged and a new vi
5ba0: 72 74 75 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  rtual expression
5bb0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20   of the form.** 
5bc0: 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64  "Y <op> X" is ad
5bd0: 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45  ded to the WHERE
5be0: 20 63 6c 61 75 73 65 20 61 6e 64 20 61 6e 61 6c   clause and anal
5bf0: 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  yzed separately.
5c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5c10: 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53  exprAnalyze(.  S
5c20: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
5c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
5c40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
5c50: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
5c60: 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  C,         /* th
5c70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
5c80: 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20  /.  int idxTerm 
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ca0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   Index of the te
5cb0: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
5cc0: 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54  d */.){.  WhereT
5cd0: 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57  erm *pTerm = &pW
5ce0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
5cf0: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
5d00: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
5d10: 61 73 6b 53 65 74 3b 0a 20 20 45 78 70 72 20 2a  askSet;.  Expr *
5d20: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
5d30: 45 78 70 72 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Expr;.  Bitmask 
5d40: 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 42 69  prereqLeft;.  Bi
5d50: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
5d60: 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b  .  int nPattern;
5d70: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
5d80: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 0a 20 20  e;.  int op;..  
5d90: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
5da0: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
5db0: 72 6e 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  rn;.  prereqLeft
5dc0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
5dd0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
5de0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
5df0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
5e00: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
5e10: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
5e20: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
5e30: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
5e40: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
5e50: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
5e60: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69  kSet, pExpr->pLi
5e70: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
5e90: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
5ea0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
5eb0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Expr->pSelect);.
5ec0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
5ed0: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
5ee0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
5ef0: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
5f00: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
5f10: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
5f20: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
5f30: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
5f40: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
5f50: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
5f60: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
5f70: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
5f80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5f90: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5fa0: 20 29 7b 0a 20 20 20 20 70 72 65 72 65 71 41 6c   ){.    prereqAl
5fb0: 6c 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  l |= getMask(pMa
5fc0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52  skSet, pExpr->iR
5fd0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a  ightJoinTable);.
5fe0: 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65    }.  pTerm->pre
5ff0: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
6000: 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66  ll;.  pTerm->lef
6010: 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  tCursor = -1;.  
6020: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
6030: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f   -1;.  pTerm->eO
6040: 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69  perator = 0;.  i
6050: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  f( allowedOp(op)
6060: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
6070: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
6080: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
6090: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
60a0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
60b0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
60c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
60d0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
60e0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
60f0: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
6100: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
6110: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
6120: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
6130: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
6140: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
6150: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
6160: 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20  orMask(op);.    
6170: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
6180: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
6190: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
61a0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
61b0: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
61c0: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
61d0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
61e0: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
61f0: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
6200: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
6210: 65 33 45 78 70 72 44 75 70 28 70 45 78 70 72 29  e3ExprDup(pExpr)
6220: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
6230: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
6240: 64 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d() ){.         
6250: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6260: 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  te(pDup);.      
6270: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
6290: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
62a0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
62b0: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
62c0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
62d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
62e0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
62f0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
6300: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
6310: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
6320: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
6330: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
6340: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
6350: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
6360: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
6370: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
6380: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
6390: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  D;.      }else{.
63a0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
63b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e  Expr;.        pN
63c0: 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  ew = pTerm;.    
63d0: 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f    }.      exprCo
63e0: 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20  mmute(pDup);.   
63f0: 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d     pLeft = pDup-
6400: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e  >pLeft;.      pN
6410: 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  ew->leftCursor =
6420: 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
6430: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
6440: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
6450: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
6460: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
6470: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20   = prereqLeft;. 
6480: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
6490: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
64a0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
64b0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
64c0: 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29  orMask(pDup->op)
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
64e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
64f0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
6500: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20  ATION.  /* If a 
6510: 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57  term is the BETW
6520: 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72  EEN operator, cr
6530: 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72  eate two new vir
6540: 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20  tual terms.  ** 
6550: 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20  that define the 
6560: 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42  range that the B
6570: 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74  ETWEEN implement
6580: 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  s..  */.  else i
6590: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
65a0: 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20  _BETWEEN ){.    
65b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
65c0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
65d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
65e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f  tatic const u8 o
65f0: 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54  ps[] = {TK_GE, T
6600: 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72  K_LE};.    asser
6610: 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
6620: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
6630: 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20  ->nExpr==2 );.  
6640: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
6650: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
6660: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
6670: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
6680: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
6690: 71 6c 69 74 65 33 45 78 70 72 28 6f 70 73 5b 69  qlite3Expr(ops[i
66a0: 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  ], sqlite3ExprDu
66b0: 70 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c  p(pExpr->pLeft),
66c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
66e0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 69  lite3ExprDup(pLi
66f0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c  st->a[i].pExpr),
6700: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
6710: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
6720: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
6730: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
6740: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
6750: 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79  .      exprAnaly
6760: 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
6770: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65  xNew);.      pTe
6780: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
6790: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43  Term];.      pWC
67a0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
67b0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
67c0: 20 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e     }.    pTerm->
67d0: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a  nChild = 2;.  }.
67e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
67f0: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
6800: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
6810: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6820: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
6830: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
6840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6850: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20  _SUBQUERY).  /* 
6860: 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65  Attempt to conve
6870: 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  rt OR-connected 
6880: 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e  terms into an IN
6890: 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61   operator so tha
68a0: 74 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20  t.  ** they can 
68b0: 6d 61 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69  make use of indi
68c0: 63 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20  ces.  Example:. 
68d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
68e0: 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78 70  = expr1  OR  exp
68f0: 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20  r2 = x  OR  x = 
6900: 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  expr3.  **.  ** 
6910: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
6920: 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  o.  **.  **     
6930: 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70   x IN (expr1,exp
6940: 72 32 2c 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20  r2,expr3).  **. 
6950: 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
6960: 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d  ation must be om
6970: 69 74 74 65 64 20 69 66 20 4f 4d 49 54 5f 53 55  itted if OMIT_SU
6980: 42 51 55 45 52 59 20 69 73 20 64 65 66 69 6e 65  BQUERY is define
6990: 64 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 74  d because.  ** t
69a0: 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20  he compiler for 
69b0: 74 68 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61  the the IN opera
69c0: 74 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 73  tor is part of s
69d0: 75 62 2d 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ub-queries..  */
69e0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
69f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
6a00: 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20      int ok;.    
6a10: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e  int i, j;.    in
6a20: 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73  t iColumn, iCurs
6a30: 6f 72 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61  or;.    WhereCla
6a40: 75 73 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65  use sOr;.    Whe
6a50: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
6a60: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ..    assert( (p
6a70: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
6a80: 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29  RM_DYNAMIC)==0 )
6a90: 3b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  ;.    whereClaus
6aa0: 65 49 6e 69 74 28 26 73 4f 72 2c 20 70 57 43 2d  eInit(&sOr, pWC-
6ab0: 3e 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65  >pParse, pMaskSe
6ac0: 74 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  t);.    whereSpl
6ad0: 69 74 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20  it(&sOr, pExpr, 
6ae0: 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72  TK_OR);.    expr
6af0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
6b00: 20 26 73 4f 72 29 3b 0a 20 20 20 20 61 73 73 65   &sOr);.    asse
6b10: 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 3d 32  rt( sOr.nTerm>=2
6b20: 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
6b30: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73     do{.      ass
6b40: 65 72 74 28 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d  ert( j<sOr.nTerm
6b50: 20 29 3b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d   );.      iColum
6b60: 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66  n = sOr.a[j].lef
6b70: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69  tColumn;.      i
6b80: 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a  Cursor = sOr.a[j
6b90: 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ].leftCursor;.  
6ba0: 20 20 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72      ok = iCursor
6bb0: 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >=0;.      for(i
6bc0: 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f  =sOr.nTerm-1, pO
6bd0: 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d  rTerm=sOr.a; i>=
6be0: 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f  0 && ok; i--, pO
6bf0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
6c00: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65    if( pOrTerm->e
6c10: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20  Operator!=WO_EQ 
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
6c30: 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c  o or_not_possibl
6c40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
6c50: 20 20 20 20 20 69 66 28 20 6f 72 54 65 72 6d 49       if( orTermI
6c60: 73 4f 70 74 43 61 6e 64 69 64 61 74 65 28 70 4f  sOptCandidate(pO
6c70: 72 54 65 72 6d 2c 20 69 43 75 72 73 6f 72 2c 20  rTerm, iCursor, 
6c80: 69 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20  iColumn) ){.    
6c90: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66        pOrTerm->f
6ca0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
6cb0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
6cc0: 65 20 69 66 28 20 6f 72 54 65 72 6d 48 61 73 4f  e if( orTermHasO
6cd0: 6b 44 75 70 6c 69 63 61 74 65 28 26 73 4f 72 2c  kDuplicate(&sOr,
6ce0: 20 70 4f 72 54 65 72 6d 29 20 29 7b 0a 20 20 20   pOrTerm) ){.   
6cf0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
6d00: 66 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  flags &= ~TERM_O
6d10: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
6d30: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  k = 0;.        }
6d40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
6d50: 69 6c 65 28 20 21 6f 6b 20 26 26 20 28 73 4f 72  ile( !ok && (sOr
6d60: 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20  .a[j++].flags & 
6d70: 54 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20  TERM_COPIED)!=0 
6d80: 26 26 20 6a 3c 32 20 29 3b 0a 20 20 20 20 69 66  && j<2 );.    if
6d90: 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78  ( ok ){.      Ex
6da0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
6db0: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
6dc0: 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  New, *pDup;.    
6dd0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
6de0: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73  0;.      for(i=s
6df0: 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  Or.nTerm-1, pOrT
6e00: 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20  erm=sOr.a; i>=0 
6e10: 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54  && ok; i--, pOrT
6e20: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
6e30: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c  if( (pOrTerm->fl
6e40: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b  ags & TERM_OR_OK
6e50: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
6e60: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
6e70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6e80: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
6e90: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
6ea0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
6eb0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c  xprListAppend(pL
6ec0: 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20  ist, pDup, 0);. 
6ed0: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70         pLeft = p
6ee0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
6ef0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Left;.      }.  
6f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
6f10: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t!=0 );.      pD
6f20: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6f30: 44 75 70 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  Dup(pLeft);.    
6f40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
6f50: 45 78 70 72 28 54 4b 5f 49 4e 2c 20 70 44 75 70  Expr(TK_IN, pDup
6f60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
6f70: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
6f80: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
6f90: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a         transferJ
6fa0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77  oinMarkings(pNew
6fb0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
6fc0: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
6fd0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
6fe0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
6ff0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
7000: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
7010: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
7020: 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61  .        exprAna
7030: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
7040: 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  idxNew);.       
7050: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
7060: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
7070: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
7080: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
7090: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
70a0: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
70b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
70c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
70d0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
70e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
70f0: 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65  .or_not_possible
7100: 3a 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  :.    whereClaus
7110: 65 43 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20  eClear(&sOr);.  
7120: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7130: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
7140: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
7150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7160: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
7170: 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74  N.  /* Add const
7180: 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65  raints to reduce
7190: 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
71a0: 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47  e on a LIKE or G
71b0: 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  LOB.  ** operato
71c0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  r..  */.  if( is
71d0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e  LikeOrGlob(pWC->
71e0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
71f0: 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69  r, &nPattern, &i
7200: 73 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20  sComplete) ){.  
7210: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a    Expr *pLeft, *
7220: 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72  pRight;.    Expr
7230: 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b   *pStr1, *pStr2;
7240: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
7250: 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32  xpr1, *pNewExpr2
7260: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
7270: 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20  1, idxNew2;..   
7280: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
7290: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
72a0: 72 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  r;.    pRight = 
72b0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
72c0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53  0].pExpr;.    pS
72d0: 74 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tr1 = sqlite3Exp
72e0: 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20  r(TK_STRING, 0, 
72f0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7300: 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71  Str1 ){.      sq
7310: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
7320: 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pStr1->token, &p
7330: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
7340: 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65       pStr1->toke
7350: 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a  n.n = nPattern;.
7360: 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20      }.    pStr2 
7370: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7380: 28 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28  (pStr1);.    if(
7390: 20 70 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20   pStr2 ){.      
73a0: 61 73 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74  assert( pStr2->t
73b0: 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20  oken.dyn );.    
73c0: 20 20 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32    ++*(u8*)&pStr2
73d0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65  ->token.z[nPatte
73e0: 72 6e 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rn-1];.    }.   
73f0: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
7400: 69 74 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20  ite3Expr(TK_GE, 
7410: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
7420: 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29  Left), pStr1, 0)
7430: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
7440: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
7450: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
7460: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
7470: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
7480: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
7490: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
74a0: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
74b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
74c0: 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70  K_LT, sqlite3Exp
74d0: 72 44 75 70 28 70 4c 65 66 74 29 2c 20 70 53 74  rDup(pLeft), pSt
74e0: 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e  r2, 0);.    idxN
74f0: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
7500: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
7510: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
7520: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
7530: 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  C);.    exprAnal
7540: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
7550: 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65  dxNew2);.    pTe
7560: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7570: 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69  Term];.    if( i
7580: 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  sComplete ){.   
7590: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
75a0: 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  1].iParent = idx
75b0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d  Term;.      pWC-
75c0: 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72  >a[idxNew2].iPar
75d0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
75e0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
75f0: 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ld = 2;.    }.  
7600: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7610: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
7620: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
7630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7640: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7650: 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54   /* Add a WO_MAT
7660: 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65 72  CH auxiliary ter
7670: 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61  m to the constra
7680: 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a 20  int set if the. 
7690: 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72   ** current expr
76a0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
76b0: 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d   form:  column M
76c0: 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20  ATCH expr..  ** 
76d0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
76e0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
76f0: 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
7700: 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75  ds of.  ** virtu
7710: 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20  al tables.  The 
7720: 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70 74  native query opt
7730: 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20  imizer does not 
7740: 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20  attempt.  ** to 
7750: 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68  do anything with
7760: 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73   MATCH functions
7770: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  ..  */.  if( isM
7780: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78  atchOfColumn(pEx
7790: 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  pr) ){.    int i
77a0: 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20  dxNew;.    Expr 
77b0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
77c0: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
77d0: 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69  pNewTerm;.    Bi
77e0: 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75  tmask prereqColu
77f0: 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a  mn, prereqExpr;.
7800: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
7810: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
7820: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66  .pExpr;.    pLef
7830: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
7840: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
7850: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
7860: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7870: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
7880: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
7890: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
78a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
78b0: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
78c0: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
78d0: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
78e0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
78f0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
7900: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7910: 72 28 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20 73  r(TK_MATCH, 0, s
7920: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 52  qlite3ExprDup(pR
7930: 69 67 68 74 29 2c 20 30 29 3b 0a 20 20 20 20 20  ight), 0);.     
7940: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
7950: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
7960: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
7970: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
7980: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 70 4e 65  AMIC);.      pNe
7990: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
79a0: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
79b0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
79c0: 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78 70  ight = prereqExp
79d0: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  r;.      pNewTer
79e0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
79f0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
7a00: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
7a10: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
7a20: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
7a30: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
7a40: 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48  rator = WO_MATCH
7a50: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
7a60: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
7a70: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
7a80: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7a90: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  rm];.      pTerm
7aa0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
7ab0: 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
7ac0: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
7ad0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
7ae0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
7af0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
7b00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
7b10: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
7b20: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d  IRTUALTABLE */.}
7b30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
7b40: 52 55 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68  RUE if any of th
7b50: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
7b60: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
7b70: 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ...] contain.** 
7b80: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
7b90: 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ny table other t
7ba0: 68 61 6e 20 74 68 65 20 69 42 61 73 65 20 74 61  han the iBase ta
7bb0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
7bc0: 6e 74 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68  nt referencesOth
7bd0: 65 72 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72  erTables(.  Expr
7be0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
7bf0: 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
7c00: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
7c10: 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70  hs list */.  Exp
7c20: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
7c30: 65 74 2c 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e  et,    /* Mappin
7c40: 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f  g from tables to
7c50: 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e   bitmaps */.  in
7c60: 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20  t iFirst,       
7c70: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65          /* Be se
7c80: 61 72 63 68 69 6e 67 20 77 69 74 68 20 74 68 65  arching with the
7c90: 20 69 46 69 72 73 74 2d 74 68 20 65 78 70 72 65   iFirst-th expre
7ca0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
7cb0: 42 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20  Base            
7cc0: 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72       /* Ignore r
7cd0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
7ce0: 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
7cf0: 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20  Bitmask allowed 
7d00: 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  = ~getMask(pMask
7d10: 53 65 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77  Set, iBase);.  w
7d20: 68 69 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69  hile( iFirst<pLi
7d30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
7d40: 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
7d50: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
7d60: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b  List->a[iFirst++
7d70: 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64  ].pExpr)&allowed
7d80: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
7d90: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
7da0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7dc0: 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66 20  tine decides if 
7dd0: 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65 64  pIdx can be used
7de0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
7df0: 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75  ORDER BY.** clau
7e00: 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20  se.  If it can, 
7e10: 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49  it returns 1.  I
7e20: 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61  f pIdx cannot sa
7e30: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44  tisfy the.** ORD
7e40: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
7e50: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7e60: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64  ns 0..**.** pOrd
7e70: 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52  erBy is an ORDER
7e80: 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
7e90: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
7ea0: 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68 65  nt.  pTab is the
7eb0: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61  .** left-most ta
7ec0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
7ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 73  clause of that s
7ee0: 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ame SELECT state
7ef0: 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ment and.** the 
7f00: 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72 73  table has a curs
7f10: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61  or number of "ba
7f20: 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e  se".  pIdx is an
7f30: 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a   index on pTab..
7f40: 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20  **.** nEqCol is 
7f50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
7f60: 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68  lumns of pIdx th
7f70: 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20 65  at are used as e
7f80: 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74  quality.** const
7f90: 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20  raints.  Any of 
7fa0: 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61  these columns ma
7fb0: 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f  y be missing fro
7fc0: 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  m the ORDER BY.*
7fd0: 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  * clause and the
7fe0: 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c   match can still
7ff0: 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a   be a success..*
8000: 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f  *.** All terms o
8010: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
8020: 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  hat match agains
8030: 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  t the index must
8040: 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53   be either.** AS
8050: 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72  C or DESC.  (Ter
8060: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
8070: 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74  BY clause past t
8080: 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51  he end of a UNIQ
8090: 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e  UE.** index do n
80a0: 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  ot need to satis
80b0: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
80c0: 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76  nt.)  The *pbRev
80d0: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
80e0: 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44   to 1 if the ORD
80f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
8100: 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20  all DESC and it 
8110: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a  is set to 0 if.*
8120: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
8130: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43  lause is all ASC
8140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8150: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a  isSortingIndex(.
8160: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8180: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8190: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70    ExprMaskSet *p
81a0: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
81b0: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20  ping from table 
81c0: 69 6e 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61  indices to bitma
81d0: 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ps */.  Index *p
81e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
81f0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
8200: 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
8210: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
8220: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
8230: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
8240: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f  e table to be so
8250: 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rted */.  ExprLi
8260: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8270: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
8280: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
8290: 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20  t nEqCol,       
82a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
82b0: 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  of index columns
82c0: 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61   with == constra
82d0: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ints */.  int *p
82e0: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
82f0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
8300: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
8310: 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  C */.){.  int i,
8320: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
8330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8340: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
8350: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
8360: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8370: 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20  /* XOR of index 
8380: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72  and ORDER BY sor
8390: 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  t direction */. 
83a0: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
83d0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
83e0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
83f0: 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20  t_item *pTerm;  
8400: 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74    /* A term of t
8410: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8420: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
8430: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8440: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ;..  assert( pOr
8450: 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54  derBy!=0 );.  nT
8460: 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
8470: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
8480: 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
8490: 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66  * Match terms of
84a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
84b0: 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c  ause against col
84c0: 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  umns of.  ** the
84d0: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
84e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69  * Note that indi
84f0: 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e  ces have pIdx->n
8500: 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63  Column regular c
8510: 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a  olumns plus.  **
8520: 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   one additional 
8530: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e  column containin
8540: 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68  g the rowid.  Th
8550: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20  e rowid column. 
8560: 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
8570: 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64   is also allowed
8580: 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73   to match agains
8590: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  t the ORDER BY. 
85a0: 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f   ** clause..  */
85b0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54  .  for(i=j=0, pT
85c0: 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  erm=pOrderBy->a;
85d0: 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70   j<nTerm && i<=p
85e0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
85f0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
8600: 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  xpr;       /* Th
8610: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
8620: 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54 65  the ORDER BY pTe
8630: 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  rm */.    CollSe
8640: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20  q *pColl;    /* 
8650: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
8660: 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20  quence of pExpr 
8670: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53  */.    int termS
8680: 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72  ortOrder; /* Sor
8690: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  t order for this
86a0: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74   term */.    int
86b0: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
86c0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75  /* The i-th colu
86d0: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
86e0: 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a    -1 for rowid *
86f0: 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f  /.    int iSortO
8700: 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f  rder;    /* 1 fo
8710: 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53  r DESC, 0 for AS
8720: 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e  C on the i-th in
8730: 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  dex term */.    
8740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
8750: 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  l; /* Name of th
8760: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8770: 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e  ence for i-th in
8780: 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20  dex term */..   
8790: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
87a0: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
87b0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
87c0: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
87d0: 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20  able!=base ){.  
87e0: 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75      /* Can not u
87f0: 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74  se an index sort
8800: 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61   on anything tha
8810: 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d  t is not a colum
8820: 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  n in the.      *
8830: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
8840: 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e of the FROM cl
8850: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72  ause */.      br
8860: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
8870: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
8880: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
8890: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  , pExpr);.    if
88a0: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
88b0: 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
88c0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  fltColl;.    }. 
88d0: 20 20 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e     if( i<pIdx->n
88e0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
88f0: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
8900: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
8910: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
8920: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  pIdx->pTable->iP
8930: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
8940: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
8950: 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74     }.      iSort
8960: 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53  Order = pIdx->aS
8970: 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
8980: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d     zColl = pIdx-
8990: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
89a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f  }else{.      iCo
89b0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
89c0: 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b   iSortOrder = 0;
89d0: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
89e0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
89f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72   }.    if( pExpr
8a00: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
8a10: 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  mn || sqlite3Str
8a20: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
8a30: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
8a40: 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20     /* Term j of 
8a50: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8a60: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  use does not mat
8a70: 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74  ch column i of t
8a80: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
8a90: 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29    if( i<nEqCol )
8aa0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8ab0: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
8ac0: 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
8ad0: 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20  ned by == fails 
8ae0: 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20  to match an.    
8af0: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
8b00: 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b  term, that is OK
8b10: 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74  .  Just ignore t
8b20: 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  hat column of th
8b30: 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
8b40: 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
8b50: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
8b60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8b70: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
8b80: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
8b90: 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72  nd is not constr
8ba0: 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20  ained by ==.    
8bb0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
8bc0: 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74  index cannot sat
8bd0: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
8be0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  Y constraint..  
8bf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
8c10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
8c20: 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74  ert( pIdx->aSort
8c30: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
8c40: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73  assert( pTerm->s
8c50: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70  ortOrder==0 || p
8c60: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
8c70: 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
8c80: 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20  ( iSortOrder==0 
8c90: 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31  || iSortOrder==1
8ca0: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
8cb0: 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64  Order = iSortOrd
8cc0: 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74  er ^ pTerm->sort
8cd0: 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Order;.    if( i
8ce0: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
8cf0: 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64   if( termSortOrd
8d00: 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b  er!=sortOrder ){
8d10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69  .        /* Indi
8d20: 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  ces can only be 
8d30: 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45  used if all ORDE
8d40: 52 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20  R BY terms past 
8d50: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  the.        ** e
8d60: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
8d70: 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  nts are all eith
8d80: 65 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20  er DESC or ASC. 
8d90: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
8da0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
8db0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f   }else{.      so
8dc0: 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f  rtOrder = termSo
8dd0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
8de0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72     j++;.    pTer
8df0: 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  m++;.    if( iCo
8e00: 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72  lumn<0 && !refer
8e10: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
8e20: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
8e30: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
8e40: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8e50: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20   indexed column 
8e60: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
8e70: 65 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e  ey and everythin
8e80: 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20  g matches.      
8e90: 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f  ** so far and no
8ea0: 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
8eb0: 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  BY terms to the 
8ec0: 72 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20  right reference 
8ed0: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  other.      ** t
8ee0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
8ef0: 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61  n, then we are a
8f00: 73 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20  ssured that the 
8f10: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
8f20: 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73  d .      ** to s
8f30: 6f 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20  ort because the 
8f40: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
8f50: 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e  nique and so non
8f60: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20  e of the other. 
8f70: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20       ** columns 
8f80: 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69  will make any di
8f90: 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a  fference.      *
8fa0: 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72  /.      j = nTer
8fb0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
8fc0: 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64  *pbRev = sortOrd
8fd0: 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d  er!=0;.  if( j>=
8fe0: 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  nTerm ){.    /* 
8ff0: 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  All terms of the
9000: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
9010: 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
9020: 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20  this index so.  
9030: 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20    ** this index 
9040: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
9050: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  sorting. */.    
9060: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
9070: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
9080: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d  r!=OE_None && i=
9090: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  =pIdx->nColumn. 
90a0: 20 20 20 20 20 26 26 20 21 72 65 66 65 72 65 6e       && !referen
90b0: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
90c0: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
90d0: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
90e0: 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20     /* All terms 
90f0: 6f 66 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61  of this index ma
9100: 74 63 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20  tch some prefix 
9110: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
9120: 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e  clause.    ** an
9130: 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 55  d the index is U
9140: 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72  NIQUE and no ter
9150: 6d 73 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f  ms on the tail o
9160: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  f the ORDER BY. 
9170: 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66     ** clause ref
9180: 65 72 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62  erence other tab
9190: 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20  les in a join.  
91a0: 49 66 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74  If this is all t
91b0: 72 75 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  rue then.    ** 
91c0: 74 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61  the order by cla
91d0: 75 73 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f  use is superfluo
91e0: 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  us. */.    retur
91f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
9200: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n 0;.}../*.** Ch
9210: 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65  eck table to see
9220: 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
9230: 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65   clause in pOrde
9240: 72 42 79 20 63 61 6e 20 62 65 20 73 61 74 69 73  rBy can be satis
9250: 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69  fied.** by sorti
9260: 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52  ng in order of R
9270: 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72  OWID.  Return tr
9280: 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74  ue if so and set
9290: 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a   *pbRev to be.**
92a0: 20 74 72 75 65 20 66 6f 72 20 72 65 76 65 72 73   true for revers
92b0: 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73  e ROWID and fals
92c0: 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f  e for forward RO
92d0: 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  WID order..*/.st
92e0: 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c  atic int sortabl
92f0: 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20  eByRowid(.  int 
9300: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
9310: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
9320: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74  mber for table t
9330: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
9340: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
9350: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
9360: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
9370: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
9380: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20   *pMaskSet,  /* 
9390: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
93a0: 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a  les to bitmaps *
93b0: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20  /.  int *pbRev  
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
93d0: 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52  et to 1 if ORDER
93e0: 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29   BY is DESC */.)
93f0: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20  {.  Expr *p;..  
9400: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
9410: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9420: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
9430: 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64  >0 );.  p = pOrd
9440: 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
9450: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
9460: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
9470: 54 61 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70  Table==base && p
9480: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20  ->iColumn==-1.  
9490: 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73    && !references
94a0: 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64  OtherTables(pOrd
94b0: 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20  erBy, pMaskSet, 
94c0: 31 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20  1, base) ){.    
94d0: 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42  *pbRev = pOrderB
94e0: 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
94f0: 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  r;.    return 1;
9500: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
9510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
9520: 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61  e a crude estima
9530: 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69  te of the logari
9540: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
9550: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
9560: 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20  esults need not 
9570: 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20  be exact.  This 
9580: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
9590: 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74   estimating.** t
95a0: 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66  he total cost of
95b0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72   performing oper
95c0: 61 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f  atings with O(lo
95d0: 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a  gN) or O(NlogN).
95e0: 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20  ** complexity.  
95f0: 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73  Because N is jus
9600: 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73  t a guess, it is
9610: 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64   no great traged
9620: 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20  y if.** logN is 
9630: 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f  a little off..*/
9640: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
9650: 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b  stLog(double N){
9660: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d  .  double logN =
9670: 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d   1;.  double x =
9680: 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e   10;.  while( N>
9690: 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d  x ){.    logN +=
96a0: 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b   1;.    x *= 10;
96b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f  .  }.  return lo
96c0: 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  gN;.}../*.** Two
96d0: 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72   routines for pr
96e0: 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  inting the conte
96f0: 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  nt of an sqlite3
9700: 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73  _index_info.** s
9710: 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20  tructure.  Used 
9720: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
9730: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
9740: 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53   If neither.** S
9750: 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51  QLITE_TEST or SQ
9760: 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64  LITE_DEBUG are d
9770: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65  efined, then the
9780: 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61  se routines.** a
9790: 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69  re no-ops..*/.#i
97a0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
97b0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
97c0: 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
97d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
97e0: 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f  atic void TRACE_
97f0: 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74  IDX_INPUTS(sqlit
9800: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
9810: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
9820: 28 20 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65  ( !sqlite3_where
9830: 5f 74 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  _trace ) return;
9840: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9850: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
9860: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
9870: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
9880: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
9890: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
98a0: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
98b0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
98c0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
98d0: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
98e0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
98f0: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
9900: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
9910: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
9920: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
9930: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
9940: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
9950: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
9960: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
9970: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
9980: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
9990: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
99a0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
99b0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
99c0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
99d0: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
99e0: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
99f0: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
9a00: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
9a10: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
9a20: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
9a30: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 77 68 65  if( !sqlite3_whe
9a40: 72 65 5f 74 72 61 63 65 20 29 20 72 65 74 75 72  re_trace ) retur
9a50: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
9a60: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
9a70: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
9a80: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
9a90: 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49  usage[%d]: argvI
9aa0: 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22  dx=%d omit=%d\n"
9ab0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
9ac0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
9ad0: 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
9ae0: 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  dex,.       p->a
9af0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
9b00: 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20  i].omit);.  }.  
9b10: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
9b20: 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c  tf("  idxNum=%d\
9b30: 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a  n", p->idxNum);.
9b40: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
9b50: 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25  intf("  idxStr=%
9b60: 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29  s\n", p->idxStr)
9b70: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
9b80: 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42  Printf("  orderB
9b90: 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c  yConsumed=%d\n",
9ba0: 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75   p->orderByConsu
9bb0: 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  med);.  sqlite3D
9bc0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73  ebugPrintf("  es
9bd0: 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e  timatedCost=%g\n
9be0: 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43  ", p->estimatedC
9bf0: 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ost);.}.#else.#d
9c00: 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f  efine TRACE_IDX_
9c10: 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e  INPUTS(A).#defin
9c20: 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50  e TRACE_IDX_OUTP
9c30: 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23  UTS(A).#endif..#
9c40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9c50: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9c60: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
9c70: 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
9c80: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
9c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
9ca0: 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
9cb0: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
9cc0: 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
9cd0: 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
9ce0: 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
9cf0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
9d00: 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
9d10: 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
9d20: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
9d30: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
9d40: 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
9d50: 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
9d60: 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
9d70: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
9d80: 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
9d90: 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
9da0: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
9db0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
9dc0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
9dd0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
9de0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
9df0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
9e00: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
9e10: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
9e20: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
9e30: 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
9e40: 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
9e50: 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
9e60: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
9e70: 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
9e80: 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
9e90: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
9ea0: 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
9eb0: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
9ec0: 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
9ed0: 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
9ee0: 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
9ef0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
9f00: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
9f10: 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
9f20: 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
9f30: 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
9f40: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
9f50: 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
9f60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9f70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9f80: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
9f90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
9fa0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fc0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
9fd0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
9fe0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
9ff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
a000: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
a010: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
a020: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
a030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
a040: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
a050: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
a060: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
a070: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a090: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
a0a0: 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79  */.  int orderBy
a0b0: 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  Usable,         
a0c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
a0d0: 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20  e can potential 
a0e0: 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  sort */.  sqlite
a0f0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
a100: 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65  pIdxInfo /* Inde
a110: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
a120: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
a130: 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ex */.){.  Table
a140: 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70   *pTab = pSrc->p
a150: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  Tab;.  sqlite3_i
a160: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
a170: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
a180: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
a190: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
a1a0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
a1b0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
a1c0: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
a1d0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
a1e0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
a1f0: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
a200: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
a210: 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
a220: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
a230: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
a240: 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  If the sqlite3_i
a250: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
a260: 75 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ure has not been
a270: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
a280: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69   allocated and i
a290: 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74  nitialized for t
a2a0: 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
a2b0: 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  e, then allocate
a2c0: 0a 20 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  .  ** and initia
a2d0: 6c 69 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f  lize it now.  */
a2e0: 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
a2f0: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
a300: 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
a310: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
a320: 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65  erm;.    int nTe
a330: 72 6d 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41  rm;.    WHERETRA
a340: 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
a350: 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
a360: 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e  %s...\n", pTab->
a370: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  zName));..    /*
a380: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
a390: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
a3a0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
a3b0: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
a3c0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
a3d0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
a3e0: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  .    for(i=nTerm
a3f0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
a400: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
a410: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
a420: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
a430: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
a440: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
a450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
a460: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
a470: 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e 74  or==WO_IN ) cont
a480: 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72  inue;.      nTer
a490: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
a4a0: 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
a4b0: 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
a4c0: 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
a4d0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
a4e0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
a4f0: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
a500: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
a510: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
a520: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c  f.    ** the sql
a530: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a540: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
a550: 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  /.    nOrderBy =
a560: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
a570: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
a580: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
a590: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
a5a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
a5b0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
a5c0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a5d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
a5e0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
a5f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
a600: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
a610: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
a620: 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
a630: 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
a640: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
a650: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
a660: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a670: 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
a680: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a690: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a6a0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  e.    */.    pId
a6b0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  xInfo = sqliteMa
a6c0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
a6d0: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
a700: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
a710: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
a720: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
a750: 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
a760: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
a770: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
a780: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a790: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
a7a0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
a7b0: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20  return 0.0;.    
a7c0: 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f  }.    *ppIdxInfo
a7d0: 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20   = pIdxInfo;..  
a7e0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
a7f0: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
a800: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
a810: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
a820: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
a830: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
a840: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
a850: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
a860: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
a870: 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  m.    ** changin
a880: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
a890: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
a8a0: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
a8b0: 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69  er to.    ** ini
a8c0: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
a8d0: 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
a8e0: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
a8f0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
a900: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
a910: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20  IdxInfo[1];.    
a920: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
a930: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
a940: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
a950: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
a960: 20 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72     pUsage = (str
a970: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
a980: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
a990: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
a9a0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
a9b0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
a9c0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
a9d0: 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74  nTerm;.    *(int
a9e0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
a9f0: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
aa00: 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73  ;.    *(struct s
aa10: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
aa20: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
aa30: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
aa40: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20   = pIdxCons;.   
aa50: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
aa60: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
aa70: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
aa80: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
aa90: 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63  rBy;.    *(struc
aaa0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
aab0: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
aac0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
aad0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
aae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
ab30: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54     for(i=j=0, pT
ab40: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
ab50: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
ab60: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
ab70: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
ab80: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
ab90: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
aba0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
abb0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
abc0: 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _IN ) continue;.
abd0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
abe0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
abf0: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  m->leftColumn;. 
ac00: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
ac10: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
ac20: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
ac30: 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e  [j].op = pTerm->
ac40: 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20  eOperator;.     
ac50: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
ac60: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
ac70: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
ac80: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
ac90: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
aca0: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
acb0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
acc0: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
acd0: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
ace0: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
acf0: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
ad00: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
ad10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
ad20: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
ad30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
ad40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ad50: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
ad60: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
ad70: 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LT );.      asse
ad80: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
ad90: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
ada0: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_LE );.      a
adb0: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
adc0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
add0: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
ade0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
adf0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
ae00: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
ae10: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
ae20: 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
ae30: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
ae40: 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73  ATCH );.      as
ae50: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
ae60: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
ae70: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
ae80: 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
ae90: 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ) );.      j++;.
aea0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
aeb0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
aec0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
aed0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
aee0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
aef0: 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79       pIdxOrderBy
af00: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
af10: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
af20: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
af30: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
af40: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
af50: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
af60: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
af70: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
af80: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
af90: 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
afa0: 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
afb0: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
afc0: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
afd0: 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
afe0: 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
aff0: 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
b000: 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
b010: 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
b020: 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
b030: 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
b040: 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
b050: 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
b060: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
b070: 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
b080: 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
b090: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
b0a0: 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
b0b0: 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c  e defined. Also,
b0c0: 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74   by this point t
b0d0: 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62  here must.  ** b
b0e0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
b0f0: 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
b100: 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
b110: 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ise.  ** sqlite3
b120: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
b130: 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20  es() would have 
b140: 70 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72  picked up the er
b150: 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  ror. .  */.  ass
b160: 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  ert( pTab->azMod
b170: 75 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e  uleArg && pTab->
b180: 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29  azModuleArg[0] )
b190: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
b1a0: 2d 3e 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30  ->pVtab );.#if 0
b1b0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74  .  if( pTab->pVt
b1c0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab==0 ){.    sql
b1d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b1e0: 72 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20  rse, "undefined 
b1f0: 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61  module %s for ta
b200: 62 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ble %s",.       
b210: 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
b220: 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61  rg[0], pTab->zNa
b230: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
b240: 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  0.0;.  }.#endif.
b250: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43  .  /* Set the aC
b260: 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
b270: 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e  le fields and in
b280: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20  itialize all .  
b290: 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  ** output variab
b2a0: 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  les to zero..  *
b2b0: 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69  *.  ** aConstrai
b2c0: 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74  nt[].usable is t
b2d0: 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  rue for constrai
b2e0: 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69  nts where the ri
b2f0: 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69  ght-hand.  ** si
b300: 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  de contains only
b310: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
b320: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
b330: 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  t of the current
b340: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e  .  ** table.  In
b350: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
b360: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
b370: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
b380: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
b390: 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70      column = exp
b3a0: 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  r.  **.  ** and 
b3b0: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
b3c0: 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  g a join, then t
b3d0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  he constraint on
b3e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a   column is .  **
b3f0: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61   only valid if a
b400: 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  ll tables refere
b410: 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63  nced in expr occ
b420: 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ur to the left. 
b430: 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
b440: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
b450: 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  mn..  **.  ** Th
b460: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
b470: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
b480: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
b490: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
b4a0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
b4b0: 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79  table.  That way
b4c0: 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
b4d0: 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65   compute it once
b4e0: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
b4f0: 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74  h we might try t
b500: 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20  o pick the best 
b510: 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74  index multiple t
b520: 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65  imes..  ** For e
b530: 61 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70  ach attempt at p
b540: 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c  icking an index,
b550: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61   the order of ta
b560: 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
b570: 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64   join might be d
b580: 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68  ifferent so we h
b590: 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  ave to recompute
b5a0: 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
b5b0: 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e  .  ** each time.
b5c0: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
b5d0: 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
b5e0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
b5f0: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
b600: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
b610: 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
b620: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
b630: 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sage;.  for(i=0;
b640: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
b650: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
b660: 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
b670: 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
b680: 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  ermOffset;.    p
b690: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
b6a0: 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
b6b0: 3e 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72  >usable =  (pTer
b6c0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
b6d0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20   notReady)==0;. 
b6e0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61   }.  memset(pUsa
b6f0: 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55  ge, 0, sizeof(pU
b700: 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66  sage[0])*pIdxInf
b710: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b  o->nConstraint);
b720: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
b730: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
b740: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b750: 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e  _free(pIdxInfo->
b760: 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70  idxStr);.  }.  p
b770: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20  IdxInfo->idxStr 
b780: 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
b790: 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70  >idxNum = 0;.  p
b7a0: 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
b7b0: 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
b7c0: 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
b7d0: 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
b7e0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
b7f0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
b800: 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30  TE_BIG_DBL / 2.0
b810: 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
b820: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
b830: 79 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  y;.  if( pIdxInf
b840: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21  o->nOrderBy && !
b850: 6f 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b  orderByUsable ){
b860: 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  .    *(int*)&pId
b870: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
b880: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  = 0;.  }..  sqli
b890: 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 50 61  te3SafetyOff(pPa
b8a0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52  rse->db);.  WHER
b8b0: 45 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e  ETRACE(("xBestIn
b8c0: 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70  dex for %s\n", p
b8d0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
b8e0: 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
b8f0: 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63  (pIdxInfo);.  rc
b900: 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e   = pTab->pVtab->
b910: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
b920: 64 65 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c  dex(pTab->pVtab,
b930: 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52   pIdxInfo);.  TR
b940: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
b950: 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28  pIdxInfo);.  if(
b960: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b970: 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
b980: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
b990: 20 20 20 20 73 71 6c 69 74 65 33 46 61 69 6c 65      sqlite3Faile
b9a0: 64 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  dMalloc();.    }
b9b0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c  else {.      sql
b9c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b9d0: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
b9e0: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
b9f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ba00: 53 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d  SafetyOn(pParse-
ba10: 3e 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  >db);.  }else{. 
ba20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
ba30: 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e  afetyOn(pParse->
ba40: 64 62 29 3b 0a 20 20 7d 0a 20 20 2a 28 69 6e 74  db);.  }.  *(int
ba50: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
ba60: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
ba70: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  ;..  return pIdx
ba80: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
ba90: 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ost;.}.#endif /*
baa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
bab0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
bac0: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73  .** Find the bes
bad0: 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65  t index for acce
bae0: 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c  ssing a particul
baf0: 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  ar table.  Retur
bb00: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
bb10: 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61  o the index, fla
bb20: 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
bb30: 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73   how the index s
bb40: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74  hould be used, t
bb50: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
bb60: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
bb70: 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63  ints, and the "c
bb80: 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e  ost" for this in
bb90: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  dex..**.** The l
bba0: 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78  owest cost index
bbb0: 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74   wins.  The cost
bbc0: 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
bbd0: 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  of the amount of
bbe0: 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b  .** CPU and disk
bbf0: 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f   I/O need to pro
bc00: 63 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74  cess the request
bc10: 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63   using the selec
bc20: 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61  ted index..** Fa
bc30: 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75  ctors that influ
bc40: 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64  ence cost includ
bc50: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54  e:.**.**    *  T
bc60: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
bc70: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
bc80: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76   will be retriev
bc90: 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20  ed.  (The.**    
bca0: 20 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74     fewer the bet
bcb0: 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ter.).**.**    *
bcc0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
bcd0: 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63   sorting must oc
bce0: 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  cur..**.**    * 
bcf0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
bd00: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65  there must be se
bd10: 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69  parate lookups i
bd20: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69  n the.**       i
bd30: 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20  ndex and in the 
bd40: 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  main table..**.*
bd50: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
bd60: 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72  bestIndex(.  Par
bd70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bd90: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
bda0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
bdb0: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
bdc0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
bdd0: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
bde0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
bdf0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
be00: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
be10: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
be20: 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
be30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
be40: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
be50: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
be60: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
be70: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
be80: 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72      /* The order
be90: 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
bea0: 49 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c  Index **ppIndex,
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bec0: 61 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69  ake *ppIndex poi
bed0: 6e 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69  nt to the best i
bee0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
bef0: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
bf00: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61        /* Put fla
bf10: 67 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  gs describing th
bf20: 69 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46  is choice in *pF
bf30: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
bf40: 6e 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20  nEq             
bf50: 20 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65        /* Put the
bf60: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
bf70: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
bf80: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  here */.){.  Whe
bf90: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
bfa0: 20 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20   Index *bestIdx 
bfb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
bfc0: 49 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73  Index that gives
bfd0: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
bfe0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77   */.  double low
bff0: 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  estCost;        
c000: 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
c010: 20 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a   using bestIdx *
c020: 2f 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67  /.  int bestFlag
c030: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
c040: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
c050: 74 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78  ted with bestIdx
c060: 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45   */.  int bestNE
c070: 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
c080: 20 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20    /* Best value 
c090: 66 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74  for nEq */.  int
c0a0: 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43   iCur = pSrc->iC
c0b0: 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  ursor;   /* The 
c0c0: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
c0d0: 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73  ble to be access
c0e0: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
c0f0: 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
c100: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
c110: 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
c120: 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20  g */.  int rev; 
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63     /* True to sc
c150: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
c160: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  der */.  int fla
c170: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
c180: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
c190: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
c1a0: 72 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  robe */.  int nE
c1b0: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
c1c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c1d0: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
c1e0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  traints */.  int
c1f0: 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20   eqTermMask;    
c200: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
c210: 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
c220: 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
c230: 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20    double cost;  
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c250: 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70   Cost of using p
c260: 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 57 48 45 52  Probe */..  WHER
c270: 45 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64  ETRACE(("bestInd
c280: 65 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65  ex: tbl=%s notRe
c290: 61 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d  ady=%x\n", pSrc-
c2a0: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f  >pTab->zName, no
c2b0: 74 52 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65  tReady));.  lowe
c2c0: 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  stCost = SQLITE_
c2d0: 42 49 47 5f 44 42 4c 3b 0a 20 20 70 50 72 6f 62  BIG_DBL;.  pProb
c2e0: 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  e = pSrc->pTab->
c2f0: 70 49 6e 64 65 78 3b 0a 0a 20 20 2f 2a 20 49 66  pIndex;..  /* If
c300: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e   the table has n
c310: 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  o indices and th
c320: 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d 73  ere are no terms
c330: 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20 20   in the where.  
c340: 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  ** clause that r
c350: 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57 49  efer to the ROWI
c360: 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  D, then we will 
c370: 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20 74 6f  never be able to
c380: 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e   do.  ** anythin
c390: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 66  g other than a f
c3a0: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 6f  ull table scan o
c3b0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 57  n this table.  W
c3c0: 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a 20  e might as.  ** 
c3d0: 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72 73  well put it firs
c3e0: 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72  t in the join or
c3f0: 64 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c 20  der.  That way, 
c400: 70 65 72 68 61 70 73 20 69 74 20 63 61 6e 20 62  perhaps it can b
c410: 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65  e.  ** reference
c420: 64 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c 65  d by other table
c430: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  s in the join.. 
c440: 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 6f 62 65   */.  if( pProbe
c450: 3d 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64  ==0 &&.     find
c460: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
c470: 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
c480: 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  IN|WO_LT|WO_LE|W
c490: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30  O_GT|WO_GE,0)==0
c4a0: 20 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72   &&.     (pOrder
c4b0: 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62  By==0 || !sortab
c4c0: 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20  leByRowid(iCur, 
c4d0: 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70  pOrderBy, pWC->p
c4e0: 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 29 20  MaskSet, &rev)) 
c4f0: 29 7b 0a 20 20 20 20 2a 70 46 6c 61 67 73 20 3d  ){.    *pFlags =
c500: 20 30 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78   0;.    *ppIndex
c510: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71 20   = 0;.    *pnEq 
c520: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
c530: 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  0.0;.  }..  /* C
c540: 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64  heck for a rowid
c550: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
c560: 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69  N (...) constrai
c570: 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  nts.  */.  pTerm
c580: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
c590: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
c5a0: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
c5b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
c5c0: 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  m ){.    Expr *p
c5d0: 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64  Expr;.    *ppInd
c5e0: 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74  ex = 0;.    best
c5f0: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  Flags = WHERE_RO
c600: 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20  WID_EQ;.    if( 
c610: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
c620: 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20   & WO_EQ ){.    
c630: 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20    /* Rowid== is 
c640: 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20  always the best 
c650: 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66  pick.  Look no f
c660: 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65  urther.  Because
c670: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61   only.      ** a
c680: 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67   single row is g
c690: 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74  enerated, output
c6a0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f   is always in so
c6b0: 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
c6c0: 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48      *pFlags = WH
c6d0: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57  ERE_ROWID_EQ | W
c6e0: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
c6f0: 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20     *pnEq = 1;.  
c700: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
c710: 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77  "... best is row
c720: 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  id\n"));.      r
c730: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d  eturn 0.0;.    }
c740: 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20  else if( (pExpr 
c750: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d  = pTerm->pExpr)-
c760: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
c770: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
c780: 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e  LIST): cost is N
c790: 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20  logN where N is 
c7a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
c7b0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  st.      ** elem
c7c0: 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
c7d0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78  lowestCost = pEx
c7e0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
c7f0: 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  ;.      lowestCo
c800: 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77  st *= estLog(low
c810: 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65  estCost);.    }e
c820: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  lse{.      /* Ro
c830: 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a  wid IN (SELECT):
c840: 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
c850: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
c860: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
c870: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
c880: 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ult of the inner
c890: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76   select.  We hav
c8a0: 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69  e no way to esti
c8b0: 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  mate.      ** th
c8c0: 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65  at value so make
c8d0: 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a   a wild guess. *
c8e0: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
c8f0: 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a  st = 200;.    }.
c900: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
c910: 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f  "... rowid IN co
c920: 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77  st: %.9g\n", low
c930: 65 73 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a  estCost));.  }..
c940: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
c950: 65 20 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c  e cost of a tabl
c960: 65 20 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64  e scan.  If we d
c970: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d  o not know how m
c980: 61 6e 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73  any.  ** entries
c990: 20 61 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c   are in the tabl
c9a0: 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e  e, use 1 million
c9b0: 20 61 73 20 61 20 67 75 65 73 73 2e 0a 20 20 2a   as a guess..  *
c9c0: 2f 0a 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62  /.  cost = pProb
c9d0: 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e ? pProbe->aiRo
c9e0: 77 45 73 74 5b 30 5d 20 3a 20 31 30 30 30 30 30  wEst[0] : 100000
c9f0: 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
ca00: 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e  ("... table scan
ca10: 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67   base cost: %.9g
ca20: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66  \n", cost));.  f
ca30: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57  lags = WHERE_ROW
ca40: 49 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20  ID_RANGE;..  /* 
ca50: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72  Check for constr
ca60: 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65  aints on a range
ca70: 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20   of rowids in a 
ca80: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f  table scan..  */
ca90: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
caa0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
cab0: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
cac0: 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
cad0: 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_GE, 0);.  if( 
cae0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
caf0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
cb00: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
cb10: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
cb20: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  0) ){.      flag
cb30: 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
cb40: 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74  IMIT;.      cost
cb50: 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
cb60: 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52   that rowid<EXPR
cb70: 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
cb80: 74 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a  thirds or rows *
cb90: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
cba0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
cbb0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
cbc0: 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
cbd0: 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  ) ){.      flags
cbe0: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
cbf0: 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  MIT;.      cost 
cc00: 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20  /= 3;  /* Guess 
cc10: 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20  that rowid>EXPR 
cc20: 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74  eliminates two-t
cc30: 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f  hirds of rows */
cc40: 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
cc50: 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69  TRACE(("... rowi
cc60: 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  d range reduces 
cc70: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
cc80: 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65   cost));.  }else
cc90: 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b  {.    flags = 0;
cca0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
ccb0: 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65  e table scan doe
ccc0: 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68  s not satisfy th
ccd0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
cce0: 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a  e, increase.  **
ccf0: 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f   the cost by Nlo
cd00: 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  gN to cover the 
cd10: 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69  expense of sorti
cd20: 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ng. */.  if( pOr
cd30: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
cd40: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
cd50: 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c  (iCur, pOrderBy,
cd60: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20   pWC->pMaskSet, 
cd70: 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20 66  &rev) ){.      f
cd80: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
cd90: 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49  DERBY|WHERE_ROWI
cda0: 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 69  D_RANGE;.      i
cdb0: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
cdc0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
cdd0: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
cde0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
cdf0: 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
ce00: 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
ce10: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
ce20: 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63  "... sorting inc
ce30: 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25  reases cost to %
ce40: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
ce50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ce60: 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20  cost<lowestCost 
ce70: 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  ){.    lowestCos
ce80: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62 65  t = cost;.    be
ce90: 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  stFlags = flags;
cea0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
ceb0: 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73 20  e pSrc table is 
cec0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
ced0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
cee0: 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20  hen we may not. 
cef0: 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78   ** use an index
cf00: 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e   to satisfy IS N
cf10: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
cf20: 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20  on that table.  
cf30: 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63  This is.  ** bec
cf40: 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67  ause columns mig
cf50: 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
cf60: 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c  NULL if the tabl
cf70: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
cf80: 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d   -.  ** a circum
cf90: 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68 65  stance which the
cfa0: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65   index cannot he
cfb0: 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20  lp us discover. 
cfc0: 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20   Ticket #2177.. 
cfd0: 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 72 63 2d   */.  if( (pSrc-
cfe0: 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
cff0: 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 65  EFT)!=0 ){.    e
d000: 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
d010: 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  Q|WO_IN;.  }else
d020: 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  {.    eqTermMask
d030: 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57   = WO_EQ|WO_IN|W
d040: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20  O_ISNULL;.  }.. 
d050: 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68   /* Look at each
d060: 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66   index..  */.  f
d070: 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72  or(; pProbe; pPr
d080: 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
d090: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20  t){.    int i;  
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d0c0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62  nter */.    doub
d0d0: 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20  le inMultiplier 
d0e0: 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45 54  = 1;..    WHERET
d0f0: 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78  RACE(("... index
d100: 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d   %s:\n", pProbe-
d110: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
d120: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
d130: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d140: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
d150: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20 20  are satisfied.  
d160: 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63    ** by x=EXPR c
d170: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20  onstraints or x 
d180: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
d190: 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
d1a0: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
d1b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62  for(i=0; i<pProb
d1c0: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  e->nColumn; i++)
d1d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
d1e0: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
d1f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  [i];.      pTerm
d200: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
d210: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
d220: 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
d230: 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69  pProbe);.      i
d240: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
d250: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  eak;.      flags
d260: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
d270: 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _EQ;.      if( p
d280: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
d290: 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
d2a0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
d2b0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
d2c0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
d2d0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
d2e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
d2f0: 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  pr->pSelect!=0 )
d300: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75  {.          inMu
d310: 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a  ltiplier *= 25;.
d320: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d330: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d  ( pExpr->pList!=
d340: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
d350: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70  nMultiplier *= p
d360: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
d370: 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  pr + 1;.        
d380: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
d390: 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62      cost = pProb
d3a0: 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a  e->aiRowEst[i] *
d3b0: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20   inMultiplier * 
d3c0: 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c  estLog(inMultipl
d3d0: 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20  ier);.    nEq = 
d3e0: 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  i;.    if( pProb
d3f0: 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
d400: 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26 20  one && (flags & 
d410: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
d420: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
d430: 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
d440: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c  lumn ){.      fl
d450: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
d460: 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  QUE;.    }.    W
d470: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
d480: 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74  .. nEq=%d inMult
d490: 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c  =%.9g cost=%.9g\
d4a0: 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69  n", nEq, inMulti
d4b0: 70 6c 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a  plier, cost));..
d4c0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20      /* Look for 
d4d0: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
d4e0: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  s.    */.    if(
d4f0: 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f   nEq<pProbe->nCo
d500: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  lumn ){.      in
d510: 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
d520: 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20  Column[nEq];.   
d530: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
d540: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
d550: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
d560: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
d570: 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  _GE, pProbe);.  
d580: 20 20 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b      if( pTerm ){
d590: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
d5a0: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
d5b0: 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66  ANGE;.        if
d5c0: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
d5d0: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
d5e0: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
d5f0: 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
d600: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
d610: 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
d620: 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d           cost /=
d630: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
d640: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
d650: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
d660: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
d670: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20  |WO_GE, pProbe) 
d680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
d690: 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
d6a0: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
d6b0: 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20   cost /= 3;.    
d6c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48      }.        WH
d6d0: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
d6e0: 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20  . range reduces 
d6f0: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
d700: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
d710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
d720: 64 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61  dd the additiona
d730: 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  l cost of sortin
d740: 67 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66  g if that is a f
d750: 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  actor..    */.  
d760: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
d770: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61  {.      if( (fla
d780: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
d790: 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20  N_IN)==0 &&.    
d7a0: 20 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67         isSorting
d7b0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57 43  Index(pParse,pWC
d7c0: 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62  ->pMaskSet,pProb
d7d0: 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c  e,iCur,pOrderBy,
d7e0: 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20  nEq,&rev) ){.   
d7f0: 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d       if( flags==
d800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
d810: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
d820: 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  UMN_RANGE;.     
d830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6c 61     }.        fla
d840: 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
d850: 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RBY;.        if(
d860: 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
d870: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
d880: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
d890: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
d8a0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  .        cost +=
d8b0: 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73   cost*estLog(cos
d8c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  t);.        WHER
d8d0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
d8e0: 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61 73 65  orderby increase
d8f0: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
d900: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
d910: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
d920: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
d930: 20 77 65 20 63 61 6e 20 67 65 74 20 61 77 61 79   we can get away
d940: 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74   with using just
d950: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f   the index witho
d960: 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72  ut.    ** ever r
d970: 65 61 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eading the table
d980: 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
d990: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c  e case, then hal
d9a0: 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  ve the.    ** co
d9b0: 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  st of this index
d9c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d9d0: 20 66 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e   flags && pSrc->
d9e0: 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74  colUsed < (((Bit
d9f0: 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
da00: 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  ) ){.      Bitma
da10: 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  sk m = pSrc->col
da20: 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  Used;.      int 
da30: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
da40: 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  ; j<pProbe->nCol
da50: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
da60: 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62     int x = pProb
da70: 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  e->aiColumn[j];.
da80: 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d          if( x<BM
da90: 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  S-1 ){.         
daa0: 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73   m &= ~(((Bitmas
dab0: 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20  k)1)<<x);.      
dac0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
dad0: 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20    if( m==0 ){.  
dae0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
daf0: 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
db00: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32         cost /= 2
db10: 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
db20: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64  RACE(("...... id
db30: 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63  x-only reduces c
db40: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
db50: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
db60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
db70: 20 74 68 69 73 20 69 6e 64 65 78 20 68 61 73 20   this index has 
db80: 61 63 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77  achieved the low
db90: 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c  est cost so far,
dba0: 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20   then use it..  
dbb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73    */.    if( cos
dbc0: 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29  t < lowestCost )
dbd0: 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78 20  {.      bestIdx 
dbe0: 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20  = pProbe;.      
dbf0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
dc00: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
dc10: 20 66 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20   flags!=0 );.   
dc20: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
dc30: 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74  lags;.      best
dc40: 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d  NEq = nEq;.    }
dc50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
dc60: 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  t the best resul
dc70: 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65  t.  */.  *ppInde
dc80: 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 57  x = bestIdx;.  W
dc90: 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74  HERETRACE(("best
dca0: 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63 6f   index is %s, co
dcb0: 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25  st=%.9g, flags=%
dcc0: 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20  x, nEq=%d\n",.  
dcd0: 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3f 20        bestIdx ? 
dce0: 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a  bestIdx->zName :
dcf0: 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73   "(none)", lowes
dd00: 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61 67 73  tCost, bestFlags
dd10: 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a  , bestNEq));.  *
dd20: 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61  pFlags = bestFla
dd30: 67 73 20 7c 20 65 71 54 65 72 6d 4d 61 73 6b 3b  gs | eqTermMask;
dd40: 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e  .  *pnEq = bestN
dd50: 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77  Eq;.  return low
dd60: 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  estCost;.}.../*.
dd70: 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
dd80: 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
dd90: 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
dda0: 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
ddb0: 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
ddc0: 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
ddd0: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
dde0: 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
ddf0: 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
de00: 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
de10: 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
de20: 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
de30: 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
de40: 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
de50: 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
de60: 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
de70: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
de80: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
de90: 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
dea0: 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
deb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
dec0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
ded0: 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
dee0: 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
def0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
df00: 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
df10: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
df20: 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
df30: 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
df40: 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
df50: 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
df60: 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
df70: 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
df80: 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
df90: 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
dfa0: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
dfb0: 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
dfc0: 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
dfd0: 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
dfe0: 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
dff0: 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
e000: 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
e010: 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
e020: 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
e030: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
e040: 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
e050: 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
e060: 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
e070: 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
e080: 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
e090: 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
e0a0: 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
e0b0: 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
e0c0: 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
e0d0: 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
e0e0: 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
e0f0: 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
e100: 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
e110: 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
e120: 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
e130: 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
e140: 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
e150: 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
e160: 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
e170: 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
e180: 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
e190: 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
e1a0: 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
e1b0: 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
e1c0: 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
e1d0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
e1e0: 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
e1f0: 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
e200: 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
e210: 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
e220: 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  && (pTerm->flags
e230: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
e240: 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  0.      && (pLev
e250: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
e260: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
e270: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
e280: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
e290: 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
e2a0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
e2b0: 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
e2c0: 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
e2d0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
e2e0: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
e2f0: 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
e300: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
e310: 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
e320: 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
e330: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
e340: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
e350: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e360: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
e370: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
e380: 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65  t builds a probe
e390: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
e3a0: 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c  *.** There shoul
e3b0: 64 20 62 65 20 6e 43 6f 6c 75 6d 6e 20 76 61 6c  d be nColumn val
e3c0: 75 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  ues on the stack
e3d0: 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 2a 2a 20  .  The index.** 
e3e0: 74 6f 20 62 65 20 70 72 6f 62 65 64 20 69 73 20  to be probed is 
e3f0: 70 49 64 78 2e 20 20 50 6f 70 20 74 68 65 20 76  pIdx.  Pop the v
e400: 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73  alues from the s
e410: 74 61 63 6b 20 61 6e 64 0a 2a 2a 20 72 65 70 6c  tack and.** repl
e420: 61 63 65 20 74 68 65 6d 20 61 6c 6c 20 77 69 74  ace them all wit
e430: 68 20 61 20 73 69 6e 67 6c 65 20 72 65 63 6f 72  h a single recor
e440: 64 20 74 68 61 74 20 69 73 20 74 68 65 20 69 6e  d that is the in
e450: 64 65 78 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2e 0a  dex.** problem..
e460: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
e470: 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 0a  uildIndexProbe(.
e480: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
e490: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e4a0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
e4b0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
e4c0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62  ,    /* The numb
e4d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  er of columns to
e4e0: 20 63 68 65 63 6b 20 66 6f 72 20 4e 55 4c 4c 20   check for NULL 
e4f0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
e500: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68       /* Index th
e510: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 73 65  at we will be se
e520: 61 72 63 68 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  arching */.){.  
e530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e540: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
e550: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
e560: 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66    sqlite3IndexAf
e570: 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64  finityStr(v, pId
e580: 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  x);.}.../*.** Ge
e590: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
e5a0: 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74  a single equalit
e5b0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
e5c0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
e5d0: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
e5e0: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
e5f0: 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e  =expr or X IN (.
e600: 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20  ..).   pTerm is 
e610: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a  the term to be .
e620: 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  ** coded..**.** 
e630: 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  The current valu
e640: 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72  e for the constr
e650: 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  aint is left on 
e660: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
e670: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
e680: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
e690: 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
e6a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e6b0: 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
e6c0: 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
e6d0: 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
e6e0: 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
e6f0: 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
e700: 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
e710: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
e720: 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
e730: 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
e740: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
e750: 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   X..*/.static vo
e760: 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  id codeEqualityT
e770: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
e780: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
e790: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
e7a0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
e7b0: 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
e7c0: 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
e7d0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
e7e0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
e7f0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
e800: 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
e810: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e820: 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
e830: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
e840: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
e850: 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  pr;.  Vdbe *v = 
e860: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
e870: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
e880: 45 51 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EQ ){.    sqlite
e890: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e8a0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
e8b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
e8c0: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e8e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
e8f0: 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
e900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
e910: 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UERY.  }else{.  
e920: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20    int iTab;.    
e930: 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
e940: 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  In;..    assert(
e950: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
e960: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
e970: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
e980: 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62  e, pX);.    iTab
e990: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
e9a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e9b0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
e9c0: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
e9d0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e9e0: 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70  "# %.*s", pX->sp
e9f0: 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a  an.n, pX->span.z
ea00: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ));.    if( pLev
ea10: 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  el->nIn==0 ){.  
ea20: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20      pLevel->nxt 
ea30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ea40: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
ea50: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  .    pLevel->nIn
ea60: 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
ea70: 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  aInLoop = sqlite
ea80: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 4c  ReallocOrFree(pL
ea90: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20  evel->aInLoop,. 
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
ead0: 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  ->aInLoop[0])*pL
eae0: 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20  evel->nIn);.    
eaf0: 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49  pIn = pLevel->aI
eb00: 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
eb10: 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
eb20: 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d  += pLevel->nIn -
eb30: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
eb40: 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
eb50: 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20 3d    pIn->topAddr =
eb60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb70: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
eb80: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  iTab, 0);.      
eb90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eba0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d  (v, OP_IsNull, -
ebb0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  1, 0);.    }else
ebc0: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
ebd0: 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
ebe0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
ebf0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
ec00: 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pTerm);.}../*.**
ec10: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ec20: 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
ec30: 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
ec40: 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
ec50: 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68  an.** index.  Th
ec60: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
ec70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
ec80: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
ec90: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ck..**.** For ex
eca0: 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
ecb0: 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
ecc0: 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
ecd0: 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
ece0: 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
ecf0: 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
ed00: 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
ed10: 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
ed20: 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
ed30: 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
ed40: 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
ed50: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
ed60: 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
ed70: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
ed80: 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
ed90: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
eda0: 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
edb0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
edc0: 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
edd0: 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
ede0: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
edf0: 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
ee00: 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
ee10: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
ee20: 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
ee30: 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e  ll be left.** on
ee40: 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69   the stack - a i
ee50: 73 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e  s the deepest an
ee60: 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65  d b the shallowe
ee70: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  st..**.** In the
ee80: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
ee90: 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
eea0: 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
eeb0: 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
eec0: 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
eed0: 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
eee0: 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
eef0: 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
ef00: 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
ef10: 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
ef20: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
ef30: 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
ef40: 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   cell..**.** Thi
ef50: 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73  s routine always
ef60: 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65   allocates at le
ef70: 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63  ast one memory c
ef80: 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20  ell and puts.** 
ef90: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
efa0: 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
efb0: 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e  in pLevel->iMem.
efc0: 20 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a    The code that.
efd0: 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
efe0: 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70  utine will use p
eff0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73  Level->iMem to s
f000: 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
f010: 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
f020: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
f030: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
f040: 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
f050: 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
f060: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
f070: 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
f080: 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
f090: 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
f0a0: 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  * use..*/.static
f0b0: 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75   void codeAllEqu
f0c0: 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
f0d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f0e0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f0f0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
f100: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
f110: 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
f120: 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
f130: 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
f140: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
f150: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
f160: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
f170: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
f180: 52 65 61 64 79 20 20 20 20 20 20 2f 2a 20 57 68  Ready      /* Wh
f190: 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
f1a0: 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
f1b0: 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a  een coded */.){.
f1c0: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
f1d0: 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20  el->nEq;        
f1e0: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
f1f0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
f200: 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
f210: 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65  .  int termsInMe
f220: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
f230: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f   /* If true, sto
f240: 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b  re value in mem[
f250: 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62  ] cells */.  Vdb
f260: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f270: 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
f280: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
f290: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
f2a0: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
f2b0: 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
f2c0: 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  pIdx;   /* The i
f2d0: 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
f2e0: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
f2f0: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
f300: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
f310: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
f320: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
f330: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f340: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
f350: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
f360: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
f370: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f390: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f3a0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
f3b0: 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
f3c0: 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
f3d0: 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
f3e0: 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65  te them..  ** We
f3f0: 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20   always need at 
f400: 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74  least one used t
f410: 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70  o store the loop
f420: 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a   terminator.  **
f430: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72   value.  If ther
f440: 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f  e are IN operato
f450: 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e  rs we'll need on
f460: 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72  e for each == or
f470: 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61  .  ** IN constra
f480: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76  int..  */.  pLev
f490: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
f4a0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28  e->nMem++;.  if(
f4b0: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
f4c0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
f4d0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
f4e0: 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e  nMem += pLevel->
f4f0: 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e  nEq;.    termsIn
f500: 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  Mem = 1;.  }..  
f510: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
f520: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
f530: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
f540: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
f550: 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  n>=nEq );.  for(
f560: 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
f570: 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  {.    int k = pI
f580: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
f590: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
f5a0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
f5b0: 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
f5c0: 65 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64  evel->flags, pId
f5d0: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  x);.    if( pTer
f5e0: 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
f5f0: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
f600: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
f610: 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
f620: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
f630: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
f640: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28  pLevel);.    if(
f650: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
f660: 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
f670: 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
f680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f690: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  ddOp(v, OP_IsNul
f6a0: 6c 2c 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3f 20  l, termsInMem ? 
f6b0: 2d 31 20 3a 20 2d 28 6a 2b 31 29 2c 20 70 4c 65  -1 : -(j+1), pLe
f6c0: 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d  vel->brk);.    }
f6d0: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73 49 6e  .    if( termsIn
f6e0: 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Mem ){.      sql
f6f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f700: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
f710: 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20  evel->iMem+j+1, 
f720: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
f730: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
f740: 6c 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  l the constraint
f750: 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74   values are on t
f760: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
f770: 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74  ack.  */.  if( t
f780: 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20  ermsInMem ){.   
f790: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
f7a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
f7b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f7c0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65   OP_MemLoad, pLe
f7d0: 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30  vel->iMem+j+1, 0
f7e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
f7f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
f800: 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  TE_TEST)./*.** T
f810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
f820: 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65  iable holds a te
f830: 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  xt description o
f840: 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e  f query plan gen
f850: 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  erated.** by the
f860: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
f870: 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
f880: 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20  eBegin().  Each 
f890: 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67  call to WhereBeg
f8a0: 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  in.** overwrites
f8b0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20   the previous.  
f8c0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
f8d0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
f8e0: 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ting and.** anal
f8f0: 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68  ysis only..*/.ch
f900: 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
f910: 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b  _plan[BMS*2*40];
f920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
f930: 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20   join */.static 
f940: 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20  int nQPlan = 0; 
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f960: 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69  Next free slow i
f970: 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20  n _query_plan[] 
f980: 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
f990: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  LITE_TEST */.../
f9a0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
f9b0: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
f9c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f9d0: 68 65 72 65 49 6e 66 6f 46 72 65 65 28 57 68 65  hereInfoFree(Whe
f9e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
f9f0: 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
fa00: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fa10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66  for(i=0; i<pWInf
fa20: 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  o->nLevel; i++){
fa30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
fa40: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  ndex_info *pInfo
fa50: 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
fa60: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
fa70: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
fa80: 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
fa90: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
faa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
fab0: 20 43 6f 76 65 72 61 67 65 3a 20 44 6f 6e 27 74   Coverage: Don't
fac0: 20 74 68 69 6e 6b 20 74 68 69 73 20 63 61 6e 20   think this can 
fad0: 62 65 20 72 65 61 63 68 65 64 2e 20 42 79 20 74  be reached. By t
fae0: 68 65 20 74 69 6d 65 20 74 68 69 73 0a 20 20 20  he time this.   
faf0: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
fb00: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
fb10: 65 20 69 6e 64 65 78 2d 73 74 72 69 6e 67 73 20  e index-strings 
fb20: 68 61 76 65 20 62 65 65 6e 20 70 61 73 73 65 64  have been passed
fb30: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
fb40: 20 74 68 65 20 76 64 62 65 20 6c 61 79 65 72 20   the vdbe layer 
fb50: 66 6f 72 20 64 65 6c 65 74 69 6f 6e 2e 0a 20 20  for deletion..  
fb60: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
fb70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
fb80: 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  e(pInfo->idxStr)
fb90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fba0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
fbb0: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
fbc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
fbd0: 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  ree(pWInfo);.  }
fbe0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
fbf0: 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
fc00: 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
fc10: 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
fc20: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
fc30: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
fc40: 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
fc50: 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
fc60: 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
fc70: 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
fc80: 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
fc90: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
fca0: 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
fcb0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
fcc0: 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
fcd0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
fce0: 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
fcf0: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
fd00: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
fd10: 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
fd20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
fd30: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
fd40: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
fd50: 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
fd60: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
fd70: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
fd80: 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
fd90: 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
fda0: 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
fdb0: 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
fdc0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
fdd0: 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
fde0: 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
fdf0: 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
fe00: 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
fe10: 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
fe20: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
fe30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
fe40: 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
fe50: 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
fe60: 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
fe70: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
fe80: 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
fe90: 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
fea0: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
feb0: 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
fec0: 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
fed0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
fee0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
fef0: 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
ff00: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
ff10: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
ff20: 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
ff30: 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
ff40: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
ff50: 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
ff60: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
ff70: 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
ff80: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
ff90: 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
ffc0: 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
ffd0: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
ffe0: 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
fff0: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
10000 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
10030 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
10040 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
10050 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
10060 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
10070 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
10080 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10090 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
100a0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
100b0 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
100c0 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
100d0 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
100e0 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
100f0 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
10100 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
10110 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
10120 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
10130 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
10140 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
10150 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
10160 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
10170 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
10180 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
10190 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
101a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
101b0 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
101c0 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
101d0 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
101e0 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
101f0 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
10200 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
10210 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
10220 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
10230 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
10240 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
10250 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
10260 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
10270 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
10280 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
10290 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
102a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
102b0 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
102c0 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
102d0 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
102e0 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
102f0 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
10300 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
10310 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
10320 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
10330 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
10340 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
10350 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
10360 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
10370 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
10380 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
10390 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
103a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
103b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
103c0 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
103d0 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
103e0 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
103f0 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
10400 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
10410 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
10420 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
10430 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
10440 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
10450 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
10460 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
10470 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
10480 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
10490 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
104a0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
104b0 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
104c0 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
104d0 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
104e0 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
104f0 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
10500 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
10510 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
10520 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
10530 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
10540 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
10550 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
10560 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
10570 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
10580 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
10590 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
105a0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
105b0 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
105c0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
105d0 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
105e0 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
105f0 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
10600 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
10610 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
10620 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
10630 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
10640 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
10650 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
10660 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
10670 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
10680 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
10690 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
106a0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
106b0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
106c0 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
106d0 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
106e0 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
106f0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
10700 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
10710 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
10720 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
10730 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
10740 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
10750 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
10760 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
10770 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
10780 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
10790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
107a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
107b0 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
107c0 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
107d0 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
107e0 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
107f0 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
10800 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
10810 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
10820 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
10830 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
10840 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
10850 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
10860 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
10870 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
10880 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
10890 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
108a0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
108b0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
108c0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
108d0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
108e0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
108f0 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
10900 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
10910 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
10920 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
10930 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
10940 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
10950 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
10960 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
10970 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
10980 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
10990 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
109a0 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
109b0 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
109c0 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
109d0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
109e0 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
109f0 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
10a00 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
10a10 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
10a20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
10a30 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
10a40 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
10a50 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
10a60 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
10a70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
10a80 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
10a90 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
10aa0 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
10ab0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
10ac0 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
10ad0 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
10ae0 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
10af0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
10b00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10b10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10b20 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
10b30 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
10b40 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
10b50 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
10b60 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
10b70 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
10b80 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
10b90 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
10ba0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
10bb0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
10bc0 70 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20  pOrderBy  /* An 
10bd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
10be0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
10bf0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10c10 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10c20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
10c30 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57  fo;         /* W
10c40 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
10c50 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
10c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
10c70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10c80 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20  se->pVdbe;   /* 
10c90 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61  The virtual data
10ca0 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20  base engine */. 
10cb0 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d   int brk, cont =
10cc0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   0;         /* A
10cd0 64 64 72 65 73 73 65 73 20 75 73 65 64 20 64 75  ddresses used du
10ce0 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61  ring code genera
10cf0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
10d00 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
10d10 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
10d20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
10d30 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
10d40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
10d50 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  m;          /* A
10d60 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   single term in 
10d70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10d80 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
10d90 74 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20  t maskSet;      
10da0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
10db0 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
10dc0 20 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b   WhereClause wc;
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10de0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10df0 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
10e00 74 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20  these terms */. 
10e10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
10e20 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
10e30 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74   /* A single ent
10e40 72 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74  ry from pTabList
10e50 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
10e60 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
10e70 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
10e80 65 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70  e level in the p
10e90 57 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20  WInfo list */.  
10ea0 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
10ed0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
10ee0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64  ent */.  int and
10ef0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
10f00 20 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f      /* AND-ed co
10f10 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mbination of all
10f20 20 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f   wc.a[].flags */
10f30 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
10f40 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
10f50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
10f60 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
10f70 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
10f80 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
10f90 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  k .  */.  if( pT
10fa0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
10fb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10fc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10fd0 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
10fe0 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
10ff0 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
11000 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c  0;.  }..  /* Spl
11010 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  it the WHERE cla
11020 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74  use into separat
11030 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
11040 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a   where each.  **
11050 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
11060 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61  s separated by a
11070 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
11080 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53    */.  initMaskS
11090 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20  et(&maskSet);.  
110a0 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
110b0 26 77 63 2c 20 70 50 61 72 73 65 2c 20 26 6d 61  &wc, pParse, &ma
110c0 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53  skSet);.  whereS
110d0 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65  plit(&wc, pWhere
110e0 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a  , TK_AND);.    .
110f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
11100 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
11110 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
11120 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
11130 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
11140 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a  eturn value..  *
11150 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
11160 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
11170 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70  f(WhereInfo) + p
11180 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69  TabList->nSrc*si
11190 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
111a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
111b0 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
111c0 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65  {.    goto where
111d0 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a  BeginNoMem;.  }.
111e0 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c    pWInfo->nLevel
111f0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   = pTabList->nSr
11200 63 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  c;.  pWInfo->pPa
11210 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
11220 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
11230 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70   = pTabList;.  p
11240 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20  WInfo->iBreak = 
11250 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11260 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
11270 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
11280 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
11290 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
112a0 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
112b0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
112c0 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
112d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
112e0 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
112f0 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
11300 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
11310 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Src==0 || sqlite
11320 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
11330 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
11340 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11350 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
11360 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
11370 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68 65 72  k, 1);.    pWher
11380 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11390 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
113a0 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
113b0 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
113c0 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
113d0 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
113e0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
113f0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11400 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
11410 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
11420 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
11430 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
11440 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
11450 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
11460 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
11470 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
11480 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
11490 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
114a0 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
114b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
114c0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
114d0 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
114e0 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
114f0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
11500 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78  ursor);.  }.  ex
11510 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
11520 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20 20 69  bList, &wc);.  i
11530 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
11540 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
11550 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e  goto whereBeginN
11560 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oMem;.  }..  /* 
11570 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69  Chose the best i
11580 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
11590 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68  each table in th
115a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
115b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
115c0 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20  op fills in the 
115d0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
115e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57  :.  **.  **   pW
115f0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20  Info->a[].pIdx  
11600 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f      The index to
11610 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65   use for this le
11620 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  vel of the loop.
11630 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
11640 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48  a[].flags     WH
11650 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73  ERE_xxx flags as
11660 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
11670 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  dx.  **   pWInfo
11680 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20  ->a[].nEq       
11690 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
116a0 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
116b0 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  nts.  **   pWInf
116c0 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20  o->a[].iFrom    
116d0 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68   When term of th
116e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
116f0 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a   being coded.  *
11700 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
11710 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44  iTabCur   The VD
11720 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
11730 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
11740 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
11750 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68  a[].iIdxCur   Th
11760 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
11770 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  r the index.  **
11780 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
11790 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
117a0 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
117b0 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
117c0 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
117d0 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
117e0 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
117f0 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
11800 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
11810 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
11820 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
11830 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
11840 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
11850 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
11860 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
11870 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
11880 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
11890 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
118a0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65  vel++){.    Inde
118b0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
118c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
118d0 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20   for FROM table 
118e0 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20  at pTabItem */. 
118f0 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20     int flags;   
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11910 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61  * Flags asssocia
11920 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
11930 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  .    int nEq;   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
11960 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
11970 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  ts */.    double
11980 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
11990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
119a0 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  t for pIdx */.  
119b0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119d0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
119e0 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f  r FROM tables */
119f0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73  .    Index *pBes
11a00 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
11a10 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64   /* The best ind
11a20 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  ex seen so far *
11a30 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c  /.    int bestFl
11a40 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ags = 0;        
11a50 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63    /* Flags assoc
11a60 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74  iated with pBest
11a70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74   */.    int best
11a80 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  NEq = 0;        
11a90 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63      /* nEq assoc
11aa0 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74  iated with pBest
11ab0 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c   */.    double l
11ac0 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20  owestCost;      
11ad0 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74      /* Cost of t
11ae0 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20  he pBest */.    
11af0 69 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20  int bestJ = 0;  
11b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11b10 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
11b20 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
11b50 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
11b60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65   */.    int once
11b70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11b80 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e      /* True when
11b90 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 73 20   first table is 
11ba0 73 65 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  seen */.    sqli
11bb0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
11bc0 70 49 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72 65  pIndex; /* Curre
11bd0 6e 74 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78  nt virtual index
11be0 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43   */..    lowestC
11bf0 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
11c00 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  _DBL;.    for(j=
11c10 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d  iFrom, pTabItem=
11c20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b  &pTabList->a[j];
11c30 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
11c40 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d  c; j++, pTabItem
11c50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ++){.      int d
11c60 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a  oNotReorder;  /*
11c70 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61   True if this ta
11c80 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ble should not b
11c90 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a  e reordered */..
11ca0 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64        doNotReord
11cb0 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d  er =  (pTabItem-
11cc0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  >jointype & (JT_
11cd0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
11ce0 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  =0;.      if( on
11cf0 63 65 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64  ce && doNotReord
11d00 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
11d10 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d    m = getMask(&m
11d20 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d  askSet, pTabItem
11d30 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
11d40 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65    if( (m & notRe
11d50 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
11d60 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20     if( j==iFrom 
11d70 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20  ) iFrom++;.     
11d80 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11d90 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
11da0 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  t( pTabItem->pTa
11db0 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
11dc0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11dd0 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20  TABLE.      if( 
11de0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 49 74  IsVirtual(pTabIt
11df0 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
11e00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
11e10 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49  ex_info **ppIdxI
11e20 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  nfo = &pWInfo->a
11e30 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [j].pIdxInfo;.  
11e40 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73        cost = bes
11e50 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50  tVirtualIndex(pP
11e60 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49  arse, &wc, pTabI
11e70 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20  tem, notReady,. 
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11ea0 70 4f 72 64 65 72 42 79 20 3f 20 2a 70 70 4f 72  pOrderBy ? *ppOr
11eb0 64 65 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c  derBy : 0, i==0,
11ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20   ppIdxInfo);.   
11ef0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45       flags = WHE
11f00 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
11f10 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
11f20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20  = *ppIdxInfo;.  
11f30 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
11f40 20 26 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65   && pIndex->orde
11f50 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20  rByConsumed ){. 
11f60 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
11f70 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
11f80 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45  BLE | WHERE_ORDE
11f90 52 42 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RBY;.        }. 
11fa0 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b         pIdx = 0;
11fb0 0a 20 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30  .        nEq = 0
11fc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 53  ;.        if( (S
11fd0 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e  QLITE_BIG_DBL/2.
11fe0 30 29 3c 63 6f 73 74 20 29 7b 0a 20 20 20 20 20  0)<cost ){.     
11ff0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
12000 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
12010 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  to be larger tha
12020 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c  n SQLITE_BIG_DBL
12030 20 28 74 68 65 0a 20 20 20 20 20 20 20 20 20 20   (the.          
12040 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20  ** inital value 
12050 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e  of lowestCost in
12060 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69   this loop. If i
12070 74 20 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20  t is, then.     
12080 20 20 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73       ** the (cos
12090 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65  t<lowestCost) te
120a0 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65  st below will ne
120b0 76 65 72 20 62 65 20 74 72 75 65 20 61 6e 64 0a  ver be true and.
120c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 4c 65            ** pLe
120d0 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 6e 65  vel->pBestIdx ne
120e0 76 65 72 20 73 65 74 2e 0a 20 20 20 20 20 20 20  ver set..       
120f0 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
12100 20 63 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f   cost = (SQLITE_
12110 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20  BIG_DBL/2.0);.  
12120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12130 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
12140 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74    {.        cost
12150 20 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50 61   = bestIndex(pPa
12160 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74  rse, &wc, pTabIt
12170 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20  em, notReady,.  
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20         (i==0 && 
121a0 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70  ppOrderBy) ? *pp
121b0 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20  OrderBy : 0,.   
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c        &pIdx, &fl
121e0 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20  ags, &nEq);.    
121f0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
12200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12210 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73  ( cost<lowestCos
12220 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63  t ){.        onc
12230 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c  e = 1;.        l
12240 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
12250 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20  ;.        pBest 
12260 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
12270 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  bestFlags = flag
12280 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e  s;.        bestN
12290 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  Eq = nEq;.      
122a0 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20    bestJ = j;.   
122b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65       pLevel->pBe
122c0 73 74 49 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a  stIdx = pIndex;.
122d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
122e0 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  ( doNotReorder )
122f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12300 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
12310 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f  ** Optimizer cho
12320 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72  ose table %d for
12330 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73   loop %d\n", bes
12340 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  tJ,.           p
12350 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29  Level-pWInfo->a)
12360 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74  );.    if( (best
12370 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
12380 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20  DERBY)!=0 ){.   
12390 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
123a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64  0;.    }.    and
123b0 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61  Flags &= bestFla
123c0 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
123d0 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67  flags = bestFlag
123e0 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  s;.    pLevel->p
123f0 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20  Idx = pBest;.   
12400 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62   pLevel->nEq = b
12410 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76  estNEq;.    pLev
12420 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b  el->aInLoop = 0;
12430 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  .    pLevel->nIn
12440 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42   = 0;.    if( pB
12450 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  est ){.      pLe
12460 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70  vel->iIdxCur = p
12470 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12490 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
124a0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
124b0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
124c0 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
124d0 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
124e0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
124f0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
12500 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45  bestJ;.  }.  WHE
12510 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
12520 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
12530 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a   ***\n"));..  /*
12540 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
12550 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
12560 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
12570 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
12580 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
12590 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
125a0 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
125b0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
125c0 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
125d0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
125e0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
125f0 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
12600 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
12610 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
12620 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
12630 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
12640 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
12650 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
12660 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
12670 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
12680 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
12690 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
126a0 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
126b0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
126c0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
126d0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
126e0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
126f0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70    /* Table to op
12700 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  en */.    Index 
12710 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e  *pIx;      /* In
12720 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65  dex used to acce
12730 73 73 20 70 54 61 62 20 28 69 66 20 61 6e 79 29  ss pTab (if any)
12740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
12750 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12760 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
12770 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
12780 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
12790 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
127a0 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e  ->iIdxCur;..#ifn
127b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
127c0 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20  EXPLAIN.    if( 
127d0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
127e0 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =2 ){.      char
127f0 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74   *zMsg;.      st
12800 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12810 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
12820 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
12830 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d  iFrom];.      zM
12840 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
12850 6e 74 66 28 22 54 41 42 4c 45 20 25 73 22 2c 20  ntf("TABLE %s", 
12860 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
12870 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
12880 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
12890 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
128a0 4d 50 72 69 6e 74 66 28 22 25 7a 20 41 53 20 25  MPrintf("%z AS %
128b0 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d  s", zMsg, pItem-
128c0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
128d0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 78  }.      if( (pIx
128e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29   = pLevel->pIdx)
128f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
12900 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
12910 69 6e 74 66 28 22 25 7a 20 57 49 54 48 20 49 4e  intf("%z WITH IN
12920 44 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  DEX %s", zMsg, p
12930 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Ix->zName);.    
12940 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
12950 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
12960 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
12970 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
12980 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
12990 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
129a0 22 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52  "%z USING PRIMAR
129b0 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20  Y KEY", zMsg);. 
129c0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
129d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
129e0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c  ALTABLE.      el
129f0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
12a00 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20  BestIdx ){.     
12a10 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
12a20 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20  _info *pBestIdx 
12a30 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  = pLevel->pBestI
12a40 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67  dx;.        zMsg
12a50 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
12a60 66 28 22 25 7a 20 56 49 52 54 55 41 4c 20 54 41  f("%z VIRTUAL TA
12a70 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22  BLE INDEX %d:%s"
12a80 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20  , zMsg,.        
12a90 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
12aa0 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42  tIdx->idxNum, pB
12ab0 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29 3b  estIdx->idxStr);
12ac0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
12ad0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
12ae0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
12af0 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20  ORDERBY ){.     
12b00 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
12b10 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 4f 52 44  3MPrintf("%z ORD
12b20 45 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20  ER BY", zMsg);. 
12b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12b40 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
12b50 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c  P_Explain, i, pL
12b60 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 7a 4d 73  evel->iFrom, zMs
12b70 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P3_DYNAMIC);.
12b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
12b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
12ba0 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49  AIN */.    pTabI
12bb0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
12bc0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
12bd0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
12be0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
12bf0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
12c00 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
12c10 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
12c20 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
12c30 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c   pTab->isEphem |
12c40 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
12c50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
12c60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12c70 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
12c80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65   if( pLevel->pBe
12c90 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69  stIdx ){.      i
12ca0 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
12cb0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
12cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
12cd0 33 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  3(v, OP_VOpen, i
12ce0 43 75 72 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63  Cur, 0, (const c
12cf0 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62  har*)pTab->pVtab
12d00 2c 20 50 33 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P3_VTAB);.    
12d10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
12d20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
12d30 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
12d40 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
12d50 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
12d60 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
12d70 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
12d80 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
12d90 52 65 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28  Read);.      if(
12da0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a   pTab->nCol<(siz
12db0 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 29 20  eof(Bitmask)*8) 
12dc0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
12dd0 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
12de0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
12df0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
12e00 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
12e10 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
12e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e30 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c 69  ChangeP2(v, sqli
12e40 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
12e50 64 72 28 76 29 2d 31 2c 20 6e 29 3b 0a 20 20 20  dr(v)-1, n);.   
12e60 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
12e70 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
12e80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
12e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
12ea0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
12eb0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
12ec0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
12ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
12ee0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
12ef0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
12f00 0a 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20  .    if( (pIx = 
12f10 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30  pLevel->pIdx)!=0
12f20 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
12f30 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
12f40 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
12f50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
12f60 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
12f70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
12f80 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
12f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12fa0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
12fb0 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64  Db, 0);.      Vd
12fc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
12fd0 20 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65   %s", pIx->zName
12fe0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
12ff0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
13000 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72  penRead, iIdxCur
13010 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20  , pIx->tnum,.   
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
13040 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
13050 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  F);.    }.    if
13060 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
13070 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e   & (WHERE_IDX_ON
13080 4c 59 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  LY|WHERE_COLUMN_
13090 52 41 4e 47 45 29 29 21 3d 30 20 29 7b 0a 20 20  RANGE))!=0 ){.  
130a0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 63 61 6c 6c      /* Only call
130b0 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
130c0 73 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69  s on the index i
130d0 66 20 77 65 20 6d 69 67 68 74 20 6c 61 74 65 72  f we might later
130e0 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 4f 50   use.      ** OP
130f0 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 69  _Column on the i
13100 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ndex. */.      s
13110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13120 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
13130 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c 20 70 49  mns, iIdxCur, pI
13140 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20  x->nColumn+1);. 
13150 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13160 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
13170 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13180 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
13190 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
131a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
131b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
131c0 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
131d0 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
131e0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
131f0 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
13200 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
13210 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
13220 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
13230 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
13240 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
13250 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
13260 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  0;.  for(i=0, pL
13270 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
13280 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
13290 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
132a0 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
132b0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
132c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20  Item->iCursor;  
132d0 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
132e0 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
132f0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13300 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Idx;       /* Th
13310 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
13320 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
13330 69 6e 74 20 6e 78 74 3b 20 20 20 20 20 20 20 20  int nxt;        
13340 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
13350 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
13360 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
13370 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74   case */.    int
13380 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
13390 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
133a0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
133b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74   */.    int omit
133c0 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72  Table;     /* Tr
133d0 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
133e0 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
133f0 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20     int bRev;    
13400 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
13410 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
13420 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
13430 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  r */..    pTabIt
13440 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
13450 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
13460 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61  ;.    iCur = pTa
13470 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
13480 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
13490 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  l->pIdx;.    iId
134a0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
134b0 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76  IdxCur;.    bRev
134c0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
134d0 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
134e0 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54  E)!=0;.    omitT
134f0 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
13500 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
13510 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20  X_ONLY)!=0;..   
13520 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
13530 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
13540 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
13550 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
13560 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
13570 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
13580 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b   to brk to break
13590 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
135a0 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63      ** Jump to c
135b0 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
135c0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
135d0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
135e0 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a  he.    ** loop..
135f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68      **.    ** Wh
13600 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
13610 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
13620 6c 73 6f 20 68 61 76 65 20 61 20 22 6e 78 74 22  lso have a "nxt"
13630 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 20 20   label that.    
13640 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
13650 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
13660 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
13670 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
13680 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20     ** there are 
13690 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
136a0 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
136b0 74 73 2c 20 74 68 65 20 22 6e 78 74 22 20 6c 61  ts, the "nxt" la
136c0 62 65 6c 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  bel.    ** is th
136d0 65 20 73 61 6d 65 20 61 73 20 22 62 72 6b 22 2e  e same as "brk".
136e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20  .    */.    brk 
136f0 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20  = pLevel->brk = 
13700 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20 73 71  pLevel->nxt = sq
13710 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13720 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20  el(v);.    cont 
13730 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
13740 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13750 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
13760 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
13770 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
13780 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
13790 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
137a0 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
137b0 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
137c0 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
137d0 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
137e0 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
137f0 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
13800 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
13810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13820 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
13830 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
13840 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
13850 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  FT)!=0 ){.      
13860 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65  if( !pParse->nMe
13870 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
13880 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ++;.      pLevel
13890 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50  ->iLeftJoin = pP
138a0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
138b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
138c0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
138d0 74 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  t, 0, pLevel->iL
138e0 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
138f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13900 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  "# init LEFT JOI
13910 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
13920 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ));.    }..#ifnd
13930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13940 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
13950 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
13960 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
13970 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61   Case 0:  The ta
13980 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
13990 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
139a0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
139b0 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  xt.      **     
139c0 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
139d0 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20 20 2a  he data..      *
139e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
139f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
13a00 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64  ex_info *pBestId
13a10 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  x = pLevel->pBes
13a20 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  tIdx;.      int 
13a30 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 42  nConstraint = pB
13a40 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61  estIdx->nConstra
13a50 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  int;.      struc
13a60 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
13a70 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
13a80 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
13ac0 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  stIdx->aConstrai
13ad0 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20 20 63  ntUsage;.      c
13ae0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
13af0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
13b00 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e  aint *aConstrain
13b10 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
13b50 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
13b60 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d      for(j=1; j<=
13b70 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
13b80 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  ){.        int k
13b90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
13ba0 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; k<nConstraint
13bb0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
13bc0 20 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e    if( aUsage[k].
13bd0 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a  argvIndex==j ){.
13be0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
13bf0 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61  iTerm = aConstra
13c00 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73  int[k].iTermOffs
13c10 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  et;.            
13c20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13c30 70 50 61 72 73 65 2c 20 77 63 2e 61 5b 69 54 65  pParse, wc.a[iTe
13c40 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm].pExpr->pRigh
13c50 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
13c60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
13c70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
13c80 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e       if( k==nCon
13c90 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b  straint ) break;
13ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13cc0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
13cd0 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  -1, 0);.      sq
13ce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13cf0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42  , OP_Integer, pB
13d00 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  estIdx->idxNum, 
13d10 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
13d20 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56  3VdbeOp3(v, OP_V
13d30 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 62 72  Filter, iCur, br
13d40 6b 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  k, pBestIdx->idx
13d50 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
13d60 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13d70 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
13d80 64 78 53 74 72 20 3f 20 50 33 5f 4d 50 52 49 4e  dxStr ? P3_MPRIN
13d90 54 46 20 3a 20 50 33 5f 53 54 41 54 49 43 29 3b  TF : P3_STATIC);
13da0 0a 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d  .      pBestIdx-
13db0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
13dc0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  r = 0;.      for
13dd0 28 6a 3d 30 3b 20 6a 3c 70 42 65 73 74 49 64 78  (j=0; j<pBestIdx
13de0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  ->nConstraint; j
13df0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
13e00 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
13e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13e20 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
13e30 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
13e40 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64  set;.          d
13e50 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
13e60 6c 2c 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29  l, &wc.a[iTerm])
13e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13e80 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
13e90 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
13ea0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
13eb0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
13ec0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
13ed0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13ee0 64 64 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  ddr(v);.    }els
13ef0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
13f00 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13f10 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ABLE */..    if(
13f20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
13f30 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
13f40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
13f50 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
13f60 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
13f70 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
13f80 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20  g an.      **   
13f90 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
13fa0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
13fb0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
13fc0 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a  ld.  Or.      **
13fd0 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
13fe0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
13ff0 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
14000 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
14010 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
14020 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20  construct..     
14030 20 2a 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20   */.      pTerm 
14040 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
14050 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
14060 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
14070 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
14080 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
14090 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
140a0 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a  rm->pExpr!=0 );.
140b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
140c0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
140d0 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61  =iCur );.      a
140e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
140f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==0 );.      cod
14100 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
14110 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
14120 76 65 6c 29 3b 0a 20 20 20 20 20 20 6e 78 74 20  vel);.      nxt 
14130 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20  = pLevel->nxt;. 
14140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14150 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
14160 42 65 49 6e 74 2c 20 31 2c 20 6e 78 74 29 3b 0a  BeInt, 1, nxt);.
14170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14180 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
14190 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 6e 78  Exists, iCur, nx
141a0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
141b0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
141c0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
141d0 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
141e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
141f0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
14200 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b  E_ROWID_RANGE ){
14210 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32  .      /* Case 2
14220 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
14230 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
14240 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
14250 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
14260 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
14270 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
14280 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  ;.      int star
14290 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  t;.      WhereTe
142a0 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
142b0 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  d;..      assert
142c0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
142d0 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d  ;.      pStart =
142e0 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
142f0 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
14300 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
14310 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  0);.      pEnd =
14320 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
14330 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
14340 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
14350 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52  0);.      if( bR
14360 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ev ){.        pT
14370 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
14380 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70        pStart = p
14390 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 45 6e  End;.        pEn
143a0 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  d = pTerm;.     
143b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 74   }.      if( pSt
143c0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45  art ){.        E
143d0 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
143e0 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
143f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  xpr;.        ass
14400 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
14410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
14420 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72  tart->leftCursor
14430 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20  ==iCur );.      
14440 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
14450 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
14460 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73  ight);.        s
14470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14480 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20  v, OP_ForceInt, 
14490 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pX->op==TK_LE ||
144a0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20   pX->op==TK_GT, 
144b0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  brk);.        sq
144c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
144d0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65  , bRev ? OP_Move
144e0 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  Lt : OP_MoveGe, 
144f0 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
14500 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14510 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
14520 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
14530 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
14540 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14560 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f  eAddOp(v, bRev ?
14570 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
14580 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29  wind, iCur, brk)
14590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
145a0 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
145b0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
145c0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
145d0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
145e0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
145f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14600 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
14610 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
14620 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14630 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
14640 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
14650 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
14660 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
14670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14680 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
14690 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
146a0 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
146b0 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
146c0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
146d0 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
146e0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
146f0 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
14700 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14710 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
14720 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
14730 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20  : OP_Gt;.       
14740 20 7d 0a 20 20 20 20 20 20 20 20 64 69 73 61 62   }.        disab
14750 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
14760 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  End);.      }.  
14770 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
14780 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14790 64 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65  dr(v);.      pLe
147a0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
147b0 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
147c0 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  xt;.      pLevel
147d0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
147e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
147f0 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28  start;.      if(
14800 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
14810 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14820 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14830 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
14840 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
14850 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14860 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76  OP_MemLoad, pLev
14870 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
14880 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14890 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70  eAddOp(v, testOp
148a0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
148b0 45 52 49 43 2c 20 62 72 6b 29 3b 0a 20 20 20 20  ERIC, brk);.    
148c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
148d0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
148e0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
148f0 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
14900 20 43 61 73 65 20 33 3a 20 54 68 65 20 57 48 45   Case 3: The WHE
14910 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
14920 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 74 68  hat refers to th
14930 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20  e right-most.   
14940 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
14950 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
14960 78 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  x is an inequali
14970 74 79 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ty.  For example
14980 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 20 20  , if.      **   
14990 20 20 20 20 20 20 74 68 65 20 69 6e 64 65 78 20        the index 
149a0 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e  is on (x,y,z) an
149b0 64 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  d the WHERE clau
149c0 73 65 20 69 73 20 6f 66 20 74 68 65 0a 20 20 20  se is of the.   
149d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 66 6f     **         fo
149e0 72 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c 31 30  rm "x=5 AND y<10
149f0 22 20 74 68 65 6e 20 74 68 69 73 20 63 61 73 65  " then this case
14a00 20 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20   is used.  Only 
14a10 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  the.      **    
14a20 20 20 20 20 20 72 69 67 68 74 2d 6d 6f 73 74 20       right-most 
14a30 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e  column can be an
14a40 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68   inequality - th
14a50 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20  e rest must.    
14a60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65    **         use
14a70 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49   the "==" and "I
14a80 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  N" operators..  
14a90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
14aa0 20 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73          This cas
14ab0 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77  e is also used w
14ac0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
14ad0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20   WHERE clause.  
14ae0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
14af0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
14b00 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
14b10 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
14b20 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20  rder.      **   
14b30 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
14b40 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
14b50 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
14b60 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20   ORDER BY..     
14b70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74   */.      int st
14b80 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
14b90 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  Eq = pLevel->nEq
14ba0 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 45  ;.      int topE
14bb0 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  q=0;        /* T
14bc0 72 75 65 20 69 66 20 74 6f 70 20 6c 69 6d 69 74  rue if top limit
14bd0 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20   uses ==. False 
14be0 69 73 20 73 74 72 69 63 74 6c 79 20 3c 20 2a 2f  is strictly < */
14bf0 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d 45 71  .      int btmEq
14c00 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  =0;        /* Tr
14c10 75 65 20 69 66 20 62 74 6d 20 6c 69 6d 69 74 20  ue if btm limit 
14c20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69  uses ==. False i
14c30 66 20 73 74 72 69 63 74 6c 79 20 3e 20 2a 2f 0a  f strictly > */.
14c40 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4f 70 2c        int topOp,
14c50 20 62 74 6d 4f 70 3b 20 20 20 2f 2a 20 4f 70 65   btmOp;   /* Ope
14c60 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 74  rators for the t
14c70 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 73 65  op and bottom se
14c80 61 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20  arch bounds */. 
14c90 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 3b       int testOp;
14ca0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4c 69  .      int topLi
14cb0 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  mit = (pLevel->f
14cc0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
14cd0 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20  _LIMIT)!=0;.    
14ce0 20 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d    int btmLimit =
14cf0 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
14d00 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
14d10 54 29 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  T)!=0;..      /*
14d20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14d30 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
14d40 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
14d50 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
14d60 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65       ** and leve
14d70 6c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  l the values of 
14d80 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74  those terms on t
14d90 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20  he stack..      
14da0 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c  */.      codeAll
14db0 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
14dc0 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77  arse, pLevel, &w
14dd0 63 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 0a 20  c, notReady);.. 
14de0 20 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74       /* Duplicat
14df0 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74  e the equality t
14e00 65 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75  erm values becau
14e10 73 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c  se they will all
14e20 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65   be.      ** use
14e30 64 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f  d twice: once to
14e40 20 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e   make the termin
14e50 61 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e  ation key and on
14e60 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20  ce to make the. 
14e70 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65       ** start ke
14e80 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
14e90 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
14ea0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
14eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ec0 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d  (v, OP_Dup, nEq-
14ed0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  1, 0);.      }..
14ee0 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
14ef0 6f 75 74 20 77 68 61 74 20 63 6f 6d 70 61 72 69  out what compari
14f00 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 74 6f  son operators to
14f10 20 75 73 65 20 66 6f 72 20 74 6f 70 20 61 6e 64   use for top and
14f20 20 62 6f 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a   bottom .      *
14f30 2a 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73 2e  * search bounds.
14f40 20 46 6f 72 20 61 6e 20 61 73 63 65 6e 64 69 6e   For an ascendin
14f50 67 20 69 6e 64 65 78 2c 20 74 68 65 20 62 6f 74  g index, the bot
14f60 74 6f 6d 20 62 6f 75 6e 64 20 69 73 20 61 20 3e  tom bound is a >
14f70 20 6f 72 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20   or >=.      ** 
14f80 6f 70 65 72 61 74 6f 72 20 61 6e 64 20 74 68 65  operator and the
14f90 20 74 6f 70 20 62 6f 75 6e 64 20 69 73 20 61 20   top bound is a 
14fa0 3c 20 6f 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72  < or <= operator
14fb0 2e 20 20 46 6f 72 20 61 20 64 65 73 63 65 6e 64  .  For a descend
14fc0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64  ing.      ** ind
14fd0 65 78 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  ex the operators
14fe0 20 61 72 65 20 72 65 76 65 72 73 65 64 2e 0a 20   are reversed.. 
14ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15000 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
15010 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f  er[nEq]==SQLITE_
15020 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20  SO_ASC ){.      
15030 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c    topOp = WO_LT|
15040 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62  WO_LE;.        b
15050 74 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  tmOp = WO_GT|WO_
15060 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  GE;.      }else{
15070 0a 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d  .        topOp =
15080 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20   WO_GT|WO_GE;.  
15090 20 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f        btmOp = WO
150a0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _LT|WO_LE;.     
150b0 20 20 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70     SWAP(int, top
150c0 4c 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29  Limit, btmLimit)
150d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
150e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
150f0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79   termination key
15100 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b  .  This is the k
15110 65 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20  ey value that.  
15120 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20      ** will end 
15130 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68 65  the search.  The
15140 72 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61  re is no termina
15150 74 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72  tion key if ther
15160 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e  e.      ** are n
15170 6f 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  o equality terms
15180 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20   and no "X<..." 
15190 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  term..      **. 
151a0 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63       ** 2002-Dec
151b0 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73  -04: On a revers
151c0 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68  e-order scan, th
151d0 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72  e so-called "ter
151e0 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20  mination".      
151f0 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20  ** key computed 
15200 68 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73  here really ends
15210 20 75 70 20 62 65 69 6e 67 20 74 68 65 20 73 74   up being the st
15220 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a  art key..      *
15230 2f 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c  /.      nxt = pL
15240 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20  evel->nxt;.     
15250 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b   if( topLimit ){
15260 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
15270 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  X;.        int k
15280 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
15290 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  n[j];.        pT
152a0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
152b0 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  wc, iCur, k, not
152c0 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20 70 49  Ready, topOp, pI
152d0 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  dx);.        ass
152e0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
152f0 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54  .        pX = pT
15300 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
15310 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
15320 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
15330 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20  _CODED)==0 );.  
15340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15350 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
15360 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
15370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15380 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
15390 2c 20 2d 28 6e 45 71 2b 31 29 2c 20 6e 78 74 29  , -(nEq+1), nxt)
153a0 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71 20  ;.        topEq 
153b0 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
153c0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
153d0 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  E);.        disa
153e0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
153f0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
15400 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47  testOp = OP_IdxG
15410 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
15420 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
15430 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47   nEq>0 ? OP_IdxG
15440 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  E : OP_Noop;.   
15450 20 20 20 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a       topEq = 1;.
15460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15470 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
15480 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
15490 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f   nCol = nEq + to
154a0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
154b0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
154c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
154d0 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65         buildInde
154e0 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20  xProbe(v, nCol, 
154f0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
15500 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
15510 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 74 6f       int op = to
15520 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20  pEq ? OP_MoveLe 
15530 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20  : OP_MoveLt;.   
15540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15550 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
15560 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
15570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15590 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
155a0 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
155b0 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
155c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
155d0 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
155e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
155f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  ddOp(v, OP_Last,
15600 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
15610 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
15620 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
15630 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73 20  tart key.  This 
15640 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74 20  is the key that 
15650 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 65  defines the lowe
15660 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64  r.      ** bound
15670 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e 20   on the search. 
15680 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   There is no sta
15690 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65 20  rt key if there 
156a0 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20  are no.      ** 
156b0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
156c0 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  nd if there is n
156d0 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20  o "X>..." term. 
156e0 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 61   In.      ** tha
156f0 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65  t case, generate
15700 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73 74   a "Rewind" inst
15710 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65  ruction in place
15720 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
15730 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72 63   start key searc
15740 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  h..      **.    
15750 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34    ** 2002-Dec-04
15760 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66  : In the case of
15770 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72   a reverse-order
15780 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f 2d   search, the so-
15790 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  called.      ** 
157a0 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61 6c  "start" key real
157b0 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ly ends up being
157c0 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65 72   used as the ter
157d0 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20  mination key..  
157e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
157f0 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20   btmLimit ){.   
15800 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
15810 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70         int k = p
15820 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
15830 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
15840 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
15850 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
15860 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78 29 3b  y, btmOp, pIdx);
15870 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15880 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
15890 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
158a0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
158b0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
158c0 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
158d0 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
158e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
158f0 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
15900 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73  ight);.        s
15910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15920 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 28  v, OP_IsNull, -(
15930 6e 45 71 2b 31 29 2c 20 6e 78 74 29 3b 0a 20 20  nEq+1), nxt);.  
15940 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54        btmEq = pT
15950 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15960 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
15970 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
15980 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
15990 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
159a0 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d  .        btmEq =
159b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
159c0 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62    if( nEq>0 || b
159d0 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  tmLimit ){.     
159e0 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
159f0 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20  q + btmLimit;.  
15a00 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
15a10 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70  Probe(v, nCol, p
15a20 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
15a30 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ( bRev ){.      
15a40 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d      pLevel->iMem
15a50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
15a60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  +;.          sql
15a70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15a80 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
15a90 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
15aa0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
15ab0 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20   = OP_IdxLT;.   
15ac0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15ad0 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 62        int op = b
15ae0 74 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65  tmEq ? OP_MoveGe
15af0 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20   : OP_MoveGt;.  
15b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15b10 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
15b20 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20  iIdxCur, nxt);. 
15b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15b40 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
15b50 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
15b60 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
15b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b90 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
15ba0 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
15bb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15bc0 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 68 65  Generate the the
15bd0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
15be0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
15bf0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20   termination.   
15c00 20 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61 76     ** key we hav
15c10 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74 68  e to test for th
15c20 61 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72 74  at key and abort
15c30 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
15c40 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  he.      ** loop
15c50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15c60 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
15c70 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15c80 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  v);.      if( te
15c90 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
15ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15cb0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15cc0 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
15cd0 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
15ce0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15cf0 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20 69  dOp(v, testOp, i
15d00 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
15d10 20 20 20 20 20 20 69 66 28 20 28 74 6f 70 45 71        if( (topEq
15d20 20 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28 21   && !bRev) || (!
15d30 62 74 6d 45 71 20 26 26 20 62 52 65 76 29 20 29  btmEq && bRev) )
15d40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
15d50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
15d60 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53  v, -1, "+", P3_S
15d70 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
15d80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15d90 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 7c 20 62  if( topLimit | b
15da0 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  tmLimit ){.     
15db0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15dc0 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
15dd0 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 29 3b  , iIdxCur, nEq);
15de0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15df0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15e00 49 73 4e 75 6c 6c 2c 20 31 2c 20 63 6f 6e 74 29  IsNull, 1, cont)
15e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15e20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
15e30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15e40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15e50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43  _IdxRowid, iIdxC
15e60 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
15e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e80 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
15e90 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
15ea0 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72  ..      /* Recor
15eb0 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
15ec0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
15ed0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20  ate the loop..  
15ee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65      */.      pLe
15ef0 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
15f00 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
15f10 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  xt;.      pLevel
15f20 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
15f30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
15f40 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65   = start;.    }e
15f50 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
15f60 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
15f70 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20  LUMN_EQ ){.     
15f80 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65   /* Case 4:  The
15f90 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 61  re is an index a
15fa0 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  nd all terms of 
15fb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
15fc0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 20   that.      **  
15fd0 20 20 20 20 20 20 20 20 72 65 66 65 72 20 74 6f          refer to
15fe0 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
15ff0 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e   the "==" or "IN
16000 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20  " operators..   
16010 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
16020 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
16030 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
16040 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  Eq;..      /* Ge
16050 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
16060 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
16070 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
16080 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
16090 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20 74    ** and leave t
160a0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
160b0 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
160c0 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
160d0 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
160e0 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
160f0 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
16100 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 20  notReady);.     
16110 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nxt = pLevel->n
16120 78 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  xt;..      /* Ge
16130 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c 65 20  nerate a single 
16140 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  key that will be
16150 20 75 73 65 64 20 74 6f 20 62 6f 74 68 20 73 74   used to both st
16160 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74  art and terminat
16170 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  e.      ** the s
16180 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20  earch.      */. 
16190 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
161a0 72 6f 62 65 28 76 2c 20 6e 45 71 2c 20 70 49 64  robe(v, nEq, pId
161b0 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
161c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
161d0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
161e0 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20  l->iMem, 0);..  
161f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
16200 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65  code (1) to move
16210 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61   to the first ma
16220 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  tching element o
16230 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
16240 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72     ** Then gener
16250 61 74 65 20 63 6f 64 65 20 28 32 29 20 74 68 61  ate code (2) tha
16260 74 20 6a 75 6d 70 73 20 74 6f 20 22 6e 78 74 22  t jumps to "nxt"
16270 20 61 66 74 65 72 20 74 68 65 20 63 75 72 73 6f   after the curso
16280 72 20 69 73 20 70 61 73 74 0a 20 20 20 20 20 20  r is past.      
16290 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63  ** the last matc
162a0 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
162b0 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
162c0 63 6f 64 65 20 28 31 29 20 69 73 20 65 78 65 63  code (1) is exec
162d0 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  uted.      ** on
162e0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
162f0 20 74 68 65 20 73 65 61 72 63 68 2c 20 74 68 65   the search, the
16300 20 63 6f 64 65 20 28 32 29 20 69 73 20 65 78 65   code (2) is exe
16310 63 75 74 65 64 20 62 65 66 6f 72 65 20 65 61 63  cuted before eac
16320 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61  h.      ** itera
16330 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e  tion of the scan
16340 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
16350 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64  can has finished
16360 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  . */.      if( b
16370 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Rev ){.        /
16380 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73  * Scan in revers
16390 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  e order */.     
163a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163b0 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65  dOp(v, OP_MoveLe
163c0 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b  , iIdxCur, nxt);
163d0 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d  .        start =
163e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
163f0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
16400 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
16410 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16420 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16430 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43 75 72  P_IdxLT, iIdxCur
16440 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  , nxt);.        
16450 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
16460 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Prev;.      }els
16470 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63  e{.        /* Sc
16480 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72  an in the forwar
16490 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  d order */.     
164a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
164b0 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
164c0 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b  , iIdxCur, nxt);
164d0 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d  .        start =
164e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
164f0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
16500 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
16510 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16520 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16530 49 64 78 47 45 2c 20 69 49 64 78 43 75 72 2c 20  IdxGE, iIdxCur, 
16540 6e 78 74 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41  nxt, "+", P3_STA
16550 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  TIC);.        pL
16560 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
16570 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
16580 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
16590 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
165a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
165b0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
165c0 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
165d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
165e0 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
165f0 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
16600 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
16610 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
16620 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
16630 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
16640 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
16650 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
16660 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
16670 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
16680 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20  mplete.      ** 
16690 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
166a0 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
166b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
166c0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
166d0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
166e0 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20  assert( bRev==0 
166f0 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
16700 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  >op = OP_Next;. 
16710 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
16720 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
16730 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73  evel->p2 = 1 + s
16740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16750 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
16760 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a  ur, brk);.    }.
16770 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
16780 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
16790 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f  t, iCur);..    /
167a0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
167b0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
167c0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
167d0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
167e0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
167f0 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
16800 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
16810 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
16820 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77  (pTerm=wc.a, j=w
16830 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d  c.nTerm; j>0; j-
16840 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
16850 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
16860 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
16870 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
16880 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
16890 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
168a0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
168b0 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
168c0 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
168d0 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54  e;.      pE = pT
168e0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
168f0 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
16900 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
16910 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
16920 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
16930 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
16940 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
16950 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
16960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16970 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
16980 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a  , pE, cont, 1);.
16990 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
169a0 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
169b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
169c0 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
169d0 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
169e0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
169f0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
16a00 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
16a10 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
16a20 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
16a30 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
16a40 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
16a50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
16a60 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
16a70 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74  .      pLevel->t
16a80 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
16a90 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ab0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
16ac0 49 6e 74 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  Int, 1, pLevel->
16ad0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
16ae0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16af0 2c 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46 54  , "# record LEFT
16b00 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
16b10 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63      for(pTerm=wc
16b20 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54  .a, j=0; j<wc.nT
16b30 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  erm; j++, pTerm+
16b40 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16b50 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28  pTerm->flags & (
16b60 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
16b70 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
16b80 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
16b90 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
16ba0 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
16bb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
16bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
16bd0 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
16be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16bf0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16c00 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63   pTerm->pExpr, c
16c10 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ont, 1);.       
16c20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
16c30 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
16c40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16c50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16c60 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69  ST  /* For testi
16c70 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
16c80 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f   use only */.  /
16c90 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
16ca0 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72  query plan infor
16cb0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
16cc0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20   current table. 
16cd0 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65   ** and the inde
16ce0 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
16cf0 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49   it (if any).  I
16d00 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  f the table itse
16d10 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75  lf.  ** is not u
16d20 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73  sed, its name is
16d30 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20   just '{}'.  If 
16d40 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  no index is used
16d50 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
16d60 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d  is listed as "{}
16d70 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61  ".  If the prima
16d80 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74  ry key is used t
16d90 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61  he.  ** index na
16da0 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a  me is '*'..  */.
16db0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
16dc0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
16dd0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  ){.    char *z;.
16de0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70      int n;.    p
16df0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
16e00 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49  >a[i];.    pTabI
16e10 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
16e20 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
16e30 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49  ];.    z = pTabI
16e40 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
16e50 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
16e60 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
16e70 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73  zName;.    n = s
16e80 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66  trlen(z);.    if
16e90 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
16ea0 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
16eb0 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
16ec0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
16ed0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
16ee0 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
16ef0 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
16f00 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
16f10 6c 61 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20  lan], "{}");.   
16f20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
16f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16f40 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73         strcpy(&s
16f50 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
16f60 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20  n[nQPlan], z);. 
16f70 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
16f80 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
16f90 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
16fa0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
16fb0 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20   ' ';.    }.    
16fc0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
16fd0 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
16fe0 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
16ff0 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
17000 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
17010 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
17020 6e 5d 2c 20 22 2a 20 22 29 3b 0a 20 20 20 20 20  n], "* ");.     
17030 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
17040 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
17050 65 6c 2d 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20  el->pIdx==0 ){. 
17060 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c       strcpy(&sql
17070 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
17080 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b  nQPlan], "{} ");
17090 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
170a0 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
170b0 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
170c0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
170d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
170e0 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
170f0 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
17100 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20  plan)-2 ){.     
17110 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
17120 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17130 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70  Plan], pLevel->p
17140 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
17150 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
17160 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17170 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
17180 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
17190 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
171a0 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
171b0 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
171c0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
171d0 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
171e0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
171f0 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
17200 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
17210 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
17220 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
17230 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
17240 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
17250 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
17260 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
17270 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
17280 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
17290 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
172a0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
172b0 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
172c0 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
172d0 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e  .  */.  pWInfo->
172e0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74  iContinue = cont
172f0 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  ;.  whereClauseC
17300 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74  lear(&wc);.  ret
17310 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
17320 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
17330 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
17340 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a  hereBeginNoMem:.
17350 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
17360 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65  ar(&wc);.  where
17370 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29  InfoFree(pWInfo)
17380 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
17390 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
173a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
173b0 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
173c0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
173d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
173e0 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
173f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
17400 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
17410 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
17420 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64  o *pWInfo){.  Vd
17430 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
17440 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17450 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
17460 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
17470 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
17480 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
17490 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  List;..  /* Gene
174a0 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
174b0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
174c0 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73  .  for(i=pTabLis
174d0 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b  t->nSrc-1; i>=0;
174e0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
174f0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
17500 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
17510 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17520 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b  , pLevel->cont);
17530 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17540 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17560 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eAddOp(v, pLevel
17570 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
17580 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
17590 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
175a0 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20  vel->nIn ){.    
175b0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
175c0 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
175d0 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
175e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
175f0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29  (v, pLevel->nxt)
17600 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
17610 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26  evel->nIn, pIn=&
17620 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
17630 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
17640 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
17650 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17660 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41  ere(v, pIn->topA
17670 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ddr+1);.        
17680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17690 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e  (v, OP_Next, pIn
176a0 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f 70  ->iCur, pIn->top
176b0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Addr);.        s
176c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
176d0 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64  re(v, pIn->topAd
176e0 64 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dr-1);.      }. 
176f0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
17700 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29  pLevel->aInLoop)
17710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17720 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17730 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62  bel(v, pLevel->b
17740 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
17750 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
17760 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
17770 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
17780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
17790 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
177a0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
177b0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
177c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
177d0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
177e0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
177f0 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  sor, 0);.      i
17800 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  f( pLevel->iIdxC
17810 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ur>=0 ){.       
17820 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17830 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  p(v, OP_NullRow,
17840 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
17850 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
17860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17870 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
17880 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29   0, pLevel->top)
17890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
178a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
178b0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
178c0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
178d0 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
178e0 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
178f0 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
17900 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
17910 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
17920 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17930 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
17940 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
17950 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
17960 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
17970 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
17980 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
17990 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
179a0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
179b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
179c0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
179d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
179e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
179f0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
17a00 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
17a10 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
17a20 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
17a30 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
17a40 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
17a50 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20  ( pTab->isEphem 
17a60 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
17a70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17a80 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
17a90 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
17aa0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
17ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17ac0 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
17ad0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
17ae0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
17af0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64   if( pLevel->pId
17b00 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x!=0 ){.      sq
17b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17b20 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76  , OP_Close, pLev
17b30 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b  el->iIdxCur, 0);
17b40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
17b50 61 6b 65 20 63 75 72 73 6f 72 20 73 75 62 73 74  ake cursor subst
17b60 69 74 75 74 69 6f 6e 73 20 66 6f 72 20 63 61 73  itutions for cas
17b70 65 73 20 77 68 65 72 65 20 77 65 20 77 61 6e 74  es where we want
17b80 20 74 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a   to use.    ** j
17b90 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ust the index an
17ba0 64 20 6e 65 76 65 72 20 72 65 66 65 72 65 6e 63  d never referenc
17bb0 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  e the table..   
17bc0 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
17bd0 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
17be0 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
17bf0 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
17c00 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
17c10 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
17c20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
17c30 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
17c40 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
17c50 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
17c60 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
17c70 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
17c80 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
17c90 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
17ca0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
17cb0 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
17cc0 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
17cd0 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
17ce0 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
17cf0 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
17d00 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
17d10 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
17d20 4c 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  LY ){.      int 
17d30 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20  k, j, last;.    
17d40 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
17d50 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
17d60 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b   = pLevel->pIdx;
17d70 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
17d80 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  pIdx!=0 );.     
17d90 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
17da0 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66  beGetOp(v, pWInf
17db0 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20  o->iTop);.      
17dc0 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
17dd0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17de0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57  ;.      for(k=pW
17df0 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61  Info->iTop; k<la
17e00 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
17e10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
17e20 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
17e30 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
17e40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
17e50 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
17e60 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
17e70 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
17e80 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
17e90 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
17ea0 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
17eb0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
17ec0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d     if( pOp->p2==
17ed0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
17ee0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
17ef0 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a     pOp->p2 = j;.
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
17f10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
17f20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
17f30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
17f40 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
17f50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
17f60 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
17f70 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
17f80 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
17f90 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
17fa0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  id;.        }els
17fb0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
17fc0 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b  e==OP_NullRow ){
17fd0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
17fe0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
17ff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18000 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
18010 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
18020 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e  p.  */.  whereIn
18030 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a  foFree(pWInfo);.
18040 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.