/ Hex Artifact Content
Login

Artifact 767db25b4b92a5e0a6f1b75ba40abf377b65a212:


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 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 31  : where.c,v 1.31
0340: 30 20 32 30 30 38 2f 30 36 2f 32 35 20 30 32 3a  0 2008/06/25 02:
0350: 34 37 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a  47:57 drh Exp $.
0360: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0370: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0380: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
0390: 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
03a0: 2e 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22  .  "BMS" means "
03b0: 42 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a  BitMask Size"..*
03c0: 2f 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28  /.#define BMS  (
03d0: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
03e0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20  8)../*.** Trace 
03f0: 6f 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f  output macros.*/
0400: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0410: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0420: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0430: 47 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  G).int sqlite3Wh
0440: 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 20  ereTrace = 0;.# 
0450: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
0460: 45 28 58 29 20 20 69 66 28 73 71 6c 69 74 65 33  E(X)  if(sqlite3
0470: 57 68 65 72 65 54 72 61 63 65 29 20 73 71 6c 69  WhereTrace) sqli
0480: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 58  te3DebugPrintf X
0490: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
04a0: 57 48 45 52 45 54 52 41 43 45 28 58 29 0a 23 65  WHERETRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
04c0: 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79   reference.*/.ty
04d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04e0: 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43 6c  reClause WhereCl
04f0: 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73 74  ause;.typedef st
0500: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
0510: 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 0a 2f   ExprMaskSet;../
0520: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0530: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0540: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0550: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0560: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0570: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0580: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
0590: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05a0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05b0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05c0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05d0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05e0: 68 65 72 73 20 62 79 20 61 6e 20 41 4e 44 20 6f  hers by an AND o
05f0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41  perator..**.** A
0600: 6c 6c 20 57 68 65 72 65 54 65 72 6d 73 20 61 72  ll WhereTerms ar
0610: 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  e collected into
0620: 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 43   a single WhereC
0630: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
0640: 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77    .** The follow
0650: 69 6e 67 20 69 64 65 6e 74 69 74 79 20 68 6f 6c  ing identity hol
0660: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ds:.**.**       
0670: 20 57 68 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e   WhereTerm.pWC->
0680: 61 5b 57 68 65 72 65 54 65 72 6d 2e 69 64 78 5d  a[WhereTerm.idx]
0690: 20 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a   == WhereTerm.**
06a0: 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65 72 6d 20  .** When a term 
06b0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
06c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
06d0: 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e     X <op> <expr>
06e0: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  .**.** where X i
06f0: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  s a column name 
0700: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
0710: 6f 66 20 63 65 72 74 61 69 6e 20 6f 70 65 72 61  of certain opera
0720: 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68  tors,.** then Wh
0730: 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 75 72 73  ereTerm.leftCurs
0740: 6f 72 20 61 6e 64 20 57 68 65 72 65 54 65 72 6d  or and WhereTerm
0750: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f  .leftColumn reco
0760: 72 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  rd the.** cursor
0770: 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75   number and colu
0780: 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e  mn number for X.
0790: 20 20 57 68 65 72 65 54 65 72 6d 2e 6f 70 65 72    WhereTerm.oper
07a0: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
07b0: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
07c0: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
07d0: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
07e0: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
07f0: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
0800: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
0810: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
0820: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
0830: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
0840: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
0850: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
0860: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
0870: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72  tors..**.** prer
0880: 65 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72  eqRight and prer
0890: 65 71 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74  eqAll record set
08a0: 73 20 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62  s of cursor numb
08b0: 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79  ers,.** but they
08c0: 20 64 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c   do so indirectl
08d0: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 45 78 70  y.  A single Exp
08e0: 72 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  rMaskSet structu
08f0: 72 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a  re translates.**
0900: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
0910: 6e 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65  nto bits and the
0920: 20 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20   translated bit 
0930: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
0940: 20 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64   prereq.** field
0950: 73 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74  s.  The translat
0960: 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f  ion is used in o
0970: 72 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65  rder to maximize
0980: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
0990: 2a 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c  * bits that will
09a0: 20 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73   fit in a Bitmas
09b0: 6b 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72  k.  The VDBE cur
09c0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
09d0: 74 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f  t be.** spread o
09e0: 75 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d  ut over the non-
09f0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
0a00: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  s.  For example,
0a10: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e   the cursor.** n
0a20: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20  umbers might be 
0a30: 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c  3, 8, 9, 10, 20,
0a40: 20 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e   23, 41, and 45.
0a50: 20 20 54 68 65 20 45 78 70 72 4d 61 73 6b 53 65    The ExprMaskSe
0a60: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
0a70: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
0a80: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
0a90: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
0aa0: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
0ab0: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
0ac0: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
0ad0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
0ae0: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
0af0: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
0b00: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
0b10: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
0b20: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
0b30: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
0b40: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
0b50: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
0b60: 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  gh 7..*/.typedef
0b70: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0b80: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0b90: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0ba0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0bc0: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0bd0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
0be0: 31 36 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  16 iParent;     
0bf0: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0c00: 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74  e pWC->a[iParent
0c10: 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72 6d  ] when this term
0c20: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69   disabled */.  i
0c30: 31 36 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20  16 leftCursor;  
0c40: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
0c50: 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20   number of X in 
0c60: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  "X <op> <expr>" 
0c70: 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 6f 6c  */.  i16 leftCol
0c80: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
0c90: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
0ca0: 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65   X in "X <op> <e
0cb0: 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31 36 20 65  xpr>" */.  u16 e
0cc0: 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20 20  Operator;       
0cd0: 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61     /* A WO_xx va
0ce0: 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c  lue describing <
0cf0: 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  op> */.  u8 flag
0d00: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
0d10: 20 2f 2a 20 42 69 74 20 66 6c 61 67 73 2e 20 20   /* Bit flags.  
0d20: 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75  See below */.  u
0d30: 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20  8 nChild;       
0d40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d50: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61   of children tha
0d60: 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75  t must disable u
0d70: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
0d80: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f  se *pWC;       /
0d90: 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69  * The clause thi
0da0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
0db0: 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  f */.  Bitmask p
0dc0: 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f  rereqRight;    /
0dd0: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
0de0: 6c 65 73 20 75 73 65 64 20 62 79 20 70 52 69 67  les used by pRig
0df0: 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ht */.  Bitmask 
0e00: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
0e10: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
0e20: 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
0e30: 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  by p */.};../*.*
0e40: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0e50: 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 66 6c   of WhereTerm.fl
0e60: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
0e70: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
0e80: 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  x01   /* Need to
0e90: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   call sqlite3Exp
0ea0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 20 2a  rDelete(pExpr) *
0eb0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
0ec0: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
0ed0: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
0ee0: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
0ef0: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
0f00: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
0f10: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
0f20: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
0f30: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
0f40: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
0f50: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
0f60: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
0f70: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
0f80: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 55       0x10   /* U
0f90: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
0fa0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
0fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
0fc0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0fd0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0fe0: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
0ff0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
1000: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
1010: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1020: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1030: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1040: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63  eTerms..*/.struc
1050: 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a  t WhereClause {.
1060: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1080: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1090: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
10a0: 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 2f  t *pMaskSet;   /
10b0: 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62  * Mapping of tab
10c0: 6c 65 20 69 6e 64 69 63 65 73 20 74 6f 20 62 69  le indices to bi
10d0: 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20  tmasks */.  int 
10e0: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
10f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1100: 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  f terms */.  int
1110: 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
1120: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1130: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b  of entries in a[
1140: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
1150: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   *a;            
1160: 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63  /* Each a[] desc
1170: 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20  ribes a term of 
1180: 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65  the WHERE cluase
1190: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11a0: 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20 20 2f  aStatic[10];   /
11b0: 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63  * Initial static
11c0: 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a   space for a[] *
11d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
11e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
11f0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1200: 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f  re keeps track o
1210: 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62  f a mapping.** b
1220: 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72 73  etween VDBE curs
1230: 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 62  or numbers and b
1240: 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d 61  its of the bitma
1250: 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72 6d  sks in WhereTerm
1260: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1270: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1280: 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65  are small intege
1290: 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  rs contained in 
12a0: 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  .** SrcList_item
12b0: 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78 70  .iCursor and Exp
12c0: 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 2e  r.iTable fields.
12d0: 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e 20    For any given 
12e0: 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65  WHERE .** clause
12f0: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
1300: 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20 62  bers might not b
1310: 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20  egin with 0 and 
1320: 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  they might.** co
1330: 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74 68  ntain gaps in th
1340: 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71 75  e numbering sequ
1350: 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77 61  ence.  But we wa
1360: 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d  nt to make maxim
1370: 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68 65  um.** use of the
1380: 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69 74   bits in our bit
1390: 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74 72  masks.  This str
13a0: 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73 20  ucture provides 
13b0: 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f  a mapping.** fro
13c0: 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75 72  m the sparse cur
13d0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
13e0: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
13f0: 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a  egers beginning.
1400: 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a  ** with 0..**.**
1410: 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74 2e   If ExprMaskSet.
1420: 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e  ix[A]==B it mean
1430: 73 20 74 68 61 74 20 54 68 65 20 41 2d 74 68 20  s that The A-th 
1440: 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73 6b  bit of a Bitmask
1450: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1460: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
1470: 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68 20  er B.  The A-th 
1480: 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  bit of a bitmask
1490: 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20   is 1<<A..**.** 
14a0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
14b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
14c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 64   expression used
14d0: 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20 63   these VDBE.** c
14e0: 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38  ursors:  4, 5, 8
14f0: 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20 54  , 29, 57, 73.  T
1500: 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61 73  hen the  ExprMas
1510: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a 2a  kSet structure.*
1520: 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73  * would map thos
1530: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1540: 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68 72   into bits 0 thr
1550: 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ough 5..**.** No
1560: 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70 70  te that the mapp
1570: 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ing is not neces
1580: 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e 20  sarily ordered. 
1590: 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a   In the example.
15a0: 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d 61  ** above, the ma
15b0: 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c  pping might go l
15c0: 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c  ike this:  4->3,
15d0: 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d   5->1, 8->2, 29-
15e0: 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33  >0,.** 57->5, 73
15f0: 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20  ->4.  Or one of 
1600: 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e  719 other combin
1610: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65 20  ations might be 
1620: 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73  used. It.** does
1630: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74 74   not really matt
1640: 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d 70  er.  What is imp
1650: 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20 73  ortant is that s
1660: 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20  parse cursor.** 
1670: 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74 20  numbers all get 
1680: 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74 20  mapped into bit 
1690: 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65 67  numbers that beg
16a0: 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63 6f  in with 0 and co
16b0: 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73  ntain.** no gaps
16c0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 78 70 72  ..*/.struct Expr
16d0: 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20  MaskSet {.  int 
16e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1700: 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64 20  ber of assigned 
1710: 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f  cursor values */
1720: 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a 65 6f 66  .  int ix[sizeof
1730: 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20 20 20  (Bitmask)*8];   
1740: 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69 67   /* Cursor assig
1750: 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69 74 20  ned to each bit 
1760: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69  */.};.../*.** Bi
1770: 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20 6f  tmasks for the o
1780: 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 6e  perators that in
1790: 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20 74  dices are able t
17a0: 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a  o exploit.  An.*
17b0: 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  * OR-ed combinat
17c0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ion of these val
17d0: 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  ues can be used 
17e0: 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66  when searching f
17f0: 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74  or.** terms in t
1800: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 2e  he where clause.
1810: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  .*/.#define WO_I
1820: 4e 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20  N     1.#define 
1830: 57 4f 5f 45 51 20 20 20 20 20 32 0a 23 64 65 66  WO_EQ     2.#def
1840: 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28 57  ine WO_LT     (W
1850: 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f  O_EQ<<(TK_LT-TK_
1860: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
1870: 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LE     (WO_EQ<<(
1880: 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LE-TK_EQ)).#d
1890: 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20 20  efine WO_GT     
18a0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54  (WO_EQ<<(TK_GT-T
18b0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
18c0: 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GE     (WO_EQ<
18d0: 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_GE-TK_EQ)).
18e0: 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48  #define WO_MATCH
18f0: 20 20 36 34 0a 23 64 65 66 69 6e 65 20 57 4f 5f    64.#define WO_
1900: 49 53 4e 55 4c 4c 20 31 32 38 0a 0a 2f 2a 0a 2a  ISNULL 128../*.*
1910: 2a 20 56 61 6c 75 65 20 66 6f 72 20 66 6c 61 67  * Value for flag
1920: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62 65  s returned by be
1930: 73 74 49 6e 64 65 78 28 29 2e 20 20 0a 2a 2a 0a  stIndex().  .**.
1940: 2a 2a 20 54 68 65 20 6c 65 61 73 74 20 73 69 67  ** The least sig
1950: 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 69 73  nificant byte is
1960: 20 72 65 73 65 72 76 65 64 20 61 73 20 61 20 6d   reserved as a m
1970: 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75  ask for WO_ valu
1980: 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65  es above..** The
1990: 20 57 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61 67   WhereLevel.flag
19a0: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
19b0: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
19c0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
19d0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
19e0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
19f0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
1a00: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
1a10: 65 6c 2e 66 6c 61 67 73 0a 2a 2a 20 69 73 20 73  el.flags.** is s
1a20: 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45  et to WO_IN|WO_E
1a30: 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65 76  Q.  The WhereLev
1a40: 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 63  el.flags field c
1a50: 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20  an then be used 
1a60: 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70  as.** the "op" p
1a70: 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64  arameter to find
1a80: 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65  Term when we are
1a90: 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c   resolving equal
1aa0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
1ab0: 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74  .** ISNULL const
1ac0: 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e  raints will then
1ad0: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20   not be used on 
1ae0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
1af0: 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69  of a left.** joi
1b00: 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37  n.  Tickets #217
1b10: 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a  7 and #2189..*/.
1b20: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
1b30: 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30  WID_EQ     0x000
1b40: 31 30 30 20 20 20 2f 2a 20 72 6f 77 69 64 3d 45  100   /* rowid=E
1b50: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
1b60: 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65  (...) */.#define
1b70: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
1b80: 47 45 20 20 30 78 30 30 30 32 30 30 20 20 20 2f  GE  0x000200   /
1b90: 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e 64  * rowid<EXPR and
1ba0: 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20 2a  /or rowid>EXPR *
1bb0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1bc0: 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78 30  COLUMN_EQ    0x0
1bd0: 30 31 30 30 30 20 20 20 2f 2a 20 78 3d 45 58 50  01000   /* x=EXP
1be0: 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  R or x IN (...) 
1bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1c00: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78  _COLUMN_RANGE 0x
1c10: 30 30 32 30 30 30 20 20 20 2f 2a 20 78 3c 45 58  002000   /* x<EX
1c20: 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52  PR and/or x>EXPR
1c30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1c40: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30  E_COLUMN_IN    0
1c50: 78 30 30 34 30 30 30 20 20 20 2f 2a 20 78 20 49  x004000   /* x I
1c60: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
1c70: 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  ne WHERE_TOP_LIM
1c80: 49 54 20 20 20 20 30 78 30 31 30 30 30 30 20 20  IT    0x010000  
1c90: 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c   /* x<EXPR or x<
1ca0: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
1cb0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1cc0: 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30  E_BTM_LIMIT    0
1cd0: 78 30 32 30 30 30 30 20 20 20 2f 2a 20 78 3e 45  x020000   /* x>E
1ce0: 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63  XPR or x>=EXPR c
1cf0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
1d00: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
1d10: 4e 4c 59 20 20 20 20 20 30 78 30 38 30 30 30 30  NLY     0x080000
1d20: 20 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20     /* Use index 
1d30: 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c  only - omit tabl
1d40: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  e */.#define WHE
1d50: 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20 20  RE_ORDERBY      
1d60: 30 78 31 30 30 30 30 30 20 20 20 2f 2a 20 4f 75  0x100000   /* Ou
1d70: 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61 72  tput will appear
1d80: 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64 65   in correct orde
1d90: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  r */.#define WHE
1da0: 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20 20  RE_REVERSE      
1db0: 30 78 32 30 30 30 30 30 20 20 20 2f 2a 20 53 63  0x200000   /* Sc
1dc0: 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1dd0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
1de0: 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20 20  HERE_UNIQUE     
1df0: 20 20 30 78 34 30 30 30 30 30 20 20 20 2f 2a 20    0x400000   /* 
1e00: 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20  Selects no more 
1e10: 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a  than one row */.
1e20: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56 49  #define WHERE_VI
1e30: 52 54 55 41 4c 54 41 42 4c 45 20 30 78 38 30 30  RTUALTABLE 0x800
1e40: 30 30 30 20 20 20 2f 2a 20 55 73 65 20 76 69 72  000   /* Use vir
1e50: 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65  tual-table proce
1e60: 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ssing */../*.** 
1e70: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72 65  Initialize a pre
1e80: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 43  allocated WhereC
1e90: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
1ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1eb0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1ec0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1ed0: 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  pWC,        /* T
1ee0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  he WhereClause t
1ef0: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
1f00: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
1f10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
1f20: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1f30: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d  ntext */.  ExprM
1f40: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
1f50: 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
1f60: 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64 69 63 65  rom table indice
1f70: 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f  s to bitmasks */
1f80: 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72 73  .){.  pWC->pPars
1f90: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
1fa0: 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d  C->pMaskSet = pM
1fb0: 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e 6e  askSet;.  pWC->n
1fc0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
1fd0: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
1fe0: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
1ff0: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
2000: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
2010: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
2020: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2030: 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68 65  ucture.  The Whe
2040: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2050: 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73 20  re.** itself is 
2060: 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69 73  not freed.  This
2070: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
2080: 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72 65  inverse of where
2090: 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f  ClauseInit()..*/
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
20b0: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68  reClauseClear(Wh
20c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29 7b  ereClause *pWC){
20d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
20e0: 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66 6f 72 28  eTerm *a;.  for(
20f0: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
2100: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
2110: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
2120: 66 28 20 61 2d 3e 66 6c 61 67 73 20 26 20 54 45  f( a->flags & TE
2130: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
2140: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2150: 65 6c 65 74 65 28 61 2d 3e 70 45 78 70 72 29 3b  elete(a->pExpr);
2160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2170: 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53   pWC->a!=pWC->aS
2180: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c  tatic ){.    sql
2190: 69 74 65 33 5f 66 72 65 65 28 70 57 43 2d 3e 61  ite3_free(pWC->a
21a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21b0: 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 69 65  Add a new entrie
21c0: 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43 6c  s to the WhereCl
21d0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
21e0: 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
21f0: 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61 63 65  located.** space
2200: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
2210: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6c 61 67  *.** If the flag
2220: 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75  s argument inclu
2230: 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  des TERM_DYNAMIC
2240: 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62  , then responsib
2250: 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65  ility.** for fre
2260: 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73 73  eing the express
2270: 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64  ion p is assumed
2280: 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c 61   by the WhereCla
2290: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  use object..**.*
22a0: 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73  * WARNING:  This
22b0: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
22c0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70  eallocate the sp
22d0: 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ace used to stor
22e0: 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e  e.** WhereTerms.
22f0: 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74    All pointers t
2300: 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f  o WhereTerms sho
2310: 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74  uld be invalidat
2320: 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c  ed after.** call
2330: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
2340: 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73  .  Such pointers
2350: 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61   may be reinitia
2360: 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e  lized by referen
2370: 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d  cing.** the pWC-
2380: 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  >a[] array..*/.s
2390: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43  tatic int whereC
23a0: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
23b0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
23c0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
23d0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
23e0: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
23f0: 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65  ;.  if( pWC->nTe
2400: 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29  rm>=pWC->nSlot )
2410: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
2420: 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a  *pOld = pWC->a;.
2430: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
2440: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  ite3Malloc( size
2450: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57  of(pWC->a[0])*pW
2460: 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20  C->nSlot*2 );.  
2470: 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20    if( pWC->a==0 
2480: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 70 50  ){.      pWC->pP
2490: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
24a0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
24b0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 54 45    if( flags & TE
24c0: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
24d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
24e0: 72 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20  rDelete(p);.    
24f0: 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e 61    }.      pWC->a
2500: 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72   = pOld;.      r
2510: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
2520: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
2530: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
2540: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
2550: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
2560: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
2570: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
2580: 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20  e3_free(pOld);. 
2590: 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53     }.    pWC->nS
25a0: 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20  lot *= 2;.  }.  
25b0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
25c0: 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d  idx = pWC->nTerm
25d0: 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b  ];.  pWC->nTerm+
25e0: 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70  +;.  pTerm->pExp
25f0: 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e  r = p;.  pTerm->
2600: 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
2610: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
2620: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
2630: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
2640: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
2650: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
2660: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
2670: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
2680: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
2690: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
26a0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
26b0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
26c0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
26d0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
26e0: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
26f0: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
2700: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
2710: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
2720: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
2730: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
2740: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
2750: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2760: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
2770: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
2780: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
2790: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
27a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
27b0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
27c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
27d0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
27e0: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
27f0: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
2800: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
2820: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
2830: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
2840: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
2850: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
2860: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2870: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
2880: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
2890: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
28a0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
28b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
28c0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
28d0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
28e0: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
28f0: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
2900: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
2910: 72 61 79 2e 20 20 54 68 69 73 20 61 72 72 61 79  ray.  This array
2920: 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64   grows as needed
2930: 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
2940: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
2950: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f  WHERE clause..*/
2960: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
2970: 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61  reSplit(WhereCla
2980: 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
2990: 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a  pExpr, int op){.
29a0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
29b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
29c0: 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a  Expr->op!=op ){.
29d0: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
29e0: 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72  nsert(pWC, pExpr
29f0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
2a00: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57     whereSplit(pW
2a10: 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  C, pExpr->pLeft,
2a20: 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53   op);.    whereS
2a30: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
2a40: 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20  >pRight, op);.  
2a50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  }.}../*.** Initi
2a60: 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73  alize an express
2a70: 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a  ion mask set.*/.
2a80: 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b  #define initMask
2a90: 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50  Set(P)  memset(P
2aa0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29  , 0, sizeof(*P))
2ab0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ac0: 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74  he bitmask for t
2ad0: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20  he given cursor 
2ae0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
2af0: 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20  0 if.** iCursor 
2b00: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65  is not in the se
2b10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  t..*/.static Bit
2b20: 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70  mask getMask(Exp
2b30: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
2b40: 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  et, int iCursor)
2b50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
2b60: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
2b70: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
2b80: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
2b90: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
2ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69       return ((Bi
2bb0: 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20  tmask)1)<<i;.   
2bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2bd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2be0: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
2bf0: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
2c00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
2c10: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
2c20: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2c30: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
2c40: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
2c50: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2c60: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
2c70: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
2c80: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
2c90: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
2ca0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
2cb0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
2cc0: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
2cd0: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
2ce0: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
2cf0: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
2d00: 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20  ask(ExprMaskSet 
2d10: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
2d20: 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72  Cursor){.  asser
2d30: 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c  t( pMaskSet->n <
2d40: 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b   ArraySize(pMask
2d50: 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d  Set->ix) );.  pM
2d60: 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b  askSet->ix[pMask
2d70: 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72  Set->n++] = iCur
2d80: 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sor;.}../*.** Th
2d90: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
2da0: 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61   (recursively) a
2db0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2dc0: 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a  e and generates.
2dd0: 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64  ** a bitmask ind
2de0: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61  icating which ta
2df0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  bles are used in
2e00: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
2e10: 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  .** tree..**.** 
2e20: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  In order for thi
2e30: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72  s routine to wor
2e40: 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  k, the calling f
2e50: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76  unction must hav
2e60: 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  e.** previously 
2e70: 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45  invoked sqlite3E
2e80: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
2e90: 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  ) on the express
2ea0: 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65  ion.  See.** the
2eb0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
2ec0: 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
2ed0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2ee0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54  nformation..** T
2ef0: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  he sqlite3ExprRe
2f00: 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75  solveNames() rou
2f10: 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20  tines looks for 
2f20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
2f30: 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f  .** sets their o
2f40: 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c  pcodes to TK_COL
2f50: 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78  UMN and their Ex
2f60: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
2f70: 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   to.** the VDBE 
2f80: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
2f90: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
2fa0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68  s routine just h
2fb0: 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61  as to.** transla
2fc0: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
2fd0: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61  mbers into bitma
2fe0: 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52  sk values and OR
2ff0: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d   all.** the bitm
3000: 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  asks together..*
3010: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
3020: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
3030: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a  age(ExprMaskSet*
3040: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
3050: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
3060: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
3070: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  e(ExprMaskSet*, 
3080: 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63  Select*);.static
3090: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62   Bitmask exprTab
30a0: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
30b0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
30c0: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
30d0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
30e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
30f0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
3100: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
3110: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
3120: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
3130: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
3140: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
3150: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
3160: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
3170: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
3180: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
3190: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
31a0: 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pLeft);.  mask |
31b0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
31c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
31d0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b  ->pList);.  mask
31e0: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
31f0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3200: 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  t, p->pSelect);.
3210: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
3220: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
3230: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
3240: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
3250: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
3260: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
3270: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
3280: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
3290: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
32a0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
32b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
32c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
32d0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
32e0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
32f0: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
3300: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
3310: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
3320: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
3330: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
3340: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65   *pMaskSet, Sele
3350: 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61  ct *pS){.  Bitma
3360: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77  sk mask = 0;.  w
3370: 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20 20  hile( pS ){.    
3380: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
3390: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
33a0: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
33b0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
33c0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
33d0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
33e0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
33f0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
3400: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
3410: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
3420: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3430: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3440: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
3450: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
3460: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
3470: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
3480: 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d 20  ving);.    pS = 
3490: 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  pS->pPrior;.  }.
34a0: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
34b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
34c0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
34d0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
34e0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
34f0: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
3500: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
3510: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
3520: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
3530: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
3540: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
3550: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
3560: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73  , and "IN"..*/.s
3570: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
3580: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
3590: 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f  ssert( TK_GT>TK_
35a0: 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47  EQ && TK_GT<TK_G
35b0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
35c0: 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LT>TK_EQ && TK
35d0: 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LT<TK_GE );.  a
35e0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f  ssert( TK_LE>TK_
35f0: 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47  EQ && TK_LE<TK_G
3600: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
3610: 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b  K_GE==TK_EQ+4 );
3620: 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b  .  return op==TK
3630: 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45  _IN || (op>=TK_E
3640: 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20  Q && op<=TK_GE) 
3650: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  || op==TK_ISNULL
3660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
3670: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
3680: 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ype T..*/.#defin
3690: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
36a0: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
36b0: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
36c0: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
36d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78  on operator.  Ex
36e0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
36f0: 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a   form "X op Y".*
3700: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
3710: 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a  into "Y op X"..*
3720: 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74  *.** If a collat
3730: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
3740: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3750: 65 69 74 68 65 72 20 74 68 65 20 6c 65 66 74 20  either the left 
3760: 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65  or right.** side
3770: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
3780: 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61  on, it remains a
3790: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
37a0: 68 65 20 73 61 6d 65 20 73 69 64 65 20 61 66 74  he same side aft
37b0: 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74  er.** the commut
37c0: 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c  ation. So "Y col
37d0: 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58  late NOCASE op X
37e0: 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58  " becomes .** "X
37f0: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
3800: 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73 20 62  op Y". This is b
3810: 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61  ecause any colla
3820: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e  tion sequence on
3830: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e  .** the left han
3840: 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70  d side of a comp
3850: 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73  arison overrides
3860: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
3870: 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61  equence .** atta
3880: 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67 68  ched to the righ
3890: 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20  t. For the same 
38a0: 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78  reason the EP_Ex
38b0: 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a  pCollate flag.**
38c0: 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64   is not commuted
38d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38e0: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70   exprCommute(Exp
38f0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36  r *pExpr){.  u16
3900: 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45 78   expRight = (pEx
3910: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
3920: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
3930: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
3940: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
3950: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3960: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73  pCollate);.  ass
3970: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70  ert( allowedOp(p
3980: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78  Expr->op) && pEx
3990: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b  pr->op!=TK_IN );
39a0: 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a  .  SWAP(CollSeq*
39b0: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  ,pExpr->pRight->
39c0: 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65  pColl,pExpr->pLe
39d0: 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45  ft->pColl);.  pE
39e0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
39f0: 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  gs = (pExpr->pRi
3a00: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50  ght->flags & ~EP
3a10: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65  _ExpCollate) | e
3a20: 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72 2d  xpLeft;.  pExpr-
3a30: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20  >pLeft->flags = 
3a40: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66  (pExpr->pLeft->f
3a50: 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f  lags & ~EP_ExpCo
3a60: 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67 68  llate) | expRigh
3a70: 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c  t;.  SWAP(Expr*,
3a80: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45  pExpr->pRight,pE
3a90: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
3aa0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  f( pExpr->op>=TK
3ab0: 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _GT ){.    asser
3ac0: 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b  t( TK_LT==TK_GT+
3ad0: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
3ae0: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20   TK_GE==TK_LE+2 
3af0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
3b00: 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20  K_GT>TK_EQ );.  
3b10: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c    assert( TK_GT<
3b20: 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  TK_LE );.    ass
3b30: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d  ert( pExpr->op>=
3b40: 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e  TK_GT && pExpr->
3b50: 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op<=TK_GE );.   
3b60: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70   pExpr->op = ((p
3b70: 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e  Expr->op-TK_GT)^
3b80: 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a  2)+TK_GT;.  }.}.
3b90: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
3ba0: 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72   from TK_xx oper
3bb0: 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69  ator to WO_xx bi
3bc0: 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  tmask..*/.static
3bd0: 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61 73   int operatorMas
3be0: 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74  k(int op){.  int
3bf0: 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c   c;.  assert( al
3c00: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20  lowedOp(op) );. 
3c10: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
3c20: 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b  {.    c = WO_IN;
3c30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
3c40: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
3c50: 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b    c = WO_ISNULL;
3c60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20  .  }else{.    c 
3c70: 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f  = WO_EQ<<(op-TK_
3c80: 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  EQ);.  }.  asser
3c90: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
3ca0: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
3cb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3cc0: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
3cd0: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
3ce0: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
3cf0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
3d00: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
3d10: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
3d20: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
3d30: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
3d40: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3d50: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
3d60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3d70: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
3d80: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
3d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
3da0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
3db0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3dc0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
3dd0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
3de0: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
3df0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
3e00: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
3e10: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
3e20: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
3e30: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
3e40: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
3e50: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
3e60: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
3e70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
3e80: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
3e90: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
3ea0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  d..*/.static Whe
3eb0: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
3ec0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
3ed0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
3ee0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
3ef0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
3f00: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
3f10: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
3f20: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
3f30: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
3f40: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
3f50: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
3f60: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
3f70: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
3f80: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
3f90: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
3fa0: 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36 20 6f 70  mask */.  u16 op
3fb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3fc0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
3fd0: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
3fe0: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
3ff0: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
4000: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
4010: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
4020: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
4030: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
4040: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
4050: 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 66  rm;.  int k;.  f
4060: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
4070: 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k=pWC->nTerm; k
4080: 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
4090: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
40a0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
40b0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72  .       && (pTer
40c0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
40d0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
40e0: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 6c       && pTerm->l
40f0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
4100: 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  mn.       && (pT
4110: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
4120: 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20   op)!=0.    ){. 
4130: 20 20 20 20 20 69 66 28 20 69 43 75 72 3e 3d 30       if( iCur>=0
4140: 20 26 26 20 70 49 64 78 20 26 26 20 70 54 65 72   && pIdx && pTer
4150: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
4160: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
4170: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
4180: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
4190: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
41a0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ll;.        char
41b0: 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20   idxaff;.       
41c0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
41d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
41e0: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  pWC->pParse;..  
41f0: 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70        idxaff = p
4200: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
4210: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
4220: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ity;.        if(
4230: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
4240: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78  finityOk(pX, idx
4250: 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  aff) ) continue;
4260: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67  ..        /* Fig
4270: 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c  ure out the coll
4280: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72  ation sequence r
4290: 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20  equired from an 
42a0: 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20  index for.      
42b0: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73    ** it to be us
42c0: 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73  eful for optimis
42d0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ing expression p
42e0: 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20  X. Store this.  
42f0: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69        ** value i
4300: 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c  n variable pColl
4310: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4320: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
4330: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
4340: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
4350: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
4360: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
4370: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
4380: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
4390: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
43a0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
43b0: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
43c0: 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  l;.        }..  
43d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
43e0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  <pIdx->nColumn &
43f0: 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  & pIdx->aiColumn
4400: 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b  [j]!=iColumn; j+
4410: 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 61 73 73  +){}.        ass
4420: 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  ert( j<pIdx->nCo
4430: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
4440: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
4450: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
4460: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
4470: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
4480: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
4490: 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a  rn pTerm;.    }.
44a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
44b0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
44c0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
44d0: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
44e0: 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65  ze(SrcList*, Whe
44f0: 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b  reClause*, int);
4500: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70  ../*.** Call exp
4510: 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20  rAnalyze on all 
4520: 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45  terms in a WHERE
4530: 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a   clause.  .**.**
4540: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4550: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a  exprAnalyzeAll(.
4560: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
4570: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68  ist,       /* th
4580: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
4590: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
45a0: 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74  pWC         /* t
45b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
45c0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
45d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
45e0: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
45f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
4600: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
4610: 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69  pTabList, pWC, i
4620: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
4630: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
4640: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
4650: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
4660: 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ee if the given 
4670: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
4680: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
4690: 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61  rator that.** ca
46a0: 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75  n be optimized u
46b0: 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20  sing inequality 
46c0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65  constraints.  Re
46d0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
46e0: 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c  is.** so and fal
46f0: 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  se if not..**.**
4700: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
4710: 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  e operator to be
4720: 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68   optimizible, th
4730: 65 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20  e RHS must be a 
4740: 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61  string.** litera
4750: 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  l that does not 
4760: 62 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c  begin with a wil
4770: 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74  dcard.  .*/.stat
4780: 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47  ic int isLikeOrG
4790: 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  lob(.  sqlite3 *
47a0: 64 62 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db,      /* The 
47b0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 45 78  database */.  Ex
47c0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
47d0: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
47e0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
47f0: 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f   *pnPattern,   /
4800: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  * Number of non-
4810: 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20  wildcard prefix 
4820: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
4830: 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  int *pisComplete
4840: 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  , /* True if the
4850: 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69   only wildcard i
4860: 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20  s % in the last 
4870: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
4880: 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20  nt *pnoCase     
4890: 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65   /* True if uppe
48a0: 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c  rcase is equival
48b0: 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65  ent to lowercase
48c0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
48d0: 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20 2a  har *z;.  Expr *
48e0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a  pRight, *pLeft;.
48f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4900: 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74 3b  t;.  int c, cnt;
4910: 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a 20  .  char wc[3];. 
4920: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
4930: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
4940: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
4950: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
4960: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
4970: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
4980: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
4990: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
49a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
49b0: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
49c0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69  pr->pList;.  pRi
49d0: 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  ght = pList->a[0
49e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
49f0: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54  Right->op!=TK_ST
4a00: 52 49 4e 47 0a 20 20 20 26 26 20 28 70 52 69 67  RING.   && (pRig
4a10: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  ht->op!=TK_REGIS
4a20: 54 45 52 20 7c 7c 20 70 52 69 67 68 74 2d 3e 69  TER || pRight->i
4a30: 43 6f 6c 75 6d 6e 21 3d 54 4b 5f 53 54 52 49 4e  Column!=TK_STRIN
4a40: 47 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  G) ){.    return
4a50: 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20   0;.  }.  pLeft 
4a60: 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  = pList->a[1].pE
4a70: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  xpr;.  if( pLeft
4a80: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4a90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4aa0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 70  .  }.  pColl = p
4ab0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 61  Left->pColl;.  a
4ac0: 73 73 65 72 74 28 20 70 43 6f 6c 6c 21 3d 30 20  ssert( pColl!=0 
4ad0: 7c 7c 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  || pLeft->iColum
4ae0: 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  n==-1 );.  if( p
4af0: 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Coll==0 ){.    /
4b00: 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 69  * No collation i
4b10: 73 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68  s defined for th
4b20: 65 20 52 4f 57 49 44 2e 20 20 55 73 65 20 74 68  e ROWID.  Use th
4b30: 65 20 64 65 66 61 75 6c 74 2e 20 2a 2f 0a 20 20  e default. */.  
4b40: 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    pColl = db->pD
4b50: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69  fltColl;.  }.  i
4b60: 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21  f( (pColl->type!
4b70: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e  =SQLITE_COLL_BIN
4b80: 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61 73 65 29  ARY || *pnoCase)
4b90: 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c   &&.      (pColl
4ba0: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
4bb0: 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 2a  OLL_NOCASE || !*
4bc0: 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20  pnoCase) ){.    
4bd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4be0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
4bf0: 70 72 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  pr(db, pRight);.
4c00: 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 52    z = (char *)pR
4c10: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  ight->token.z;. 
4c20: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
4c30: 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  z ){.    while( 
4c40: 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26  (c=z[cnt])!=0 &&
4c50: 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d   c!=wc[0] && c!=
4c60: 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32  wc[1] && c!=wc[2
4c70: 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20  ] ){ cnt++; }.  
4c80: 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 7c  }.  if( cnt==0 |
4c90: 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74  | 255==(u8)z[cnt
4ca0: 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ] ){.    return 
4cb0: 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d  0;.  }.  *pisCom
4cc0: 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d  plete = z[cnt]==
4cd0: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
4ce0: 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65  ]==0;.  *pnPatte
4cf0: 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75  rn = cnt;.  retu
4d00: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
4d10: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
4d20: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
4d30: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
4d40: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4d50: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
4d60: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
4d70: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
4d80: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
4d90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
4da0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
4db0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
4dc0: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
4dd0: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
4de0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
4df0: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
4e00: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
4e10: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
4e20: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
4e30: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
4e40: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
4e50: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
4e60: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
4e70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4e80: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
4e90: 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20 20 20 20  .n!=5 ||.       
4ea0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
4eb0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 45 78  (const char*)pEx
4ec0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 74  pr->token.z,"mat
4ed0: 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20 20 20  ch",5)!=0 ){.   
4ee0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4ef0: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
4f00: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
4f10: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
4f20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4f30: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
4f40: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
4f50: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
4f60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4f70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
4f80: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4f90: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4fa0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
4fb0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
4fc0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
4fd0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
4fe0: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
4ff0: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
5000: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
5010: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
5020: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
5030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
5040: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
5050: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
5060: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
5070: 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67    pDerived->flag
5080: 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67  s |= pBase->flag
5090: 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b  s & EP_FromJoin;
50a0: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69  .  pDerived->iRi
50b0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
50c0: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
50d0: 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64  Table;.}..#if !d
50e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
50f0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
5100: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
5110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5120: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UERY)./*.** Retu
5130: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
5140: 69 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20  iven term of an 
5150: 4f 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65  OR clause can be
5160: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 69 6e   converted.** in
5170: 74 6f 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 2e  to an IN clause.
5180: 20 20 54 68 65 20 69 43 75 72 73 6f 72 20 61 6e    The iCursor an
5190: 64 20 69 43 6f 6c 75 6d 6e 20 64 65 66 69 6e 65  d iColumn define
51a0: 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 0a 2a   the left-hand.*
51b0: 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  * side of the IN
51c0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   clause..**.** T
51d0: 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20 74 68  he context is th
51e0: 61 74 20 77 65 20 68 61 76 65 20 6d 75 6c 74 69  at we have multi
51f0: 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ple OR-connected
5200: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 0a   equality terms.
5210: 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
5220: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d  .**           a=
5230: 3c 65 78 70 72 31 3e 20 4f 52 20 20 61 3d 3c 65  <expr1> OR  a=<e
5240: 78 70 72 32 3e 20 4f 52 20 62 3d 3c 65 78 70 72  xpr2> OR b=<expr
5250: 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  3>  OR ....**.**
5260: 20 54 68 65 20 70 4f 72 54 65 72 6d 20 69 6e 70   The pOrTerm inp
5270: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
5280: 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ne corresponds t
5290: 6f 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  o a single term 
52a0: 6f 66 0a 2a 2a 20 74 68 69 73 20 4f 52 20 63 6c  of.** this OR cl
52b0: 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72 20  ause.  In order 
52c0: 66 6f 72 20 74 68 65 20 74 65 72 6d 20 74 6f 20  for the term to 
52d0: 62 65 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  be a candidate f
52e0: 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  or.** conversion
52f0: 20 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   to an IN operat
5300: 6f 72 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  or, the followin
5310: 67 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a 0a  g must be true:.
5320: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65  **.**     *  The
5330: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
5340: 6f 66 20 74 68 65 20 74 65 72 6d 20 6d 75 73 74  of the term must
5350: 20 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   be the column w
5360: 68 69 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 69  hich.**        i
5370: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
5380: 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c  iCursor and iCol
5390: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  umn..**.**     *
53a0: 20 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68    If the right-h
53b0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
53c0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
53d0: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 2a  the affinities.*
53e0: 2a 20 20 20 20 20 20 20 20 6f 66 20 62 6f 74 68  *        of both
53f0: 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20   right and left 
5400: 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75  sides must be su
5410: 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a  ch that no type.
5420: 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 76 65 72  **        conver
5430: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
5440: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
5450: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
5460: 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 6f  .**.** If both o
5470: 66 20 74 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  f these conditio
5480: 6e 73 20 61 72 65 20 74 72 75 65 2c 20 74 68 65  ns are true, the
5490: 6e 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  n return true.  
54a0: 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74  Otherwise.** ret
54b0: 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74  urn false..*/.st
54c0: 61 74 69 63 20 69 6e 74 20 6f 72 54 65 72 6d 49  atic int orTermI
54d0: 73 4f 70 74 43 61 6e 64 69 64 61 74 65 28 57 68  sOptCandidate(Wh
54e0: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
54f0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 69  , int iCursor, i
5500: 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69  nt iColumn){.  i
5510: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
5520: 69 67 68 74 3b 0a 20 20 61 73 73 65 72 74 28 20  ight;.  assert( 
5530: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
5540: 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 69  or==WO_EQ );.  i
5550: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
5560: 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72 20  Cursor!=iCursor 
5570: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
5580: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 54 65  .  }.  if( pOrTe
5590: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d  rm->leftColumn!=
55a0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  iColumn ){.    r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
55c0: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
55d0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
55e0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
55f0: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 61 66 66  ight);.  if( aff
5600: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
5610: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5620: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
5630: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
5640: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
5650: 65 66 74 29 3b 0a 20 20 69 66 28 20 61 66 66 52  eft);.  if( affR
5660: 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29 7b  ight!=affLeft ){
5670: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5680: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
5690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
56a0: 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
56b0: 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 20 63   term of an OR c
56c0: 6c 61 75 73 65 20 63 61 6e 20 62 65 20 69 67 6e  lause can be ign
56d0: 6f 72 65 64 20 64 75 72 69 6e 67 0a 2a 2a 20 61  ored during.** a
56e0: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
56f0: 75 72 65 20 61 6c 6c 20 4f 52 20 74 65 72 6d 73  ure all OR terms
5700: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
5710: 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  for optimization
5720: 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  ..** In other wo
5730: 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rds, return true
5740: 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 74 68   if a call to th
5750: 65 20 6f 72 54 65 72 6d 49 73 4f 70 74 43 61 6e  e orTermIsOptCan
5760: 64 69 64 61 74 65 28 29 0a 2a 2a 20 61 62 6f 76  didate().** abov
5770: 65 20 72 65 74 75 72 6e 65 64 20 66 61 6c 73 65  e returned false
5780: 20 62 75 74 20 69 74 20 69 73 20 6e 6f 74 20 6e   but it is not n
5790: 65 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 71  ecessary to disq
57a0: 75 61 6c 69 66 79 20 74 68 65 0a 2a 2a 20 6f 70  ualify the.** op
57b0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  timization..**.*
57c0: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6f 72  * Suppose the or
57d0: 69 67 69 6e 61 6c 20 4f 52 20 70 68 72 61 73 65  iginal OR phrase
57e0: 20 77 61 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a   was this:.**.**
57f0: 20 20 20 20 20 20 20 20 20 20 20 61 3d 34 20 20             a=4  
5800: 4f 52 20 20 61 3d 31 31 20 20 4f 52 20 20 61 3d  OR  a=11  OR  a=
5810: 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  b.**.** During a
5820: 6e 61 6c 79 73 69 73 2c 20 74 68 65 20 74 68 69  nalysis, the thi
5830: 72 64 20 74 65 72 6d 20 67 65 74 73 20 66 6c 69  rd term gets fli
5840: 70 70 65 64 20 61 72 6f 75 6e 64 20 61 6e 64 20  pped around and 
5850: 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 73 6f 20  duplicate.** so 
5860: 74 68 61 74 20 77 65 20 61 72 65 20 6c 65 66 74  that we are left
5870: 20 77 69 74 68 20 74 68 69 73 3a 0a 2a 2a 0a 2a   with this:.**.*
5880: 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d 34 20  *           a=4 
5890: 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20 20 61   OR  a=11  OR  a
58a0: 3d 62 20 20 4f 52 20 20 62 3d 61 0a 2a 2a 0a 2a  =b  OR  b=a.**.*
58b0: 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 61 73 74  * Since the last
58c0: 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 20 64   two terms are d
58d0: 75 70 6c 69 63 61 74 65 73 2c 20 6f 6e 6c 79 20  uplicates, only 
58e0: 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 2a 2a 20 68  one of them.** h
58f0: 61 73 20 74 6f 20 71 75 61 6c 69 66 79 20 69 6e  as to qualify in
5900: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 77   order for the w
5910: 68 6f 6c 65 20 70 68 72 61 73 65 20 74 6f 20 71  hole phrase to q
5920: 75 61 6c 69 66 79 2e 20 20 57 68 65 6e 0a 2a 2a  ualify.  When.**
5930: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5940: 20 63 61 6c 6c 65 64 2c 20 77 65 20 6b 6e 6f 77   called, we know
5950: 20 74 68 61 74 20 70 4f 72 54 65 72 6d 20 64 69   that pOrTerm di
5960: 64 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e 0a 2a  d not qualify..*
5970: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
5980: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5990: 73 65 65 20 69 66 20 70 4f 72 54 65 72 6d 20 68  see if pOrTerm h
59a0: 61 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 74  as a duplicate t
59b0: 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 71 75 61  hat.** might qua
59c0: 6c 69 66 79 2e 20 20 49 66 20 74 68 65 72 65 20  lify.  If there 
59d0: 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 74  is a duplicate t
59e0: 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  hat has not yet 
59f0: 62 65 65 6e 0a 2a 2a 20 64 69 73 71 75 61 6c 69  been.** disquali
5a00: 66 69 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72  fied, then retur
5a10: 6e 20 74 72 75 65 2e 20 20 49 66 20 74 68 65 72  n true.  If ther
5a20: 65 20 61 72 65 20 6e 6f 20 64 75 70 6c 69 63 61  e are no duplica
5a30: 74 65 73 2c 20 6f 72 0a 2a 2a 20 74 68 65 20 64  tes, or.** the d
5a40: 75 70 6c 69 63 61 74 65 20 68 61 73 20 61 6c 73  uplicate has als
5a50: 6f 20 62 65 65 6e 20 64 69 73 71 75 61 6c 69 66  o been disqualif
5a60: 69 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ied, return fals
5a70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5a80: 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70 6c   orTermHasOkDupl
5a90: 69 63 61 74 65 28 57 68 65 72 65 43 6c 61 75 73  icate(WhereClaus
5aa0: 65 20 2a 70 4f 72 2c 20 57 68 65 72 65 54 65 72  e *pOr, WhereTer
5ab0: 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a 20 20 69  m *pOrTerm){.  i
5ac0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67  f( pOrTerm->flag
5ad0: 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  s & TERM_COPIED 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
5af0: 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  s the original t
5b00: 65 72 6d 2e 20 20 54 68 65 20 64 75 70 6c 69 63  erm.  The duplic
5b10: 61 74 65 20 69 73 20 74 6f 20 74 68 65 20 6c 65  ate is to the le
5b20: 66 74 20 68 61 64 0a 20 20 20 20 2a 2a 20 68 61  ft had.    ** ha
5b30: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 61  s not yet been a
5b40: 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74 68 75 73  nalyzed and thus
5b50: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
5b60: 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64 2e 20  n disqualified. 
5b70: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
5b80: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4f 72 54  .  }.  if( (pOrT
5b90: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
5ba0: 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 0a 20 20  M_VIRTUAL)!=0.  
5bb0: 20 20 20 26 26 20 28 70 4f 72 2d 3e 61 5b 70 4f     && (pOr->a[pO
5bc0: 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e  rTerm->iParent].
5bd0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f  flags & TERM_OR_
5be0: 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  OK)!=0 ){.    /*
5bf0: 20 54 68 69 73 20 69 73 20 61 20 64 75 70 6c 69   This is a dupli
5c00: 63 61 74 65 20 74 65 72 6d 2e 20 20 54 68 65 20  cate term.  The 
5c10: 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c 69 66 69  original qualifi
5c20: 65 64 20 73 6f 20 74 68 69 73 20 6f 6e 65 0a 20  ed so this one. 
5c30: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68     ** does not h
5c40: 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20 20 20 72  ave to. */.    r
5c50: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 2f  eturn 1;.  }.  /
5c60: 2a 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  * This is either
5c70: 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20 74 65 72   a singleton ter
5c80: 6d 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20  m or else it is 
5c90: 61 20 64 75 70 6c 69 63 61 74 65 20 66 6f 72 0a  a duplicate for.
5ca0: 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6f    ** which the o
5cb0: 72 69 67 69 6e 61 6c 20 64 69 64 20 6e 6f 74 20  riginal did not 
5cc0: 71 75 61 6c 69 66 79 2e 20 20 45 69 74 68 65 72  qualify.  Either
5cd0: 20 77 61 79 20 77 65 20 61 72 65 20 64 6f 6e 65   way we are done
5ce0: 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65 74 75 72   for. */.  retur
5cf0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
5d00: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52   !SQLITE_OMIT_OR
5d10: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26  _OPTIMIZATION &&
5d20: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55   !SQLITE_OMIT_SU
5d30: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
5d40: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
5d50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
5d60: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
5d70: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
5d80: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
5d90: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
5da0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
5db0: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
5dc0: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
5dd0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
5de0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
5df0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
5e00: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
5e10: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
5e20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5e30: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
5e40: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
5e50: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
5e60: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
5e70: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
5e80: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20  X <op> <expr>". 
5e90: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
5ea0: 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74 68 65 20  on is of.** the 
5eb0: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
5ec0: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
5ed0: 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20   Y are columns, 
5ee0: 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  then the origina
5ef0: 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  l.** expression 
5f00: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
5f10: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 65   a new virtual e
5f20: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
5f30: 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e   form.** "Y <op>
5f40: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
5f50: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5f60: 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64 20 73 65   and analyzed se
5f70: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
5f80: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
5f90: 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20  lyze(.  SrcList 
5fa0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
5fb0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
5fc0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
5fd0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
5fe0: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5ff0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
6000: 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20   idxTerm        
6010: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
6020: 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  of the term to b
6030: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
6040: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
6050: 65 72 6d 3b 0a 20 20 45 78 70 72 4d 61 73 6b 53  erm;.  ExprMaskS
6060: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 0a 20 20  et *pMaskSet;.  
6070: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 42  Expr *pExpr;.  B
6080: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
6090: 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  t;.  Bitmask pre
60a0: 72 65 71 41 6c 6c 3b 0a 20 20 42 69 74 6d 61 73  reqAll;.  Bitmas
60b0: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
60c0: 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  ;.  int nPattern
60d0: 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65  ;.  int isComple
60e0: 74 65 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65  te;.  int noCase
60f0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 50 61  ;.  int op;.  Pa
6100: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
6110: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  C->pParse;.  sql
6120: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6130: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62  e->db;..  if( db
6140: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6150: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
6160: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
6170: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
6180: 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e  pMaskSet = pWC->
6190: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70  pMaskSet;.  pExp
61a0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
61b0: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
61c0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
61d0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
61e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20  >pLeft);.  op = 
61f0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
6200: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
6210: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
6220: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
6230: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
6240: 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54  ight = exprListT
6250: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
6260: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  et, pExpr->pList
6270: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
6280: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 65 78              | ex
6290: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
62a0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
62b0: 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  pr->pSelect);.  
62c0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
62d0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  _ISNULL ){.    p
62e0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
62f0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
6300: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
6310: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
6320: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6330: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
6340: 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c  ;.  }.  prereqAl
6350: 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  l = exprTableUsa
6360: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
6370: 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48  pr);.  if( ExprH
6380: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
6390: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
63a0: 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20  {.    Bitmask x 
63b0: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
63c0: 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68  et, pExpr->iRigh
63d0: 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20  tJoinTable);.   
63e0: 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b   prereqAll |= x;
63f0: 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20  .    extraRight 
6400: 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c  = x-1;  /* ON cl
6410: 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e  ause terms may n
6420: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
6430: 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  an index.       
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65  ** on left table
6460: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
6470: 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a    Ticket #3015 *
6480: 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  /.  }.  pTerm->p
6490: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
64a0: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
64b0: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
64c0: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
64d0: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
64e0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
64f0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
6500: 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72  p) && (pTerm->pr
6510: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
6520: 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20  eqLeft)==0 ){.  
6530: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
6540: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
6550: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
6560: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
6570: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
6580: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
6590: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
65a0: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
65b0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
65c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
65d0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
65e0: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
65f0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
6600: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20  atorMask(op);.  
6610: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
6620: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
6630: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
6640: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
6650: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
6660: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
6670: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
6680: 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sor>=0 ){.      
6690: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
66a0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
66b0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
66c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
66d0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
66e0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
66f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6700: 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ete(pDup);.     
6710: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6730: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
6740: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
6750: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
6760: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
6770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
6780: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
6790: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
67a0: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
67b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
67c0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
67d0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
67e0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
67f0: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
6800: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
6810: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c         pTerm->fl
6820: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
6830: 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ED;.      }else{
6840: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
6850: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
6860: 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  New = pTerm;.   
6870: 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43     }.      exprC
6880: 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20  ommute(pDup);.  
6890: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70      pLeft = pDup
68a0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  ->pLeft;.      p
68b0: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
68c0: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
68d0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66  .      pNew->lef
68e0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
68f0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
6900: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
6910: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a  t = prereqLeft;.
6920: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
6930: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
6940: 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  l;.      pNew->e
6950: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
6960: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
6970: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
6980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6990: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
69a0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
69b0: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
69c0: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
69d0: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
69e0: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
69f0: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
6a00: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
6a10: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
6a20: 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ts..  */.  else 
6a30: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
6a40: 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20  K_BETWEEN ){.   
6a50: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6a60: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
6a70: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6a80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
6a90: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
6aa0: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
6ab0: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
6ac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
6ad0: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
6ae0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
6af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6b00: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
6b10: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
6b20: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
6b30: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
6b40: 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45  ops[i], sqlite3E
6b50: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
6b60: 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20 20 20  ->pLeft),.      
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6b90: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
6ba0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29  >a[i].pExpr), 0)
6bb0: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
6bc0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
6bd0: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
6be0: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
6bf0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
6c00: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
6c10: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
6c20: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
6c30: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
6c40: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
6c50: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
6c60: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
6c70: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
6c80: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
6c90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6ca0: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
6cb0: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
6cc0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6cd0: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6ce0: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6cf0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6d00: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74  BQUERY).  /* Att
6d10: 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20  empt to convert 
6d20: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
6d30: 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ms into an IN op
6d40: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20  erator so that. 
6d50: 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b   ** they can mak
6d60: 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
6d70: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  .  Example:.  **
6d80: 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  .  **      x = e
6d90: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
6da0: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
6db0: 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  r3.  **.  ** is 
6dc0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20  converted into. 
6dd0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
6de0: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
6df0: 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  expr3).  **.  **
6e00: 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
6e10: 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74  on must be omitt
6e20: 65 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55  ed if OMIT_SUBQU
6e30: 45 52 59 20 69 73 20 64 65 66 69 6e 65 64 20 62  ERY is defined b
6e40: 65 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  ecause.  ** the 
6e50: 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65  compiler for the
6e60: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
6e70: 20 69 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d   is part of sub-
6e80: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
6e90: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
6ea0: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
6eb0: 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74   int ok;.    int
6ec0: 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69   i, j;.    int i
6ed0: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b  Column, iCursor;
6ee0: 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
6ef0: 20 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54   sOr;.    WhereT
6f00: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20  erm *pOrTerm;.. 
6f10: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
6f20: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
6f30: 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20  DYNAMIC)==0 );. 
6f40: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
6f50: 69 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50  it(&sOr, pWC->pP
6f60: 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
6f70: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
6f80: 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f  &sOr, pExpr, TK_
6f90: 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  OR);.    exprAna
6fa0: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26 73  lyzeAll(pSrc, &s
6fb0: 4f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Or);.    assert(
6fc0: 20 73 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b   sOr.nTerm>=2 );
6fd0: 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
6fe0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
6ff0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 6f 72 5f 6e  iled ) goto or_n
7000: 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20  ot_possible;.   
7010: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
7020: 74 28 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29  t( j<sOr.nTerm )
7030: 3b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20  ;.      iColumn 
7040: 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43  = sOr.a[j].leftC
7050: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75  olumn;.      iCu
7060: 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  rsor = sOr.a[j].
7070: 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  leftCursor;.    
7080: 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d    ok = iCursor>=
7090: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73  0;.      for(i=s
70a0: 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  Or.nTerm-1, pOrT
70b0: 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20  erm=sOr.a; i>=0 
70c0: 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54  && ok; i--, pOrT
70d0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
70e0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  if( pOrTerm->eOp
70f0: 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b  erator!=WO_EQ ){
7100: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
7110: 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b  or_not_possible;
7120: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7130: 20 20 20 69 66 28 20 6f 72 54 65 72 6d 49 73 4f     if( orTermIsO
7140: 70 74 43 61 6e 64 69 64 61 74 65 28 70 4f 72 54  ptCandidate(pOrT
7150: 65 72 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69 43  erm, iCursor, iC
7160: 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20  olumn) ){.      
7170: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61      pOrTerm->fla
7180: 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b  gs |= TERM_OR_OK
7190: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
71a0: 69 66 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44  if( orTermHasOkD
71b0: 75 70 6c 69 63 61 74 65 28 26 73 4f 72 2c 20 70  uplicate(&sOr, p
71c0: 4f 72 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20  OrTerm) ){.     
71d0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
71e0: 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f  ags &= ~TERM_OR_
71f0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
7200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20  e{.          ok 
7210: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
7220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
7230: 65 28 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61  e( !ok && (sOr.a
7240: 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45  [j++].flags & TE
7250: 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26  RM_COPIED)!=0 &&
7260: 20 6a 3c 32 20 29 3b 0a 20 20 20 20 69 66 28 20   j<2 );.    if( 
7270: 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  ok ){.      Expr
7280: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
7290: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
72a0: 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  w, *pDup;.      
72b0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
72c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72  .      for(i=sOr
72d0: 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  .nTerm-1, pOrTer
72e0: 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26  m=sOr.a; i>=0 &&
72f0: 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72   ok; i--, pOrTer
7300: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
7310: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67  ( (pOrTerm->flag
7320: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d  s & TERM_OR_OK)=
7330: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7340: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
7350: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7360: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
7370: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
7380: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
7390: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
73a0: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69  pWC->pParse, pLi
73b0: 73 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20  st, pDup, 0);.  
73c0: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
73d0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
73e0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
73f0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
7400: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
7410: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
7420: 75 70 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20  up(db, pLeft);. 
7430: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
7440: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
7450: 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a  N, pDup, 0, 0);.
7460: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
7470: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
7480: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72  xNew;.        tr
7490: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
74a0: 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  gs(pNew, pExpr);
74b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
74c0: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
74d0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
74e0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
74f0: 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d  (pWC, pNew, TERM
7500: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
7510: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
7520: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
7530: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
7540: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
7550: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
7560: 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61  ;.        pWC->a
7570: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
7580: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
7590: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
75a0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
75b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
75c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
75d0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
75e0: 7d 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70  }.    }.or_not_p
75f0: 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 77 68 65  ossible:.    whe
7600: 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 73  reClauseClear(&s
7610: 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  Or);.  }.#endif 
7620: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
7630: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
7640: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
7650: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
7660: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
7670: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
7680: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
7690: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
76a0: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
76b0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
76c0: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
76d0: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
76e0: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
76f0: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
7700: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
7710: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
7720: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
7730: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
7740: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
7750: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
7760: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
7770: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
7780: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
7790: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
77a0: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
77b0: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  "..  */.  if( is
77c0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 64 62 2c 20 70  LikeOrGlob(db, p
77d0: 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c  Expr, &nPattern,
77e0: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
77f0: 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78  oCase) ){.    Ex
7800: 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  pr *pLeft, *pRig
7810: 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  ht;.    Expr *pS
7820: 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20  tr1, *pStr2;.   
7830: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
7840: 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20  , *pNewExpr2;.  
7850: 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69    int idxNew1, i
7860: 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65  dxNew2;..    pLe
7870: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ft = pExpr->pLis
7880: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
7890: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
78a0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
78b0: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20  Expr;.    pStr1 
78c0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
78d0: 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47  Parse, TK_STRING
78e0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
78f0: 69 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20  if( pStr1 ){.   
7900: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
7910: 6f 70 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e  opy(db, &pStr1->
7920: 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e  token, &pRight->
7930: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53  token);.      pS
7940: 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e  tr1->token.n = n
7950: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70  Pattern;.      p
7960: 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50  Str1->flags = EP
7970: 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d  _Dequoted;.    }
7980: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
7990: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
79a0: 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20  pStr1);.    if( 
79b0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
79c0: 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
79d0: 20 2a 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65   *pC;.      asse
79e0: 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e  rt( pStr2->token
79f0: 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43  .dyn );.      pC
7a00: 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e   = (u8*)&pStr2->
7a10: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
7a20: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
7a30: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
7a40: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
7a50: 69 66 28 20 63 3d 3d 27 40 27 20 29 20 69 73 43  if( c=='@' ) isC
7a60: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
7a70: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
7a80: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
7a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
7aa0: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
7ab0: 7d 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  }.    pNewExpr1 
7ac0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7ad0: 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71  Parse, TK_GE, sq
7ae0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7af0: 70 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30  pLeft), pStr1, 0
7b00: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
7b10: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
7b20: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
7b30: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
7b40: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
7b50: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
7b60: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
7b70: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
7b80: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
7b90: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20  (pParse, TK_LT, 
7ba0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7bb0: 62 2c 70 4c 65 66 74 29 2c 20 70 53 74 72 32 2c  b,pLeft), pStr2,
7bc0: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
7bd0: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
7be0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
7bf0: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
7c00: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
7c10: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
7c20: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
7c30: 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
7c40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
7c50: 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
7c60: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
7c70: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
7c80: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7c90: 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
7ca0: 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
7cb0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
7cc0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
7cd0: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
7ce0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7cf0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
7d00: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
7d10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7d20: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
7d30: 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20   Add a WO_MATCH 
7d40: 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74  auxiliary term t
7d50: 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  o the constraint
7d60: 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   set if the.  **
7d70: 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73   current express
7d80: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
7d90: 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43  rm:  column MATC
7da0: 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69  H expr..  ** Thi
7db0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
7dc0: 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
7dd0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
7de0: 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
7df0: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
7e00: 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
7e10: 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
7e20: 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
7e30: 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
7e40: 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
7e50: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63   */.  if( isMatc
7e60: 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29  hOfColumn(pExpr)
7e70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e   ){.    int idxN
7e80: 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ew;.    Expr *pR
7e90: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
7ea0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
7eb0: 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61  wTerm;.    Bitma
7ec0: 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c  sk prereqColumn,
7ed0: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20   prereqExpr;..  
7ee0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
7ef0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
7f00: 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  xpr;.    pLeft =
7f10: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
7f20: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
7f30: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
7f40: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7f50: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
7f60: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
7f70: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
7f80: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
7f90: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
7fa0: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
7fb0: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
7fc0: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
7fd0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
7fe0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
7ff0: 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20  b, TK_MATCH, 0, 
8000: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8010: 62 2c 20 70 52 69 67 68 74 29 2c 20 30 29 3b 0a  b, pRight), 0);.
8020: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
8030: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
8040: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
8050: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
8060: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
8070: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
8080: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
8090: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
80a0: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
80b0: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
80c0: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
80d0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
80e0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
80f0: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
8100: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
8110: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
8120: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
8130: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
8140: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
8150: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
8160: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
8170: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
8180: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
8190: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
81a0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
81b0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
81c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
81d0: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
81e0: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
81f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8200: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8210: 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e   */..  /* Preven
8220: 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  t ON clause term
8230: 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  s of a LEFT JOIN
8240: 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64   from being used
8250: 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61   to drive.  ** a
8260: 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c  n index for tabl
8270: 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
8280: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
8290: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
82a0: 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69  Right |= extraRi
82b0: 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ght;.}../*.** Re
82c0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79  turn TRUE if any
82d0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
82e0: 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  ons in pList->a[
82f0: 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61  iFirst...] conta
8300: 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  in.** a referenc
8310: 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f  e to any table o
8320: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 42  ther than the iB
8330: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ase table..*/.st
8340: 61 74 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e  atic int referen
8350: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a  cesOtherTables(.
8360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8370: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t,          /* S
8380: 65 61 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e  earch expression
8390: 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f  s in ths list */
83a0: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
83b0: 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20  pMaskSet,    /* 
83c0: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
83d0: 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a  les to bitmaps *
83e0: 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8400: 20 42 65 20 73 65 61 72 63 68 69 6e 67 20 77 69   Be searching wi
8410: 74 68 20 74 68 65 20 69 46 69 72 73 74 2d 74 68  th the iFirst-th
8420: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8430: 20 69 6e 74 20 69 42 61 73 65 20 20 20 20 20 20   int iBase      
8440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
8450: 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20  nore references 
8460: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
8470: 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c  .){.  Bitmask al
8480: 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b  lowed = ~getMask
8490: 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65  (pMaskSet, iBase
84a0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72  );.  while( iFir
84b0: 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  st<pList->nExpr 
84c0: 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70 72  ){.    if( (expr
84d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
84e0: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46  Set, pList->a[iF
84f0: 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61  irst++].pExpr)&a
8500: 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20  llowed)!=0 ){.  
8510: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8520: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8530: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
8540: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
8550: 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
8560: 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
8570: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
8580: 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74  * clause.  If it
8590: 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73   can, it returns
85a0: 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e   1.  If pIdx can
85b0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a  not satisfy the.
85c0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
85d0: 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
85e0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
85f0: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
8600: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8610: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
8620: 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20  tatement.  pTab 
8630: 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  is the.** left-m
8640: 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ost table in the
8650: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
8660: 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54  that same SELECT
8670: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a   statement and.*
8680: 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  * the table has 
8690: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
86a0: 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78  of "base".  pIdx
86b0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
86c0: 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43  pTab..**.** nEqC
86d0: 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ol is the number
86e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70   of columns of p
86f0: 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65  Idx that are use
8700: 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a  d as equality.**
8710: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41   constraints.  A
8720: 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75  ny of these colu
8730: 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69  mns may be missi
8740: 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  ng from the ORDE
8750: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61  R BY.** clause a
8760: 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e  nd the match can
8770: 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63   still be a succ
8780: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  ess..**.** All t
8790: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
87a0: 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20  R BY that match 
87b0: 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
87c0: 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  x must be either
87d0: 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e  .** ASC or DESC.
87e0: 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20    (Terms of the 
87f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8800: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
8810: 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65  a UNIQUE.** inde
8820: 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  x do not need to
8830: 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f   satisfy this co
8840: 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20  nstraint.)  The 
8850: 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a  *pbRev value is.
8860: 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  ** set to 1 if t
8870: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8880: 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61  se is all DESC a
8890: 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  nd it is set to 
88a0: 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45  0 if.** the ORDE
88b0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
88c0: 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69  ll ASC..*/.stati
88d0: 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
88e0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
88f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8900: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8910: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b  xt */.  ExprMask
8920: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
8930: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
8940: 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f  table indices to
8950: 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e   bitmaps */.  In
8960: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
8970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
8980: 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
8990: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  g */.  int base,
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
89b0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
89c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f  for the table to
89d0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
89e0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
89f0: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
8a00: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
8a10: 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20  /.  int nEqCol, 
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8a30: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63  umber of index c
8a40: 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63  olumns with == c
8a50: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
8a60: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
8a70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
8a80: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
8a90: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
8aa0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
8ad0: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
8ae0: 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  der = 0;        
8af0: 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20        /* XOR of 
8b00: 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20  index and ORDER 
8b10: 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f  BY sort directio
8b20: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  n */.  int nTerm
8b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8b50: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
8b60: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  ms */.  struct E
8b70: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
8b80: 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72  erm;    /* A ter
8b90: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
8ba0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
8bb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8bc0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
8bd0: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
8be0: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
8bf0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
8c00: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
8c10: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
8c20: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
8c30: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
8c40: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
8c50: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
8c60: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
8c70: 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70  t indices have p
8c80: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67  Idx->nColumn reg
8c90: 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  ular columns plu
8ca0: 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74  s.  ** one addit
8cb0: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e  ional column con
8cc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69  taining the rowi
8cd0: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f  d.  The rowid co
8ce0: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  lumn.  ** of the
8cf0: 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61   index is also a
8d00: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
8d10: 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45  against the ORDE
8d20: 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
8d30: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a  ..  */.  for(i=j
8d40: 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72  =0, pTerm=pOrder
8d50: 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26  By->a; j<nTerm &
8d60: 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  & i<=pIdx->nColu
8d70: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  mn; i++){.    Ex
8d80: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
8d90: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
8da0: 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
8db0: 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20  BY pTerm */.    
8dc0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
8dd0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
8de0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
8df0: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74  pExpr */.    int
8e00: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20   termSortOrder; 
8e10: 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f  /* Sort order fo
8e20: 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  r this term */. 
8e30: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20     int iColumn; 
8e40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
8e50: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
8e60: 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72  index.  -1 for r
8e70: 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
8e80: 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f  iSortOrder;    /
8e90: 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20  * 1 for DESC, 0 
8ea0: 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69  for ASC on the i
8eb0: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
8ec0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
8ed0: 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65   *zColl; /* Name
8ee0: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   of the collatin
8ef0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69  g sequence for i
8f00: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
8f10: 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  /..    pExpr = p
8f20: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
8f30: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
8f40: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
8f50: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
8f60: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e   ){.      /* Can
8f70: 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65   not use an inde
8f80: 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69  x sort on anythi
8f90: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
8fa0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20   column in the. 
8fb0: 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73       ** left-mos
8fc0: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46  t table of the F
8fd0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
8fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8ff0: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
9000: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
9010: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
9020: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9030: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
9040: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
9050: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
9060: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
9070: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
9080: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
9090: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ];.      if( iCo
90a0: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62  lumn==pIdx->pTab
90b0: 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  le->iPKey ){.   
90c0: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
90d0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
90e0: 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49   iSortOrder = pI
90f0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
9100: 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ];.      zColl =
9110: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
9120: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9130: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
9140: 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65  .      iSortOrde
9150: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f  r = 0;.      zCo
9160: 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll = pColl->zNam
9170: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
9180: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
9190: 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69  =iColumn || sqli
91a0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
91b0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
91c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d  ){.      /* Term
91d0: 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20   j of the ORDER 
91e0: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
91f0: 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  ot match column 
9200: 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  i of the index *
9210: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45  /.      if( i<nE
9220: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  qCol ){.        
9230: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
9240: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f  olumn that is co
9250: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
9260: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
9270: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  n.        ** ORD
9280: 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74  ER BY term, that
9290: 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67   is OK.  Just ig
92a0: 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  nore that column
92b0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
92c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
92d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
92e0: 20 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49   }else if( i==pI
92f0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
9300: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9310: 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20  column i is the 
9320: 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65  rowid.  All othe
9330: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a  r terms match. *
9340: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
9350: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9360: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
9370: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c  ndex column fail
9380: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69  s to match and i
9390: 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  s not constraine
93a0: 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20  d by ==.        
93b0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  ** then the inde
93c0: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
93d0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f   the ORDER BY co
93e0: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20  nstraint..      
93f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
9400: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
9410: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9420: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
9430: 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
9440: 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  rt( pTerm->sortO
9450: 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d  rder==0 || pTerm
9460: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
9470: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
9480: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69  ortOrder==0 || i
9490: 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  SortOrder==1 );.
94a0: 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65      termSortOrde
94b0: 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e  r = iSortOrder ^
94c0: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
94d0: 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71  r;.    if( i>nEq
94e0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
94f0: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
9500: 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
9510: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20       /* Indices 
9520: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
9530: 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   if all ORDER BY
9540: 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a   terms past the.
9550: 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c          ** equal
9560: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
9570: 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44  are all either D
9580: 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20  ESC or ASC. */. 
9590: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
95a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
95b0: 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72  se{.      sortOr
95c0: 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72  der = termSortOr
95d0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  der;.    }.    j
95e0: 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b  ++;.    pTerm++;
95f0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
9600: 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63 65  <0 && !reference
9610: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
9620: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
9630: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
9640: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
9650: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74  exed column is t
9660: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61  he primary key a
9670: 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d 61  nd everything ma
9680: 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 73  tches.      ** s
9690: 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f  o far and none o
96a0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
96b0: 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67 68  erms to the righ
96c0: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  t reference othe
96d0: 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  r.      ** table
96e0: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74  s in the join, t
96f0: 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75 72  hen we are assur
9700: 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ed that the inde
9710: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 20  x can be used . 
9720: 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20       ** to sort 
9730: 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69 6d  because the prim
9740: 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71 75  ary key is uniqu
9750: 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66  e and so none of
9760: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 20   the other.     
9770: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c   ** columns will
9780: 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72   make any differ
9790: 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ence.      */.  
97a0: 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20      j = nTerm;. 
97b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52     }.  }..  *pbR
97c0: 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d  ev = sortOrder!=
97d0: 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72  0;.  if( j>=nTer
97e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  m ){.    /* All 
97f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
9800: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
9810: 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69 73   covered by this
9820: 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a   index so.    **
9830: 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20   this index can 
9840: 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
9850: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ing. */.    retu
9860: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
9870: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
9880: 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64  E_None && i==pId
9890: 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  x->nColumn.     
98a0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
98b0: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
98c0: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
98d0: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f  , base) ){.    /
98e0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
98f0: 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20  his index match 
9900: 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74  some prefix of t
9910: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
9920: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  se.    ** and th
9930: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
9940: 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f  E and no terms o
9950: 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  n the tail of th
9960: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
9970: 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e  * clause referen
9980: 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ce other tables 
9990: 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74  in a join.  If t
99a0: 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20  his is all true 
99b0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
99c0: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
99d0: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20  is superfluous. 
99e0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
99f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
9a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
9a10: 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20  table to see if 
9a20: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
9a30: 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20  use in pOrderBy 
9a40: 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
9a50: 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69  .** by sorting i
9a60: 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44  n order of ROWID
9a70: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
9a80: 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62  f so and set *pb
9a90: 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75  Rev to be.** tru
9aa0: 65 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f  e for reverse RO
9ab0: 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  WID and false fo
9ac0: 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20  r forward ROWID 
9ad0: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
9ae0: 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52   int sortableByR
9af0: 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65  owid(.  int base
9b00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9b10: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
9b20: 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65   for table to be
9b30: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70   sorted */.  Exp
9b40: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
9b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
9b60: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
9b70: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
9b80: 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70  askSet,  /* Mapp
9b90: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20  ing from tables 
9ba0: 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20  to bitmaps */.  
9bb0: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
9bd0: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
9be0: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
9bf0: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
9c00: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
9c10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
9c20: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
9c30: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
9c40: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
9c50: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
9c60: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
9c70: 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43  e==base && p->iC
9c80: 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26 26  olumn==-1.    &&
9c90: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
9ca0: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
9cb0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c 20 62  , pMaskSet, 1, b
9cc0: 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70 62 52  ase) ){.    *pbR
9cd0: 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  ev = pOrderBy->a
9ce0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
9cf0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9d00: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9d10: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
9d20: 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f  crude estimate o
9d30: 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  f the logarithm 
9d40: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
9d50: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ue..** The resul
9d60: 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65  ts need not be e
9d70: 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f  xact.  This is o
9d80: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74  nly used for est
9d90: 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  imating.** the t
9da0: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72  otal cost of per
9db0: 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f  forming operatio
9dc0: 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20  ns with O(logN) 
9dd0: 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63  or O(NlogN).** c
9de0: 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61  omplexity.  Beca
9df0: 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20  use N is just a 
9e00: 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20  guess, it is no 
9e10: 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66  great tragedy if
9e20: 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69  .** logN is a li
9e30: 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  ttle off..*/.sta
9e40: 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f  tic double estLo
9e50: 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64  g(double N){.  d
9e60: 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a  ouble logN = 1;.
9e70: 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b    double x = 10;
9e80: 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b  .  while( N>x ){
9e90: 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a  .    logN += 1;.
9ea0: 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d      x *= 10;.  }
9eb0: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a  .  return logN;.
9ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
9ed0: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
9ee0: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
9ef0: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
9f00: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
9f10: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
9f20: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
9f30: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
9f40: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
9f50: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
9f60: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
9f70: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
9f80: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
9f90: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
9fa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9fb0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
9fc0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9fd0: 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
9fe0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
9ff0: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
a000: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
a010: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
a020: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
a030: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
a040: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
a050: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
a060: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a070: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
a080: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
a090: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
a0a0: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
a0b0: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
a0c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
a0d0: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
a0e0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
a0f0: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
a100: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
a110: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
a120: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
a130: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
a140: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
a150: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
a160: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
a170: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
a180: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
a190: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
a1a0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
a1b0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
a1c0: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
a1d0: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
a1e0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
a1f0: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
a200: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
a210: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
a220: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
a230: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
a240: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
a250: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
a260: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
a270: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a280: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
a290: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
a2a0: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
a2b0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
a2c0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
a2d0: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
a2e0: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
a2f0: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
a300: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
a310: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
a320: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
a330: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
a340: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
a350: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
a360: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
a370: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
a380: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
a390: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
a3a0: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
a3b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
a3c0: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
a3d0: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
a3e0: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a  timatedCost);.}.
a3f0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
a400: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
a410: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
a420: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
a430: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
a440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
a450: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f  ALTABLE./*.** Co
a460: 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
a470: 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
a480: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
a490: 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
a4a0: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
a4b0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
a4c0: 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
a4d0: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
a4e0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
a4f0: 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
a500: 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
a510: 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
a520: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
a530: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
a540: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
a550: 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
a560: 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
a570: 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
a580: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
a590: 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
a5a0: 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
a5b0: 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
a5c0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
a5d0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a5e0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
a5f0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
a600: 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
a610: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
a620: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
a630: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
a640: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
a650: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
a660: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
a670: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
a680: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
a690: 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
a6a0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
a6b0: 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
a6c0: 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
a6d0: 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
a6e0: 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
a6f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
a700: 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
a710: 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
a720: 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
a730: 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
a740: 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74 75  double bestVirtu
a750: 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  alIndex(.  Parse
a760: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a780: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
a790: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
a7a0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
a7b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
a7c0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
a7d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
a7e0: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
a7f0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
a800: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
a810: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
a820: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
a830: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
a840: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
a850: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
a860: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
a870: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
a880: 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79   /* The order by
a890: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a8a0: 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c 20   orderByUsable, 
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a8c0: 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 6f  rue if we can po
a8d0: 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a  tential sort */.
a8e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
a8f0: 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
a900: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
a910: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
a920: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
a930: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
a940: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
a950: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
a960: 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
a970: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
a980: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
a990: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
a9a0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
a9b0: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
a9c0: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
a9d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
a9e0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
a9f0: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
aa00: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
aa10: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f  t i, j;.  int nO
aa20: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 72 63  rderBy;.  int rc
aa30: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
aa40: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
aa50: 6f 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  o structure has 
aa60: 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
aa70: 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  sly.  ** allocat
aa80: 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ed and initializ
aa90: 65 64 20 66 6f 72 20 74 68 69 73 20 76 69 72 74  ed for this virt
aaa0: 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ual table, then 
aab0: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e  allocate.  ** an
aac0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20  d initialize it 
aad0: 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  now.  */.  pIdxI
aae0: 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f  nfo = *ppIdxInfo
aaf0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
ab00: 3d 3d 30 20 29 7b 0a 20 20 20 20 57 68 65 72 65  ==0 ){.    Where
ab10: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
ab20: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
ab30: 57 48 45 52 45 54 52 41 43 45 28 28 22 52 65 63  WHERETRACE(("Rec
ab40: 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20 69  omputing index i
ab50: 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22  nfo for %s...\n"
ab60: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
ab70: 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
ab80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
ab90: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
aba0: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
abb0: 65 66 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a 20  eferring.    ** 
abc0: 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
abd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72  table */.    for
abe0: 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72  (i=nTerm=0, pTer
abf0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
ac00: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
ac10: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
ac20: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ac30: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
ac40: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
ac50: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
ac60: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65  ->eOperator&(pTe
ac70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29  rm->eOperator-1)
ac80: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
ac90: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
aca0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20  Operator==WO_IN 
acb0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
acc0: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
acd0: 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
ace0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
acf0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
ad00: 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29  WO_IN|WO_ISNULL)
ad10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ad20: 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     nTerm++;.    
ad30: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
ad40: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ad50: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
ad60: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
ad70: 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 76 69  rrent .    ** vi
ad80: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
ad90: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
ada0: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
adb0: 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a 2a 20   part of.    ** 
adc0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
add0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
ade0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4f 72  ..    */.    nOr
adf0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 69  derBy = 0;.    i
ae00: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
ae10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ae20: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
ae30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45   i++){.        E
ae40: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
ae50: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
ae60: 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
ae70: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
ae80: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
ae90: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
aea0: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
aeb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
aec0: 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ==pOrderBy->nExp
aed0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72  r ){.        nOr
aee0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
aef0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
af00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
af10: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
af20: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
af30: 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2f 0a  tructure.    */.
af40: 20 20 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73      pIdxInfo = s
af50: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
af60: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
af70: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
af80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
afa0: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
afb0: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
afc0: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
aff0: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
b000: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  nOrderBy );.    
b010: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
b020: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b030: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b040: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
b050: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b060: 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0.0;.    }.    *
b070: 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78  ppIdxInfo = pIdx
b080: 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Info;..    /* In
b090: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
b0a0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
b0b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
b0c0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
b0d0: 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 66  ns.    ** many f
b0e0: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
b0f0: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
b100: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
b110: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 20 20 2a  Index from.    *
b120: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
b130: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
b140: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
b150: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
b160: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
b170: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
b180: 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 43 6f     */.    pIdxCo
b190: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
b1a0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
b1b0: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
b1c0: 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  [1];.    pIdxOrd
b1d0: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
b1e0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
b1f0: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
b200: 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70 55 73 61  nTerm];.    pUsa
b210: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
b220: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
b230: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
b240: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
b250: 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  By];.    *(int*)
b260: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
b270: 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
b280: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
b290: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
b2a0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a   nOrderBy;.    *
b2b0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
b2c0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
b2d0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
b2e0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
b2f0: 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73 74 72 75  Cons;.    *(stru
b300: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
b310: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
b320: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
b330: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
b340: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
b350: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
b360: 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
b370: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
b380: 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b3d0: 55 73 61 67 65 3b 0a 0a 20 20 20 20 66 6f 72 28  Usage;..    for(
b3e0: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
b3f0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
b400: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
b410: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
b420: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
b430: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
b440: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b450: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
b460: 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
b470: 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
b480: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b490: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
b4a0: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
b4b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
b4c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
b4d0: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
b4e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
b4f0: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
b500: 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
b510: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49  ntinue;.      pI
b520: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
b530: 6e 20 3d 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  n = pTerm->leftC
b540: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64  olumn;.      pId
b550: 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
b560: 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  fset = i;.      
b570: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d  pIdxCons[j].op =
b580: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
b590: 72 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;.      /* The 
b5a0: 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e  direct assignmen
b5b0: 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
b5c0: 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62  s line is possib
b5d0: 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a  le only because.
b5e0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f        ** the WO_
b5f0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
b600: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
b610: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
b620: 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
b630: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
b640: 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20 66  ts verify this f
b650: 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  act. */.      as
b660: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
b670: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
b680: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 20  AINT_EQ );.     
b690: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
b6a0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
b6b0: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
b6c0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
b6d0: 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
b6e0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b  CONSTRAINT_LE );
b6f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
b700: 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GT==SQLITE_IND
b710: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54  EX_CONSTRAINT_GT
b720: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b730: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
b740: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b750: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _GE );.      ass
b760: 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53  ert( WO_MATCH==S
b770: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b780: 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a  TRAINT_MATCH );.
b790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
b7a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
b7b0: 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f   (WO_EQ|WO_LT|WO
b7c0: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
b7d0: 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20  WO_MATCH) );.   
b7e0: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
b7f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
b800: 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
b810: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
b820: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
b830: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 49 64  pExpr;.      pId
b840: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
b850: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
b860: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64 78  lumn;.      pIdx
b870: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
b880: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
b890: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
b8a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
b8b0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73  his point, the s
b8c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
b8d0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
b8e0: 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73   pIdxInfo points
b8f0: 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61  .  ** to will ha
b900: 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ve been initiali
b910: 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69  zed, either duri
b920: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ng the current i
b930: 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a  nvocation or.  *
b940: 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72  * during some pr
b950: 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ior invocation. 
b960: 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76   Now we just hav
b970: 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74  e to customize t
b980: 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20  he.  ** details 
b990: 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20  of pIdxInfo for 
b9a0: 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
b9b0: 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20  cation and pass 
b9c0: 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74  it to.  ** xBest
b9d0: 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  Index..  */..  /
b9e0: 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d  * The module nam
b9f0: 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
ba00: 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73  d. Also, by this
ba10: 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73   point there mus
ba20: 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e  t.  ** be a poin
ba30: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
ba40: 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
ba50: 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a  . Otherwise.  **
ba60: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
ba70: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75  olumnNames() wou
ba80: 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75  ld have picked u
ba90: 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20  p the error. .  
baa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
bab0: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26  b->azModuleArg &
bac0: 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  & pTab->azModule
bad0: 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65  Arg[0] );.  asse
bae0: 72 74 28 20 70 54 61 62 2d 3e 70 56 74 61 62 20  rt( pTab->pVtab 
baf0: 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  );.#if 0.  if( p
bb00: 54 61 62 2d 3e 70 56 74 61 62 3d 3d 30 20 29 7b  Tab->pVtab==0 ){
bb10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bb20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
bb30: 64 65 66 69 6e 65 64 20 6d 6f 64 75 6c 65 20 25  defined module %
bb40: 73 20 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c  s for table %s",
bb50: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
bb60: 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70  zModuleArg[0], p
bb70: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
bb80: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d   return 0.0;.  }
bb90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
bba0: 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  t the aConstrain
bbb0: 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64  t[].usable field
bbc0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
bbd0: 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75   all .  ** outpu
bbe0: 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
bbf0: 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  ero..  **.  ** a
bc00: 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61  Constraint[].usa
bc10: 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20  ble is true for 
bc20: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72  constraints wher
bc30: 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
bc40: 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61  .  ** side conta
bc50: 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e  ins only referen
bc60: 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f  ces to tables to
bc70: 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
bc80: 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61   current.  ** ta
bc90: 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
bca0: 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e  ords, if the con
bcb0: 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
bcc0: 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
bcd0: 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  *           colu
bce0: 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20  mn = expr.  **. 
bcf0: 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
bd00: 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
bd10: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
bd20: 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
bd30: 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61  is .  ** only va
bd40: 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65  lid if all table
bd50: 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20  s referenced in 
bd60: 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68  expr occur to th
bd70: 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
bd80: 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
bd90: 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  ing column..  **
bda0: 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74  .  ** The aConst
bdb0: 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63  raints[] array c
bdc0: 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
bdd0: 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
bde0: 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  nts.  ** on the 
bdf0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20  current table.  
be00: 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79  That way we only
be10: 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65   have to compute
be20: 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76   it once.  ** ev
be30: 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67  en though we mig
be40: 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74  ht try to pick t
be50: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75  he best index mu
be60: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20  ltiple times..  
be70: 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65  ** For each atte
be80: 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61  mpt at picking a
be90: 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64  n index, the ord
bea0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
beb0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  the.  ** join mi
bec0: 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
bed0: 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
bee0: 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
bef0: 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61  ble flag.  ** ea
bf00: 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ch time..  */.  
bf10: 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
bf20: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
bf30: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
bf40: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
bf50: 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20  raint;.  pUsage 
bf60: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
bf70: 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
bf80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
bf90: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
bfa0: 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
bfb0: 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78  +){.    j = pIdx
bfc0: 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
bfd0: 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  t;.    pTerm = &
bfe0: 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70  pWC->a[j];.    p
bff0: 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
c000: 3d 20 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  =  (pTerm->prere
c010: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
c020: 79 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d  y)==0;.  }.  mem
c030: 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73  set(pUsage, 0, s
c040: 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29  izeof(pUsage[0])
c050: 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  *pIdxInfo->nCons
c060: 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70  traint);.  if( p
c070: 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
c080: 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
c090: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
c0a0: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
c0b0: 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d  .  }.  pIdxInfo-
c0c0: 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  >idxStr = 0;.  p
c0d0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
c0e0: 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
c0f0: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
c100: 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  r = 0;.  pIdxInf
c110: 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
c120: 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  ed = 0;.  pIdxIn
c130: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
c140: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
c150: 42 4c 20 2f 20 32 2e 30 3b 0a 20 20 6e 4f 72 64  BL / 2.0;.  nOrd
c160: 65 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d  erBy = pIdxInfo-
c170: 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >nOrderBy;.  if(
c180: 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
c190: 72 42 79 20 26 26 20 21 6f 72 64 65 72 42 79 55  rBy && !orderByU
c1a0: 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 2a 28 69  sable ){.    *(i
c1b0: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
c1c0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
c1d0: 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ..  (void)sqlite
c1e0: 33 53 61 66 65 74 79 4f 66 66 28 70 50 61 72 73  3SafetyOff(pPars
c1f0: 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52 45 54  e->db);.  WHERET
c200: 52 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65  RACE(("xBestInde
c210: 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61  x for %s\n", pTa
c220: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52  b->zName));.  TR
c230: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
c240: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  IdxInfo);.  rc =
c250: 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70 4d   pTab->pVtab->pM
c260: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
c270: 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 70  x(pTab->pVtab, p
c280: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43  IdxInfo);.  TRAC
c290: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 49  E_IDX_OUTPUTS(pI
c2a0: 64 78 49 6e 66 6f 29 3b 0a 20 20 28 76 6f 69 64  dxInfo);.  (void
c2b0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
c2c0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 0a 20  (pParse->db);.. 
c2d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
c2e0: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
c2f0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
c300: 20 21 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e   !pIdxInfo->aCon
c310: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
c320: 65 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 61  e && pUsage[i].a
c330: 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20  rgvIndex>0 ){.  
c340: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c350: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
c360: 20 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73         "table %s
c370: 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74  : xBestIndex ret
c380: 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64  urned an invalid
c390: 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   plan", pTab->zN
c3a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
c3b0: 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20  rn 0.0;.    }.  
c3c0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
c3d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
c3e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
c3f0: 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
c400: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
c410: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
c420: 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lse {.      sqli
c430: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c440: 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
c450: 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
c460: 20 20 7d 0a 20 20 7d 0a 20 20 2a 28 69 6e 74 2a    }.  }.  *(int*
c470: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
c480: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
c490: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49  ..  return pIdxI
c4a0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
c4b0: 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  st;.}.#endif /* 
c4c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
c4d0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
c4e0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74  ** Find the best
c4f0: 20 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73   index for acces
c500: 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
c510: 72 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  r table.  Return
c520: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
c530: 20 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67   the index, flag
c540: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
c550: 68 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73 68  how the index sh
c560: 6f 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68  ould be used, th
c570: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65  e.** number of e
c580: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
c590: 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f  nts, and the "co
c5a0: 73 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64  st" for this ind
c5b0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f  ex..**.** The lo
c5c0: 77 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20  west cost index 
c5d0: 77 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20  wins.  The cost 
c5e0: 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
c5f0: 66 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a  f the amount of.
c600: 2a 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20  ** CPU and disk 
c610: 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63  I/O need to proc
c620: 65 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20  ess the request 
c630: 75 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74  using the select
c640: 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63  ed index..** Fac
c650: 74 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65  tors that influe
c660: 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65  nce cost include
c670: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68  :.**.**    *  Th
c680: 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
c690: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
c6a0: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65  will be retrieve
c6b0: 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20  d.  (The.**     
c6c0: 20 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74    fewer the bett
c6d0: 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  er.).**.**    * 
c6e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
c6f0: 73 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63  sorting must occ
c700: 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ur..**.**    *  
c710: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
c720: 68 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70  here must be sep
c730: 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e  arate lookups in
c740: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
c750: 64 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d  dex and in the m
c760: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f  ain table..**.*/
c770: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
c780: 65 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73  estIndex(.  Pars
c790: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
c7b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7c0: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
c7d0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
c7e0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
c7f0: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
c800: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
c810: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
c820: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
c830: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
c840: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
c850: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
c860: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
c870: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
c880: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
c890: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
c8a0: 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20     /* The order 
c8b0: 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49  by clause */.  I
c8c0: 6e 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20  ndex **ppIndex, 
c8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
c8e0: 6b 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e  ke *ppIndex poin
c8f0: 74 20 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e  t to the best in
c900: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46  dex */.  int *pF
c910: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
c920: 20 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67       /* Put flag
c930: 73 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69  s describing thi
c940: 73 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c  s choice in *pFl
c950: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ags */.  int *pn
c960: 45 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq              
c970: 20 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20       /* Put the 
c980: 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  number of == or 
c990: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68  IN constraints h
c9a0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ere */.){.  Wher
c9b0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
c9c0: 49 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d  Index *bestIdx =
c9d0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
c9e0: 6e 64 65 78 20 74 68 61 74 20 67 69 76 65 73 20  ndex that gives 
c9f0: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
ca00: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  */.  double lowe
ca10: 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
ca20: 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
ca30: 75 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f  using bestIdx */
ca40: 0a 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73  .  int bestFlags
ca50: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
ca60: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
ca70: 65 64 20 77 69 74 68 20 62 65 73 74 49 64 78 20  ed with bestIdx 
ca80: 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71  */.  int bestNEq
ca90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
caa0: 20 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66   /* Best value f
cab0: 6f 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20  or nEq */.  int 
cac0: 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
cad0: 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
cae0: 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
caf0: 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
cb00: 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
cb10: 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
cb20: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
cb30: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
cb40: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20   */.  int rev;  
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61    /* True to sca
cb70: 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
cb80: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
cb90: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
cba0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
cbb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72  ociated with pPr
cbc0: 6f 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  obe */.  int nEq
cbd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cbe0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cbf0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
cc00: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
cc10: 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20  eqTermMask;     
cc20: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
cc30: 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74  of valid equalit
cc40: 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  y operators */. 
cc50: 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20   double cost;   
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cc70: 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50  Cost of using pP
cc80: 72 6f 62 65 20 2a 2f 0a 0a 20 20 57 48 45 52 45  robe */..  WHERE
cc90: 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64 65  TRACE(("bestInde
cca0: 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61  x: tbl=%s notRea
ccb0: 64 79 3d 25 6c 6c 78 5c 6e 22 2c 20 70 53 72 63  dy=%llx\n", pSrc
ccc0: 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  ->pTab->zName, n
ccd0: 6f 74 52 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77  otReady));.  low
cce0: 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  estCost = SQLITE
ccf0: 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 70 50 72 6f  _BIG_DBL;.  pPro
cd00: 62 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  be = pSrc->pTab-
cd10: 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 2f 2a 20 49  >pIndex;..  /* I
cd20: 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
cd30: 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  no indices and t
cd40: 68 65 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d  here are no term
cd50: 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20  s in the where. 
cd60: 20 2a 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20   ** clause that 
cd70: 72 65 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57  refer to the ROW
cd80: 49 44 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ID, then we will
cd90: 20 6e 65 76 65 72 20 62 65 20 61 62 6c 65 20 74   never be able t
cda0: 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69  o do.  ** anythi
cdb0: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
cdc0: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
cdd0: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  on this table.  
cde0: 57 65 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a  We might as.  **
cdf0: 20 77 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72   well put it fir
ce00: 73 74 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f  st in the join o
ce10: 72 64 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c  rder.  That way,
ce20: 20 70 65 72 68 61 70 73 20 69 74 20 63 61 6e 20   perhaps it can 
ce30: 62 65 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  be.  ** referenc
ce40: 65 64 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c  ed by other tabl
ce50: 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a  es in the join..
ce60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 72 6f 62    */.  if( pProb
ce70: 65 3d 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e  e==0 &&.     fin
ce80: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
ce90: 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f   -1, 0, WO_EQ|WO
cea0: 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _IN|WO_LT|WO_LE|
ceb0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d  WO_GT|WO_GE,0)==
cec0: 30 20 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65  0 &&.     (pOrde
ced0: 72 42 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61  rBy==0 || !sorta
cee0: 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c  bleByRowid(iCur,
cef0: 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e   pOrderBy, pWC->
cf00: 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29 29  pMaskSet, &rev))
cf10: 20 29 7b 0a 20 20 20 20 2a 70 46 6c 61 67 73 20   ){.    *pFlags 
cf20: 3d 20 30 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65  = 0;.    *ppInde
cf30: 78 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71  x = 0;.    *pnEq
cf40: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
cf50: 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   0.0;.  }..  /* 
cf60: 43 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69  Check for a rowi
cf70: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
cf80: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
cf90: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72  ints.  */.  pTer
cfa0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
cfb0: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
cfc0: 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
cfd0: 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65  N, 0);.  if( pTe
cfe0: 72 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  rm ){.    Expr *
cff0: 70 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e  pExpr;.    *ppIn
d000: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73  dex = 0;.    bes
d010: 74 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  tFlags = WHERE_R
d020: 4f 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28  OWID_EQ;.    if(
d030: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
d040: 72 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20  r & WO_EQ ){.   
d050: 20 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73     /* Rowid== is
d060: 20 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74   always the best
d070: 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20   pick.  Look no 
d080: 66 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73  further.  Becaus
d090: 65 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  e only.      ** 
d0a0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20  a single row is 
d0b0: 67 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75  generated, outpu
d0c0: 74 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73  t is always in s
d0d0: 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
d0e0: 20 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57       *pFlags = W
d0f0: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20  HERE_ROWID_EQ | 
d100: 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
d110: 20 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20      *pnEq = 1;. 
d120: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
d130: 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f  ("... best is ro
d140: 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wid\n"));.      
d150: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20  return 0.0;.    
d160: 7d 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72  }else if( (pExpr
d170: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29   = pTerm->pExpr)
d180: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
d190: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
d1a0: 28 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20  (LIST): cost is 
d1b0: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
d1c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
d1d0: 69 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ist.      ** ele
d1e0: 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ments.  */.     
d1f0: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45   lowestCost = pE
d200: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d210: 72 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  r;.      lowestC
d220: 6f 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f  ost *= estLog(lo
d230: 77 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d  westCost);.    }
d240: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52  else{.      /* R
d250: 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29  owid IN (SELECT)
d260: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
d270: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
d280: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
d290: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
d2a0: 73 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65  sult of the inne
d2b0: 72 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61  r select.  We ha
d2c0: 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74  ve no way to est
d2d0: 69 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  imate.      ** t
d2e0: 68 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b  hat value so mak
d2f0: 65 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20  e a wild guess. 
d300: 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  */.      lowestC
d310: 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d  ost = 200;.    }
d320: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
d330: 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63  ("... rowid IN c
d340: 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f  ost: %.9g\n", lo
d350: 77 65 73 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a  westCost));.  }.
d360: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
d370: 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74 61 62  he cost of a tab
d380: 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77 65 20  le scan.  If we 
d390: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
d3a0: 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65  many.  ** entrie
d3b0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 74 61 62  s are in the tab
d3c0: 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f  le, use 1 millio
d3d0: 6e 20 61 73 20 61 20 67 75 65 73 73 2e 0a 20 20  n as a guess..  
d3e0: 2a 2f 0a 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  */.  cost = pPro
d3f0: 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52  be ? pProbe->aiR
d400: 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30 30 30  owEst[0] : 10000
d410: 30 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  00;.  WHERETRACE
d420: 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61  (("... table sca
d430: 6e 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39  n base cost: %.9
d440: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
d450: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  flags = WHERE_RO
d460: 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a  WID_RANGE;..  /*
d470: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74   Check for const
d480: 72 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67  raints on a rang
d490: 65 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61  e of rowids in a
d4a0: 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a   table scan..  *
d4b0: 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  /.  pTerm = find
d4c0: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
d4d0: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
d4e0: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
d4f0: 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28  WO_GE, 0);.  if(
d500: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
d510: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
d520: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
d530: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
d540: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61   0) ){.      fla
d550: 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
d560: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73  LIMIT;.      cos
d570: 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73  t /= 3;  /* Gues
d580: 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50  s that rowid<EXP
d590: 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f  R eliminates two
d5a0: 2d 74 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20  -thirds or rows 
d5b0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
d5c0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d5d0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
d5e0: 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
d5f0: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  0) ){.      flag
d600: 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c  s |= WHERE_BTM_L
d610: 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74  IMIT;.      cost
d620: 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
d630: 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52   that rowid>EXPR
d640: 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
d650: 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a  thirds of rows *
d660: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  /.    }.    WHER
d670: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77  ETRACE(("... row
d680: 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  id range reduces
d690: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
d6a0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73  , cost));.  }els
d6b0: 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30  e{.    flags = 0
d6c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d6d0: 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f  he table scan do
d6e0: 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74  es not satisfy t
d6f0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d700: 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a  se, increase.  *
d710: 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c  * the cost by Nl
d720: 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65  ogN to cover the
d730: 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74   expense of sort
d740: 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ing. */.  if( pO
d750: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66  rderBy ){.    if
d760: 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69  ( sortableByRowi
d770: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
d780: 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
d790: 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20 20   &rev) ){.      
d7a0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  flags |= WHERE_O
d7b0: 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f 57  RDERBY|WHERE_ROW
d7c0: 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  ID_RANGE;.      
d7d0: 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20  if( rev ){.     
d7e0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d7f0: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
d800: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d810: 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
d820: 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
d830: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
d840: 28 22 2e 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e  ("... sorting in
d850: 63 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20  creases cost to 
d860: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
d870: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d880: 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74   cost<lowestCost
d890: 20 29 7b 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f   ){.    lowestCo
d8a0: 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62  st = cost;.    b
d8b0: 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  estFlags = flags
d8c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d8d0: 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73  he pSrc table is
d8e0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
d8f0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
d900: 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a  then we may not.
d910: 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65    ** use an inde
d920: 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20  x to satisfy IS 
d930: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
d940: 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20   on that table. 
d950: 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65   This is.  ** be
d960: 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69  cause columns mi
d970: 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
d980: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62   NULL if the tab
d990: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  le does not matc
d9a0: 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75  h -.  ** a circu
d9b0: 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68  mstance which th
d9c0: 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  e index cannot h
d9d0: 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e  elp us discover.
d9e0: 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a    Ticket #2177..
d9f0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 72 63    */.  if( (pSrc
da00: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
da10: 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
da20: 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  eqTermMask = WO_
da30: 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73  EQ|WO_IN;.  }els
da40: 65 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  e{.    eqTermMas
da50: 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
da60: 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  WO_ISNULL;.  }..
da70: 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63    /* Look at eac
da80: 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  h index..  */.  
da90: 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50  for(; pProbe; pP
daa0: 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65  robe=pProbe->pNe
dab0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  xt){.    int i; 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
dae0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75  unter */.    dou
daf0: 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  ble inMultiplier
db00: 20 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45   = 1;..    WHERE
db10: 54 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65  TRACE(("... inde
db20: 78 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65  x %s:\n", pProbe
db30: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  ->zName));..    
db40: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
db50: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
db60: 6e 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  n the index that
db70: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20   are satisfied. 
db80: 20 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20     ** by x=EXPR 
db90: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78  constraints or x
dba0: 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72   IN (...) constr
dbb0: 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  aints..    */.  
dbc0: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20    flags = 0;.   
dbd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f   for(i=0; i<pPro
dbe0: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  be->nColumn; i++
dbf0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
dc00: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
dc10: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  n[i];.      pTer
dc20: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
dc30: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
dc40: 61 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c  ady, eqTermMask,
dc50: 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20   pProbe);.      
dc60: 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
dc70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67  reak;.      flag
dc80: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
dc90: 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20  N_EQ;.      if( 
dca0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
dcb0: 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
dcc0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
dcd0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
dce0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
dcf0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
dd00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
dd10: 78 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  xpr->pSelect!=0 
dd20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
dd30: 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b  ultiplier *= 25;
dd40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dd50: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21  f( pExpr->pList!
dd60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
dd70: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20  inMultiplier *= 
dd80: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
dd90: 78 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  xpr + 1;.       
dda0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ddb0: 0a 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f  .    cost = pPro
ddc0: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20  be->aiRowEst[i] 
ddd0: 2a 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a  * inMultiplier *
dde0: 20 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70   estLog(inMultip
ddf0: 6c 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d  lier);.    nEq =
de00: 20 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f   i;.    if( pPro
de10: 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
de20: 4e 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26  None && (flags &
de30: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
de40: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
de50: 20 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43   nEq==pProbe->nC
de60: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66  olumn ){.      f
de70: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
de80: 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IQUE;.    }.    
de90: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
dea0: 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c  ... nEq=%d inMul
deb0: 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67  t=%.9g cost=%.9g
dec0: 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75 6c 74 69 70  \n",nEq,inMultip
ded0: 6c 69 65 72 2c 63 6f 73 74 29 29 3b 0a 0a 20 20  lier,cost));..  
dee0: 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
def0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
df00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
df10: 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
df20: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
df30: 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
df40: 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
df50: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
df60: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
df70: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
df80: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
df90: 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
dfa0: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
dfb0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
dfc0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
dfd0: 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  GE;.        if( 
dfe0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
dff0: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
e000: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50   WO_LT|WO_LE, pP
e010: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
e020: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
e030: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
e040: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
e050: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e060: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
e070: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
e080: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
e090: 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_GE, pProbe) ){
e0a0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
e0b0: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
e0c0: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
e0d0: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
e0e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
e0f0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
e100: 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
e110: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
e120: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
e130: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
e140: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
e150: 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
e160: 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
e170: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
e180: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
e190: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
e1a0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
e1b0: 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  IN)==0 &&.      
e1c0: 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e       isSortingIn
e1d0: 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e  dex(pParse,pWC->
e1e0: 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c  pMaskSet,pProbe,
e1f0: 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45  iCur,pOrderBy,nE
e200: 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20  q,&rev) ){.     
e210: 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20     if( flags==0 
e220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
e230: 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
e240: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
e250: 20 7d 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73   }.        flags
e260: 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
e270: 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  Y;.        if( r
e280: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
e290: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  flags |= WHERE_R
e2a0: 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
e2b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
e2c0: 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63         cost += c
e2d0: 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
e2e0: 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
e2f0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72  RACE(("...... or
e300: 64 65 72 62 79 20 69 6e 63 72 65 61 73 65 73 20  derby increases 
e310: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
e320: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
e330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
e340: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
e350: 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77  e can get away w
e360: 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ith using just t
e370: 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74  he index without
e380: 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61  .    ** ever rea
e390: 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ding the table. 
e3a0: 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
e3b0: 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65  case, then halve
e3c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
e3d0: 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a   of this index..
e3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
e3f0: 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f  lags && pSrc->co
e400: 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61  lUsed < (((Bitma
e410: 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
e420: 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
e430: 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
e440: 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
e450: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
e460: 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j<pProbe->nColum
e470: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
e480: 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d   int x = pProbe-
e490: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
e4a0: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
e4b0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  1 ){.          m
e4c0: 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
e4d0: 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20  1)<<x);.        
e4e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e4f0: 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
e500: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
e510: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
e520: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a       cost /= 2;.
e530: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
e540: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d  CE(("...... idx-
e550: 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73  only reduces cos
e560: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
e570: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
e580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
e590: 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63  his index has ac
e5a0: 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73  hieved the lowes
e5b0: 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74  t cost so far, t
e5c0: 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  hen use it..    
e5d0: 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
e5e0: 20 26 26 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73   && cost < lowes
e5f0: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62  tCost ){.      b
e600: 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b  estIdx = pProbe;
e610: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
e620: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
e630: 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  bestFlags = flag
e640: 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45 71  s;.      bestNEq
e650: 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20 20   = nEq;.    }.  
e660: 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 74  }..  /* Report t
e670: 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a 20  he best result. 
e680: 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20 3d   */.  *ppIndex =
e690: 20 62 65 73 74 49 64 78 3b 0a 20 20 57 48 45 52   bestIdx;.  WHER
e6a0: 45 54 52 41 43 45 28 28 22 62 65 73 74 20 69 6e  ETRACE(("best in
e6b0: 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74 3d  dex is %s, cost=
e6c0: 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c 20  %.9g, flags=%x, 
e6d0: 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
e6e0: 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65 73     bestIdx ? bes
e6f0: 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28  tIdx->zName : "(
e700: 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43 6f  none)", lowestCo
e710: 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20 62  st, bestFlags, b
e720: 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46 6c  estNEq));.  *pFl
e730: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 20  ags = bestFlags 
e740: 7c 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20  | eqTermMask;.  
e750: 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b  *pnEq = bestNEq;
e760: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74  .  return lowest
e770: 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Cost;.}.../*.** 
e780: 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
e790: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
e7a0: 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
e7b0: 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
e7c0: 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
e7d0: 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
e7e0: 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
e7f0: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
e800: 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
e810: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
e820: 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
e830: 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
e840: 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
e850: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
e860: 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
e870: 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
e880: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
e890: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
e8a0: 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
e8b0: 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
e8c0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
e8d0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
e8e0: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
e8f0: 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
e900: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
e910: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
e920: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
e930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
e940: 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
e950: 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
e960: 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
e970: 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
e980: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
e990: 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
e9a0: 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
e9b0: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
e9c0: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
e9d0: 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
e9e0: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
e9f0: 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
ea00: 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
ea10: 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
ea20: 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
ea30: 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
ea40: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
ea50: 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
ea60: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
ea70: 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
ea80: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
ea90: 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
eaa0: 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
eab0: 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
eac0: 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
ead0: 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
eae0: 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
eaf0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
eb00: 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
eb10: 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
eb20: 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
eb30: 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
eb40: 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
eb50: 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
eb60: 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
eb70: 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
eb80: 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
eb90: 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
eba0: 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
ebb0: 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
ebc0: 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
ebd0: 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
ebe0: 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
ebf0: 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
ec00: 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
ec10: 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
ec20: 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
ec30: 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
ec40: 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
ec50: 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
ec60: 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
ec70: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
ec80: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
ec90: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
eca0: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61  {.    pTerm->fla
ecb0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
ecc0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
ecd0: 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20  >iParent>=0 ){. 
ece0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
ecf0: 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d  pOther = &pTerm-
ed00: 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69  >pWC->a[pTerm->i
ed10: 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69  Parent];.      i
ed20: 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43  f( (--pOther->nC
ed30: 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hild)==0 ){.    
ed40: 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
ed50: 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b  pLevel, pOther);
ed60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ed70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c   }.}../*.** Appl
ed80: 79 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  y the affinities
ed90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
eda0: 20 74 68 65 20 66 69 72 73 74 20 6e 20 63 6f 6c   the first n col
edb0: 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78 0a 2a 2a  umns of index.**
edc0: 20 70 49 64 78 20 74 6f 20 74 68 65 20 76 61 6c   pIdx to the val
edd0: 75 65 73 20 69 6e 20 74 68 65 20 6e 20 72 65 67  ues in the n reg
ede0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
edf0: 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  at base..*/.stat
ee00: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c  ic void codeAppl
ee10: 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65 20  yAffinity(Parse 
ee20: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73  *pParse, int bas
ee30: 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64 65 78 20  e, int n, Index 
ee40: 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 6e 3e  *pIdx){.  if( n>
ee50: 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
ee60: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ee70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
ee80: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
ee90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
eea0: 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65  P_Affinity, base
eeb0: 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
eec0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
eed0: 72 28 76 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  r(v, pIdx);.    
eee0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
eef0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
ef00: 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b  Parse, base, n);
ef10: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
ef20: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
ef30: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
ef40: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
ef50: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
ef60: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
ef70: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
ef80: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
ef90: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
efa0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
efb0: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
efc0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
efd0: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
efe0: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
eff0: 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
f000: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
f010: 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
f020: 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
f030: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
f040: 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
f050: 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
f060: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
f070: 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
f080: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
f090: 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
f0a0: 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
f0b0: 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
f0c0: 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
f0d0: 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
f0e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
f0f0: 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20  EqualityTerm(.  
f100: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f110: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
f120: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f130: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f140: 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20  ,   /* The term 
f150: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
f160: 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20  use to be coded 
f170: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
f180: 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e  *pLevel, /* When
f190: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52   level of the FR
f1a0: 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65  OM clause we are
f1b0: 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
f1c0: 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
f1d0: 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
f1e0: 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
f1f0: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
f200: 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
f210: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
f220: 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
f230: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f240: 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
f250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f260: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
f270: 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 69 66 28  esults */..  if(
f280: 20 69 54 61 72 67 65 74 3c 3d 30 20 29 7b 0a 20   iTarget<=0 ){. 
f290: 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
f2a0: 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
f2b0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f2c0: 20 7d 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d   }.  if( pX->op=
f2d0: 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69 52  =TK_EQ ){.    iR
f2e0: 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
f2f0: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
f300: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
f310: 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
f320: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
f330: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
f340: 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
f350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f360: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
f370: 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
f380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
f390: 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
f3a0: 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
f3b0: 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
f3c0: 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
f3d0: 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  pIn;..    assert
f3e0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
f3f0: 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
f400: 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
f410: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
f420: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
f430: 2c 20 31 29 3b 0a 20 20 20 20 69 54 61 62 20 3d  , 1);.    iTab =
f440: 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
f450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f460: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f470: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56   iTab, 0);.    V
f480: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f490: 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e  %.*s", pX->span.
f4a0: 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b  n, pX->span.z));
f4b0: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
f4c0: 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >nIn==0 ){.     
f4d0: 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20 73   pLevel->nxt = s
f4e0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f4f0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
f500: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b    pLevel->nIn++;
f510: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  .    pLevel->aIn
f520: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 44 62  Loop = sqlite3Db
f530: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
f540: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
f550: 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  ->aInLoop,.     
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f580: 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49  izeof(pLevel->aI
f590: 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
f5a0: 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  ->nIn);.    pIn 
f5b0: 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  = pLevel->aInLoo
f5c0: 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
f5d0: 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70  {.      pIn += p
f5e0: 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20 31 3b 0a  Level->nIn - 1;.
f5f0: 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
f600: 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
f610: 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
f620: 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
f630: 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20     pIn->topAddr 
f640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f650: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
f660: 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20   iTab, iReg);.  
f670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f680: 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20     pIn->topAddr 
f690: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f6a0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
f6b0: 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
f6c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f6d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f6e0: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
f6f0: 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
f700: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
f710: 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
f720: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
f730: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
f740: 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pTerm);.  return
f750: 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
f760: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f770: 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
f780: 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
f790: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
f7a0: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65  n.** index.  The
f7b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
f7c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
f7d0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
f7e0: 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  k..**.** For exa
f7f0: 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
f800: 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
f810: 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
f820: 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
f830: 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
f840: 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
f850: 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
f860: 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
f870: 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
f880: 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
f890: 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
f8a0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
f8b0: 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
f8c0: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
f8d0: 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
f8e0: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
f8f0: 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
f900: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
f910: 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
f920: 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
f930: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f940: 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
f950: 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
f960: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
f970: 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
f980: 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20  l be left.** on 
f990: 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73  the stack - a is
f9a0: 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64   the deepest and
f9b0: 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73   b the shallowes
f9c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  t..**.** In the 
f9d0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
f9e0: 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
f9f0: 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
fa00: 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
fa10: 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
fa20: 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
fa30: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
fa40: 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
fa50: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
fa60: 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
fa70: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
fa80: 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
fa90: 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cell..**.** This
faa0: 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
fab0: 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
fac0: 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
fad0: 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74  ll and puts.** t
fae0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
faf0: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
fb00: 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20  n pLevel->iMem. 
fb10: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
fb20: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
fb30: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c  tine will use pL
fb40: 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74  evel->iMem to st
fb50: 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
fb60: 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
fb70: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
fb80: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
fb90: 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
fba0: 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
fbb0: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
fbc0: 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
fbd0: 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
fbe0: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
fbf0: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
fc00: 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  int codeAllEqual
fc10: 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
fc20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fc30: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
fc40: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
fc50: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
fc60: 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
fc70: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
fc80: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
fc90: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
fca0: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
fcb0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
fcc0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
fcd0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68 69 63  ady,     /* Whic
fce0: 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
fcf0: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
fd00: 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  n coded */.  int
fd10: 20 6e 45 78 74 72 61 52 65 67 20 20 20 20 20 20   nExtraReg      
fd20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fd30: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
fd40: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 29  to allocate */.)
fd50: 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
fd60: 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20  evel->nEq;      
fd70: 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
fd80: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
fd90: 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
fda0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
fdb0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
fdc0: 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
fdd0: 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
fde0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
fdf0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
fe00: 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20 20 20  pLevel->pIdx;   
fe10: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
fe20: 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
fe30: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
fe40: 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
fe50: 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20  abCur;   /* The 
fe60: 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
fe70: 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ble */.  WhereTe
fe80: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
fe90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
fea0: 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
feb0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  rm */.  int j;  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fee0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
fef0: 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
ff00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
ff10: 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
ff20: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
ff30: 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65  w many memory ce
ff40: 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  lls we will need
ff50: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
ff60: 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77  hem..  ** We alw
ff70: 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73  ays need at leas
ff80: 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74  t one used to st
ff90: 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72  ore the loop ter
ffa0: 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c  minator.  ** val
ffb0: 75 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ue.  If there ar
ffc0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77  e IN operators w
ffd0: 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f  e'll need one fo
ffe0: 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a  r each == or.  *
fff0: 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e  * IN constraint.
10000 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e  .  */.  pLevel->
10010 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
10020 4d 65 6d 20 2b 20 31 3b 0a 20 20 72 65 67 42 61  Mem + 1;.  regBa
10030 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
10040 6d 20 2b 20 32 3b 0a 20 20 70 50 61 72 73 65 2d  m + 2;.  pParse-
10050 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d  >nMem += pLevel-
10060 3e 6e 45 71 20 2b 20 32 20 2b 20 6e 45 78 74 72  >nEq + 2 + nExtr
10070 61 52 65 67 3b 0a 0a 20 20 2f 2a 20 45 76 61 6c  aReg;..  /* Eval
10080 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74  uate the equalit
10090 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  y constraints.  
100a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  */.  assert( pId
100b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20  x->nColumn>=nEq 
100c0 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
100d0 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nEq; j++){.    i
100e0 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b  nt r1;.    int k
100f0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
10100 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
10110 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
10120 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
10130 79 2c 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  y, pLevel->flags
10140 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
10150 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
10160 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  k;.    assert( (
10170 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
10180 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
10190 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
101a0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
101b0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
101c0 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
101d0 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
101e0 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e+j ){.      sql
101f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10200 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
10210 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
10220 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
10230 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10240 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
10250 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
10260 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10270 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66   WO_IN );.    if
10280 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
10290 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
102a0 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20  |WO_IN))==0 ){. 
102b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
102d0 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20  ull, regBase+j, 
102e0 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20  pLevel->brk);.  
102f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10300 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66   regBase;.}..#if
10310 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
10320 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
10330 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
10340 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
10350 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
10360 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
10370 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
10380 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
10390 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
103a0 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
103b0 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
103c0 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
103d0 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
103e0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
103f0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
10400 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
10410 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
10420 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
10430 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
10440 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
10450 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
10460 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
10470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
10480 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
10490 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
104a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
104b0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
104c0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
104d0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
104e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
104f0 65 49 6e 66 6f 46 72 65 65 28 57 68 65 72 65 49  eInfoFree(WhereI
10500 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
10510 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
10520 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10530 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e  (i=0; i<pWInfo->
10540 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
10550 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
10560 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  x_info *pInfo = 
10570 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
10580 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  xInfo;.      if(
10590 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20   pInfo ){.      
105a0 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d    assert( pInfo-
105b0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
105c0 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r==0 );.        
105d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e  sqlite3_free(pIn
105e0 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
105f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10600 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  ree(pWInfo);.  }
10610 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
10620 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ate the beginnin
10630 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73  g of the loop us
10640 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  ed for WHERE cla
10650 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
10660 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
10670 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  lue is a pointer
10680 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74   to an opaque st
10690 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e  ructure that con
106a0 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61  tains.** informa
106b0 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74  tion needed to t
106c0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
106d0 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63  p.  Later, the c
106e0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a  alling routine.*
106f0 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  * should invoke 
10700 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10710 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72  ) with the retur
10720 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
10730 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f  function.** in o
10740 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65  rder to complete
10750 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10760 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
10770 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10780 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75  occurs, this rou
10790 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c  tine returns NUL
107a0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73  L..**.** The bas
107b0 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f  ic idea is to do
107c0 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20   a nested loop, 
107d0 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63  one loop for eac
107e0 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68  h table in.** th
107f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
10800 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53   a select.  (INS
10810 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73  ERT and UPDATE s
10820 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68  tatements are th
10830 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53  e.** same as a S
10840 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20  ELECT with only 
10850 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
10860 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
10870 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  e.)  For.** exam
10880 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20  ple, if the SQL 
10890 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  is this:.**.**  
108a0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
108b0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
108c0 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54  ERE ...;.**.** T
108d0 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e  hen the code gen
108e0 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70  erated is concep
108f0 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20  tually like the 
10900 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
10910 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
10920 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20  w1 in t1 do     
10930 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
10940 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
10950 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
10960 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62  t2 do      |-- b
10970 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
10980 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20  gin().**        
10990 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69    foreach row3 i
109a0 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20  n t3 do   /.**  
109b0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
109c0 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20            end   
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65    \    Code gene
109f0 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  rated.**        
10a00 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
10a10 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62             |-- b
10a20 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  y sqlite3WhereEn
10a30 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20  d().**      end 
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a50 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20          /.**.** 
10a60 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f  Note that the lo
10a70 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  ops might not be
10a80 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f   nested in the o
10a90 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  rder in which th
10aa0 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20  ey.** appear in 
10ab0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10ac0 69 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  if a different o
10ad0 72 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61  rder is better a
10ae0 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75  ble to make.** u
10af0 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20  se of indices.  
10b00 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77  Note also that w
10b10 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61  hen the IN opera
10b20 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a  tor appears in.*
10b30 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
10b40 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73  se, it might res
10b50 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61  ult in additiona
10b60 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66  l nested loops f
10b70 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74  or.** scanning t
10b80 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65  hrough all value
10b90 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
10ba0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
10bb0 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  IN..**.** There 
10bc0 61 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72  are Btree cursor
10bd0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
10be0 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74  h each table.  t
10bf0 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a  1 uses cursor.**
10c00 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74   number pTabList
10c10 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20  ->a[0].iCursor. 
10c20 20 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72   t2 uses the cur
10c30 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  sor pTabList->a[
10c40 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41  1].iCursor..** A
10c50 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68  nd so forth.  Th
10c60 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
10c70 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65  ates code to ope
10c80 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72  n those VDBE cur
10c90 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sors.** and sqli
10ca0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65  te3WhereEnd() ge
10cb0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
10cc0 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a   to close them..
10cd0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74  **.** The code t
10ce0 68 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  hat sqlite3Where
10cf0 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65  Begin() generate
10d00 73 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  s leaves the cur
10d10 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e  sors named.** in
10d20 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69   pTabList pointi
10d30 6e 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72  ng at their appr
10d40 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e  opriate entries.
10d50 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65    The [...] code
10d60 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43  .** can use OP_C
10d70 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77  olumn and OP_Row
10d80 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68  id opcodes on th
10d90 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65  ese cursors to e
10da0 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66  xtract.** data f
10db0 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20  rom the various 
10dc0 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f  tables of the lo
10dd0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
10de0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
10df0 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65   empty, the fore
10e00 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65  ach loops must e
10e10 61 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a  ach scan their.*
10e20 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e  * entire tables.
10e30 20 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77    Thus a three-w
10e40 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28  ay join is an O(
10e50 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20  N^3) operation. 
10e60 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74   But if.** the t
10e70 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63  ables have indic
10e80 65 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  es and there are
10e90 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
10ea0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
10eb0 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73  ** refer to thos
10ec0 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d  e indices, a com
10ed0 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e  plete table scan
10ee0 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20   can be avoided 
10ef0 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  and the.** code 
10f00 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61  will run much fa
10f10 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74  ster.  Most of t
10f20 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20  he work of this 
10f30 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b  routine is check
10f40 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ing.** to see if
10f50 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
10f60 65 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  es that can be u
10f70 73 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20  sed to speed up 
10f80 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
10f90 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  Terms of the WHE
10fa0 52 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  RE clause are al
10fb0 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74  so used to limit
10fc0 20 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75   which rows actu
10fd0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20  ally.** make it 
10fe0 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20  to the "..." in 
10ff0 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
11000 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65  e loop.  After e
11010 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a  ach "foreach",.*
11020 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * terms of the W
11030 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
11040 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20   use only terms 
11050 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64  in that loop and
11060 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20   outer.** loops 
11070 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e  are evaluated an
11080 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d  d if false a jum
11090 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64  p is made around
110a0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
110b0 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28  ** inner loops (
110c0 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e  or around the ".
110d0 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20  .." if the test 
110e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
110f0 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74  e inner-.** most
11100 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54   loop).**.** OUT
11110 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41  ER JOINS.**.** A
11120 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20  n outer join of 
11130 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32  tables t1 and t2
11140 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20   is conceptally 
11150 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  coded as follows
11160 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61  :.**.**    forea
11170 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
11180 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  .**      flag = 
11190 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  0.**      foreac
111a0 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a  h row2 in t2 do.
111b0 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a  **        start:
111c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  .**          ...
111d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61  .**          fla
111e0 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e  g = 1.**      en
111f0 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61  d.**      if fla
11200 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20  g==0 then.**    
11210 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77      move the row
11220 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75  2 cursor to a nu
11230 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ll row.**       
11240 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20   goto start.**  
11250 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64      fi.**    end
11260 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
11270 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e  CLAUSE PROCESSIN
11280 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72  G.**.** *ppOrder
11290 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
112a0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
112b0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
112c0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  CT statement,.**
112d0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
112e0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
112f0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
11300 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
11310 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
11320 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45  d from an UPDATE
11330 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
11340 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64  ment, then ppOrd
11350 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  erBy is NULL..**
11360 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20  .** If an index 
11370 63 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74  can be used so t
11380 68 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20  hat the natural 
11390 6f 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20  output order of 
113a0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61  the table.** sca
113b0 6e 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72  n is correct for
113c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
113d0 61 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20  ause, then that 
113e0 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e  index is used an
113f0 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  d.** *ppOrderBy 
11400 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
11410 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
11420 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72  mization that pr
11430 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e  events an.** unn
11440 65 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66  ecessary sort of
11450 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
11460 69 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72  if an index appr
11470 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a  opriate for the.
11480 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
11490 73 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  se already exist
114a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
114b0 77 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f  where clause loo
114c0 70 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72  ps cannot be arr
114d0 61 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65  anged to provide
114e0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
114f0 6f 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68  output order, th
11500 65 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42  en the *ppOrderB
11510 79 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  y is unchanged..
11520 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
11530 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11540 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11550 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
11560 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
11570 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
11580 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c  bList,    /* A l
11590 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ist of all table
115a0 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  s to be scanned 
115b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
115c0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
115d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
115e0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
115f0 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20  pOrderBy, /* An 
11600 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
11610 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 38   or NULL */.  u8
11620 20 77 66 6c 61 67 73 20 20 20 20 20 20 20 20 20   wflags         
11630 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
11640 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
11650 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
11660 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69  eInt.h */.){.  i
11670 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11690 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
116a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
116b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
116c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
116d0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
116e0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
116f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
11700 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
11710 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
11720 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69  se engine */.  i
11730 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30  nt brk, cont = 0
11740 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
11750 72 65 73 73 65 73 20 75 73 65 64 20 64 75 72 69  resses used duri
11760 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
11770 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
11780 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
11790 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
117a0 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
117b0 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
117c0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
117d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
117e0 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  ingle term in th
117f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
11800 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
11810 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 2f  maskSet;       /
11820 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
11830 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
11840 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20  hereClause wc;  
11850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11860 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
11870 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68   divided into th
11880 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73  ese terms */.  s
11890 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
118a0 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
118b0 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  * A single entry
118c0 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a   from pTabList *
118d0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
118e0 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  pLevel;         
118f0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11900 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49  level in the pWI
11910 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  nfo list */.  in
11920 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11940 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
11950 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
11960 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
11970 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
11980 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
11990 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77  ination of all w
119a0 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 20  c.a[].flags */. 
119b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
119c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
119d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
119e0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
119f0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a   *pOrderBy = 0;.
11a00 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
11a10 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
11a20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
11a30 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
11a40 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
11a50 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
11a60 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
11a70 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
11a80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11a90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11aa0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
11ab0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
11ac0 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
11ad0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 70 4f  ;.  }..  if( ppO
11ae0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 70 4f  rderBy ){.    pO
11af0 72 64 65 72 42 79 20 3d 20 2a 70 70 4f 72 64 65  rderBy = *ppOrde
11b00 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  rBy;.  }..  /* S
11b10 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
11b20 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
11b30 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
11b40 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
11b50 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
11b60 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
11b70 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
11b80 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
11b90 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a  kSet(&maskSet);.
11ba0 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
11bb0 74 28 26 77 63 2c 20 70 50 61 72 73 65 2c 20 26  t(&wc, pParse, &
11bc0 6d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69  maskSet);.  sqli
11bd0 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
11be0 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68  ants(pParse, pWh
11bf0 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  ere);.  whereSpl
11c00 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20  it(&wc, pWhere, 
11c10 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
11c20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
11c30 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
11c40 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
11c50 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
11c60 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
11c70 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  urn value..  */.
11c80 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
11c90 62 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  b;.  pWInfo = sq
11ca0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11cb0 6f 28 64 62 2c 20 20 0a 20 20 20 20 20 20 20 20  o(db,  .        
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
11cd0 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20  zeof(WhereInfo) 
11ce0 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  + pTabList->nSrc
11cf0 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
11d00 65 6c 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  el));.  if( db->
11d10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11d20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
11d30 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20  ginNoMem;.  }.  
11d40 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
11d50 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
11d60 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
11d70 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
11d80 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
11d90 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
11da0 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71  nfo->iBreak = sq
11db0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11dc0 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  el(v);..  /* Spe
11dd0 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
11de0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
11df0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
11e00 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
11e10 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
11e20 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
11e30 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
11e40 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
11e50 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
11e60 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
11e70 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  c==0 || sqlite3E
11e80 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
11e90 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
11ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
11eb0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
11ec0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
11ed0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
11ee0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
11ef0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
11f00 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
11f10 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
11f20 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
11f30 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
11f40 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
11f50 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
11f60 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
11f70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
11f80 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
11f90 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
11fa0 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
11fb0 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
11fc0 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
11fd0 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
11fe0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
11ff0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
12000 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
12010 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
12020 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
12030 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
12040 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
12050 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
12060 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
12070 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
12080 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
12090 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
120a0 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
120b0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
120c0 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
120d0 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
120e0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
120f0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
12100 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
12110 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
12120 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
12130 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
12140 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
12150 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
12160 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
12170 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
12180 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
12190 30 31 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  015..  */.  for(
121a0 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
121b0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
121c0 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73   createMask(&mas
121d0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
121e0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
121f0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
12200 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73  G.  {.    Bitmas
12210 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b  k toTheLeft = 0;
12220 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12230 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
12240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
12250 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
12260 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
12270 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
12280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12290 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66   (m-1)==toTheLef
122a0 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65  t );.      toThe
122b0 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d  Left |= m;.    }
122c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
122d0 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
122e0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
122f0 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ons.  Note that 
12300 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69  exprAnalyze() mi
12310 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77  ght.  ** add new
12320 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f   virtual terms o
12330 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
12340 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
12350 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a    We do not.  **
12360 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65   want to analyze
12370 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74   these virtual t
12380 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61  erms, so start a
12390 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20  nalyzing at the 
123a0 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72  end.  ** and wor
123b0 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61  k forward so tha
123c0 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74  t the added virt
123d0 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65  ual terms are ne
123e0 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20  ver processed.. 
123f0 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a   */.  exprAnalyz
12400 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26  eAll(pTabList, &
12410 77 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  wc);.  if( db->m
12420 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12430 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
12440 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20  inNoMem;.  }..  
12450 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65 73  /* Chose the bes
12460 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  t index to use f
12470 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
12480 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
12490 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
124a0 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74   loop fills in t
124b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
124c0 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  lds:.  **.  **  
124d0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64   pWInfo->a[].pId
124e0 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78  x      The index
124f0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
12500 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f   level of the lo
12510 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  op..  **   pWInf
12520 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20  o->a[].flags    
12530 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73   WHERE_xxx flags
12540 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12550 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49   pIdx.  **   pWI
12560 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20  nfo->a[].nEq    
12570 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66     The number of
12580 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74   == and IN const
12590 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57  raints.  **   pW
125a0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20  Info->a[].iFrom 
125b0 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66      When term of
125c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
125d0 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a   is being coded.
125e0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
125f0 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68 65  [].iTabCur   The
12600 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
12610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
12620 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  ble.  **   pWInf
12630 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20  o->a[].iIdxCur  
12640 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
12650 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20   for the index. 
12660 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
12670 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20  op also figures 
12680 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20  out the nesting 
12690 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
126a0 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a  in the FROM.  **
126b0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
126c0 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
126d0 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74  mask)0;.  pTabIt
126e0 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
126f0 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  ;.  pLevel = pWI
12700 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61  nfo->a;.  andFla
12710 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45  gs = ~0;.  WHERE
12720 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
12730 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c  mizer Start ***\
12740 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46  n"));.  for(i=iF
12750 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
12760 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
12770 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
12780 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49  pLevel++){.    I
12790 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
127a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
127b0 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62  dex for FROM tab
127c0 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a  le at pTabItem *
127d0 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b  /.    int flags;
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f    /* Flags assso
12800 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
12810 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b   */.    int nEq;
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12840 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
12850 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75  aints */.    dou
12860 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
12870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12880 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f  cost for pIdx */
12890 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  .    int j;     
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
128c0 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73  over FROM tables
128d0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
128e0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
128f0 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20      /* The best 
12900 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61  index seen so fa
12910 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73  r */.    int bes
12920 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  tFlags = 0;     
12930 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
12940 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
12950 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
12960 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20  estNEq = 0;     
12970 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73         /* nEq as
12980 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
12990 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  est */.    doubl
129a0 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20  e lowestCost;   
129b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
129c0 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20  f the pBest */. 
129d0 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30     int bestJ = 0
129e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
129f0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a  * The value of j
12a00 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   */.    Bitmask 
12a10 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
12a20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76      /* Bitmask v
12a30 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65  alue for j or be
12a40 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  stJ */.    int o
12a50 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nce = 0;        
12a60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
12a70 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20  hen first table 
12a80 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 73  is seen */.    s
12a90 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12aa0 6f 20 2a 70 49 6e 64 65 78 3b 20 2f 2a 20 43 75  o *pIndex; /* Cu
12ab0 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e  rrent virtual in
12ac0 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65  dex */..    lowe
12ad0 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  stCost = SQLITE_
12ae0 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72  BIG_DBL;.    for
12af0 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74  (j=iFrom, pTabIt
12b00 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  em=&pTabList->a[
12b10 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j]; j<pTabList->
12b20 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49  nSrc; j++, pTabI
12b30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  tem++){.      in
12b40 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20  t doNotReorder; 
12b50 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
12b60 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f   table should no
12b70 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a  t be reordered *
12b80 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65  /..      doNotRe
12b90 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74  order =  (pTabIt
12ba0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28  em->jointype & (
12bb0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
12bc0 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  ))!=0;.      if(
12bd0 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65   once && doNotRe
12be0 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
12bf0 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b       m = getMask
12c00 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  (&maskSet, pTabI
12c10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
12c20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
12c30 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
12c40 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72        if( j==iFr
12c50 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20  om ) iFrom++;.  
12c60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
12c80 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
12c90 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  pTab );.#ifndef 
12ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12cb0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69  UALTABLE.      i
12cc0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
12cd0 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  bItem->pTab) ){.
12ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12cf0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
12d00 64 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f  dxInfo = &pWInfo
12d10 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
12d20 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20  .        cost = 
12d30 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78  bestVirtualIndex
12d40 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54  (pParse, &wc, pT
12d50 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
12d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 70 70 4f 72 64 65 72 42 79 20 3f 20 2a 70    ppOrderBy ? *p
12d90 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 20 69 3d  pOrderBy : 0, i=
12da0 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0,.            
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a      ppIdxInfo);.
12dd0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
12de0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
12df0 4c 45 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  LE;.        pInd
12e00 65 78 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b  ex = *ppIdxInfo;
12e10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
12e20 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 6f  dex && pIndex->o
12e30 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29  rderByConsumed )
12e40 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
12e50 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41  s = WHERE_VIRTUA
12e60 4c 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f  LTABLE | WHERE_O
12e70 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20  RDERBY;.        
12e80 7d 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3d  }.        pIdx =
12e90 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 45 71 20   0;.        nEq 
12ea0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
12eb0 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c   (SQLITE_BIG_DBL
12ec0 2f 32 2e 30 29 3c 63 6f 73 74 20 29 7b 0a 20 20  /2.0)<cost ){.  
12ed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
12ee0 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ost is not allow
12ef0 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20  ed to be larger 
12f00 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f  than SQLITE_BIG_
12f10 44 42 4c 20 28 74 68 65 0a 20 20 20 20 20 20 20  DBL (the.       
12f20 20 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c     ** inital val
12f30 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74  ue of lowestCost
12f40 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49   in this loop. I
12f50 66 20 69 74 20 69 73 2c 20 74 68 65 6e 0a 20 20  f it is, then.  
12f60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 28          ** the (
12f70 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29  cost<lowestCost)
12f80 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c   test below will
12f90 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20 61   never be true a
12fa0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
12fb0 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
12fc0 20 6e 65 76 65 72 20 73 65 74 2e 0a 20 20 20 20   never set..    
12fd0 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
12fe0 20 20 20 20 63 6f 73 74 20 3d 20 28 53 51 4c 49      cost = (SQLI
12ff0 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3b  TE_BIG_DBL/2.0);
13000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13010 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20   }else .#endif. 
13020 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
13030 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28  ost = bestIndex(
13040 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61  pParse, &wc, pTa
13050 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c  bItem, notReady,
13060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13070 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20            (i==0 
13080 26 26 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20  && ppOrderBy) ? 
13090 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a  *ppOrderBy : 0,.
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 20 20 20 20 20 20 26 70 49 64 78 2c 20           &pIdx, 
130c0 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20  &flags, &nEq);. 
130d0 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
130e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
130f0 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74   if( cost<lowest
13100 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
13110 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  once = 1;.      
13120 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
13130 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65  ost;.        pBe
13140 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
13150 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
13160 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65  lags;.        be
13170 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
13180 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a       bestJ = j;.
13190 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
131a0 70 42 65 73 74 49 64 78 20 3d 20 70 49 6e 64 65  pBestIdx = pInde
131b0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
131c0 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65   if( doNotReorde
131d0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
131e0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
131f0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
13200 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64  selects table %d
13210 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c   for loop %d\n",
13220 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20   bestJ,.        
13230 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f     pLevel-pWInfo
13240 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28  ->a));.    if( (
13250 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52  bestFlags & WHER
13260 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b  E_ORDERBY)!=0 ){
13270 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42  .      *ppOrderB
13280 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
13290 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
132a0 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
132b0 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74  el->flags = best
132c0 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
132d0 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b  l->pIdx = pBest;
132e0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  .    pLevel->nEq
132f0 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20   = bestNEq;.    
13300 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
13310 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  = 0;.    pLevel-
13320 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66  >nIn = 0;.    if
13330 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
13340 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13350 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13360 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
13370 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
13380 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
13390 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
133a0 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
133b0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
133c0 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  estJ].iCursor);.
133d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
133e0 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20  m = bestJ;.  }. 
133f0 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
13400 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
13410 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a  shed ***\n"));..
13420 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
13430 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
13440 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
13450 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
13460 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
13470 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
13480 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
13490 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
134a0 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
134b0 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
134c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
134d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
134e0 6c 65 72 20 69 73 20 61 6e 20 55 50 44 41 54 45  ler is an UPDATE
134f0 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
13500 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 65 71  ment that is req
13510 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  uesting.  ** to 
13520 75 73 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61  use a one-pass a
13530 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d  lgorithm, determ
13540 69 6e 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ine if this is a
13550 70 70 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2a  ppropriate..  **
13560 20 54 68 65 20 6f 6e 65 2d 70 61 73 73 20 61 6c   The one-pass al
13570 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20 77 6f 72  gorithm only wor
13580 6b 73 20 69 66 20 74 68 65 20 57 48 45 52 45 20  ks if the WHERE 
13590 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
135a0 74 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 74  ts.  ** the stat
135b0 65 6d 65 6e 74 20 74 6f 20 75 70 64 61 74 65 20  ement to update 
135c0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e 0a 20 20  a single row..  
135d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 66  */.  assert( (wf
135e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
135f0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
13600 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
13610 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
13620 77 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  wflags & WHERE_O
13630 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21  NEPASS_DESIRED)!
13640 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67 73 20  =0 && (andFlags 
13650 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
13660 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f  =0 ){.    pWInfo
13670 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b  ->okOnePass = 1;
13680 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30  .    pWInfo->a[0
13690 5d 2e 66 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  ].flags &= ~WHER
136a0 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
136b0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
136c0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
136d0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
136e0 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
136f0 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
13700 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
13710 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
13720 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
13730 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
13740 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
13750 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
13760 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  /.  for(i=0, pLe
13770 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
13780 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
13790 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
137a0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
137b0 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
137c0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e  o open */.    In
137d0 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20 2f  dex *pIx;      /
137e0 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
137f0 61 63 63 65 73 73 20 70 54 61 62 20 28 69 66 20  access pTab (if 
13800 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  any) */.    int 
13810 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
13820 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
13830 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
13840 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  le/index */.    
13850 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
13860 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a  evel->iIdxCur;..
13870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13880 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
13890 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
138a0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ain==2 ){.      
138b0 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
138c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
138d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
138e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
138f0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
13900 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
13910 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41 42  MPrintf(db, "TAB
13920 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  LE %s", pItem->z
13930 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
13940 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
13950 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
13960 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13970 64 62 2c 20 22 25 7a 20 41 53 20 25 73 22 2c 20  db, "%z AS %s", 
13980 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
13990 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
139a0 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70      if( (pIx = p
139b0 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20  Level->pIdx)!=0 
139c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
139d0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
139e0 28 64 62 2c 20 22 25 7a 20 57 49 54 48 20 49 4e  (db, "%z WITH IN
139f0 44 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  DEX %s", zMsg, p
13a00 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Ix->zName);.    
13a10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
13a20 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
13a30 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
13a40 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
13a50 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
13a60 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13a70 64 62 2c 20 22 25 7a 20 55 53 49 4e 47 20 50 52  db, "%z USING PR
13a80 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
13a90 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
13aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13ab0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
13ac0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65    else if( pLeve
13ad0 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20  l->pBestIdx ){. 
13ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
13af0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74  ndex_info *pBest
13b00 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42  Idx = pLevel->pB
13b10 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 20 20  estIdx;.        
13b20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
13b30 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 56 49  rintf(db, "%z VI
13b40 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
13b50 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 69 64      pBestIdx->id
13b80 78 4e 75 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e  xNum, pBestIdx->
13b90 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d  idxStr);.      }
13ba0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
13bb0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
13bc0 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20  & WHERE_ORDERBY 
13bd0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
13be0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
13bf0 28 64 62 2c 20 22 25 7a 20 4f 52 44 45 52 20 42  (db, "%z ORDER B
13c00 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
13c10 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13c20 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13c30 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
13c40 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a  vel->iFrom, 0, z
13c50 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
13c60 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
13c70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
13c80 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
13c90 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
13ca0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
13cb0 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
13cc0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
13cd0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13ce0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
13cf0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
13d00 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
13d10 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d  f( pTab->isEphem
13d20 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
13d30 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
13d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d50 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13d60 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
13d70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20  BestIdx ){.     
13d80 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
13d90 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13db0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
13dc0 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 0a  en, iCur, 0, 0,.
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
13df0 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62  har*)pTab->pVtab
13e00 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
13e10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13e20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
13e30 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
13e40 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
13e50 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66    int op = pWInf
13e60 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f  o->okOnePass ? O
13e70 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50  P_OpenWrite : OP
13e80 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20  _OpenRead;.     
13e90 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
13ea0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74  e(pParse, pTabIt
13eb0 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62  em->iCursor, iDb
13ec0 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20  , pTab, op);.   
13ed0 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
13ee0 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
13ef0 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66 28  b->nCol<(sizeof(
13f00 42 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a 20  Bitmask)*8) ){. 
13f10 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
13f20 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
13f30 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
13f40 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
13f50 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
13f60 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
13f70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13f80 67 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33 56  geP2(v, sqlite3V
13f90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13fa0 29 2d 32 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  )-2, n);.       
13fb0 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
13fc0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
13fd0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
13fe0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
13ff0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
14000 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
14010 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14020 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
14030 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74  iTabCur = pTabIt
14040 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
14050 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76   if( (pIx = pLev
14060 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a  el->pIdx)!=0 ){.
14070 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
14080 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
14090 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
140a0 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61 73  , pIx);.      as
140b0 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65  sert( pIx->pSche
140c0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
140d0 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  a );.      sqlit
140e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
140f0 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
14100 2c 20 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d  , 0, pIx->nColum
14110 6e 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n+1);.      sqli
14120 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14130 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
14140 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
14150 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
14170 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
14180 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
14190 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
141a0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
141b0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
141c0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
141d0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
141e0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  rse, iDb);.  }. 
141f0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
14200 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14210 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a  ntAddr(v);..  /*
14220 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
14230 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
14240 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
14250 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
14260 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
14270 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
14280 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
14290 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
142a0 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
142b0 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
142c0 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
142d0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
142e0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
142f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
14300 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
14310 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74    int j;.    int
14320 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
14330 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54  ->iCursor;  /* T
14340 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
14350 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
14360 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
14370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
14380 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
14390 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
143a0 6e 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nxt;           /
143b0 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20  * Where to jump 
143c0 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
143d0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73   the next IN cas
143e0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  e */.    int iId
143f0 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  xCur;       /* T
14400 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
14410 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
14420 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c      int omitTabl
14430 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  e;     /* True i
14440 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64  f we use the ind
14450 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69  ex only */.    i
14460 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20  nt bRev;        
14470 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
14480 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20  need to scan in 
14490 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
144a0 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ..    pTabItem =
144b0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
144c0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
144d0 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65    iCur = pTabIte
144e0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
144f0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
14500 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72  Idx;.    iIdxCur
14510 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
14520 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28  ur;.    bRev = (
14530 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
14540 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
14550 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65  0;.    omitTable
14560 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
14570 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
14580 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  LY)!=0;..    /* 
14590 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
145a0 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
145b0 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
145c0 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  tructions.    **
145d0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
145e0 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20   loop.  Jump to 
145f0 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  brk to break out
14600 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20   of a loop..    
14610 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
14620 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
14630 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
14640 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
14650 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20     ** loop..    
14660 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  **.    ** When t
14670 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
14680 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
14690 68 61 76 65 20 61 20 22 6e 78 74 22 20 6c 61 62  have a "nxt" lab
146a0 65 6c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 6d  el that.    ** m
146b0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
146c0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
146d0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
146e0 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20 2a  ion.  When.    *
146f0 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
14700 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
14710 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
14720 74 68 65 20 22 6e 78 74 22 20 6c 61 62 65 6c 0a  the "nxt" label.
14730 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61      ** is the sa
14740 6d 65 20 61 73 20 22 62 72 6b 22 2e 0a 20 20 20  me as "brk"..   
14750 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c   */.    brk = pL
14760 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65 76  evel->brk = pLev
14770 65 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65  el->nxt = sqlite
14780 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14790 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c  );.    cont = pL
147a0 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c  evel->cont = sql
147b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
147c0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  l(v);..    /* If
147d0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
147e0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
147f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
14800 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20  llocate and.    
14810 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
14820 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
14830 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
14840 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
14850 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66  ny.    ** row of
14860 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
14870 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20  of the join..   
14880 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
14890 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
148a0 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
148b0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
148c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
148d0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
148e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
148f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
14910 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
14920 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
14930 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14940 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a  (v, "init LEFT J
14950 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
14960 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  g"));.    }..#if
14970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14980 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14990 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42    if( pLevel->pB
149a0 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  estIdx ){.      
149b0 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
149c0 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
149d0 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
149e0 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
149f0 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  Next.      **   
14a00 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
14a10 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20   the data..     
14a20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
14a30 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 3b  .      int iReg;
14a40 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
14a50 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
14a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
14a70 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74  ndex_info *pBest
14a80 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42  Idx = pLevel->pB
14a90 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e  estIdx;.      in
14aa0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
14ab0 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74  pBestIdx->nConst
14ac0 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72  raint;.      str
14ad0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14ae0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
14af0 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20  ge *aUsage =.   
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14b30 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72  BestIdx->aConstr
14b40 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20  aintUsage;.     
14b50 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
14b60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14b70 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61  traint *aConstra
14b80 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  int =.          
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bb0 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
14bc0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
14bd0 20 20 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c        iReg = sql
14be0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
14bf0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72  (pParse, nConstr
14c00 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20 70  aint+2);.      p
14c10 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
14c20 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20  lCache++;.      
14c30 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e  for(j=1; j<=nCon
14c40 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
14c50 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
14c60 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
14c70 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
14c80 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
14c90 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76  ( aUsage[k].argv
14ca0 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20  Index==j ){.    
14cb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
14cc0 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
14cd0 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  k].iTermOffset;.
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
14cf0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
14d00 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20  bleColCache );. 
14d10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14d20 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14d30 65 2c 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e 70  e, wc.a[iTerm].p
14d40 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52  Expr->pRight, iR
14d50 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20  eg+j+1);.       
14d60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14d80 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
14d90 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62  =nConstraint ) b
14da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14db0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
14dc0 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
14dd0 63 68 65 20 29 3b 0a 20 20 20 20 20 20 70 50 61  che );.      pPa
14de0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14df0 61 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71  ache--;.      sq
14e00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14e10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
14e20 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  BestIdx->idxNum,
14e30 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71   iReg);.      sq
14e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14e50 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
14e60 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  -1, iReg+1);.   
14e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e80 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
14e90 65 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69  er, iCur, brk, i
14ea0 52 65 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69  Reg, pBestIdx->i
14eb0 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14ed0 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46  BestIdx->needToF
14ee0 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d  reeIdxStr ? P4_M
14ef0 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
14f00 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
14f10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
14f20 67 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c  ge(pParse, iReg,
14f30 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
14f40 0a 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d  .      pBestIdx-
14f50 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
14f60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  r = 0;.      for
14f70 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
14f80 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
14f90 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
14fa0 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
14fb0 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61     int iTerm = a
14fc0 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54  Constraint[j].iT
14fd0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
14fe0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
14ff0 28 70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69  (pLevel, &wc.a[i
15000 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20  Term]);.        
15010 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15020 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
15030 56 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  VNext;.      pLe
15040 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
15050 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
15060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15070 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15080 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
15090 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
150a0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
150b0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
150c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
150d0 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  ID_EQ ){.      /
150e0 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61  * Case 1:  We ca
150f0 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
15100 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
15110 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20  w using an.     
15120 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
15130 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
15140 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
15150 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
15160 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
15170 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
15180 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
15190 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
151a0 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  .)".      **    
151b0 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
151c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
151d0 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 70 54  int r1;.      pT
151e0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
151f0 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
15200 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
15210 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  _IN, 0);.      a
15220 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
15230 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15240 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
15250 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15260 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
15270 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
15280 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
15290 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
152a0 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69   r1 = codeEquali
152b0 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
152c0 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 29  Term, pLevel, 0)
152d0 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c  ;.      nxt = pL
152e0 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20  evel->nxt;.     
152f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15300 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
15310 6e 74 2c 20 72 31 2c 20 6e 78 74 29 3b 0a 20 20  nt, r1, nxt);.  
15320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15330 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
15340 78 69 73 74 73 2c 20 69 43 75 72 2c 20 6e 78 74  xists, iCur, nxt
15350 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
15360 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
15370 22 29 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  "));.      pLeve
15380 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
15390 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
153a0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
153b0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
153c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
153d0 65 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 2:  We have an
153e0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
153f0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
15400 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
15410 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15420 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e  nt testOp = OP_N
15430 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  oop;.      int s
15440 74 61 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72  tart;.      Wher
15450 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a  eTerm *pStart, *
15460 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73  pEnd;..      ass
15470 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
15480 30 20 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72  0 );.      pStar
15490 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  t = findTerm(&wc
154a0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
154b0 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
154c0 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e  E, 0);.      pEn
154d0 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  d = findTerm(&wc
154e0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
154f0 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
15500 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
15510 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
15520 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
15530 0a 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20  .        pStart 
15540 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  = pEnd;.        
15550 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
15560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15570 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
15580 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
15590 20 20 20 20 69 6e 74 20 72 31 2c 20 72 65 67 46      int r1, regF
155a0 72 65 65 31 3b 0a 20 20 20 20 20 20 20 20 70 58  ree1;.        pX
155b0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
155c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
155d0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
155e0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
155f0 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  t->leftCursor==i
15600 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72  Cur );.        r
15610 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
15620 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15630 70 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pX->pRight, &reg
15640 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
15650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15660 33 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74  3(v, OP_ForceInt
15670 2c 20 72 31 2c 20 62 72 6b 2c 20 0a 20 20 20 20  , r1, brk, .    
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15690 20 20 20 20 20 20 20 20 20 70 58 2d 3e 6f 70 3d           pX->op=
156a0 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LE || pX->op
156b0 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
156c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
156d0 4f 70 33 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op3(v, bRev ? OP
156e0 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76  _MoveLt : OP_Mov
156f0 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20  eGe, iCur, brk, 
15700 72 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  r1);.        Vdb
15710 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
15720 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "));.        sql
15730 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15740 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
15750 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 64 69  ee1);.        di
15760 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
15770 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , pStart);.     
15780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
157a0 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c  2(v, bRev ? OP_L
157b0 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c  ast : OP_Rewind,
157c0 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
157d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
157e0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45  End ){.        E
157f0 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
15800 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70   pX = pEnd->pExp
15810 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
15820 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
15830 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
15840 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
15850 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ur );.        pL
15860 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  evel->iMem = ++p
15870 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
15880 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15890 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
158a0 3e 70 52 69 67 68 74 2c 20 70 4c 65 76 65 6c 2d  >pRight, pLevel-
158b0 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  >iMem);.        
158c0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
158d0 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
158e0 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GT ){.          
158f0 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
15900 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
15910 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15920 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
15930 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
15940 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Gt;.        }
15950 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
15960 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
15970 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
15980 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
15990 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
159a0 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  (v);.      pLeve
159b0 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
159c0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
159d0 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
159e0 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
159f0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
15a00 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74  art;.      if( t
15a10 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
15a20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
15a30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15a40 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15a60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
15a70 77 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a  wid, iCur, r1);.
15a80 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
15a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15aa0 4f 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c  OP_SCopy, pLevel
15ab0 2d 3e 69 4d 65 6d 2c 20 30 29 3b 20 2a 2f 0a 20  ->iMem, 0); */. 
15ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15ad0 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
15ae0 4f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  Op, pLevel->iMem
15af0 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20  , brk, r1);.    
15b00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
15b10 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
15b20 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
15b30 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
15b40 4c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  L);.        sqli
15b50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15b60 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
15b80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
15b90 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
15ba0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  MN_RANGE|WHERE_C
15bb0 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20  OLUMN_EQ) ){.   
15bc0 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20     /* Case 3: A 
15bd0 73 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e  scan using an in
15be0 64 65 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  dex..      **.  
15bf0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
15c00 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
15c10 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
15c20 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
15c30 79 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  y .      **     
15c40 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
15c50 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
15c60 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
15c70 20 74 68 65 20 4e 0a 20 20 20 20 20 20 2a 2a 20   the N.      ** 
15c80 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73          left-mos
15c90 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
15ca0 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61   index. It may a
15cb0 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  lso contain.    
15cc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
15cd0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
15ce0 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
15cf0 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
15d00 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  xed.      **    
15d10 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74       column that
15d20 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
15d30 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c  lows the N equal
15d40 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20  ities. Only .   
15d50 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
15d60 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
15d70 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
15d80 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
15d90 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  est must.      *
15da0 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
15db0 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
15dc0 6f 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65  operators. For e
15dd0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
15de0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15df0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
15e00 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66  y,z), then the f
15e10 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73  ollowing clauses
15e20 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20 20 20   are all .      
15e30 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
15e40 69 7a 65 64 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  ized:.      **. 
15e50 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15e60 20 20 20 78 3d 35 0a 20 20 20 20 20 20 2a 2a 20     x=5.      ** 
15e70 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
15e80 4e 44 20 79 3d 31 30 0a 20 20 20 20 20 20 2a 2a  ND y=10.      **
15e90 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
15ea0 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 20 20 2a  AND y<10.      *
15eb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
15ec0 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31   AND y>5 AND y<1
15ed0 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  0.      **      
15ee0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
15ef0 35 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20  5 AND z<=10.    
15f00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
15f10 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
15f20 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
15f30 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
15f40 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 20 20  sed, only.      
15f50 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
15f60 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 20 20 2a  =5 term:.      *
15f70 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
15f80 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
15f90 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  10.      **.    
15fa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d    **         N m
15fb0 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68  ay be zero if th
15fc0 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
15fd0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
15fe0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15ff0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
16000 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
16010 74 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20  traints, then N 
16020 69 73 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 20  is at.      **  
16030 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65         least one
16040 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16050 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
16060 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
16070 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
16080 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
16090 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
160a0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
160b0 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
160c0 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
160d0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  in order.      *
160e0 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
160f0 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
16100 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
16110 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
16120 20 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20       */  .      
16130 69 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d  int aStartOp[] =
16140 20 7b 0a 20 20 20 20 20 20 20 20 30 2c 0a 20 20   {.        0,.  
16150 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
16160 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
16170 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74        /* 2: (!st
16180 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
16190 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21  && startEq &&  !
161a0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
161b0 20 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20   OP_Last,       
161c0 20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74        /* 3: (!st
161d0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
161e0 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20  && startEq &&   
161f0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
16200 20 4f 50 5f 4d 6f 76 65 47 74 2c 20 20 20 20 20   OP_MoveGt,     
16210 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61        /* 4: (sta
16220 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16230 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 21  && !startEq && !
16240 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
16250 20 4f 50 5f 4d 6f 76 65 4c 74 2c 20 20 20 20 20   OP_MoveLt,     
16260 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
16270 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16280 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
16290 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
162a0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 20 20 20 20   OP_MoveGe,     
162b0 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61        /* 6: (sta
162c0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
162d0 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21  &&  startEq && !
162e0 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20  bRev) */.       
162f0 20 4f 50 5f 4d 6f 76 65 4c 65 20 20 20 20 20 20   OP_MoveLe      
16300 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61        /* 7: (sta
16310 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
16320 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20  &&  startEq &&  
16330 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 7d  bRev) */.      }
16340 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 45 6e 64  ;.      int aEnd
16350 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
16360 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20   OP_Noop,       
16370 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e        /* 0: (!en
16380 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a  d_constraints) *
16390 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64 78  /.        OP_Idx
163a0 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
163b0 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
163c0 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20  aints && !bRev) 
163d0 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64  */.        OP_Id
163e0 78 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  xLT             
163f0 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
16400 72 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20  raints && bRev) 
16410 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
16420 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
16430 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69  el->nEq;.      i
16440 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
16450 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  0;          /* I
16460 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74  f this is an opt
16470 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69  imized SELECT mi
16480 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  n(x).. */.      
16490 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164b0 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
164c0 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
164d0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20   values */.     
164e0 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16500 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
16510 2f 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  /.      WhereTer
16520 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
16530 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
16540 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
16550 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
16560 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
16570 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20  *pRangeEnd = 0; 
16580 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79     /* Inequality
16590 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
165a0 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  ange end */.    
165b0 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20    int startEq;  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165d0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
165e0 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e  start uses ==, >
165f0 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 20  = or <= */.     
16600 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16620 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
16630 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
16640 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  r <= */.      in
16650 74 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  t start_constrai
16660 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  nts;       /* St
16670 61 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20  art of range is 
16680 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20  constrained */. 
16690 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64       int k = pId
166a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
166b0 3b 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20  ; /* Column for 
166c0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
166d0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
166e0 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  int nConstraint;
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16700 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72  Number of constr
16710 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20  aint terms */.  
16720 20 20 20 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 20      int op;..   
16730 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16740 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
16750 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
16760 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
16770 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64   IN.      ** and
16780 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
16790 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
167a0 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
167b0 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 20 20  registers.      
167c0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  ** starting at r
167d0 65 67 42 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  egBase..      */
167e0 0a 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d  .      regBase =
167f0 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79   codeAllEquality
16800 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c  Terms(pParse, pL
16810 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65  evel, &wc, notRe
16820 61 64 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e  ady, 2);.      n
16830 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74  xt = pLevel->nxt
16840 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
16850 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69  his loop satisfi
16860 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20  es a sort order 
16870 28 70 4f 72 64 65 72 42 79 29 20 72 65 71 75 65  (pOrderBy) reque
16880 73 74 20 74 68 61 74 20 0a 20 20 20 20 20 20 2a  st that .      *
16890 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
168a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
168b0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
168c0 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
168d0 20 0a 20 20 20 20 20 20 2a 2a 20 71 75 65 72 79   .      ** query
168e0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
168f0 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f  r will only allo
16900 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75  w the loop to ru
16910 6e 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  n for.      ** a
16920 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
16930 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
16940 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
16950 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20 20   returned.      
16960 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
16970 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
16980 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
16990 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
169a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72        ** the fir
169b0 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65  st one after the
169c0 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f   nEq equality co
169d0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
169e0 20 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 2a 2a   index,.      **
169f0 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73   this requires s
16a00 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ome special hand
16a10 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ling..      */. 
16a20 20 20 20 20 20 69 66 28 20 28 77 66 6c 61 67 73       if( (wflags
16a30 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  &WHERE_ORDERBY_M
16a40 49 4e 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26  IN)!=0.       &&
16a50 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 26   (pLevel->flags&
16a60 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20  WHERE_ORDERBY). 
16a70 20 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e        && (pIdx->
16a80 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20  nColumn>nEq).   
16a90 20 20 20 20 26 26 20 28 70 4f 72 64 65 72 42 79      && (pOrderBy
16aa0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
16ab0 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
16ac0 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 0a 20 20 20 20  olumn[nEq]).    
16ad0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 4d    ){.        isM
16ae0 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
16af0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
16b00 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69  ind any inequali
16b10 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ty constraint te
16b20 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61 72  rms for the star
16b30 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 20  t and end .     
16b40 20 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65   ** of the range
16b50 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
16b60 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
16b70 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
16b80 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
16b90 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e   pRangeEnd = fin
16ba0 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
16bb0 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
16bc0 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64  O_LT|WO_LE), pId
16bd0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
16be0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
16bf0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
16c00 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20  LIMIT ){.       
16c10 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66   pRangeStart = f
16c20 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
16c30 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
16c40 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70  (WO_GT|WO_GE), p
16c50 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
16c60 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
16c70 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
16c80 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
16c90 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
16ca0 65 78 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ex, or.      ** 
16cb0 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  a forward order 
16cc0 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e  scan on a descen
16cd0 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65  ding index, inte
16ce0 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20  rchange the .   
16cf0 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20     ** start and 
16d00 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67  end terms (pRang
16d10 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67  eStart and pRang
16d20 65 45 6e 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  eEnd)..      */.
16d30 20 20 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d        if( bRev==
16d40 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65  (pIdx->aSortOrde
16d50 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53  r[nEq]==SQLITE_S
16d60 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20  O_ASC) ){.      
16d70 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
16d80 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20 70   *, pRangeEnd, p
16d90 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20  RangeStart);.   
16da0 20 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74     }..      test
16db0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
16dc0 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72 74  t && pRangeStart
16dd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
16de0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LE );.      tes
16df0 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
16e00 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
16e10 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
16e20 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65  O_GE );.      te
16e30 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e  stcase( pRangeEn
16e40 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e  d && pRangeEnd->
16e50 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
16e60 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
16e70 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
16e80 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  & pRangeEnd->eOp
16e90 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
16ea0 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71 20  ;.      startEq 
16eb0 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c  = !pRangeStart |
16ec0 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  | pRangeStart->e
16ed0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
16ee0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20  E|WO_GE);.      
16ef0 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67  endEq =   !pRang
16f00 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e  eEnd || pRangeEn
16f10 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  d->eOperator & (
16f20 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
16f30 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
16f40 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74  aints = pRangeSt
16f50 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20  art || nEq>0;.. 
16f60 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65       /* Seek the
16f70 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
16f80 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16f90 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
16fa0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
16fb0 6e 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nEq;.      if( p
16fc0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
16fd0 20 20 20 20 20 20 69 6e 74 20 64 63 63 20 3d 20        int dcc = 
16fe0 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43  pParse->disableC
16ff0 6f 6c 43 61 63 68 65 3b 0a 20 20 20 20 20 20 20  olCache;.       
17000 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
17010 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  {.          pPar
17020 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
17030 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  che++;.        }
17040 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17050 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
17060 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
17070 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67  xpr->pRight, reg
17080 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
17090 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
170a0 6c 65 43 6f 6c 43 61 63 68 65 20 3d 20 64 63 63  leColCache = dcc
170b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
170c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
170d0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
170e0 65 2b 6e 45 71 2c 20 6e 78 74 29 3b 0a 20 20 20  e+nEq, nxt);.   
170f0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
17100 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
17110 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29  if( isMinQuery )
17120 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17140 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
17150 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  se+nEq);.       
17160 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
17170 20 20 20 20 20 20 20 20 73 74 61 72 74 45 71 20          startEq 
17180 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74 61  = 0;.        sta
17190 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
171a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
171b0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
171c0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
171d0 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  ase, nConstraint
171e0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6f  , pIdx);.      o
171f0 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
17200 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
17210 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
17220 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
17230 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20    assert( op!=0 
17240 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17250 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  e( op==OP_Rewind
17260 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17270 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20  se( op==OP_Last 
17280 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17290 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 47 74  e( op==OP_MoveGt
172a0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
172b0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 47  se( op==OP_MoveG
172c0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
172d0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76 65  ase( op==OP_Move
172e0 4c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Le );.      test
172f0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4d 6f 76  case( op==OP_Mov
17300 65 4c 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  eLt );.      sql
17310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17320 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e  , op, iIdxCur, n
17330 78 74 2c 20 72 65 67 42 61 73 65 2c 20 0a 20 20  xt, regBase, .  
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 20 20 20 20 28 63 68 61 72 2a 29 6e 43 6f        (char*)nCo
17360 6e 73 74 72 61 69 6e 74 2c 20 50 34 5f 49 4e 54  nstraint, P4_INT
17370 33 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4c  32);..      /* L
17380 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
17390 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
173a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
173b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
173c0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66      ** range (if
173d0 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
173e0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
173f0 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 69  t = nEq;.      i
17400 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a  f( pRangeEnd ){.
17410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17420 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17430 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
17440 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  ->pRight, regBas
17450 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20  e+nEq);.        
17460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17470 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
17480 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 78 74  regBase+nEq, nxt
17490 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 41  );.        codeA
174a0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61  pplyAffinity(pPa
174b0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
174c0 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  q+1, pIdx);.    
174d0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
174e0 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  +;.      }..    
174f0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
17500 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
17510 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
17520 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
17530 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20  ntAddr(v);..    
17540 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
17550 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
17560 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
17570 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
17580 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f        op = aEndO
17590 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20  p[(pRangeEnd || 
175a0 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76  nEq) * (1 + bRev
175b0 29 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  )];.      testca
175c0 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20  se( op==OP_Noop 
175d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
175e0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  e( op==OP_IdxGE 
175f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17600 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
17610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17620 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70  VdbeAddOp4(v, op
17630 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20  , iIdxCur, nxt, 
17640 72 65 67 42 61 73 65 2c 0a 20 20 20 20 20 20 20  regBase,.       
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 28 63 68 61 72 2a 29 6e 43 6f 6e 73 74 72 61   (char*)nConstra
17670 69 6e 74 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  int, P4_INT32);.
17680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17690 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64  eChangeP5(v, end
176a0 45 71 21 3d 62 52 65 76 29 3b 0a 0a 20 20 20 20  Eq!=bRev);..    
176b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
176c0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
176d0 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20  straints, check 
176e0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20  that the value. 
176f0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74       ** of the t
17700 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
17710 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
17720 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
17730 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a 20   NULL..      ** 
17740 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74  If it is, jump t
17750 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
17760 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
17770 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17780 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17790 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
177a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
177b0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
177c0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
177d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
177e0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  se( pLevel->flag
177f0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
17800 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  MIT );.      if(
17810 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
17820 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49   (WHERE_BTM_LIMI
17830 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  T|WHERE_TOP_LIMI
17840 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  T) ){.        sq
17850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17860 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
17870 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b  dxCur, nEq, r1);
17880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
178a0 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 63 6f 6e  _IsNull, r1, con
178b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
178c0 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
178d0 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
178e0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
178f0 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
17900 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17910 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17920 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
17930 64 78 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20  dxCur, r1);.    
17940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17950 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65  ddOp3(v, OP_Move
17960 47 65 2c 20 69 43 75 72 2c 20 30 2c 20 72 31 29  Ge, iCur, 0, r1)
17970 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
17980 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  eek */.      }. 
17990 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
179a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
179b0 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 20 20 2f  e, r1);..      /
179c0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
179d0 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
179e0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
179f0 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20  oop. Disable .  
17a00 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61      ** WHERE cla
17a10 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72  use terms made r
17a20 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20  edundant by the 
17a30 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e  index range scan
17a40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17a50 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52   pLevel->op = bR
17a60 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f  ev ? OP_Prev : O
17a70 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c  P_Next;.      pL
17a80 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
17a90 75 72 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c  ur;.      disabl
17aa0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
17ab0 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
17ac0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
17ad0 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
17ae0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17af0 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
17b00 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
17b10 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
17b20 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
17b30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
17b40 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
17b50 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
17b60 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
17b70 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
17b80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17b90 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20   bRev==0 );.    
17ba0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
17bb0 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c  P_Next;.      pL
17bc0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
17bd0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
17be0 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  2 = 1 + sqlite3V
17bf0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17c00 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72  Rewind, iCur, br
17c10 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  k);.    }.    no
17c20 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
17c30 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75  sk(&maskSet, iCu
17c40 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65  r);..    /* Inse
17c50 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
17c60 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
17c70 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
17c80 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a  completely.    *
17c90 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67  * computed using
17ca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
17cb0 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   of tables..    
17cc0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  */.    for(pTerm
17cd0 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72  =wc.a, j=wc.nTer
17ce0 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
17cf0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70  rm++){.      Exp
17d00 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 74 65 73  r *pE;.      tes
17d10 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c  tcase( pTerm->fl
17d20 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
17d30 41 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  AL );.      test
17d40 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61  case( pTerm->fla
17d50 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
17d60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
17d70 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
17d80 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
17d90 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
17da0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
17db0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
17dc0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
17dd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
17de0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
17df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e00 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  pE!=0 );.      i
17e10 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
17e20 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
17e30 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
17e40 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
17e50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
17e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
17e70 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
17e80 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74  pParse, pE, cont
17e90 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
17ea0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72  ULL);.      pTer
17eb0 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
17ec0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20  _CODED;.    }.. 
17ed0 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54     /* For a LEFT
17ee0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
17ef0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
17f00 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
17f10 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a  fact that.    **
17f20 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
17f30 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
17f40 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
17f50 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
17f60 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
17f70 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
17f80 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  oin ){.      pLe
17f90 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74  vel->top = sqlit
17fa0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17fb0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
17fc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17fd0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
17fe0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
17ff0 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
18000 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72  mment((v, "recor
18010 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
18020 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18030 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e  3ExprClearColumn
18040 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c  Cache(pParse, pL
18050 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a  evel->iTabCur);.
18060 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18070 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68  rClearColumnCach
18080 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  e(pParse, pLevel
18090 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
180a0 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61    for(pTerm=wc.a
180b0 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72  , j=0; j<wc.nTer
180c0 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; j++, pTerm++)
180d0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
180e0 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  se( pTerm->flags
180f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
18100 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
18110 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67  ase( pTerm->flag
18120 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
18130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
18140 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45  erm->flags & (TE
18150 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
18160 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
18170 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
18180 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
18190 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
181a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
181b0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
181c0 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
181d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
181e0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
181f0 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e  Term->pExpr, con
18200 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
18210 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 70  NULL);.        p
18220 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
18230 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20  ERM_CODED;.     
18240 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
18250 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18260 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67    /* For testing
18270 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
18280 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20  se only */.  /* 
18290 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75  Record in the qu
182a0 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61  ery plan informa
182b0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
182c0 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a  urrent table.  *
182d0 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  * and the index 
182e0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69  used to access i
182f0 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20  t (if any).  If 
18300 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
18310 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65  .  ** is not use
18320 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a  d, its name is j
18330 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f  ust '{}'.  If no
18340 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20   index is used. 
18350 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
18360 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e   listed as "{}".
18370 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79    If the primary
18380 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65   key is used the
18390 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65  .  ** index name
183a0 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20   is '*'..  */.  
183b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
183c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
183d0 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
183e0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65    int n;.    pLe
183f0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
18400 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65  [i];.    pTabIte
18410 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
18420 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
18430 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65  .    z = pTabIte
18440 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69  m->zAlias;.    i
18450 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54  f( z==0 ) z = pT
18460 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e  abItem->pTab->zN
18470 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  ame;.    n = str
18480 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  len(z);.    if( 
18490 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
184a0 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
184b0 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20  plan)-10 ){.    
184c0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
184d0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
184e0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
184f0 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
18500 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
18510 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20  n], "{}", 2);.  
18520 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
18530 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
18540 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
18550 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
18560 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e  an[nQPlan], z, n
18570 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
18580 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  n += n;.      }.
18590 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
185a0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
185b0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  +] = ' ';.    }.
185c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
185d0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
185e0 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a  ERE_ROWID_EQ );.
185f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
18600 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
18610 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
18620 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
18630 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
18640 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
18650 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
18660 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
18670 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18680 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
18690 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
186a0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
186b0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49  e if( pLevel->pI
186c0 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  dx==0 ){.      m
186d0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
186e0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
186f0 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20  ], "{} ", 3);.  
18700 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b      nQPlan += 3;
18710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18720 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65    n = strlen(pLe
18730 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65  vel->pIdx->zName
18740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
18750 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
18760 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18770 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
18780 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
18790 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
187a0 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  n], pLevel->pIdx
187b0 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
187c0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
187d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
187e0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
187f0 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
18800 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18810 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
18820 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
18830 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
18840 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
18850 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
18860 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
18870 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
18880 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
18890 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
188a0 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
188b0 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
188c0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
188d0 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
188e0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
188f0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
18900 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
18910 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
18920 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
18930 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
18940 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e  .  */.  pWInfo->
18950 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74  iContinue = cont
18960 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  ;.  whereClauseC
18970 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74  lear(&wc);.  ret
18980 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
18990 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
189a0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
189b0 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a  hereBeginNoMem:.
189c0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
189d0 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65  ar(&wc);.  where
189e0 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29  InfoFree(pWInfo)
189f0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
18a00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
18a10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
18a20 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
18a30 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
18a40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
18a50 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
18a60 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
18a70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
18a80 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
18a90 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64  o *pWInfo){.  Vd
18aa0 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
18ab0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18ac0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
18ad0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
18ae0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
18af0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
18b00 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  List;..  /* Gene
18b10 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
18b20 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
18b30 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c  .  sqlite3ExprCl
18b40 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  earColumnCache(p
18b50 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 2d  WInfo->pParse, -
18b60 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62  1);.  for(i=pTab
18b70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  List->nSrc-1; i>
18b80 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c  =0; i--){.    pL
18b90 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
18ba0 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  a[i];.    sqlite
18bb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18bc0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  l(v, pLevel->con
18bd0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
18be0 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
18bf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18c00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
18c10 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
18c20 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
18c30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
18c40 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a   pLevel->nIn ){.
18c50 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
18c60 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
18c70 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
18c80 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18c90 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
18ca0 6e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  nxt);.      for(
18cb0 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70  j=pLevel->nIn, p
18cc0 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  In=&pLevel->aInL
18cd0 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a  oop[j-1]; j>0; j
18ce0 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20  --, pIn--){.    
18cf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
18d00 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
18d10 74 6f 70 41 64 64 72 2b 31 29 3b 0a 20 20 20 20  topAddr+1);.    
18d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18d30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
18d40 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
18d50 2d 3e 74 6f 70 41 64 64 72 29 3b 0a 20 20 20 20  ->topAddr);.    
18d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
18d70 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
18d80 74 6f 70 41 64 64 72 2d 31 29 3b 0a 20 20 20 20  topAddr-1);.    
18d90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18da0 33 5f 66 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61  3_free(pLevel->a
18db0 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
18dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18dd0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
18de0 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20  evel->brk);.    
18df0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
18e00 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
18e10 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
18e20 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
18e30 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
18e40 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
18e50 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 73  ftJoin);.      s
18e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18e70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
18e80 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
18e90 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
18ea0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  f( pLevel->iIdxC
18eb0 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ur>=0 ){.       
18ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18ed0 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
18ee0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
18ef0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
18f20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b  0, pLevel->top);
18f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18f40 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
18f50 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
18f60 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
18f70 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
18f80 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
18f90 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
18fa0 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
18fb0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
18fc0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18fd0 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
18fe0 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
18ff0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
19000 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
19010 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
19020 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
19030 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
19040 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
19050 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
19060 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
19070 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
19080 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
19090 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
190a0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
190b0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
190c0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
190d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
190e0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
190f0 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c   pTab->isEphem |
19100 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
19110 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19120 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
19130 6e 65 50 61 73 73 20 26 26 20 28 70 4c 65 76 65  nePass && (pLeve
19140 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
19150 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
19160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19170 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
19180 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  lose, pTabItem->
19190 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  iCursor);.    }.
191a0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
191b0 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx!=0 ){.     
191c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
191d0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
191e0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
191f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19200 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
19210 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
19220 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69   code substituti
19230 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61  ons to read data
19240 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  .    ** from the
19250 20 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72   index in prefer
19260 65 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c  ence to the tabl
19270 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68  e. Sometimes, th
19280 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
19290 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e  the table need n
192a0 65 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f  ever be read fro
192b0 6d 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72  m. This is a per
192c0 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a  formance boost,.
192d0 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64      ** as the vd
192e0 62 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75  be level waits u
192f0 6e 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69  ntil the table i
19300 73 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63  s read before ac
19310 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65  tually.    ** se
19320 65 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  eking the table 
19330 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65  cursor to the re
19340 63 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69  cord correspondi
19350 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
19360 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  t.    ** positio
19370 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  n in the index..
19380 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43      ** .    ** C
19390 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65  alls to the code
193a0 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65   generator in be
193b0 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65  tween sqlite3Whe
193c0 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20  reBegin and.    
193d0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
193e0 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65  nd will have cre
193f0 61 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72  ated code that r
19400 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61  eferences the ta
19410 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  ble.    ** direc
19420 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20  tly.  This loop 
19430 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63  scans all that c
19440 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ode looking for 
19450 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74  opcodes.    ** t
19460 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  hat reference th
19470 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76  e table and conv
19480 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f  erts them into o
19490 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20  pcodes that.    
194a0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ** reference the
194b0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20   index..    */. 
194c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
194d0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Idx ){.      int
194e0 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
194f0 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
19500 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
19510 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
19520 3b 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65 49  ;.      int useI
19530 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76 65  ndexOnly = pLeve
19540 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
19550 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20  _IDX_ONLY;..    
19560 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
19570 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  0 );.      pOp =
19580 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
19590 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
195a0 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
195b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
195c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
195d0 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
195e0 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
195f0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
19600 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
19610 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
19620 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19630 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
19640 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
19650 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
19660 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
19670 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
19680 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
19690 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
196a0 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
196b0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
196c0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
196d0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
196e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
196f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19700 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
19710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 75         assert(!u
19730 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a  seIndexOnly || j
19740 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  <pIdx->nColumn);
19750 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
19760 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
19770 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
19780 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
19790 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
197a0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
197b0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52  opcode = OP_IdxR
197c0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  owid;.        }e
197d0 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
197e0 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20  ode==OP_NullRow 
197f0 26 26 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20  && useIndexOnly 
19800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
19810 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
19820 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
19830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19840 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
19850 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  nup.  */.  where
19860 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29  InfoFree(pWInfo)
19870 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.