/ Hex Artifact Content
Login

Artifact 53c6b8014622aa918046957e56bc020101754768:


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 30  : where.c,v 1.30
0340: 37 20 32 30 30 38 2f 30 35 2f 33 30 20 31 34 3a  7 2008/05/30 14:
0350: 35 38 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a  58:37 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 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
2450: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
2460: 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20  WC->nSlot*2 );. 
2470: 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30     if( pWC->a==0
2480: 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 70   ){.      pWC->p
2490: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
24a0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
24b0: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 54     if( flags & T
24c0: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
24d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
24e0: 70 72 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20  prDelete(p);.   
24f0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
2500: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
2510: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2520: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
2530: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
2540: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
2550: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
2560: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
2570: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
2580: 74 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b 0a  te3_free(pOld);.
2590: 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e      }.    pWC->n
25a0: 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20  Slot *= 2;.  }. 
25b0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
25c0: 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72  [idx = pWC->nTer
25d0: 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d  m];.  pWC->nTerm
25e0: 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78  ++;.  pTerm->pEx
25f0: 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d  pr = p;.  pTerm-
2600: 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
2610: 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70    pTerm->pWC = p
2620: 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  WC;.  pTerm->iPa
2630: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74  rent = -1;.  ret
2640: 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn idx;.}../*.*
2650: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2660: 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70  dentifies subexp
2670: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
2680: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
2690: 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78  re.** each subex
26a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
26b0: 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44  rated by the AND
26c0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
26d0: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
26e0: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
26f0: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
2700: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
2710: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
2720: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
2730: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
2740: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
2750: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
2760: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
2770: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
2780: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
2790: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
27a0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
27b0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
27c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
27d0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
27e0: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
27f0: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
2800: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
2820: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
2830: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
2840: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
2850: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
2860: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
2870: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
2880: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
2890: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
28a0: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
28b0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
28c0: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
28d0: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
28e0: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
28f0: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
2900: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
2910: 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72 61  rray.  This arra
2920: 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65  y grows as neede
2930: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  d to contain.** 
2940: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2950: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
2960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
2970: 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c  ereSplit(WhereCl
2980: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
2990: 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b  *pExpr, int op){
29a0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
29b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
29c0: 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b  pExpr->op!=op ){
29d0: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
29e0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
29f0: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
2a00: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2a10: 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  WC, pExpr->pLeft
2a20: 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65  , op);.    where
2a30: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2a40: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20  ->pRight, op);. 
2a50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
2a60: 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73  ialize an expres
2a70: 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f  sion mask set.*/
2a80: 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73  .#define initMas
2a90: 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28  kSet(P)  memset(
2aa0: 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29  P, 0, sizeof(*P)
2ab0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
2ac0: 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
2ad0: 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
2ae0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
2af0: 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72   0 if.** iCursor
2b00: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73   is not in the s
2b10: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  et..*/.static Bi
2b20: 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45 78  tmask getMask(Ex
2b30: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
2b40: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
2b50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
2b60: 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65  r(i=0; i<pMaskSe
2b70: 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t->n; i++){.    
2b80: 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  if( pMaskSet->ix
2b90: 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  [i]==iCursor ){.
2ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42        return ((B
2bb0: 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20  itmask)1)<<i;.  
2bc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2bd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2be0: 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66  ate a new mask f
2bf0: 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f  or cursor iCurso
2c00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  r..**.** There i
2c10: 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72  s one cursor per
2c20: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
2c30: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
2c40: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62  number of.** tab
2c50: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
2c60: 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
2c70: 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c  d by a test earl
2c80: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  y in the.** sqli
2c90: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2ca0: 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20  routine.  So we 
2cb0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d  know that the pM
2cc0: 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20  askSet->ix[].** 
2cd0: 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72  array will never
2ce0: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74   overflow..*/.st
2cf0: 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65  atic void create
2d00: 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74  Mask(ExprMaskSet
2d10: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
2d20: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
2d30: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
2d40: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
2d50: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
2d60: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
2d70: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
2d80: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
2d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
2da0: 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  s (recursively) 
2db0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2dc0: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
2dd0: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
2de0: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
2df0: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
2e00: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
2e10: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  n.** tree..**.**
2e20: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
2e30: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f  is routine to wo
2e40: 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  rk, the calling 
2e50: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
2e60: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
2e70: 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33   invoked sqlite3
2e80: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
2e90: 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  () on the expres
2ea0: 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sion.  See.** th
2eb0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2ec0: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
2ed0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
2ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
2ef0: 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 52  The sqlite3ExprR
2f00: 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f  esolveNames() ro
2f10: 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72  utines looks for
2f20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
2f30: 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20  d.** sets their 
2f40: 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f  opcodes to TK_CO
2f50: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45  LUMN and their E
2f60: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
2f70: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45  s to.** the VDBE
2f80: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
2f90: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
2fa0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
2fb0: 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c  has to.** transl
2fc0: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
2fd0: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d  umbers into bitm
2fe0: 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f  ask values and O
2ff0: 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74  R all.** the bit
3000: 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a  masks together..
3010: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
3020: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
3030: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
3040: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
3050: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3060: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
3070: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c  ge(ExprMaskSet*,
3080: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
3090: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
30a0: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
30b0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
30c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d  Expr *p){.  Bitm
30d0: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
30e0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
30f0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  n 0;.  if( p->op
3100: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
3110: 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73     mask = getMas
3120: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69  k(pMaskSet, p->i
3130: 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75  Table);.    retu
3140: 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d  rn mask;.  }.  m
3150: 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55  ask = exprTableU
3160: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
3170: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73  ->pRight);.  mas
3180: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
3190: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
31a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20  >pLeft);.  mask 
31b0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
31c0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
31d0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73  p->pList);.  mas
31e0: 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54  k |= exprSelectT
31f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
3200: 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b  et, p->pSelect);
3210: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
3220: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
3230: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
3240: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
3250: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c  *pMaskSet, ExprL
3260: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
3270: 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20  nt i;.  Bitmask 
3280: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
3290: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
32a0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
32b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
32c0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
32d0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
32e0: 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
32f0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
3300: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
3310: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
3320: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
3330: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
3340: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c  t *pMaskSet, Sel
3350: 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d  ect *pS){.  Bitm
3360: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
3370: 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20 20  while( pS ){.   
3380: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
3390: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
33a0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
33b0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
33c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
33d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
33e0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
33f0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
3400: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
3410: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
3420: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
3430: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
3440: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
3450: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
3460: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
3470: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
3480: 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20 3d  aving);.    pS =
3490: 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d   pS->pPrior;.  }
34a0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
34b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
34c0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
34d0: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
34e0: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
34f0: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
3500: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
3510: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
3520: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
3530: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
3540: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
3550: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
3560: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a  ", and "IN"..*/.
3570: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
3580: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
3590: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
35a0: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
35b0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
35c0: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
35d0: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
35e0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
35f0: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
3600: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3610: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
3620: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
3630: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
3640: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
3650: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c   || op==TK_ISNUL
3660: 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  L;.}../*.** Swap
3670: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
3680: 74 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69  type T..*/.#defi
3690: 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42  ne SWAP(TYPE,A,B
36a0: 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42  ) {TYPE t=A; A=B
36b0: 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ; B=t;}../*.** C
36c0: 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69  ommute a compari
36d0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45  son operator.  E
36e0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
36f0: 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a  e form "X op Y".
3700: 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ** are converted
3710: 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a   into "Y op X"..
3720: 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61  **.** If a colla
3730: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
3740: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3750: 20 65 69 74 68 65 72 20 74 68 65 20 6c 65 66 74   either the left
3760: 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73 69 64   or right.** sid
3770: 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  e of the compari
3780: 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e 73 20  son, it remains 
3790: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37a0: 74 68 65 20 73 61 6d 65 20 73 69 64 65 20 61 66  the same side af
37b0: 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75  ter.** the commu
37c0: 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f  tation. So "Y co
37d0: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
37e0: 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22  X" becomes .** "
37f0: 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45  X collate NOCASE
3800: 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69 73 20   op Y". This is 
3810: 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c  because any coll
3820: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
3830: 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61  n.** the left ha
3840: 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d  nd side of a com
3850: 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65  parison override
3860: 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  s any collation 
3870: 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74  sequence .** att
3880: 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67  ached to the rig
3890: 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65  ht. For the same
38a0: 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 45   reason the EP_E
38b0: 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a  xpCollate flag.*
38c0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65  * is not commute
38d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
38e0: 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 45 78  d exprCommute(Ex
38f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 75 31  pr *pExpr){.  u1
3900: 36 20 65 78 70 52 69 67 68 74 20 3d 20 28 70 45  6 expRight = (pE
3910: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61  xpr->pRight->fla
3920: 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
3930: 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65  te);.  u16 expLe
3940: 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65  ft = (pExpr->pLe
3950: 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  ft->flags & EP_E
3960: 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73  xpCollate);.  as
3970: 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28  sert( allowedOp(
3980: 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45  pExpr->op) && pE
3990: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29  xpr->op!=TK_IN )
39a0: 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71  ;.  SWAP(CollSeq
39b0: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  *,pExpr->pRight-
39c0: 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c  >pColl,pExpr->pL
39d0: 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70  eft->pColl);.  p
39e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
39f0: 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ags = (pExpr->pR
3a00: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  ight->flags & ~E
3a10: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
3a20: 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72  expLeft;.  pExpr
3a30: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d  ->pLeft->flags =
3a40: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
3a50: 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43  flags & ~EP_ExpC
3a60: 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67  ollate) | expRig
3a70: 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a  ht;.  SWAP(Expr*
3a80: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70  ,pExpr->pRight,p
3a90: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
3aa0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
3ab0: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65  K_GT ){.    asse
3ac0: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
3ad0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
3ae0: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32  ( TK_GE==TK_LE+2
3af0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3b00: 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20  TK_GT>TK_EQ );. 
3b10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3b20: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73  <TK_LE );.    as
3b30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
3b40: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
3b50: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
3b60: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28    pExpr->op = ((
3b70: 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29  pExpr->op-TK_GT)
3b80: 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d  ^2)+TK_GT;.  }.}
3b90: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  ../*.** Translat
3ba0: 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65  e from TK_xx ope
3bb0: 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62  rator to WO_xx b
3bc0: 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  itmask..*/.stati
3bd0: 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61  c int operatorMa
3be0: 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  sk(int op){.  in
3bf0: 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t c;.  assert( a
3c00: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a  llowedOp(op) );.
3c10: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
3c20: 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e  ){.    c = WO_IN
3c30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
3c40: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
3c50: 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c     c = WO_ISNULL
3c60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
3c70: 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b   = WO_EQ<<(op-TK
3c80: 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _EQ);.  }.  asse
3c90: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  rt( op!=TK_ISNUL
3ca0: 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c  L || c==WO_ISNUL
3cb0: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  L );.  assert( o
3cc0: 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57  p!=TK_IN || c==W
3cd0: 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  O_IN );.  assert
3ce0: 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63  ( op!=TK_EQ || c
3cf0: 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73  ==WO_EQ );.  ass
3d00: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c  ert( op!=TK_LT |
3d10: 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20  | c==WO_LT );.  
3d20: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c  assert( op!=TK_L
3d30: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b  E || c==WO_LE );
3d40: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3d50: 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54  K_GT || c==WO_GT
3d60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3d70: 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_GE || c==WO
3d80: 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _GE );.  return 
3d90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  c;.}../*.** Sear
3da0: 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e  ch for a term in
3db0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3dc0: 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65  e that is of the
3dd0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
3de0: 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58  xpr>".** where X
3df0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
3e00: 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f  to the iColumn o
3e10: 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64  f table iCur and
3e20: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a   <op> is one of.
3e30: 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65  ** the WO_xx ope
3e40: 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63  rator codes spec
3e50: 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20  ified by the op 
3e60: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65  parameter..** Re
3e70: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3e80: 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74  o the term.  Ret
3e90: 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75  urn 0 if not fou
3ea0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  nd..*/.static Wh
3eb0: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
3ec0: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
3ed0: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
3ee0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
3ef0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
3f00: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
3f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
3f20: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
3f30: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
3f40: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
3f50: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3f60: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
3f70: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
3f80: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
3f90: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
3fa0: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36 20 6f   mask */.  u16 o
3fb0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3fc0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
3fd0: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
3fe0: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
3ff0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
4000: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
4010: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4020: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
4030: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
4040: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
4050: 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  erm;.  int k;.  
4060: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
4070: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
4080: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
4090: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
40a0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
40b0: 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  r.       && (pTe
40c0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
40d0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
40e0: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
40f0: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
4100: 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70  umn.       && (p
4110: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
4120: 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a  & op)!=0.    ){.
4130: 20 20 20 20 20 20 69 66 28 20 69 43 75 72 3e 3d        if( iCur>=
4140: 30 20 26 26 20 70 49 64 78 20 26 26 20 70 54 65  0 && pIdx && pTe
4150: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57  rm->eOperator!=W
4160: 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
4170: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
4180: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
4190: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
41a0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61  oll;.        cha
41b0: 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20  r idxaff;.      
41c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
41d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
41e0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pWC->pParse;.. 
41f0: 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20         idxaff = 
4200: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
4210: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
4220: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nity;.        if
4230: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
4240: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
4250: 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  xaff) ) continue
4260: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;..        /* Fi
4270: 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c  gure out the col
4280: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
4290: 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e  required from an
42a0: 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20   index for.     
42b0: 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75     ** it to be u
42c0: 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69  seful for optimi
42d0: 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  sing expression 
42e0: 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20  pX. Store this. 
42f0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
4300: 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c  in variable pCol
4310: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
4320: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d        assert(pX-
4330: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
4340: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
4350: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
4360: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
4370: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
4380: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ht);.        if(
4390: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
43a0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
43b0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
43c0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ll;.        }.. 
43d0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
43e0: 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  j<pIdx->nColumn 
43f0: 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  && pIdx->aiColum
4400: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
4410: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 61 73  ++){}.        as
4420: 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e 6e 43  sert( j<pIdx->nC
4430: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
4440: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4450: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
4460: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  , pIdx->azColl[j
4470: 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ]) ) continue;. 
4480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
4490: 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  urn pTerm;.    }
44a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
44b0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
44c0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
44d0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
44e0: 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57 68  yze(SrcList*, Wh
44f0: 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29  ereClause*, int)
4500: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78  ;../*.** Call ex
4510: 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c  prAnalyze on all
4520: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
4530: 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a  E clause.  .**.*
4540: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
4550: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
4560: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
4570: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74  List,       /* t
4580: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
4590: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
45a0: 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20  *pWC         /* 
45b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
45c0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
45d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
45e0: 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
45f0: 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
4600: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
4610: 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20  (pTabList, pWC, 
4620: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  i);.  }.}..#ifnd
4630: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
4640: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
4650: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
4660: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
4670: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
4680: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
4690: 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63  erator that.** c
46a0: 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  an be optimized 
46b0: 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79  using inequality
46c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52   constraints.  R
46d0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
46e0: 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61   is.** so and fa
46f0: 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
4700: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
4710: 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  he operator to b
4720: 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74  e optimizible, t
4730: 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20 61  he RHS must be a
4740: 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72   string.** liter
4750: 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  al that does not
4760: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77 69   begin with a wi
4770: 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61  ldcard.  .*/.sta
4780: 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72  tic int isLikeOr
4790: 47 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 20  Glob(.  sqlite3 
47a0: 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  *db,      /* The
47b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 45   database */.  E
47c0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
47d0: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
47e0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
47f0: 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20  t *pnPattern,   
4800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  /* Number of non
4810: 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78  -wildcard prefix
4820: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
4830: 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74   int *pisComplet
4840: 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  e, /* True if th
4850: 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20  e only wildcard 
4860: 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74  is % in the last
4870: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
4880: 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20  int *pnoCase    
4890: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70    /* True if upp
48a0: 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61  ercase is equiva
48b0: 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73  lent to lowercas
48c0: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
48d0: 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20  char *z;.  Expr 
48e0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
48f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4900: 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74  st;.  int c, cnt
4910: 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a  ;.  char wc[3];.
4920: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
4930: 3b 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  ;..  if( !sqlite
4940: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
4950: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
4960: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
4970: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
4980: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
4990: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
49a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
49b0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
49c0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52  xpr->pList;.  pR
49d0: 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  ight = pList->a[
49e0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
49f0: 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53  pRight->op!=TK_S
4a00: 54 52 49 4e 47 0a 20 20 20 26 26 20 28 70 52 69  TRING.   && (pRi
4a10: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  ght->op!=TK_REGI
4a20: 53 54 45 52 20 7c 7c 20 70 52 69 67 68 74 2d 3e  STER || pRight->
4a30: 69 43 6f 6c 75 6d 6e 21 3d 54 4b 5f 53 54 52 49  iColumn!=TK_STRI
4a40: 4e 47 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NG) ){.    retur
4a50: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74  n 0;.  }.  pLeft
4a60: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70   = pList->a[1].p
4a70: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66  Expr;.  if( pLef
4a80: 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op!=TK_COLUMN
4a90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4aa0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20  ;.  }.  pColl = 
4ab0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pLeft->pColl;.  
4ac0: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 21 3d 30  assert( pColl!=0
4ad0: 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75   || pLeft->iColu
4ae0: 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20  mn==-1 );.  if( 
4af0: 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pColl==0 ){.    
4b00: 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* No collation 
4b10: 69 73 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74  is defined for t
4b20: 68 65 20 52 4f 57 49 44 2e 20 20 55 73 65 20 74  he ROWID.  Use t
4b30: 68 65 20 64 65 66 61 75 6c 74 2e 20 2a 2f 0a 20  he default. */. 
4b40: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
4b50: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20  DfltColl;.  }.  
4b60: 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65  if( (pColl->type
4b70: 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  !=SQLITE_COLL_BI
4b80: 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61 73 65  NARY || *pnoCase
4b90: 29 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c  ) &&.      (pCol
4ba0: 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f  l->type!=SQLITE_
4bb0: 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21  COLL_NOCASE || !
4bc0: 2a 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20 20  *pnoCase) ){.   
4bd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4be0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
4bf0: 78 70 72 28 64 62 2c 20 70 52 69 67 68 74 29 3b  xpr(db, pRight);
4c00: 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 70  .  z = (char *)p
4c10: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  Right->token.z;.
4c20: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28    cnt = 0;.  if(
4c30: 20 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28   z ){.    while(
4c40: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
4c50: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
4c60: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
4c70: 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a 20  2] ){ cnt++; }. 
4c80: 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20   }.  if( cnt==0 
4c90: 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e  || 255==(u8)z[cn
4ca0: 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t] ){.    return
4cb0: 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f   0;.  }.  *pisCo
4cc0: 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d  mplete = z[cnt]=
4cd0: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
4ce0: 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74  1]==0;.  *pnPatt
4cf0: 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74  ern = cnt;.  ret
4d00: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
4d10: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
4d20: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
4d30: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
4d40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4d50: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
4d60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
4d70: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
4d80: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
4d90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
4da0: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
4db0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
4dc0: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
4dd0: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
4de0: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
4df0: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
4e00: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
4e10: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
4e20: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
4e30: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
4e40: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
4e50: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
4e60: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
4e70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4e80: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
4e90: 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20 20 20  n.n!=5 ||.      
4ea0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
4eb0: 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 45  ((const char*)pE
4ec0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
4ed0: 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20 20  tch",5)!=0 ){.  
4ee0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4ef0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
4f00: 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  >pList;.  if( pL
4f10: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b  ist->nExpr!=2 ){
4f20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4f30: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
4f40: 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21  a[1].pExpr->op !
4f50: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  = TK_COLUMN ){. 
4f60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4f70: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
4f80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4f90: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4fa0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  E */../*.** If t
4fb0: 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73  he pBase express
4fc0: 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69  ion originated i
4fd0: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
4fe0: 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61  G clause of.** a
4ff0: 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e   join, then tran
5000: 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72  sfer the appropr
5010: 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76  iate markings ov
5020: 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a  er to derived..*
5030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
5040: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
5050: 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65  gs(Expr *pDerive
5060: 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b  d, Expr *pBase){
5070: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61  .  pDerived->fla
5080: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
5090: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
50a0: 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52  ;.  pDerived->iR
50b0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
50c0: 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69  pBase->iRightJoi
50d0: 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21  nTable;.}..#if !
50e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
50f0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
5100: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
5110: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
5120: 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 52 65 74  QUERY)./*.** Ret
5130: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
5140: 67 69 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e  given term of an
5150: 20 4f 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62   OR clause can b
5160: 65 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 69  e converted.** i
5170: 6e 74 6f 20 61 6e 20 49 4e 20 63 6c 61 75 73 65  nto an IN clause
5180: 2e 20 20 54 68 65 20 69 43 75 72 73 6f 72 20 61  .  The iCursor a
5190: 6e 64 20 69 43 6f 6c 75 6d 6e 20 64 65 66 69 6e  nd iColumn defin
51a0: 65 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 0a  e the left-hand.
51b0: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  ** side of the I
51c0: 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  N clause..**.** 
51d0: 54 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20 74  The context is t
51e0: 68 61 74 20 77 65 20 68 61 76 65 20 6d 75 6c 74  hat we have mult
51f0: 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  iple OR-connecte
5200: 64 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73  d equality terms
5210: 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  .** like this:.*
5220: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
5230: 3d 3c 65 78 70 72 31 3e 20 4f 52 20 20 61 3d 3c  =<expr1> OR  a=<
5240: 65 78 70 72 32 3e 20 4f 52 20 62 3d 3c 65 78 70  expr2> OR b=<exp
5250: 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a 2a 0a 2a  r3>  OR ....**.*
5260: 2a 20 54 68 65 20 70 4f 72 54 65 72 6d 20 69 6e  * The pOrTerm in
5270: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
5280: 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ine corresponds 
5290: 74 6f 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  to a single term
52a0: 20 6f 66 0a 2a 2a 20 74 68 69 73 20 4f 52 20 63   of.** this OR c
52b0: 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65 72  lause.  In order
52c0: 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 74 6f   for the term to
52d0: 20 62 65 20 61 20 63 61 6e 64 69 64 61 74 65 20   be a candidate 
52e0: 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  for.** conversio
52f0: 6e 20 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61  n to an IN opera
5300: 74 6f 72 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tor, the followi
5310: 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75 65 3a  ng must be true:
5320: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68  .**.**     *  Th
5330: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
5340: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6d 75 73   of the term mus
5350: 74 20 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t be the column 
5360: 77 68 69 63 68 0a 2a 2a 20 20 20 20 20 20 20 20  which.**        
5370: 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
5380: 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f   iCursor and iCo
5390: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lumn..**.**     
53a0: 2a 20 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  *  If the right-
53b0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
53c0: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
53d0: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
53e0: 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 62 6f 74  **        of bot
53f0: 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74  h right and left
5400: 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20 73   sides must be s
5410: 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65  uch that no type
5420: 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 76 65  .**        conve
5430: 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69  rsions are requi
5440: 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  red on the right
5450: 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39  .  (Ticket #2249
5460: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20  ).**.** If both 
5470: 6f 66 20 74 68 65 73 65 20 63 6f 6e 64 69 74 69  of these conditi
5480: 6f 6e 73 20 61 72 65 20 74 72 75 65 2c 20 74 68  ons are true, th
5490: 65 6e 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20  en return true. 
54a0: 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
54b0: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
54c0: 74 61 74 69 63 20 69 6e 74 20 6f 72 54 65 72 6d  tatic int orTerm
54d0: 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65 28 57  IsOptCandidate(W
54e0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
54f0: 6d 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20  m, int iCursor, 
5500: 69 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b 0a 20 20  int iColumn){.  
5510: 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66  int affLeft, aff
5520: 52 69 67 68 74 3b 0a 20 20 61 73 73 65 72 74 28  Right;.  assert(
5530: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
5540: 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  tor==WO_EQ );.  
5550: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
5560: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
5570: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5580: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72 54  ;.  }.  if( pOrT
5590: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 21  erm->leftColumn!
55a0: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
55b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
55c0: 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74  affRight = sqlit
55d0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
55e0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
55f0: 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 61 66  Right);.  if( af
5600: 66 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  fRight==0 ){.   
5610: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5620: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
5630: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
5640: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
5650: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 61 66 66  Left);.  if( aff
5660: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
5670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
5690: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
56a0: 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
56b0: 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 20  n term of an OR 
56c0: 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20 69 67  clause can be ig
56d0: 6e 6f 72 65 64 20 64 75 72 69 6e 67 0a 2a 2a 20  nored during.** 
56e0: 61 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  a check to make 
56f0: 73 75 72 65 20 61 6c 6c 20 4f 52 20 74 65 72 6d  sure all OR term
5700: 73 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73  s are candidates
5710: 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f   for optimizatio
5720: 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  n..** In other w
5730: 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72 75  ords, return tru
5740: 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 74  e if a call to t
5750: 68 65 20 6f 72 54 65 72 6d 49 73 4f 70 74 43 61  he orTermIsOptCa
5760: 6e 64 69 64 61 74 65 28 29 0a 2a 2a 20 61 62 6f  ndidate().** abo
5770: 76 65 20 72 65 74 75 72 6e 65 64 20 66 61 6c 73  ve returned fals
5780: 65 20 62 75 74 20 69 74 20 69 73 20 6e 6f 74 20  e but it is not 
5790: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 69 73  necessary to dis
57a0: 71 75 61 6c 69 66 79 20 74 68 65 0a 2a 2a 20 6f  qualify the.** o
57b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  ptimization..**.
57c0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6f  ** Suppose the o
57d0: 72 69 67 69 6e 61 6c 20 4f 52 20 70 68 72 61 73  riginal OR phras
57e0: 65 20 77 61 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  e was this:.**.*
57f0: 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d 34 20  *           a=4 
5800: 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20 20 61   OR  a=11  OR  a
5810: 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  =b.**.** During 
5820: 61 6e 61 6c 79 73 69 73 2c 20 74 68 65 20 74 68  analysis, the th
5830: 69 72 64 20 74 65 72 6d 20 67 65 74 73 20 66 6c  ird term gets fl
5840: 69 70 70 65 64 20 61 72 6f 75 6e 64 20 61 6e 64  ipped around and
5850: 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 73 6f   duplicate.** so
5860: 20 74 68 61 74 20 77 65 20 61 72 65 20 6c 65 66   that we are lef
5870: 74 20 77 69 74 68 20 74 68 69 73 3a 0a 2a 2a 0a  t with this:.**.
5880: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d 34  **           a=4
5890: 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20 20    OR  a=11  OR  
58a0: 61 3d 62 20 20 4f 52 20 20 62 3d 61 0a 2a 2a 0a  a=b  OR  b=a.**.
58b0: 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 61 73  ** Since the las
58c0: 74 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 20  t two terms are 
58d0: 64 75 70 6c 69 63 61 74 65 73 2c 20 6f 6e 6c 79  duplicates, only
58e0: 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 2a 2a 20   one of them.** 
58f0: 68 61 73 20 74 6f 20 71 75 61 6c 69 66 79 20 69  has to qualify i
5900: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
5910: 77 68 6f 6c 65 20 70 68 72 61 73 65 20 74 6f 20  whole phrase to 
5920: 71 75 61 6c 69 66 79 2e 20 20 57 68 65 6e 0a 2a  qualify.  When.*
5930: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
5940: 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 6b 6e 6f  s called, we kno
5950: 77 20 74 68 61 74 20 70 4f 72 54 65 72 6d 20 64  w that pOrTerm d
5960: 69 64 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e 0a  id not qualify..
5970: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5980: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
5990: 20 73 65 65 20 69 66 20 70 4f 72 54 65 72 6d 20   see if pOrTerm 
59a0: 68 61 73 20 61 20 64 75 70 6c 69 63 61 74 65 20  has a duplicate 
59b0: 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 71 75  that.** might qu
59c0: 61 6c 69 66 79 2e 20 20 49 66 20 74 68 65 72 65  alify.  If there
59d0: 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
59e0: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
59f0: 20 62 65 65 6e 0a 2a 2a 20 64 69 73 71 75 61 6c   been.** disqual
5a00: 69 66 69 65 64 2c 20 74 68 65 6e 20 72 65 74 75  ified, then retu
5a10: 72 6e 20 74 72 75 65 2e 20 20 49 66 20 74 68 65  rn true.  If the
5a20: 72 65 20 61 72 65 20 6e 6f 20 64 75 70 6c 69 63  re are no duplic
5a30: 61 74 65 73 2c 20 6f 72 0a 2a 2a 20 74 68 65 20  ates, or.** the 
5a40: 64 75 70 6c 69 63 61 74 65 20 68 61 73 20 61 6c  duplicate has al
5a50: 73 6f 20 62 65 65 6e 20 64 69 73 71 75 61 6c 69  so been disquali
5a60: 66 69 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c  fied, return fal
5a70: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
5a80: 74 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70  t orTermHasOkDup
5a90: 6c 69 63 61 74 65 28 57 68 65 72 65 43 6c 61 75  licate(WhereClau
5aa0: 73 65 20 2a 70 4f 72 2c 20 57 68 65 72 65 54 65  se *pOr, WhereTe
5ab0: 72 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a 20 20  rm *pOrTerm){.  
5ac0: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61  if( pOrTerm->fla
5ad0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
5ae0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
5af0: 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  is the original 
5b00: 74 65 72 6d 2e 20 20 54 68 65 20 64 75 70 6c 69  term.  The dupli
5b10: 63 61 74 65 20 69 73 20 74 6f 20 74 68 65 20 6c  cate is to the l
5b20: 65 66 74 20 68 61 64 0a 20 20 20 20 2a 2a 20 68  eft had.    ** h
5b30: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
5b40: 61 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74 68 75  analyzed and thu
5b50: 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  s has not yet be
5b60: 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64 2e  en disqualified.
5b70: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
5b80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4f 72  ;.  }.  if( (pOr
5b90: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
5ba0: 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 0a 20  RM_VIRTUAL)!=0. 
5bb0: 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61 5b 70      && (pOr->a[p
5bc0: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
5bd0: 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  .flags & TERM_OR
5be0: 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f  _OK)!=0 ){.    /
5bf0: 2a 20 54 68 69 73 20 69 73 20 61 20 64 75 70 6c  * This is a dupl
5c00: 69 63 61 74 65 20 74 65 72 6d 2e 20 20 54 68 65  icate term.  The
5c10: 20 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c 69 66   original qualif
5c20: 69 65 64 20 73 6f 20 74 68 69 73 20 6f 6e 65 0a  ied so this one.
5c30: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
5c40: 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20 20 20  have to. */.    
5c50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5c60: 2f 2a 20 54 68 69 73 20 69 73 20 65 69 74 68 65  /* This is eithe
5c70: 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20 74 65  r a singleton te
5c80: 72 6d 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  rm or else it is
5c90: 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 6f 72   a duplicate for
5ca0: 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20  .  ** which the 
5cb0: 6f 72 69 67 69 6e 61 6c 20 64 69 64 20 6e 6f 74  original did not
5cc0: 20 71 75 61 6c 69 66 79 2e 20 20 45 69 74 68 65   qualify.  Eithe
5cd0: 72 20 77 61 79 20 77 65 20 61 72 65 20 64 6f 6e  r way we are don
5ce0: 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65 74 75  e for. */.  retu
5cf0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
5d00: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  * !SQLITE_OMIT_O
5d10: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26  R_OPTIMIZATION &
5d20: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  & !SQLITE_OMIT_S
5d30: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
5d40: 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74  * The input to t
5d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5d60: 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75  n WhereTerm stru
5d70: 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20  cture with only 
5d80: 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66  the.** "pExpr" f
5d90: 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20  ield filled in. 
5da0: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
5db0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61   routine is to a
5dc0: 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75  nalyze the.** su
5dd0: 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  bexpression and 
5de0: 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65  populate all the
5df0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
5e00: 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a   the WhereTerm.*
5e10: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  * structure..**.
5e20: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
5e30: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
5e40: 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e  orm "<expr> <op>
5e50: 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d   X" it gets comm
5e60: 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73  uted.** to the s
5e70: 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20  tandard form of 
5e80: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e  "X <op> <expr>".
5e90: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
5ea0: 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74 68 65  ion is of.** the
5eb0: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
5ec0: 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e   where both X an
5ed0: 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  d Y are columns,
5ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
5ef0: 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  al.** expression
5f00: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
5f10: 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20  d a new virtual 
5f20: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
5f30: 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70  e form.** "Y <op
5f40: 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f  > X" is added to
5f50: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5f60: 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64 20 73  e and analyzed s
5f70: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
5f80: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
5f90: 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74  alyze(.  SrcList
5fa0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20   *pSrc,         
5fb0: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5fc0: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5fd0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
5fe0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
5ff0: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
6000: 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20 20  t idxTerm       
6010: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6020: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20   of the term to 
6030: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29  be analyzed */.)
6040: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
6050: 54 65 72 6d 3b 0a 20 20 45 78 70 72 4d 61 73 6b  Term;.  ExprMask
6060: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 0a 20  Set *pMaskSet;. 
6070: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
6080: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
6090: 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72  ft;.  Bitmask pr
60a0: 65 72 65 71 41 6c 6c 3b 0a 20 20 42 69 74 6d 61  ereqAll;.  Bitma
60b0: 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20  sk extraRight = 
60c0: 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72  0;.  int nPatter
60d0: 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  n;.  int isCompl
60e0: 65 74 65 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73  ete;.  int noCas
60f0: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 50  e;.  int op;.  P
6100: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
6110: 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  WC->pParse;.  sq
6120: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6130: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64  se->db;..  if( d
6140: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
6160: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
6170: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
6180: 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d   pMaskSet = pWC-
6190: 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78  >pMaskSet;.  pEx
61a0: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
61b0: 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20  r;.  prereqLeft 
61c0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
61d0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
61e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d  ->pLeft);.  op =
61f0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
6200: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
6210: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
6220: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
6230: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
6240: 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74  Right = exprList
6250: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
6260: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  Set, pExpr->pLis
6270: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 65               | e
6290: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
62a0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
62b0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  xpr->pSelect);. 
62c0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
62d0: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
62e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
62f0: 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ht = 0;.  }else{
6300: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
6310: 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61  eqRight = exprTa
6320: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
6330: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
6340: 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41  );.  }.  prereqA
6350: 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ll = exprTableUs
6360: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
6370: 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72  xpr);.  if( Expr
6380: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
6390: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
63a0: 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78  ){.    Bitmask x
63b0: 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
63c0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67  Set, pExpr->iRig
63d0: 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20  htJoinTable);.  
63e0: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78    prereqAll |= x
63f0: 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68 74  ;.    extraRight
6400: 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63   = x-1;  /* ON c
6410: 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20  lause terms may 
6420: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
6430: 20 61 6e 20 69 6e 64 65 78 0a 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: 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c   ** on left tabl
6460: 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
6470: 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 20  .  Ticket #3015 
6480: 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e  */.  }.  pTerm->
6490: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
64a0: 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e  eqAll;.  pTerm->
64b0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b  leftCursor = -1;
64c0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
64d0: 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  t = -1;.  pTerm-
64e0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a  >eOperator = 0;.
64f0: 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28    if( allowedOp(
6500: 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70  op) && (pTerm->p
6510: 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65  rereqRight & pre
6520: 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20  reqLeft)==0 ){. 
6530: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
6540: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
6550: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
6560: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
6570: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
6580: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
6590: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65  .      pTerm->le
65a0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
65b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
65c0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  pTerm->leftColum
65d0: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
65e0: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  mn;.      pTerm-
65f0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
6600: 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20  ratorMask(op);. 
6610: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
6620: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
6630: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
6640: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
6650: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
6660: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  r *pDup;.      i
6670: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
6680: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
6690: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
66a0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
66b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
66c0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
66d0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
66e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
66f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6700: 6c 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20  lete(pDup);.    
6710: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6730: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
6740: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
6750: 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55  pDup, TERM_VIRTU
6760: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
6770: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64  ;.        if( id
6780: 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNew==0 ) return
6790: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
67a0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
67b0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
67c0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
67d0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
67e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
67f0: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  rm];.        pTe
6800: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
6810: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
6820: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
6830: 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IED;.      }else
6840: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
6850: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
6860: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
6870: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
6880: 43 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20  Commute(pDup);. 
6890: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75       pLeft = pDu
68a0: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
68b0: 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72  pNew->leftCursor
68c0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
68d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
68e0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
68f0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6900: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67   pNew->prereqRig
6910: 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b  ht = prereqLeft;
6920: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
6930: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
6940: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
6950: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
6960: 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f  atorMask(pDup->o
6970: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
6980: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6990: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
69a0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20  IZATION.  /* If 
69b0: 61 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45  a term is the BE
69c0: 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20  TWEEN operator, 
69d0: 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76  create two new v
69e0: 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a  irtual terms.  *
69f0: 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68  * that define th
6a00: 65 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65  e range that the
6a10: 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65   BETWEEN impleme
6a20: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  nts..  */.  else
6a30: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
6a40: 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20  TK_BETWEEN ){.  
6a50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
6a60: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
6a70: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
6a80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
6a90: 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c   ops[] = {TK_GE,
6aa0: 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73   TK_LE};.    ass
6ab0: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
6ac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
6ad0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a  st->nExpr==2 );.
6ae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
6af0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
6b00: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
6b10: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
6b20: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
6b30: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
6b40: 20 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33   ops[i], sqlite3
6b50: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
6b60: 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20 20  r->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 20 73 71 6c 69 74 65 33 45          sqlite3E
6b90: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
6ba0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30  ->a[i].pExpr), 0
6bb0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
6bc0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
6bd0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
6be0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
6bf0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
6c00: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
6c10: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
6c20: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
6c30: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
6c40: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
6c50: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
6c60: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
6c70: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
6c80: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
6c90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6ca0: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
6cb0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
6cc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6cd0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
6ce0: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
6cf0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
6d00: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74  UBQUERY).  /* At
6d10: 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74  tempt to convert
6d20: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
6d30: 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  rms into an IN o
6d40: 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a  perator so that.
6d50: 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61    ** they can ma
6d60: 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ke use of indice
6d70: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a  s.  Example:.  *
6d80: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20  *.  **      x = 
6d90: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
6da0: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
6db0: 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  pr3.  **.  ** is
6dc0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a   converted into.
6dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78    **.  **      x
6de0: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
6df0: 2c 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a  ,expr3).  **.  *
6e00: 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
6e10: 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74  ion must be omit
6e20: 74 65 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51  ted if OMIT_SUBQ
6e30: 55 45 52 59 20 69 73 20 64 65 66 69 6e 65 64 20  UERY is defined 
6e40: 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65  because.  ** the
6e50: 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68   compiler for th
6e60: 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  e the IN operato
6e70: 72 20 69 73 20 70 61 72 74 20 6f 66 20 73 75 62  r is part of sub
6e80: 2d 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20  -queries..  */. 
6e90: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
6ea0: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
6eb0: 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e    int ok;.    in
6ec0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20  t i, j;.    int 
6ed0: 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72  iColumn, iCursor
6ee0: 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  ;.    WhereClaus
6ef0: 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65  e sOr;.    Where
6f00: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a  Term *pOrTerm;..
6f10: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
6f20: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
6f30: 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a  _DYNAMIC)==0 );.
6f40: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
6f50: 6e 69 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70  nit(&sOr, pWC->p
6f60: 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29  Parse, pMaskSet)
6f70: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
6f80: 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b  (&sOr, pExpr, TK
6f90: 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  _OR);.    exprAn
6fa0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26  alyzeAll(pSrc, &
6fb0: 73 4f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sOr);.    assert
6fc0: 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29  ( sOr.nTerm>=2 )
6fd0: 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
6fe0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
6ff0: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6f 72 5f  ailed ) goto or_
7000: 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20  not_possible;.  
7010: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
7020: 72 74 28 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20  rt( j<sOr.nTerm 
7030: 29 3b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  );.      iColumn
7040: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
7050: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43  Column;.      iC
7060: 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d  ursor = sOr.a[j]
7070: 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20  .leftCursor;.   
7080: 20 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e     ok = iCursor>
7090: 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  =0;.      for(i=
70a0: 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  sOr.nTerm-1, pOr
70b0: 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30  Term=sOr.a; i>=0
70c0: 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72   && ok; i--, pOr
70d0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
70e0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f   if( pOrTerm->eO
70f0: 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29  perator!=WO_EQ )
7100: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
7110: 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65   or_not_possible
7120: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7130: 20 20 20 20 69 66 28 20 6f 72 54 65 72 6d 49 73      if( orTermIs
7140: 4f 70 74 43 61 6e 64 69 64 61 74 65 28 70 4f 72  OptCandidate(pOr
7150: 54 65 72 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69  Term, iCursor, i
7160: 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20  Column) ){.     
7170: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c       pOrTerm->fl
7180: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
7190: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
71a0: 20 69 66 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b   if( orTermHasOk
71b0: 44 75 70 6c 69 63 61 74 65 28 26 73 4f 72 2c 20  Duplicate(&sOr, 
71c0: 70 4f 72 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  pOrTerm) ){.    
71d0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66        pOrTerm->f
71e0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
71f0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
7200: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b  se{.          ok
7210: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
7230: 6c 65 28 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e  le( !ok && (sOr.
7240: 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54  a[j++].flags & T
7250: 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 26  ERM_COPIED)!=0 &
7260: 26 20 6a 3c 32 20 29 3b 0a 20 20 20 20 69 66 28  & j<2 );.    if(
7270: 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70   ok ){.      Exp
7280: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
7290: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  ;.      Expr *pN
72a0: 65 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  ew, *pDup;.     
72b0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30   Expr *pLeft = 0
72c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f  ;.      for(i=sO
72d0: 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  r.nTerm-1, pOrTe
72e0: 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26  rm=sOr.a; i>=0 &
72f0: 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  & ok; i--, pOrTe
7300: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
7310: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61  f( (pOrTerm->fla
7320: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
7330: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
7340: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
7350: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7360: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
7370: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
7380: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
7390: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
73a0: 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c  (pWC->pParse, pL
73b0: 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20  ist, pDup, 0);. 
73c0: 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70         pLeft = p
73d0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
73e0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Left;.      }.  
73f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
7400: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44  t!=0 );.      pD
7410: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
7420: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  Dup(db, pLeft);.
7430: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
7440: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
7450: 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b  IN, pDup, 0, 0);
7460: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
7470: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
7480: 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74  dxNew;.        t
7490: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
74a0: 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29  ngs(pNew, pExpr)
74b0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
74c0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
74d0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
74e0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
74f0: 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52  t(pWC, pNew, TER
7500: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
7510: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
7520: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
7530: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
7540: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
7550: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7560: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
7570: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
7580: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
7590: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
75a0: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
75b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
75c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
75d0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
75e0: 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f   }.    }.or_not_
75f0: 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 77 68  possible:.    wh
7600: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
7610: 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sOr);.  }.#endif
7620: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7630: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
7640: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7650: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
7660: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
7670: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
7680: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
7690: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
76a0: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
76b0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
76c0: 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74    ** A like patt
76d0: 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ern of the form 
76e0: 22 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20  "x LIKE 'abc%'" 
76f0: 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20  is changed into 
7700: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
7710: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78  .  **          x
7720: 3e 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61  >='abc' AND x<'a
7730: 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  bd' AND x LIKE '
7740: 61 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20  abc%'.  **.  ** 
7750: 54 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  The last charact
7760: 65 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  er of the prefix
7770: 20 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d   "abc" is increm
7780: 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  ented to form th
7790: 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69  e.  ** terminati
77a0: 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62  on condition "ab
77b0: 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  d"..  */.  if( i
77c0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 64 62 2c 20  sLikeOrGlob(db, 
77d0: 70 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e  pExpr, &nPattern
77e0: 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26  , &isComplete, &
77f0: 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 45  noCase) ){.    E
7800: 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69  xpr *pLeft, *pRi
7810: 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  ght;.    Expr *p
7820: 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20  Str1, *pStr2;.  
7830: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
7840: 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20  1, *pNewExpr2;. 
7850: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20     int idxNew1, 
7860: 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c  idxNew2;..    pL
7870: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  eft = pExpr->pLi
7880: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
7890: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
78a0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
78b0: 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31  pExpr;.    pStr1
78c0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
78d0: 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e  pParse, TK_STRIN
78e0: 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  G, 0, 0, 0);.   
78f0: 20 69 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20   if( pStr1 ){.  
7900: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
7910: 43 6f 70 79 28 64 62 2c 20 26 70 53 74 72 31 2d  Copy(db, &pStr1-
7920: 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d  >token, &pRight-
7930: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70  >token);.      p
7940: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Str1->token.n = 
7950: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  nPattern;.      
7960: 70 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45  pStr1->flags = E
7970: 50 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20  P_Dequoted;.    
7980: 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71  }.    pStr2 = sq
7990: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
79a0: 20 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28   pStr1);.    if(
79b0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
79c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
79d0: 2c 20 2a 70 43 3b 0a 20 20 20 20 20 20 61 73 73  , *pC;.      ass
79e0: 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65  ert( pStr2->toke
79f0: 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 70  n.dyn );.      p
7a00: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
7a10: 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72  >token.z[nPatter
7a20: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20  n-1];.      c = 
7a30: 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  *pC;.      if( n
7a40: 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20  oCase ){.       
7a50: 20 69 66 28 20 63 3d 3d 27 40 27 20 29 20 69 73   if( c=='@' ) is
7a60: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20  Complete = 0;.  
7a70: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
7a80: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d  3UpperToLower[c]
7a90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7aa0: 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20  *pC = c + 1;.   
7ab0: 20 7d 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31   }.    pNewExpr1
7ac0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7ad0: 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73  pParse, TK_GE, s
7ae0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7af0: 2c 70 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20  ,pLeft), pStr1, 
7b00: 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20  0);.    idxNew1 
7b10: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
7b20: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
7b30: 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  r1, TERM_VIRTUAL
7b40: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
7b50: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
7b60: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
7b70: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
7b80: 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r2 = sqlite3PExp
7b90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c  r(pParse, TK_LT,
7ba0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7bb0: 64 62 2c 70 4c 65 66 74 29 2c 20 70 53 74 72 32  db,pLeft), pStr2
7bc0: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
7bd0: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
7be0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
7bf0: 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
7c00: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
7c10: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
7c20: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
7c30: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
7c40: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7c50: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
7c60: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
7c70: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
7c80: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
7c90: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
7ca0: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
7cb0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
7cc0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
7cd0: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
7ce0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7cf0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
7d00: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
7d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7d20: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
7d30: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
7d40: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
7d50: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
7d60: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
7d70: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
7d80: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
7d90: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
7da0: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
7db0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
7dc0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
7dd0: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
7de0: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
7df0: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
7e00: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
7e10: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
7e20: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
7e30: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
7e40: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
7e50: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
7e60: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
7e70: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
7e80: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
7e90: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
7ea0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
7eb0: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
7ec0: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
7ed0: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
7ee0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
7ef0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
7f00: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
7f10: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
7f20: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
7f30: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
7f40: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7f50: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
7f60: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
7f70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
7f80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
7f90: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
7fa0: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
7fb0: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
7fc0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
7fd0: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
7fe0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  r = sqlite3Expr(
7ff0: 64 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c  db, TK_MATCH, 0,
8000: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8010: 64 62 2c 20 70 52 69 67 68 74 29 2c 20 30 29 3b  db, pRight), 0);
8020: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
8030: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
8040: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
8050: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
8060: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
8070: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
8080: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
8090: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
80a0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
80b0: 72 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70  reqExpr;.      p
80c0: 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  NewTerm->leftCur
80d0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
80e0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ble;.      pNewT
80f0: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20  erm->leftColumn 
8100: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
8110: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
8120: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
8130: 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e  _MATCH;.      pN
8140: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
8150: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
8160: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
8170: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
8180: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
8190: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
81a0: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
81b0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65  OPIED;.      pNe
81c0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  wTerm->prereqAll
81d0: 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   = pTerm->prereq
81e0: 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  All;.    }.  }.#
81f0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8200: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8210: 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  E */..  /* Preve
8220: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
8230: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
8240: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
8250: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
8260: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
8270: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
8280: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
8290: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
82a0: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
82b0: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ight;.}../*.** R
82c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e  eturn TRUE if an
82d0: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
82e0: 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ions in pList->a
82f0: 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74  [iFirst...] cont
8300: 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  ain.** a referen
8310: 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20  ce to any table 
8320: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69  other than the i
8330: 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  Base table..*/.s
8340: 74 61 74 69 63 20 69 6e 74 20 72 65 66 65 72 65  tatic int refere
8350: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
8360: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8370: 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st,          /* 
8380: 53 65 61 72 63 68 20 65 78 70 72 65 73 73 69 6f  Search expressio
8390: 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a  ns in ths list *
83a0: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
83b0: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a  *pMaskSet,    /*
83c0: 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61   Mapping from ta
83d0: 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20  bles to bitmaps 
83e0: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8400: 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67 20 77  * Be searching w
8410: 69 74 68 20 74 68 65 20 69 46 69 72 73 74 2d 74  ith the iFirst-t
8420: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  h expression */.
8430: 20 20 69 6e 74 20 69 42 61 73 65 20 20 20 20 20    int iBase     
8440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8450: 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73  gnore references
8460: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
8470: 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61  /.){.  Bitmask a
8480: 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73  llowed = ~getMas
8490: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73  k(pMaskSet, iBas
84a0: 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69  e);.  while( iFi
84b0: 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rst<pList->nExpr
84c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70   ){.    if( (exp
84d0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
84e0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
84f0: 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26  First++].pExpr)&
8500: 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20  allowed)!=0 ){. 
8510: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8530: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
8540: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69  his routine deci
8550: 64 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20  des if pIdx can 
8560: 62 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73  be used to satis
8570: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  fy the ORDER BY.
8580: 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69  ** clause.  If i
8590: 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e  t can, it return
85a0: 73 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61  s 1.  If pIdx ca
85b0: 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65  nnot satisfy the
85c0: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61  .** ORDER BY cla
85d0: 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  use, this routin
85e0: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
85f0: 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
8600: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
8610: 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20  e from a SELECT 
8620: 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62  statement.  pTab
8630: 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d   is the.** left-
8640: 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68  most table in th
8650: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
8660: 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43   that same SELEC
8670: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a  T statement and.
8680: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  ** the table has
8690: 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72   a cursor number
86a0: 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64   of "base".  pId
86b0: 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  x is an index on
86c0: 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71   pTab..**.** nEq
86d0: 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Col is the numbe
86e0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
86f0: 70 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73  pIdx that are us
8700: 65 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a  ed as equality.*
8710: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  * constraints.  
8720: 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c  Any of these col
8730: 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73  umns may be miss
8740: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ing from the ORD
8750: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20  ER BY.** clause 
8760: 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61  and the match ca
8770: 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63  n still be a suc
8780: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  cess..**.** All 
8790: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
87a0: 45 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68  ER BY that match
87b0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
87c0: 65 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ex must be eithe
87d0: 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43  r.** ASC or DESC
87e0: 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65  .  (Terms of the
87f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8800: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8810: 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64   a UNIQUE.** ind
8820: 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ex do not need t
8830: 6f 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63  o satisfy this c
8840: 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65  onstraint.)  The
8850: 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73   *pbRev value is
8860: 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20  .** set to 1 if 
8870: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8880: 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20  use is all DESC 
8890: 61 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f  and it is set to
88a0: 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44   0 if.** the ORD
88b0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
88c0: 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74  all ASC..*/.stat
88d0: 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67  ic int isSorting
88e0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
88f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8900: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8910: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  ext */.  ExprMas
8920: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
8930: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
8940: 20 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74   table indices t
8950: 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49  o bitmaps */.  I
8960: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
8970: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
8980: 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69  dex we are testi
8990: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ng */.  int base
89a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
89b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
89c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
89d0: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
89e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
89f0: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
8a00: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8a10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c  */.  int nEqCol,
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a30: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
8a40: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
8a50: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
8a60: 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20   int *pbRev     
8a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
8a80: 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59  to 1 if ORDER BY
8a90: 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20   is DESC */.){. 
8aa0: 20 69 6e 74 20 69 2c 20 6a 3b 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: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8ad0: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
8ae0: 72 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  rder = 0;       
8af0: 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66         /* XOR of
8b00: 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52   index and ORDER
8b10: 20 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69   BY sort directi
8b20: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  on */.  int nTer
8b30: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
8b40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8b50: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
8b60: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
8b70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
8b80: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65  Term;    /* A te
8b90: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
8ba0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  BY clause */.  s
8bb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8bc0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
8bd0: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
8be0: 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72  );.  nTerm = pOr
8bf0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
8c00: 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20  assert( nTerm>0 
8c10: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
8c20: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
8c30: 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
8c40: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
8c50: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
8c60: 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68   **.  ** Note th
8c70: 61 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20  at indices have 
8c80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65  pIdx->nColumn re
8c90: 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c  gular columns pl
8ca0: 75 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69  us.  ** one addi
8cb0: 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f  tional column co
8cc0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77  ntaining the row
8cd0: 69 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63  id.  The rowid c
8ce0: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68  olumn.  ** of th
8cf0: 65 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20  e index is also 
8d00: 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68  allowed to match
8d10: 20 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44   against the ORD
8d20: 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
8d30: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
8d40: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65  j=0, pTerm=pOrde
8d50: 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20  rBy->a; j<nTerm 
8d60: 26 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i<=pIdx->nCol
8d70: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  umn; i++){.    E
8d80: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
8d90: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
8da0: 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52  ion of the ORDER
8db0: 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20   BY pTerm */.   
8dc0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
8dd0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
8de0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  ting sequence of
8df0: 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e   pExpr */.    in
8e00: 74 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  t termSortOrder;
8e10: 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66   /* Sort order f
8e20: 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
8e30: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b      int iColumn;
8e40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d         /* The i-
8e50: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
8e60: 20 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20   index.  -1 for 
8e70: 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  rowid */.    int
8e80: 20 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20   iSortOrder;    
8e90: 2f 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30  /* 1 for DESC, 0
8ea0: 20 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20   for ASC on the 
8eb0: 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20  i-th index term 
8ec0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
8ed0: 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d  r *zColl; /* Nam
8ee0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  e of the collati
8ef0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
8f00: 69 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20  i-th index term 
8f10: 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20  */..    pExpr = 
8f20: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
8f30: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
8f40: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
8f50: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73  xpr->iTable!=bas
8f60: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  e ){.      /* Ca
8f70: 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64  n not use an ind
8f80: 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68  ex sort on anyth
8f90: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
8fa0: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a  a column in the.
8fb0: 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f        ** left-mo
8fc0: 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  st table of the 
8fd0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
8fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ff0: 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  }.    pColl = sq
9000: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
9010: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
9020: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
9030: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
9040: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
9050: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
9060: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
9070: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
9080: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
9090: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  i];.      if( iC
90a0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61  olumn==pIdx->pTa
90b0: 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  ble->iPKey ){.  
90c0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
90d0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
90e0: 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    iSortOrder = p
90f0: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
9100: 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  i];.      zColl 
9110: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
9120: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
9130: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
9140: 3b 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  ;.      iSortOrd
9150: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43  er = 0;.      zC
9160: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll = pColl->zNa
9170: 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  me;.    }.    if
9180: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9190: 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c  !=iColumn || sql
91a0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
91b0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29  l->zName, zColl)
91c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72   ){.      /* Ter
91d0: 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52  m j of the ORDER
91e0: 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
91f0: 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e  not match column
9200: 20 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20   i of the index 
9210: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e  */.      if( i<n
9220: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  EqCol ){.       
9230: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
9240: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63  column that is c
9250: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
9260: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
9270: 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  an.        ** OR
9280: 44 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61  DER BY term, tha
9290: 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69  t is OK.  Just i
92a0: 67 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d  gnore that colum
92b0: 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  n of the index. 
92c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
92d0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
92e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
92f0: 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20   /* If an index 
9300: 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20  column fails to 
9310: 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74  match and is not
9320: 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
9330: 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ==.        ** th
9340: 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  en the index can
9350: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
9360: 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
9370: 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  int..        */.
9380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
9390: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
93a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
93b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
93c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
93d0: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
93e0: 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72  =0 || pTerm->sor
93f0: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
9400: 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72   assert( iSortOr
9410: 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f  der==0 || iSortO
9420: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74  rder==1 );.    t
9430: 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69  ermSortOrder = i
9440: 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72  SortOrder ^ pTer
9450: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
9460: 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29    if( i>nEqCol )
9470: 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  {.      if( term
9480: 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f  SortOrder!=sortO
9490: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
94a0: 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f  /* Indices can o
94b0: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61  nly be used if a
94c0: 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
94d0: 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20  s past the.     
94e0: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63     ** equality c
94f0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61  onstraints are a
9500: 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f  ll either DESC o
9510: 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20  r ASC. */.      
9520: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
9530: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9540: 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
9550: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a   termSortOrder;.
9560: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
9570: 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     pTerm++;.    
9580: 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  if( iColumn<0 &&
9590: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
95a0: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
95b0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
95c0: 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ase) ){.      /*
95d0: 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   If the indexed 
95e0: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72  column is the pr
95f0: 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76  imary key and ev
9600: 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73  erything matches
9610: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72  .      ** so far
9620: 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   and none of the
9630: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
9640: 74 6f 20 74 68 65 20 72 69 67 68 74 20 72 65 66  to the right ref
9650: 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20  erence other.   
9660: 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20     ** tables in 
9670: 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77  the join, then w
9680: 65 20 61 72 65 20 61 73 73 75 72 65 64 20 74 68  e are assured th
9690: 61 74 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  at the index can
96a0: 20 62 65 20 75 73 65 64 20 0a 20 20 20 20 20 20   be used .      
96b0: 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75  ** to sort becau
96c0: 73 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  se the primary k
96d0: 65 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64  ey is unique and
96e0: 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   so none of the 
96f0: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63  other.      ** c
9700: 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65  olumns will make
9710: 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a   any difference.
9720: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
9730: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = nTerm;.    }.
9740: 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20    }..  *pbRev = 
9750: 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20  sortOrder!=0;.  
9760: 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a  if( j>=nTerm ){.
9770: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73      /* All terms
9780: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
9790: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65   clause are cove
97a0: 72 65 64 20 62 79 20 74 68 69 73 20 69 6e 64 65  red by this inde
97b0: 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73  x so.    ** this
97c0: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
97d0: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20  ed for sorting. 
97e0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
97f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
9800: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
9810: 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43  e && i==pIdx->nC
9820: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21  olumn.      && !
9830: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
9840: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
9850: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
9860: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  e) ){.    /* All
9870: 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69   terms of this i
9880: 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20  ndex match some 
9890: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52  prefix of the OR
98a0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
98b0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
98c0: 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64  ex is UNIQUE and
98d0: 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65   no terms on the
98e0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44   tail of the ORD
98f0: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
9900: 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74  use reference ot
9910: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20  her tables in a 
9920: 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69  join.  If this i
9930: 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a  s all true then.
9940: 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72      ** the order
9950: 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73 75   by clause is su
9960: 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20  perfluous. */.  
9970: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9990: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c 65  *.** Check table
99a0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4f   to see if the O
99b0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
99c0: 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20 62  n pOrderBy can b
99d0: 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
99e0: 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72 64  y sorting in ord
99f0: 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52 65  er of ROWID.  Re
9a00: 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f 20  turn true if so 
9a10: 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20 74  and set *pbRev t
9a20: 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f 72  o be.** true for
9a30: 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20 61   reverse ROWID a
9a40: 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f 72  nd false for for
9a50: 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65 72  ward ROWID order
9a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9a70: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
9a80: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
9a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
9aa0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
9ab0: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
9ac0: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
9ad0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
9ae0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
9af0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
9b00: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
9b10: 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66  t,  /* Mapping f
9b20: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
9b30: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  tmaps */.  int *
9b40: 70 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20  pbRev           
9b50: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69     /* Set to 1 i
9b60: 66 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45  f ORDER BY is DE
9b70: 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  SC */.){.  Expr 
9b80: 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *p;..  assert( p
9b90: 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
9ba0: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
9bb0: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 70  ->nExpr>0 );.  p
9bc0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   = pOrderBy->a[0
9bd0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
9be0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
9bf0: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61  && p->iTable==ba
9c00: 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
9c10: 3d 3d 2d 31 0a 20 20 20 20 26 26 20 21 72 65 66  ==-1.    && !ref
9c20: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
9c30: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
9c40: 73 6b 53 65 74 2c 20 31 2c 20 62 61 73 65 29 20  skSet, 1, base) 
9c50: 29 7b 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20  ){.    *pbRev = 
9c60: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
9c70: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65  ortOrder;.    re
9c80: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
9c90: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9ca0: 20 50 72 65 70 61 72 65 20 61 20 63 72 75 64 65   Prepare a crude
9cb0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
9cc0: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
9cd0: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a  e input value..*
9ce0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65  * The results ne
9cf0: 65 64 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e  ed not be exact.
9d00: 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75    This is only u
9d10: 73 65 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69  sed for estimati
9d20: 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20  ng.** the total 
9d30: 63 6f 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69  cost of performi
9d40: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69  ng operations wi
9d50: 74 68 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28  th O(logN) or O(
9d60: 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65  NlogN).** comple
9d70: 78 69 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e  xity.  Because N
9d80: 20 69 73 20 6a 75 73 74 20 61 20 67 75 65 73 73   is just a guess
9d90: 2c 20 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74  , it is no great
9da0: 20 74 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c   tragedy if.** l
9db0: 6f 67 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ogN is a little 
9dc0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64  off..*/.static d
9dd0: 6f 75 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75  ouble estLog(dou
9de0: 62 6c 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65  ble N){.  double
9df0: 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75   logN = 1;.  dou
9e00: 62 6c 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68  ble x = 10;.  wh
9e10: 69 6c 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20  ile( N>x ){.    
9e20: 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78  logN += 1;.    x
9e30: 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65   *= 10;.  }.  re
9e40: 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a  turn logN;.}../*
9e50: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
9e60: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
9e70: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
9e80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
9e90: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
9ea0: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
9eb0: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
9ec0: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
9ed0: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
9ee0: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
9ef0: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
9f00: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
9f10: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
9f20: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
9f30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
9f40: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
9f50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
9f60: 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
9f70: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
9f80: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
9f90: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
9fa0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
9fb0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
9fc0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
9fd0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
9fe0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
9ff0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
a000: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
a010: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
a020: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
a030: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
a040: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
a050: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
a060: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
a070: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
a080: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
a090: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
a0a0: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
a0b0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
a0c0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
a0d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a0e0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
a0f0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a100: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
a110: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
a120: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
a130: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
a140: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
a150: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
a160: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
a170: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
a180: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
a190: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
a1a0: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
a1b0: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
a1c0: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
a1d0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
a1e0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
a1f0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
a200: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
a210: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
a220: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
a230: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
a240: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
a250: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
a260: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
a270: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
a280: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
a290: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
a2a0: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
a2b0: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
a2c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
a2d0: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
a2e0: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
a2f0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
a300: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
a310: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
a320: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
a330: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
a340: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
a350: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
a360: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
a370: 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65  edCost);.}.#else
a380: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
a390: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
a3a0: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
a3b0: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
a3c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a3d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
a3e0: 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  LE./*.** Compute
a3f0: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
a400: 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61  for a virtual ta
a410: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ble..**.** The b
a420: 65 73 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d  est index is com
a430: 70 75 74 65 64 20 62 79 20 74 68 65 20 78 42 65  puted by the xBe
a440: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f  stIndex method o
a450: 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a  f the virtual.**
a460: 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20   table module.  
a470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a480: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72  really just a wr
a490: 61 70 70 65 72 20 74 68 61 74 20 73 65 74 73 20  apper that sets 
a4a0: 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  up.** the sqlite
a4b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
a4c0: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 75  ucture that is u
a4d0: 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61  sed to communica
a4e0: 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74  te with.** xBest
a4f0: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  Index..**.** In 
a500: 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75  a join, this rou
a510: 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61  tine might be ca
a520: 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  lled multiple ti
a530: 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  mes for the.** s
a540: 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ame virtual tabl
a550: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
a560: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a570: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 0a  ture is created.
a580: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
a590: 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ed on the first 
a5a0: 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72  invocation and r
a5b0: 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62  eused on all sub
a5c0: 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63  sequent.** invoc
a5d0: 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c  ations.  The sql
a5e0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a5f0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73  structure is als
a600: 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63  o used when.** c
a610: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
a620: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 76   to access the v
a630: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
a640: 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65  he whereInfoDele
a650: 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  te() .** routine
a660: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66   takes care of f
a670: 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74  reeing the sqlit
a680: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
a690: 72 75 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a  ructure after.**
a6a0: 20 65 76 65 72 79 62 6f 64 79 20 68 61 73 20 66   everybody has f
a6b0: 69 6e 69 73 68 65 64 20 77 69 74 68 20 69 74 2e  inished with it.
a6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
a6d0: 65 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  e bestVirtualInd
a6e0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
a6f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
a700: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
a710: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a720: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
a730: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
a740: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
a750: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
a760: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
a770: 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 46  rc,     /* The F
a780: 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
a790: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
a7a0: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7c0: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
a7d0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
a7e0: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
a7f0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
a800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a810: 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
a820: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65  se */.  int orde
a830: 72 42 79 55 73 61 62 6c 65 2c 20 20 20 20 20 20  rByUsable,      
a840: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a850: 66 20 77 65 20 63 61 6e 20 70 6f 74 65 6e 74 69  f we can potenti
a860: 61 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c  al sort */.  sql
a870: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a880: 2a 2a 70 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49  **ppIdxInfo /* I
a890: 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ndex information
a8a0: 20 70 61 73 73 65 64 20 74 6f 20 78 42 65 73 74   passed to xBest
a8b0: 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61  Index */.){.  Ta
a8c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63  ble *pTab = pSrc
a8d0: 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->pTab;.  sqlite
a8e0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
a8f0: 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
a900: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
a910: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
a920: 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
a930: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
a940: 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42 79  rby *pIdxOrderBy
a950: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
a960: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
a970: 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67  int_usage *pUsag
a980: 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  e;.  WhereTerm *
a990: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pTerm;.  int i, 
a9a0: 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  j;.  int nOrderB
a9b0: 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  y;.  int rc;..  
a9c0: 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65  /* If the sqlite
a9d0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
a9e0: 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62  ucture has not b
a9f0: 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  een previously. 
aa00: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   ** allocated an
aa10: 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 6f  d initialized fo
aa20: 72 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  r this virtual t
aa30: 61 62 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  able, then alloc
aa40: 61 74 65 0a 20 20 2a 2a 20 61 6e 64 20 69 6e 69  ate.  ** and ini
aa50: 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77 0a 20  tialize it now. 
aa60: 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d   */.  pIdxInfo =
aa70: 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69   *ppIdxInfo;.  i
aa80: 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29  f( pIdxInfo==0 )
aa90: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
aaa0: 2a 70 54 65 72 6d 3b 0a 20 20 20 20 69 6e 74 20  *pTerm;.    int 
aab0: 6e 54 65 72 6d 3b 0a 20 20 20 20 57 48 45 52 45  nTerm;.    WHERE
aac0: 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74  TRACE(("Recomput
aad0: 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66  ing index info f
aae0: 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61  or %s...\n", pTa
aaf0: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20  b->zName));..   
ab00: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
ab10: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
ab20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
ab30: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
ab40: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ing.    ** to th
ab50: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
ab60: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54   */.    for(i=nT
ab70: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
ab80: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
ab90: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
aba0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
abb0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
abc0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
abd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
abe0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
abf0: 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
ac00: 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
ac10: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ac20: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
ac30: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  tor==WO_IN );.  
ac40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
ac50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
ac60: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
ac70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ac80: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
ac90: 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
aca0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54  ntinue;.      nT
acb0: 65 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  erm++;.    }..  
acc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
acd0: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
ace0: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
acf0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
ad00: 20 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c   .    ** virtual
ad10: 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f   table then allo
ad20: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
ad30: 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74  he aOrderBy part
ad40: 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   of.    ** the s
ad50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ad60: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20  o structure..   
ad70: 20 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79   */.    nOrderBy
ad80: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f   = 0;.    if( pO
ad90: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
ada0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
adb0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
adc0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
add0: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
ade0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
adf0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
ae00: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
ae10: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
ae20: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
ae30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ae40: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72        if( i==pOr
ae50: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
ae60: 20 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79          nOrderBy
ae70: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
ae80: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
ae90: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  }..    /* Alloca
aea0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  te the sqlite3_i
aeb0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
aec0: 75 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ure.    */.    p
aed0: 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  IdxInfo = sqlite
aee0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
aef0: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
af00: 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20  (*pIdxInfo).    
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
af30: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
af40: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
af50: 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
af80: 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
af90: 72 42 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  rBy );.    if( p
afa0: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
afb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
afc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74  Msg(pParse, "out
afd0: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
afe0: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
aff0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78      }.    *ppIdx
b000: 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b  Info = pIdxInfo;
b010: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
b020: 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
b030: 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
b040: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
b050: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
b060: 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
b070: 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
b080: 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
b090: 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
b0a0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61   from.    ** cha
b0b0: 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20  nging them.  We 
b0c0: 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20  have to do some 
b0d0: 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e  funky casting in
b0e0: 20 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a   order to.    **
b0f0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
b100: 65 20 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e fields..    */
b110: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  .    pIdxCons = 
b120: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
b130: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
b140: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
b150: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 20      pIdxOrderBy 
b160: 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
b170: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
b180: 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d  )&pIdxCons[nTerm
b190: 5d 3b 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20  ];.    pUsage = 
b1a0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
b1b0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
b1c0: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
b1d0: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
b1e0: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
b1f0: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
b200: 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a  t = nTerm;.    *
b210: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
b220: 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
b230: 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75  erBy;.    *(stru
b240: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
b250: 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
b260: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
b270: 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b  aint = pIdxCons;
b280: 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71  .    *(struct sq
b290: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
b2a0: 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
b2b0: 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
b2c0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73  OrderBy;.    *(s
b2d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
b2e0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
b2f0: 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f  sage**)&pIdxInfo
b300: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
b310: 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ge =.           
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
b360: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  ;..    for(i=j=0
b370: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
b380: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
b390: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
b3a0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
b3b0: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
b3c0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
b3d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
b3e0: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
b3f0: 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  r&(pTerm->eOpera
b400: 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  tor-1))==0 );.  
b410: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
b420: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
b430: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  WO_IN );.      t
b440: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
b450: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
b460: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66  NULL );.      if
b470: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
b480: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49  or & (WO_IN|WO_I
b490: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
b4a0: 65 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  e;.      pIdxCon
b4b0: 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
b4c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
b4d0: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
b4e0: 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
b4f0: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43  = i;.      pIdxC
b500: 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72  ons[j].op = pTer
b510: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20  m->eOperator;.  
b520: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
b530: 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
b540: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
b550: 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
b560: 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ly because.     
b570: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
b580: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
b590: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
b5a0: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
b5b0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
b5c0: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
b5d0: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
b5e0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
b5f0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
b600: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
b610: 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EQ );.      asse
b620: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
b630: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b640: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_LT );.      a
b650: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
b660: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
b670: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
b680: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
b690: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
b6a0: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
b6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
b6c0: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
b6d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
b6e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b6f0: 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
b700: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
b710: 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20  T_MATCH );.     
b720: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
b730: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
b740: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
b750: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
b760: 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b  TCH) );.      j+
b770: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
b780: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
b790: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
b7a0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
b7b0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
b7c0: 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65  ;.      pIdxOrde
b7d0: 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
b7e0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
b7f0: 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72  .      pIdxOrder
b800: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
b810: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
b820: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
b830: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
b840: 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  oint, the sqlite
b850: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
b860: 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78  ucture that pIdx
b870: 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  Info points.  **
b880: 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65   to will have be
b890: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  en initialized, 
b8a0: 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68  either during th
b8b0: 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
b8c0: 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72  tion or.  ** dur
b8d0: 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69  ing some prior i
b8e0: 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20  nvocation.  Now 
b8f0: 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  we just have to 
b900: 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20  customize the.  
b910: 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49  ** details of pI
b920: 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63  dxInfo for the c
b930: 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
b940: 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f  n and pass it to
b950: 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  .  ** xBestIndex
b960: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ..  */..  /* The
b970: 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73   module name mus
b980: 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c  t be defined. Al
b990: 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e  so, by this poin
b9a0: 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a  t there must.  *
b9b0: 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  * be a pointer t
b9c0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  o an sqlite3_vta
b9d0: 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68  b structure. Oth
b9e0: 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69  erwise.  ** sqli
b9f0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
ba00: 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61  Names() would ha
ba10: 76 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65  ve picked up the
ba20: 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20   error. .  */.  
ba30: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a  assert( pTab->az
ba40: 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61  ModuleArg && pTa
ba50: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
ba60: 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
ba70: 54 61 62 2d 3e 70 56 74 61 62 20 29 3b 0a 23 69  Tab->pVtab );.#i
ba80: 66 20 30 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  f 0.  if( pTab->
ba90: 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  pVtab==0 ){.    
baa0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bab0: 70 50 61 72 73 65 2c 20 22 75 6e 64 65 66 69 6e  pParse, "undefin
bac0: 65 64 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72  ed module %s for
bad0: 20 74 61 62 6c 65 20 25 73 22 2c 0a 20 20 20 20   table %s",.    
bae0: 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75      pTab->azModu
baf0: 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e  leArg[0], pTab->
bb00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
bb10: 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64  rn 0.0;.  }.#end
bb20: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  if..  /* Set the
bb30: 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
bb40: 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e 64  sable fields and
bb50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20   initialize all 
bb60: 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  .  ** output var
bb70: 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a  iables to zero..
bb80: 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74    **.  ** aConst
bb90: 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69  raint[].usable i
bba0: 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73 74  s true for const
bbb0: 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68 65  raints where the
bbc0: 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a   right-hand.  **
bbd0: 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f   side contains o
bbe0: 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  nly references t
bbf0: 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  o tables to the 
bc00: 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72 72  left of the curr
bc10: 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  ent.  ** table. 
bc20: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
bc30: 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
bc40: 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
bc50: 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
bc60: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20         column = 
bc70: 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  expr.  **.  ** a
bc80: 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  nd we are evalua
bc90: 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65  ting a join, the
bca0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
bcb0: 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20   on column is . 
bcc0: 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69   ** only valid i
bcd0: 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65 66  f all tables ref
bce0: 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72 20  erenced in expr 
bcf0: 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65 66  occur to the lef
bd00: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  t.  ** of the ta
bd10: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
bd20: 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  olumn..  **.  **
bd30: 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74   The aConstraint
bd40: 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  s[] array contai
bd50: 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ns entries for a
bd60: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ll constraints. 
bd70: 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65   ** on the curre
bd80: 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74 20  nt table.  That 
bd90: 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76 65  way we only have
bda0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 6f   to compute it o
bdb0: 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  nce.  ** even th
bdc0: 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74 72  ough we might tr
bdd0: 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62 65  y to pick the be
bde0: 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c  st index multipl
bdf0: 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f  e times..  ** Fo
be00: 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20 61  r each attempt a
be10: 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64  t picking an ind
be20: 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f 66  ex, the order of
be30: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
be40: 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62   ** join might b
be50: 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20 77  e different so w
be60: 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70  e have to recomp
be70: 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20 66  ute the usable f
be80: 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74 69  lag.  ** each ti
be90: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  me..  */.  pIdxC
bea0: 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
beb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
bec0: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
bed0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
bee0: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
bef0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
bf00: 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69  ntUsage;.  for(i
bf10: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
bf20: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
bf30: 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
bf40: 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
bf50: 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
bf60: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
bf70: 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  a[j];.    pIdxCo
bf80: 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70  ns->usable =  (p
bf90: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
bfa0: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
bfb0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
bfc0: 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
bfd0: 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
bfe0: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
bff0: 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e  t);.  if( pIdxIn
c000: 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
c010: 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  xStr ){.    sqli
c020: 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
c030: 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a  o->idxStr);.  }.
c040: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
c050: 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
c060: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
c070: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
c080: 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
c090: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  ;.  pIdxInfo->or
c0a0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
c0b0: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
c0c0: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
c0d0: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
c0e0: 32 2e 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  2.0;.  nOrderBy 
c0f0: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  = pIdxInfo->nOrd
c100: 65 72 42 79 3b 0a 20 20 69 66 28 20 70 49 64 78  erBy;.  if( pIdx
c110: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 26  Info->nOrderBy &
c120: 26 20 21 6f 72 64 65 72 42 79 55 73 61 62 6c 65  & !orderByUsable
c130: 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26   ){.    *(int*)&
c140: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
c150: 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 28  By = 0;.  }..  (
c160: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
c170: 74 79 4f 66 66 28 70 50 61 72 73 65 2d 3e 64 62  tyOff(pParse->db
c180: 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  );.  WHERETRACE(
c190: 28 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72  ("xBestIndex for
c1a0: 20 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e   %s\n", pTab->zN
c1b0: 61 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49  ame));.  TRACE_I
c1c0: 44 58 5f 49 4e 50 55 54 53 28 70 49 64 78 49 6e  DX_INPUTS(pIdxIn
c1d0: 66 6f 29 3b 0a 20 20 72 63 20 3d 20 70 54 61 62  fo);.  rc = pTab
c1e0: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
c1f0: 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 54 61  ->xBestIndex(pTa
c200: 62 2d 3e 70 56 74 61 62 2c 20 70 49 64 78 49 6e  b->pVtab, pIdxIn
c210: 66 6f 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  fo);.  TRACE_IDX
c220: 5f 4f 55 54 50 55 54 53 28 70 49 64 78 49 6e 66  _OUTPUTS(pIdxInf
c230: 6f 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  o);.  (void)sqli
c240: 74 65 33 53 61 66 65 74 79 4f 6e 28 70 50 61 72  te3SafetyOn(pPar
c250: 73 65 2d 3e 64 62 29 3b 0a 0a 20 20 66 6f 72 28  se->db);..  for(
c260: 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
c270: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
c280: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 49 64  +){.    if( !pId
c290: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
c2a0: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20  nt[i].usable && 
c2b0: 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
c2c0: 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  dex>0 ){.      s
c2d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c2e0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
c2f0: 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65    "table %s: xBe
c300: 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64  stIndex returned
c310: 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e   an invalid plan
c320: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
c330: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
c340: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
c350: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c360: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
c370: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
c380: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
c390: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c3a0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b  = 1;.    }else {
c3b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c3c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c3d0: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
c3e0: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 0a 20  tr(rc));.    }. 
c3f0: 20 7d 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64   }.  *(int*)&pId
c400: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
c410: 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 72  = nOrderBy;..  r
c420: 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e  eturn pIdxInfo->
c430: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d  estimatedCost;.}
c440: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c450: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c460: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69  BLE */../*.** Fi
c470: 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  nd the best inde
c480: 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  x for accessing 
c490: 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62  a particular tab
c4a0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  le.  Return a po
c4b0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
c4c0: 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61  index, flags tha
c4d0: 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20 74  t describe how t
c4e0: 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
c4f0: 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20  be used, the.** 
c500: 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69  number of equali
c510: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
c520: 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20 66  and the "cost" f
c530: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a  or this index..*
c540: 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20  *.** The lowest 
c550: 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e  cost index wins.
c560: 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e    The cost is an
c570: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
c580: 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50   amount of.** CP
c590: 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e  U and disk I/O n
c5a0: 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  eed to process t
c5b0: 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67  he request using
c5c0: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e   the selected in
c5d0: 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20  dex..** Factors 
c5e0: 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63  that influence c
c5f0: 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ost include:.**.
c600: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74  **    *  The est
c610: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
c620: 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
c630: 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28  be retrieved.  (
c640: 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77  The.**       few
c650: 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a  er the better.).
c660: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
c670: 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69  her or not sorti
c680: 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a  ng must occur..*
c690: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
c6a0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
c6b0: 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65  must be separate
c6c0: 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a   lookups in the.
c6d0: 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61  **       index a
c6e0: 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74  nd in the main t
c6f0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  able..**.*/.stat
c700: 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e  ic double bestIn
c710: 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
c720: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
c730: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
c740: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
c750: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
c760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c770: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
c780: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
c790: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
c7a0: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
c7b0: 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
c7c0: 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
c7d0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
c7e0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
c7f0: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
c800: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
c810: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
c820: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
c830: 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   The order by cl
c840: 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ause */.  Index 
c850: 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20  **ppIndex,      
c860: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70        /* Make *p
c870: 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20  pIndex point to 
c880: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a  the best index *
c890: 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  /.  int *pFlags,
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65 73  /* Put flags des
c8c0: 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f  cribing this cho
c8d0: 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a  ice in *pFlags *
c8e0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20  /.  int *pnEq   
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65  /* Put the numbe
c910: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
c920: 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a  nstraints here *
c930: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  /.){.  WhereTerm
c940: 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78   *pTerm;.  Index
c950: 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20   *bestIdx = 0;  
c960: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
c970: 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c  that gives the l
c980: 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20  owest cost */.  
c990: 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73  double lowestCos
c9a0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
c9b0: 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
c9c0: 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e   bestIdx */.  in
c9d0: 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b  t bestFlags = 0;
c9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
c9f0: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
ca00: 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20  th bestIdx */.  
ca10: 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b  int bestNEq = 0;
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ca30: 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45  est value for nE
ca40: 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  q */.  int iCur 
ca50: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
ca60: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
ca70: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
ca80: 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
ca90: 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cab0: 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
cac0: 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
cad0: 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20   int rev;       
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
caf0: 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20  True to scan in 
cb00: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
cb10: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb30: 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
cb40: 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a  ed with pProbe *
cb50: 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20  /.  int nEq;    
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
cb80: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
cb90: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72  s */.  int eqTer
cba0: 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  mMask;          
cbb0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 61     /* Mask of va
cbc0: 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
cbd0: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75 62  rators */.  doub
cbe0: 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
cbf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
cc00: 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
cc10: 2a 2f 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45  */..  WHERETRACE
cc20: 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20 74 62  (("bestIndex: tb
cc30: 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d 25 6c  l=%s notReady=%l
cc40: 6c 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  lx\n", pSrc->pTa
cc50: 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65 61  b->zName, notRea
cc60: 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74 43 6f  dy));.  lowestCo
cc70: 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
cc80: 44 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20  DBL;.  pProbe = 
cc90: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
cca0: 65 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ex;..  /* If the
ccb0: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
ccc0: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
ccd0: 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20  are no terms in 
cce0: 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20 63  the where.  ** c
ccf0: 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
cd00: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20 74   to the ROWID, t
cd10: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hen we will neve
cd20: 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a  r be able to do.
cd30: 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74    ** anything ot
cd40: 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  her than a full 
cd50: 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68  table scan on th
cd60: 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d 69  is table.  We mi
cd70: 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c  ght as.  ** well
cd80: 20 70 75 74 20 69 74 20 66 69 72 73 74 20 69 6e   put it first in
cd90: 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e   the join order.
cda0: 20 20 54 68 61 74 20 77 61 79 2c 20 70 65 72 68    That way, perh
cdb0: 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20 20  aps it can be.  
cdc0: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ** referenced by
cdd0: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
cde0: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
cdf0: 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20    if( pProbe==0 
ce00: 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d  &&.     findTerm
ce10: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
ce20: 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  0, WO_EQ|WO_IN|W
ce30: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
ce40: 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a  |WO_GE,0)==0 &&.
ce50: 20 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d       (pOrderBy==
ce60: 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79  0 || !sortableBy
ce70: 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
ce80: 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b  erBy, pWC->pMask
ce90: 53 65 74 2c 20 26 72 65 76 29 29 20 29 7b 0a 20  Set, &rev)) ){. 
cea0: 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a     *pFlags = 0;.
ceb0: 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30      *ppIndex = 0
cec0: 3b 0a 20 20 20 20 2a 70 6e 45 71 20 3d 20 30 3b  ;.    *pnEq = 0;
ced0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b  .    return 0.0;
cee0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
cef0: 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58 50   for a rowid=EXP
cf00: 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e  R or rowid IN (.
cf10: 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ..) constraints.
cf20: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66    */.  pTerm = f
cf30: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
cf40: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
cf50: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
cf60: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
cf70: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
cf80: 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d  ;.    *ppIndex =
cf90: 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67   0;.    bestFlag
cfa0: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
cfb0: 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  EQ;.    if( pTer
cfc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
cfd0: 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  O_EQ ){.      /*
cfe0: 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61   Rowid== is alwa
cff0: 79 73 20 74 68 65 20 62 65 73 74 20 70 69 63 6b  ys the best pick
d000: 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68  .  Look no furth
d010: 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c  er.  Because onl
d020: 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  y.      ** a sin
d030: 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72  gle row is gener
d040: 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20  ated, output is 
d050: 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64  always in sorted
d060: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
d070: 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  *pFlags = WHERE_
d080: 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52 45  ROWID_EQ | WHERE
d090: 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 2a  _UNIQUE;.      *
d0a0: 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  pnEq = 1;.      
d0b0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
d0c0: 20 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e   best is rowid\n
d0d0: 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
d0e0: 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  n 0.0;.    }else
d0f0: 20 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54   if( (pExpr = pT
d100: 65 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69  erm->pExpr)->pLi
d110: 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  st!=0 ){.      /
d120: 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54  * Rowid IN (LIST
d130: 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e  ): cost is NlogN
d140: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
d150: 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20  number of list. 
d160: 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
d170: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65  .  */.      lowe
d180: 73 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e  stCost = pExpr->
d190: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
d1a0: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a      lowestCost *
d1b0: 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43  = estLog(lowestC
d1c0: 6f 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ost);.    }else{
d1d0: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20  .      /* Rowid 
d1e0: 49 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73  IN (SELECT): cos
d1f0: 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65  t is NlogN where
d200: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
d210: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
d220: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
d230: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c  of the inner sel
d240: 65 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f  ect.  We have no
d250: 20 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65   way to estimate
d260: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76  .      ** that v
d270: 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77  alue so make a w
d280: 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20  ild guess. */.  
d290: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
d2a0: 20 32 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   200;.    }.    
d2b0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
d2c0: 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20   rowid IN cost: 
d2d0: 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43  %.9g\n", lowestC
d2e0: 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ost));.  }..  /*
d2f0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f   Estimate the co
d300: 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63  st of a table sc
d310: 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  an.  If we do no
d320: 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a  t know how many.
d330: 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65    ** entries are
d340: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75   in the table, u
d350: 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20  se 1 million as 
d360: 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  a guess..  */.  
d370: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20  cost = pProbe ? 
d380: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
d390: 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20  [0] : 1000000;. 
d3a0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
d3b0: 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73  . table scan bas
d3c0: 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c  e cost: %.9g\n",
d3d0: 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67 73   cost));.  flags
d3e0: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   = WHERE_ROWID_R
d3f0: 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ANGE;..  /* Chec
d400: 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  k for constraint
d410: 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20  s on a range of 
d420: 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62 6c  rowids in a tabl
d430: 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70  e scan..  */.  p
d440: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
d450: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
d460: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
d470: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
d480: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
d490: 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6e  m ){.    if( fin
d4a0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
d4b0: 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
d4c0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29  O_LT|WO_LE, 0) )
d4d0: 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  {.      flags |=
d4e0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
d4f0: 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20  ;.      cost /= 
d500: 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61  3;  /* Guess tha
d510: 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69  t rowid<EXPR eli
d520: 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72  minates two-thir
d530: 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20  ds or rows */.  
d540: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69 6e 64    }.    if( find
d550: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
d560: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
d570: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b  _GT|WO_GE, 0) ){
d580: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
d590: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
d5a0: 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33  .      cost /= 3
d5b0: 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
d5c0: 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d   rowid>EXPR elim
d5d0: 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
d5e0: 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s of rows */.   
d5f0: 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43   }.    WHERETRAC
d600: 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61  E(("... rowid ra
d610: 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74  nge reduces cost
d620: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
d630: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
d640: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d    flags = 0;.  }
d650: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
d660: 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  ble scan does no
d670: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
d680: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
d690: 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65  ncrease.  ** the
d6a0: 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74   cost by NlogN t
d6b0: 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65  o cover the expe
d6c0: 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20  nse of sorting. 
d6d0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
d6e0: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72  y ){.    if( sor
d6f0: 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75  tableByRowid(iCu
d700: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43  r, pOrderBy, pWC
d710: 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76  ->pMaskSet, &rev
d720: 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  ) ){.      flags
d730: 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
d740: 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Y|WHERE_ROWID_RA
d750: 4e 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72  NGE;.      if( r
d760: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  ev ){.        fl
d770: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
d780: 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
d790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d7a0: 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c  ost += cost*estL
d7b0: 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20  og(cost);.      
d7c0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
d7d0: 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73   sorting increas
d7e0: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
d7f0: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
d800: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74  }.  }.  if( cost
d810: 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
d820: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
d830: 63 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c  cost;.    bestFl
d840: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d  ags = flags;.  }
d850: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53  ..  /* If the pS
d860: 72 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  rc table is the 
d870: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
d880: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20   LEFT JOIN then 
d890: 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20  we may not.  ** 
d8a0: 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  use an index to 
d8b0: 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20  satisfy IS NULL 
d8c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74  constraints on t
d8d0: 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73  hat table.  This
d8e0: 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65   is.  ** because
d8f0: 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65   columns might e
d900: 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c  nd up being NULL
d910: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f   if the table do
d920: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20  es not match -. 
d930: 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e   ** a circumstan
d940: 63 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64  ce which the ind
d950: 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75  ex cannot help u
d960: 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63  s discover.  Tic
d970: 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a  ket #2177..  */.
d980: 20 20 69 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69    if( (pSrc->joi
d990: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
d9a0: 21 3d 30 20 29 7b 0a 20 20 20 20 65 71 54 65 72  !=0 ){.    eqTer
d9b0: 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
d9c0: 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _IN;.  }else{.  
d9d0: 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57    eqTermMask = W
d9e0: 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
d9f0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NULL;.  }..  /* 
da00: 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64  Look at each ind
da10: 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ex..  */.  for(;
da20: 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
da30: 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a  pProbe->pNext){.
da40: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
da70: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69   */.    double i
da80: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b  nMultiplier = 1;
da90: 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ..    WHERETRACE
daa0: 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a  (("... index %s:
dab0: 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61  \n", pProbe->zNa
dac0: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  me));..    /* Co
dad0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
dae0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
daf0: 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20   index that are 
db00: 73 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a  satisfied.    **
db10: 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74   by x=EXPR const
db20: 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28  raints or x IN (
db30: 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73  ...) constraints
db40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61  ..    */.    fla
db50: 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  gs = 0;.    for(
db60: 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e  i=0; i<pProbe->n
db70: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
db80: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
db90: 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  be->aiColumn[i];
dba0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
dbb0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
dbc0: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
dbd0: 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50 72 6f  eqTermMask, pPro
dbe0: 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  be);.      if( p
dbf0: 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
dc00: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
dc10: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b  WHERE_COLUMN_EQ;
dc20: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
dc30: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
dc40: 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45  _IN ){.        E
dc50: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
dc60: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
dc70: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
dc80: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
dc90: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
dca0: 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20  pSelect!=0 ){.  
dcb0: 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70          inMultip
dcc0: 6c 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20  lier *= 25;.    
dcd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
dce0: 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b  xpr->pList!=0 ){
dcf0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c  .          inMul
dd00: 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72  tiplier *= pExpr
dd10: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  ->pList->nExpr +
dd20: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
dd30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
dd40: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  cost = pProbe->a
dd50: 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
dd60: 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c  ultiplier * estL
dd70: 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29  og(inMultiplier)
dd80: 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20  ;.    nEq = i;. 
dd90: 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f     if( pProbe->o
dda0: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
ddb0: 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
ddc0: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a  E_COLUMN_IN)==0.
ddd0: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d           && nEq=
dde0: 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
ddf0: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
de00: 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
de10: 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
de20: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e  TRACE(("...... n
de30: 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39  Eq=%d inMult=%.9
de40: 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e  g cost=%.9g\n",n
de50: 45 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c  Eq,inMultiplier,
de60: 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cost));..    /* 
de70: 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63  Look for range c
de80: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
de90: 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
dea0: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
deb0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
dec0: 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
ded0: 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
dee0: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
def0: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
df00: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
df10: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50  |WO_GT|WO_GE, pP
df20: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
df30: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
df40: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
df50: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
df60: 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
df70: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
df80: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
df90: 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29  T|WO_LE, pProbe)
dfa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
dfb0: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
dfc0: 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
dfd0: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20    cost /= 3;.   
dfe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
dff0: 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
e000: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
e010: 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
e020: 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
e030: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
e040: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
e050: 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
e060: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 3;.        }. 
e070: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
e080: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65  E(("...... range
e090: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
e0a0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
e0b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e0c0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
e0d0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20  additional cost 
e0e0: 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68  of sorting if th
e0f0: 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a  at is a factor..
e100: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
e110: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
e120: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
e130: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
e140: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
e150: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  isSortingIndex(p
e160: 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b  Parse,pWC->pMask
e170: 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c  Set,pProbe,iCur,
e180: 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65  pOrderBy,nEq,&re
e190: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  v) ){.        if
e1a0: 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20  ( flags==0 ){.  
e1b0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
e1c0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
e1d0: 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  GE;.        }.  
e1e0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
e1f0: 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
e200: 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
e210: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
e220: 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
e230: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
e240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e250: 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65    cost += cost*e
e260: 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20  stLog(cost);.   
e270: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
e280: 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79  ("...... orderby
e290: 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
e2a0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
e2b0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
e2c0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
e2d0: 74 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e  to see if we can
e2e0: 20 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75   get away with u
e2f0: 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
e300: 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20  dex without.    
e310: 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20  ** ever reading 
e320: 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74  the table.  If t
e330: 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
e340: 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a   then halve the.
e350: 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74      ** cost of t
e360: 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  his index..    *
e370: 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  /.    if( flags 
e380: 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  && pSrc->colUsed
e390: 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   < (((Bitmask)1)
e3a0: 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
e3b0: 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
e3c0: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
e3d0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
e3e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72    for(j=0; j<pPr
e3f0: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  obe->nColumn; j+
e400: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
e410: 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  x = pProbe->aiCo
e420: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
e430: 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a   if( x<BMS-1 ){.
e440: 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e            m &= ~
e450: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78  (((Bitmask)1)<<x
e460: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e470: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
e480: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
e490: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
e4a0: 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  X_ONLY;.        
e4b0: 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20  cost /= 2;.     
e4c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
e4d0: 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20  ...... idx-only 
e4e0: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
e4f0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
e500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e510: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
e520: 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65  ndex has achieve
e530: 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
e540: 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75  t so far, then u
e550: 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
e560: 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 63    if( flags && c
e570: 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74  ost < lowestCost
e580: 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64   ){.      bestId
e590: 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
e5a0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
e5b0: 6f 73 74 3b 0a 20 20 20 20 20 20 62 65 73 74 46  ost;.      bestF
e5c0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
e5d0: 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45      bestNEq = nE
e5e0: 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  q;.    }.  }..  
e5f0: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65  /* Report the be
e600: 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20  st result.  */. 
e610: 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74   *ppIndex = best
e620: 49 64 78 3b 0a 20 20 57 48 45 52 45 54 52 41 43  Idx;.  WHERETRAC
e630: 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69  E(("best index i
e640: 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c  s %s, cost=%.9g,
e650: 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25   flags=%x, nEq=%
e660: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65  d\n",.        be
e670: 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d  stIdx ? bestIdx-
e680: 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29  >zName : "(none)
e690: 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62  ", lowestCost, b
e6a0: 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e 45  estFlags, bestNE
e6b0: 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d  q));.  *pFlags =
e6c0: 20 62 65 73 74 46 6c 61 67 73 20 7c 20 65 71 54   bestFlags | eqT
e6d0: 65 72 6d 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45 71  ermMask;.  *pnEq
e6e0: 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65   = bestNEq;.  re
e6f0: 74 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b  turn lowestCost;
e700: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  .}.../*.** Disab
e710: 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
e720: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
e730: 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
e740: 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
e750: 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
e760: 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
e770: 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
e780: 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
e790: 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
e7a0: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
e7b0: 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
e7c0: 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
e7d0: 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
e7e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
e7f0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
e800: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e810: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
e820: 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
e830: 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
e840: 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
e850: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
e860: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
e870: 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
e880: 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
e890: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
e8a0: 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
e8b0: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
e8c0: 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
e8d0: 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
e8e0: 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
e8f0: 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
e900: 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
e910: 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
e920: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
e930: 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
e940: 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
e950: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
e960: 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
e970: 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
e980: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
e990: 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
e9a0: 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
e9b0: 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
e9c0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
e9d0: 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
e9e0: 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
e9f0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
ea00: 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
ea10: 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
ea20: 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
ea30: 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
ea40: 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
ea50: 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
ea60: 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
ea70: 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
ea80: 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
ea90: 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
eaa0: 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
eab0: 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
eac0: 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
ead0: 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
eae0: 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
eaf0: 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
eb00: 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
eb10: 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
eb20: 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
eb30: 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
eb40: 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
eb50: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
eb60: 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
eb70: 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
eb80: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
eb90: 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
eba0: 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
ebb0: 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72  m.      && (pTer
ebc0: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
ebd0: 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20  CODED)==0.      
ebe0: 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  && (pLevel->iLef
ebf0: 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72  tJoin==0 || Expr
ec00: 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
ec10: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
ec20: 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20  mJoin)).  ){.   
ec30: 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
ec40: 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
ec50: 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72   if( pTerm->iPar
ec60: 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent>=0 ){.      
ec70: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65  WhereTerm *pOthe
ec80: 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d  r = &pTerm->pWC-
ec90: 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  >a[pTerm->iParen
eca0: 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d  t];.      if( (-
ecb0: 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29  -pOther->nChild)
ecc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
ecd0: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
ece0: 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20  l, pOther);.    
ecf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
ed00: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 74 68 65  ./*.** Apply the
ed10: 20 61 66 66 69 6e 69 74 69 65 73 20 61 73 73 6f   affinities asso
ed20: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
ed30: 66 69 72 73 74 20 6e 20 63 6f 6c 75 6d 6e 73 20  first n columns 
ed40: 6f 66 20 69 6e 64 65 78 0a 2a 2a 20 70 49 64 78  of index.** pIdx
ed50: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 69   to the values i
ed60: 6e 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  n the n register
ed70: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
ed80: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
ed90: 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
eda0: 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
edb0: 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
edc0: 74 20 6e 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  t n, Index *pIdx
edd0: 29 7b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  ){.  if( n>0 ){.
ede0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
edf0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
ee00: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
ee10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
ee30: 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
ee40: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64 65  .    sqlite3Inde
ee50: 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  xAffinityStr(v, 
ee60: 70 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  pIdx);.    sqlit
ee70: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
ee80: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
ee90: 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a  , base, n);.  }.
eea0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
eeb0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
eec0: 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
eed0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
eee0: 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
eef0: 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
ef00: 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
ef10: 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
ef20: 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
ef30: 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
ef40: 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
ef50: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
ef60: 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
ef70: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
ef80: 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a  ster iReg..**.**
ef90: 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
efa0: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
efb0: 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
efc0: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
efd0: 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
efe0: 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
eff0: 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
f000: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
f010: 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
f020: 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
f030: 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
f040: 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
f050: 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
f060: 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
f070: 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c  ic int codeEqual
f080: 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
f090: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
f0a0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
f0b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
f0c0: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
f0d0: 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
f0e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
f0f0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
f100: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
f110: 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el, /* When leve
f120: 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
f130: 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
f140: 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ing on */.  int 
f150: 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20 20  iTarget         
f160: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 65  /* Attempt to le
f170: 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ave results in t
f180: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
f190: 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20  ){.  Expr *pX = 
f1a0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
f1b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
f1c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
f1d0: 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Reg;            
f1e0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
f1f0: 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  r holding result
f200: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 69 54 61 72  s */..  if( iTar
f210: 67 65 74 3c 3d 30 20 29 7b 0a 20 20 20 20 69 52  get<=0 ){.    iR
f220: 65 67 20 3d 20 69 54 61 72 67 65 74 20 3d 20 73  eg = iTarget = s
f230: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f240: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
f250: 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
f260: 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  Q ){.    iReg = 
f270: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
f280: 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
f290: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
f2a0: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
f2b0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
f2c0: 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
f2d0: 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
f2e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f2f0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
f300: 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
f310: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f320: 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
f330: 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
f340: 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
f350: 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
f360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
f370: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
f380: 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
f390: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71  ;.    eType = sq
f3a0: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
f3b0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 31 29 3b  (pParse, pX, 1);
f3c0: 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
f3d0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
f3e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f3f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
f400: 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
f410: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 2e 2a 73 22  mment((v, "%.*s"
f420: 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58  , pX->span.n, pX
f430: 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20  ->span.z));.    
f440: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 3d  if( pLevel->nIn=
f450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
f460: 65 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65  el->nxt = sqlite
f470: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f480: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
f490: 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  vel->nIn++;.    
f4a0: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
f4b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
f4c0: 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d  ocOrFree(pParse-
f4d0: 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  >db, pLevel->aIn
f4e0: 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
f510: 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
f520: 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e  [0])*pLevel->nIn
f530: 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
f540: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  vel->aInLoop;.  
f550: 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
f560: 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
f570: 2d 3e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  ->nIn - 1;.     
f580: 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
f590: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
f5a0: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
f5b0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
f5c0: 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20 73 71 6c  n->topAddr = sql
f5d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f5e0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
f5f0: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
f600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
f610: 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20 73 71 6c  n->topAddr = sql
f620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f630: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
f640: 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20  b, 0, iReg);.   
f650: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f660: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f670: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
f680: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f690: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
f6a0: 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
f6b0: 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
f6c0: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
f6d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
f6e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
f6f0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
f700: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
f710: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
f720: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
f730: 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75  index.  The valu
f740: 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
f750: 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20  raints are left 
f760: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
f770: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
f780: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
f790: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
f7a0: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
f7b0: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
f7c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f7d0: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
f7e0: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
f7f0: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
f800: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
f810: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
f820: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
f830: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
f840: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
f850: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
f860: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
f870: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
f880: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
f890: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
f8a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
f8b0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
f8c0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
f8d0: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
f8e0: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
f8f0: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
f900: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
f910: 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  left.** on the s
f920: 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20  tack - a is the 
f930: 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68  deepest and b th
f940: 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a  e shallowest..**
f950: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
f960: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
f970: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
f980: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
f990: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
f9a0: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
f9b0: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
f9c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
f9d0: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
f9e0: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
f9f0: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
fa00: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
fa10: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  Mem memory cell.
fa20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
fa30: 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
fa40: 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
fa50: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
fa60: 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64  d puts.** the ad
fa70: 64 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65  dress of that me
fa80: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65  mory cell in pLe
fa90: 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20  vel->iMem.  The 
faa0: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
fab0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
fac0: 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d  will use pLevel-
fad0: 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74  >iMem to store t
fae0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
faf0: 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
fb00: 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
fb10: 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
fb20: 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
fb30: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
fb40: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
fb50: 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
fb60: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
fb70: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
fb80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
fb90: 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
fba0: 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
fbb0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
fbc0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
fbd0: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
fbe0: 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
fbf0: 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
fc00: 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
fc10: 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
fc20: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
fc30: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
fc40: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
fc50: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
fc60: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
fc70: 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
fc80: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
fc90: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
fca0: 72 61 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  raReg         /*
fcb0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
fcc0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
fcd0: 6c 6f 63 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  locate */.){.  i
fce0: 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
fcf0: 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a 20  >nEq;        /* 
fd00: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
fd10: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
fd20: 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
fd30: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
fd40: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
fd50: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
fd60: 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
fd70: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
fd80: 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
fd90: 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68  l->pIdx;   /* Th
fda0: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
fdb0: 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
fdc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
fdd0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
fde0: 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
fdf0: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
fe00: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
fe10: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
fe20: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
fe30: 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
fe40: 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
fe70: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
fe80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fe90: 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
fea0: 73 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  ster */..  /* Fi
feb0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
fec0: 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
fed0: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
fee0: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
fef0: 20 20 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e    ** We always n
ff00: 65 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  eed at least one
ff10: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
ff20: 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  he loop terminat
ff30: 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  or.  ** value.  
ff40: 49 66 20 74 68 65 72 65 20 61 72 65 20 49 4e 20  If there are IN 
ff50: 6f 70 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20  operators we'll 
ff60: 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63  need one for eac
ff70: 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20  h == or.  ** IN 
ff80: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
ff90: 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  .  pLevel->iMem 
ffa0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
ffb0: 20 31 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20   1;.  regBase = 
ffc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 32  pParse->nMem + 2
ffd0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
ffe0: 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20   += pLevel->nEq 
fff0: 2b 20 32 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  + 2 + nExtraReg;
10000 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
10010 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
10020 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
10030 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
10040 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
10050 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
10060 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
10070 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  ;.    int k = pI
10080 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
10090 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
100a0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
100b0 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
100c0 65 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64  evel->flags, pId
100d0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  x);.    if( pTer
100e0 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
100f0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
10100 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
10110 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
10120 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
10130 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
10140 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67  erm, pLevel, reg
10150 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
10160 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
10170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10190 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
101a0 73 65 2b 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  se+j);.    }.   
101b0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
101c0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
101d0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
101e0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
101f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
10200 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
10210 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10220 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
10230 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
10240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10250 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
10260 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
10270 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  l->brk);.    }. 
10280 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42   }.  return regB
10290 61 73 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ase;.}..#if defi
102a0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
102b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
102c0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
102d0 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
102e0 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
102f0 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
10300 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
10310 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
10320 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10330 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
10340 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
10350 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
10360 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
10370 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
10380 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
10390 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
103a0 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
103b0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
103c0 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
103d0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
103e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
103f0 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
10400 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
10410 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
10420 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
10430 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
10440 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  T */.../*.** Fre
10450 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
10460 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
10470 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
10480 46 72 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a  Free(WhereInfo *
10490 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70  pWInfo){.  if( p
104a0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74  WInfo ){.    int
104b0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
104c0 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
104d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
104e0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
104f0 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
10500 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
10510 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
10520 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  o ){.        ass
10530 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64  ert( pInfo->need
10540 54 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20  ToFreeIdxStr==0 
10550 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10560 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a  e3_free(pInfo);.
10570 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10590 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
105a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
105b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
105c0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
105d0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
105e0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
105f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
10600 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
10610 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
10620 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
10630 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
10640 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
10650 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
10660 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
10670 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
10680 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
10690 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
106a0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
106b0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
106c0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
106d0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
106e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
106f0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
10700 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10710 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10720 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
10730 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
10740 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
10750 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
10760 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
10770 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
10780 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
10790 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
107a0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
107b0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
107c0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
107d0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
107e0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
107f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
10800 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
10810 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
10820 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
10830 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
10840 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
10850 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
10860 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
10870 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
10880 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
10890 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
108a0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
108b0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
108c0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
108d0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
108e0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
108f0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
10900 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10910 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
10920 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
10930 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
10940 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
10950 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
10970 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
10980 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
109b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
109c0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
109f0 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
10a00 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
10a10 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
10a20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
10a30 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
10a40 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
10a50 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
10a60 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
10a70 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
10a80 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
10a90 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
10aa0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
10ab0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
10ac0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
10ad0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
10ae0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
10af0 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
10b00 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
10b10 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
10b20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
10b30 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
10b40 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
10b50 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
10b60 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
10b70 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
10b80 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
10b90 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
10ba0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
10bb0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
10bc0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
10bd0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
10be0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
10bf0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
10c00 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
10c10 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
10c20 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
10c30 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
10c40 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
10c50 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
10c60 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
10c70 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10c80 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
10c90 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
10ca0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
10cb0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
10cc0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
10cd0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
10ce0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
10cf0 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
10d00 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
10d10 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
10d20 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
10d30 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
10d40 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
10d50 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
10d60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
10d70 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
10d80 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
10d90 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
10da0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
10db0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
10dc0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
10dd0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
10de0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
10df0 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
10e00 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
10e10 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
10e20 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
10e30 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
10e40 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
10e50 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
10e60 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
10e70 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
10e80 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
10e90 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
10ea0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
10eb0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
10ec0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
10ed0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
10ee0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
10ef0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
10f00 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
10f10 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
10f20 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
10f30 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
10f40 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
10f50 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
10f60 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
10f70 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
10f80 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
10f90 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
10fa0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
10fb0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
10fc0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
10fd0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
10fe0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
10ff0 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
11000 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
11010 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
11020 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
11030 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
11040 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
11050 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
11060 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
11070 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
11080 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
11090 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
110a0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
110b0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
110c0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
110d0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
110e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
110f0 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
11100 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
11110 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
11120 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
11130 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
11140 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
11150 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
11160 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
11170 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
11180 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
11190 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
111a0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
111b0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
111c0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
111d0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
111e0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
111f0 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
11200 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
11210 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
11220 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11230 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11240 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
11250 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
11260 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
11270 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
11280 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
11290 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
112a0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
112b0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
112c0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
112d0 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
112e0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
112f0 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
11300 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
11310 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
11320 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
11330 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
11340 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
11350 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
11360 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
11370 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
11380 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
11390 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
113a0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
113b0 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
113c0 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
113d0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
113e0 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
113f0 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
11400 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
11410 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
11420 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
11430 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
11440 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
11450 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
11460 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
11470 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
11480 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
11490 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
114a0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
114b0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
114c0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
114d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
114e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
114f0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
11500 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
11510 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
11520 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
11530 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
11540 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
11550 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
11560 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
11570 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
11580 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
11590 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
115a0 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 77 66 6c 61  ULL */.  u8 wfla
115b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
115c0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
115d0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
115e0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
115f0 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11620 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49  nter */.  WhereI
11630 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
11640 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
11650 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
11660 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
11670 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
11680 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
11690 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
116a0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
116b0 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72  gine */.  int br
116c0 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20  k, cont = 0;    
116d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65       /* Addresse
116e0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f  s used during co
116f0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  de generation */
11700 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
11710 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
11720 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
11730 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
11740 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54  oned */.  WhereT
11750 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
11760 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
11770 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
11780 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
11790 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53  xprMaskSet maskS
117a0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  et;       /* The
117b0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
117c0 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43   set */.  WhereC
117d0 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
117e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
117f0 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69  E clause is divi
11800 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74  ded into these t
11810 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  erms */.  struct
11820 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
11830 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73  TabItem;  /* A s
11840 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  ingle entry from
11850 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
11860 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
11870 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
11880 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
11890 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c   in the pWInfo l
118a0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ist */.  int iFr
118b0 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
118c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
118d0 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c  t unused FROM cl
118e0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ause element */.
118f0 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20    int andFlags; 
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11910 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69  AND-ed combinati
11920 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d  on of all wc.a[]
11930 2e 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69  .flags */.  sqli
11940 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
11950 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11960 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
11970 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
11980 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
11990 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
119a0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
119b0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
119c0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
119d0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
119e0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
119f0 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
11a00 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
11a10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11a20 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
11a30 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
11a40 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
11a50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11a60 0a 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72 42  ..  if( ppOrderB
11a70 79 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  y ){.    pOrderB
11a80 79 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a  y = *ppOrderBy;.
11a90 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20    }..  /* Split 
11aa0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11ab0 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
11ac0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
11ad0 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
11ae0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
11af0 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
11b00 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
11b10 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
11b20 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  &maskSet);.  whe
11b30 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63  reClauseInit(&wc
11b40 2c 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53  , pParse, &maskS
11b50 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
11b60 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28  prCodeConstants(
11b70 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b  pParse, pWhere);
11b80 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77  .  whereSplit(&w
11b90 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  c, pWhere, TK_AN
11ba0 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c  D);.    .  /* Al
11bb0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
11bc0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
11bd0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
11be0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
11bf0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
11c00 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  alue..  */.  db 
11c10 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11c20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
11c30 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11c40 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
11c50 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11c60 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
11c70 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
11c80 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
11c90 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11ca0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11cb0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
11cc0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Mem;.  }.  pWInf
11cd0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
11ce0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
11cf0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
11d00 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
11d10 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
11d20 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
11d30 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11d40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11d50 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
11d60 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
11d70 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
11d80 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
11d90 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
11da0 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
11db0 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
11dc0 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
11dd0 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
11de0 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54  f( pWhere && (pT
11df0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20  abList->nSrc==0 
11e00 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
11e10 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
11e20 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
11e30 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11e40 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
11e50 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
11e60 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
11e70 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
11e80 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11e90 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
11ea0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
11eb0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
11ec0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
11ed0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
11ee0 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
11ef0 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
11f00 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
11f10 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
11f20 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
11f30 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
11f40 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
11f50 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
11f60 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
11f70 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
11f80 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
11f90 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
11fa0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
11fb0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
11fc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
11fd0 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
11fe0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
11ff0 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
12000 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
12010 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
12020 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
12030 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
12040 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
12050 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
12060 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
12070 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
12080 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
12090 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
120a0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
120b0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
120c0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
120d0 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
120e0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
120f0 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
12100 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
12110 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
12120 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
12130 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
12140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61  ; i++){.    crea
12150 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  teMask(&maskSet,
12160 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12170 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
12180 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
12190 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
121a0 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
121b0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
121c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
121d0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
121e0 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
121f0 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
12200 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
12210 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
12220 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
12230 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
12240 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
12250 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
12260 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
12270 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
12280 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
12290 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
122a0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
122b0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
122c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
122d0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
122e0 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
122f0 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
12300 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
12310 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
12320 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
12330 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
12340 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
12350 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
12360 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
12370 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
12380 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
12390 70 54 61 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a  pTabList, &wc);.
123a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
123b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
123c0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  to whereBeginNoM
123d0 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  em;.  }..  /* Ch
123e0 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64  ose the best ind
123f0 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61  ex to use for ea
12400 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
12410 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
12420 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
12430 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f   fills in the fo
12440 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
12450 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e    **.  **   pWIn
12460 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20  fo->a[].pIdx    
12470 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75    The index to u
12480 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65  se for this leve
12490 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  l of the loop.. 
124a0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
124b0 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52  ].flags     WHER
124c0 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f  E_xxx flags asso
124d0 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
124e0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
124f0 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68  a[].nEq       Th
12500 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61  e number of == a
12510 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
12520 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  s.  **   pWInfo-
12530 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57  >a[].iFrom     W
12540 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20  hen term of the 
12550 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62  FROM clause is b
12560 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20  eing coded.  ** 
12570 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54    pWInfo->a[].iT
12580 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45  abCur   The VDBE
12590 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
125a0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20  database table. 
125b0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
125c0 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20  ].iIdxCur   The 
125d0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
125e0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20  the index.  **. 
125f0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
12600 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
12610 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
12620 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
12630 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
12640 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
12650 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
12660 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  0;.  pTabItem = 
12670 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
12680 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
12690 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  a;.  andFlags = 
126a0 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
126b0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
126c0 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
126d0 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
126e0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
126f0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
12700 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
12710 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
12720 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
12730 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
12740 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
12750 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
12760 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12780 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65  Flags asssociate
12790 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
127a0 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
127c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
127d0 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
127e0 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63   */.    double c
127f0 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
12800 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
12810 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  for pIdx */.    
12820 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
12830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12840 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
12850 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
12860 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
12870 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
12880 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
12890 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
128a0 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67      int bestFlag
128b0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
128c0 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
128d0 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
128e0 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45  /.    int bestNE
128f0 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
12900 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61    /* nEq associa
12910 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
12920 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77  /.    double low
12930 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  estCost;        
12940 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65    /* Cost of the
12950 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e   pBest */.    in
12960 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20  t bestJ = 0;    
12970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12980 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20   value of j */. 
12990 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20     Bitmask m;   
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
129b0 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20  * Bitmask value 
129c0 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a  for j or bestJ *
129d0 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  /.    int once =
129e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
129f0 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66    /* True when f
12a00 69 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65  irst table is se
12a10 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  en */.    sqlite
12a20 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
12a30 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74  ndex; /* Current
12a40 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a   virtual index *
12a50 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  /..    lowestCos
12a60 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
12a70 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46  BL;.    for(j=iF
12a80 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
12a90 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
12aa0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
12ab0 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
12ac0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  ){.      int doN
12ad0 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54  otReorder;  /* T
12ae0 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
12af0 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
12b00 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20  reordered */..  
12b10 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72      doNotReorder
12b20 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a   =  (pTabItem->j
12b30 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
12b40 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
12b50 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
12b60 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72   && doNotReorder
12b70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12b80 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73  m = getMask(&mas
12b90 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
12ba0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
12bb0 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64  if( (m & notRead
12bc0 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)==0 ){.       
12bd0 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20   if( j==iFrom ) 
12be0 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  iFrom++;.       
12bf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12c00 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
12c10 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20   pTabItem->pTab 
12c20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12c30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12c40 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73  BLE.      if( Is
12c50 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d  Virtual(pTabItem
12c60 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
12c70 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
12c80 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
12c90 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a  o = &pWInfo->a[j
12ca0 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
12cb0 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56      cost = bestV
12cc0 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72  irtualIndex(pPar
12cd0 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65  se, &wc, pTabIte
12ce0 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  m, notReady,.   
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f               ppO
12d10 72 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65  rderBy ? *ppOrde
12d20 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20  rBy : 0, i==0,. 
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12d50 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pIdxInfo);.     
12d60 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45     flags = WHERE
12d70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
12d80 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
12d90 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  *ppIdxInfo;.    
12da0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12db0 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42  & pIndex->orderB
12dc0 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
12dd0 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
12de0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
12df0 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42  E | WHERE_ORDERB
12e00 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
12e10 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
12e20 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a         nEq = 0;.
12e30 20 20 20 20 20 20 20 20 69 66 28 20 28 53 51 4c          if( (SQL
12e40 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29  ITE_BIG_DBL/2.0)
12e50 3c 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <cost ){.       
12e60 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69     /* The cost i
12e70 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
12e80 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
12e90 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
12ea0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
12eb0 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66   inital value of
12ec0 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74   lowestCost in t
12ed0 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20  his loop. If it 
12ee0 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  is, then.       
12ef0 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c     ** the (cost<
12f00 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
12f10 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
12f20 72 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20 20  r be true and.  
12f30 20 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76 65          ** pLeve
12f40 6c 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76 65  l->pBestIdx neve
12f50 72 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  r set..         
12f60 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 63   */ .          c
12f70 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
12f80 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20  G_DBL/2.0);.    
12f90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12fa0 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
12fb0 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d  {.        cost =
12fc0 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
12fd0 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
12fe0 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70       (i==0 && pp
13010 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72  OrderBy) ? *ppOr
13020 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20  derBy : 0,.     
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67      &pIdx, &flag
13050 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20  s, &nEq);.      
13060 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
13070 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13080 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20  cost<lowestCost 
13090 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20  ){.        once 
130a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77  = 1;.        low
130b0 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
130c0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
130d0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65  pIdx;.        be
130e0 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  stFlags = flags;
130f0 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71  .        bestNEq
13100 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20   = nEq;.        
13110 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
13120 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74     pLevel->pBest
13130 49 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  Idx = pIndex;.  
13140 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13150 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
13160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13170 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
13180 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73   Optimizer choos
13190 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  e table %d for l
131a0 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a  oop %d\n", bestJ
131b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  ,.           pLe
131c0 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b  vel-pWInfo->a));
131d0 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c  .    if( (bestFl
131e0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
131f0 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
13200 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
13210 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
13220 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73  ags &= bestFlags
13230 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c  ;.    pLevel->fl
13240 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
13250 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64  .    pLevel->pId
13260 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70  x = pBest;.    p
13270 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73  Level->nEq = bes
13280 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tNEq;.    pLevel
13290 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20  ->aInLoop = 0;. 
132a0 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
132b0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
132c0 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  t ){.      pLeve
132d0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
132e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
132f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
13300 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
13310 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
13320 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
13330 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
13340 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
13350 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
13360 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65  evel->iFrom = be
13370 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  stJ;.  }.  WHERE
13380 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
13390 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
133a0 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49  **\n"));..  /* I
133b0 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
133c0 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61  y only selects a
133d0 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65   single row, the
133e0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  n the ORDER BY. 
133f0 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72   ** clause is ir
13400 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20  relevant..  */. 
13410 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26   if( (andFlags &
13420 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
13430 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29  0 && ppOrderBy )
13440 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79  {.    *ppOrderBy
13450 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13460 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
13470 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
13480 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
13490 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
134a0 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
134b0 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
134c0 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
134d0 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
134e0 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
134f0 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
13500 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
13510 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
13520 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
13530 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
13540 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
13550 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
13560 73 73 65 72 74 28 20 28 77 66 6c 61 67 73 20 26  ssert( (wflags &
13570 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
13580 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
13590 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
135a0 29 3b 0a 20 20 69 66 28 20 28 77 66 6c 61 67 73  );.  if( (wflags
135b0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
135c0 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26 20  _DESIRED)!=0 && 
135d0 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
135e0 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  E_UNIQUE)!=0 ){.
135f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e      pWInfo->okOn
13600 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70  ePass = 1;.    p
13610 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 66 6c 61 67  WInfo->a[0].flag
13620 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
13630 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
13640 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
13650 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
13660 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
13670 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
13680 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
13690 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
136a0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
136b0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
136c0 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
136d0 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
136e0 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f  ier Goto */.  fo
136f0 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
13700 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
13710 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
13720 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
13730 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
13740 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
13750 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13760 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  Ix;      /* Inde
13770 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
13780 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a   pTab (if any) *
13790 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
137a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
137b0 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
137c0 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
137d0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ex */.    int iI
137e0 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
137f0 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65  iIdxCur;..#ifnde
13800 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
13810 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50  PLAIN.    if( pP
13820 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
13830 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
13840 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75  zMsg;.      stru
13850 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13860 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
13870 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
13880 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67  rom];.      zMsg
13890 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
138a0 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22  f(db, "TABLE %s"
138b0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
138c0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
138d0 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
138e0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
138f0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
13900 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  z AS %s", zMsg, 
13910 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
13920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13930 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
13940 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
13950 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
13960 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13970 25 7a 20 57 49 54 48 20 49 4e 44 45 58 20 25 73  %z WITH INDEX %s
13980 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e  ", zMsg, pIx->zN
13990 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
139a0 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
139b0 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
139c0 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
139d0 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
139e0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
139f0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
13a00 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20  z USING PRIMARY 
13a10 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  KEY", zMsg);.   
13a20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13a30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13a40 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65  TABLE.      else
13a50 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65   if( pLevel->pBe
13a60 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  stIdx ){.       
13a70 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13a80 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20  nfo *pBestIdx = 
13a90 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
13aa0 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  ;.        zMsg =
13ab0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13ac0 64 62 2c 20 22 25 7a 20 56 49 52 54 55 41 4c 20  db, "%z VIRTUAL 
13ad0 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
13ae0 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
13b00 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  estIdx->idxNum, 
13b10 70 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72  pBestIdx->idxStr
13b20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
13b30 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  f.      if( pLev
13b40 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
13b50 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20  E_ORDERBY ){.   
13b60 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
13b70 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13b80 25 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d  %z ORDER BY", zM
13b90 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
13ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13bb0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
13bc0 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  in, i, pLevel->i
13bd0 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  From, 0, zMsg, P
13be0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
13bf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13c00 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
13c10 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  */.    pTabItem 
13c20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
13c30 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
13c40 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
13c50 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
13c60 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
13c70 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
13c80 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
13c90 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ma);.    if( pTa
13ca0 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54  b->isEphem || pT
13cb0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
13cc0 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
13cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13ce0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
13cf0 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64   pLevel->pBestId
13d00 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
13d10 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
13d20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
13d30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13d40 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
13d50 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ur, 0, 0,.      
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70    (const char*)p
13d80 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56  Tab->pVtab, P4_V
13d90 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  TAB);.    }else.
13da0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
13db0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
13dc0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
13dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
13de0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  op = pWInfo->okO
13df0 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e  nePass ? OP_Open
13e00 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52  Write : OP_OpenR
13e10 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ead;.      sqlit
13e20 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
13e30 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
13e40 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
13e50 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  , op);.      if(
13e60 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
13e70 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
13e80 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  l<(sizeof(Bitmas
13e90 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20  k)*8) ){.       
13ea0 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
13eb0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
13ec0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
13ed0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
13ee0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
13ef0 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
13f00 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
13f10 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
13f20 72 65 6e 74 41 64 64 72 28 76 29 2d 32 2c 20 6e  rentAddr(v)-2, n
13f30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
13f40 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
13f50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
13f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
13f70 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
13f80 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
13f90 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
13fa0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
13fb0 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
13fc0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
13fd0 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28  ursor;.    if( (
13fe0 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
13ff0 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
14000 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
14010 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
14020 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
14030 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14040 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
14050 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
14060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
14080 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70  NumColumns, 0, p
14090 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a  Ix->nColumn+1);.
140a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
140b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
140c0 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
140d0 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
140e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
140f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
14100 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
14110 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
14120 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
14130 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
14140 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  e));.    }.    s
14150 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14160 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
14170 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
14180 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
14190 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
141a0 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  (v);..  /* Gener
141b0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
141c0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
141d0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
141e0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
141f0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
14200 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
14210 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
14220 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
14230 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
14240 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
14250 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
14260 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
14270 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
14280 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
14290 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
142a0 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20  j;.    int iCur 
142b0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
142c0 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  sor;  /* The VDB
142d0 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
142e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e   table */.    In
142f0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
14300 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
14310 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
14320 2f 0a 20 20 20 20 69 6e 74 20 6e 78 74 3b 20 20  /.    int nxt;  
14330 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
14340 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
14350 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
14360 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
14370 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
14380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
14390 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
143a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
143b0 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
143c0 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
143d0 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
143e0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65  y */.    int bRe
143f0 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  v;          /* T
14400 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
14410 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
14420 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20  e order */..    
14430 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
14440 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
14450 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72  iFrom];.    iCur
14460 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
14470 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d  rsor;.    pIdx =
14480 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20   pLevel->pIdx;. 
14490 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
144a0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
144b0 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
144c0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
144d0 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20  REVERSE)!=0;.   
144e0 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
144f0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
14500 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
14510 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
14520 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
14530 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
14540 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
14550 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ons.    ** for t
14560 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
14570 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f    Jump to brk to
14580 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
14590 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d  loop..    ** Jum
145a0 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
145b0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
145c0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
145d0 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  n of the.    ** 
145e0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop..    **.   
145f0 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
14600 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
14610 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
14620 20 22 6e 78 74 22 20 6c 61 62 65 6c 20 74 68 61   "nxt" label tha
14630 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74  t.    ** means t
14640 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
14650 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
14660 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
14670 57 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  When.    ** ther
14680 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
14690 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
146a0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 6e  straints, the "n
146b0 78 74 22 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a  xt" label.    **
146c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
146d0 22 62 72 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  "brk"..    */.  
146e0 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e    brk = pLevel->
146f0 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78  brk = pLevel->nx
14700 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14710 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14720 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
14730 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
14740 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14750 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
14760 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
14770 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
14780 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
14790 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69  e and.    ** ini
147a0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
147b0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
147c0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
147d0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20   matches any.   
147e0 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
147f0 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
14800 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   join..    */.  
14810 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
14820 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
14830 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
14840 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
14850 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
14860 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
14870 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
14880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14890 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
148a0 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
148b0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64  tJoin);.      Vd
148c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
148d0 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
148e0 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
148f0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
14900 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14910 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
14920 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
14930 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
14940 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
14950 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
14960 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
14970 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
14980 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
14990 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
149a0 61 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ata..      */.  
149b0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
149c0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
149d0 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
149e0 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 20  VFilter */.     
149f0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14a00 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20  nfo *pBestIdx = 
14a10 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
14a20 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e  ;.      int nCon
14a30 73 74 72 61 69 6e 74 20 3d 20 70 42 65 73 74 49  straint = pBestI
14a40 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
14a50 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 71  .      struct sq
14a60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14a70 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
14a80 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
14a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14ac0 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  x->aConstraintUs
14ad0 61 67 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  age;.      const
14ae0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14af0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14b00 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
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 20                  
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e    pBestIdx->aCon
14b50 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20  straint;..      
14b60 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
14b70 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
14b80 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
14b90 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
14ba0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
14bb0 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ++;.      for(j=
14bc0 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e  1; j<=nConstrain
14bd0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
14be0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
14bf0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
14c00 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
14c10 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
14c20 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d  ge[k].argvIndex=
14c30 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
14c40 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
14c50 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
14c60 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
14c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14c80 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
14c90 43 61 63 68 65 20 29 3b 0a 20 20 20 20 20 20 20  Cache );.       
14ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14cb0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e  Code(pParse, wc.
14cc0 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e  a[iTerm].pExpr->
14cd0 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31  pRight, iReg+j+1
14ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14cf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14d00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14d10 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
14d20 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
14d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
14d40 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
14d50 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b  sableColCache );
14d60 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14d70 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14d90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14da0 49 6e 74 65 67 65 72 2c 20 70 42 65 73 74 49 64  Integer, pBestId
14db0 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  x->idxNum, iReg)
14dc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14dd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14de0 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
14df0 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg+1);.      sql
14e00 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14e10 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
14e20 75 72 2c 20 62 72 6b 2c 20 69 52 65 67 2c 20 70  ur, brk, iReg, p
14e30 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 2c  BestIdx->idxStr,
14e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e50 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14e60 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
14e70 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  Str ? P4_MPRINTF
14e80 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
14e90 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
14ea0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
14eb0 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
14ec0 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20  traint+2);.     
14ed0 20 70 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54   pBestIdx->needT
14ee0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
14ef0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
14f00 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
14f10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
14f20 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
14f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
14f40 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
14f50 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
14f60 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64  set;.          d
14f70 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
14f80 6c 2c 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29  l, &wc.a[iTerm])
14f90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14fa0 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
14fb0 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
14fc0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
14fd0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
14fe0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
14ff0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15000 64 64 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  ddr(v);.    }els
15010 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
15020 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15030 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ABLE */..    if(
15040 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
15050 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
15060 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
15070 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
15080 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
15090 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
150a0 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20  g an.      **   
150b0 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
150c0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
150d0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
150e0 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a  ld.  Or.      **
150f0 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
15100 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
15110 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
15120 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
15130 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
15140 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20  construct..     
15150 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
15160 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
15170 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
15180 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
15190 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
151a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
151b0 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
151c0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
151d0 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
151e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
151f0 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
15200 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
15210 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
15220 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
15230 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
15240 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
15250 70 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20  pLevel, 0);.    
15260 20 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e    nxt = pLevel->
15270 6e 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nxt;.      sqlit
15280 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15290 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31  OP_MustBeInt, r1
152a0 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 73 71  , nxt);.      sq
152b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
152c0 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
152d0 20 69 43 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b   iCur, nxt, r1);
152e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
152f0 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
15300 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
15310 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
15320 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
15330 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
15340 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
15350 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
15360 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
15370 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
15380 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
15390 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  ID field..      
153a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  */.      int tes
153b0 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
153c0 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
153d0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
153e0 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a  *pStart, *pEnd;.
153f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
15400 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
15410 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69       pStart = fi
15420 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
15430 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
15440 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
15450 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69  .      pEnd = fi
15460 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
15470 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
15480 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b  WO_LT|WO_LE, 0);
15490 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20  .      if( bRev 
154a0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
154b0 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
154c0 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
154d0 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d  ;.        pEnd =
154e0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
154f0 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74        if( pStart
15500 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
15510 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e   *pX;.        in
15520 74 20 72 31 2c 20 72 65 67 46 72 65 65 31 3b 0a  t r1, regFree1;.
15530 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74          pX = pSt
15540 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
15550 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
15560 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
15570 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
15580 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
15590 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
155a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
155b0 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
155c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 31 29  ight, &regFree1)
155d0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
155e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
155f0 50 5f 46 6f 72 63 65 49 6e 74 2c 20 72 31 2c 20  P_ForceInt, r1, 
15600 62 72 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  brk, .          
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45     pX->op==TK_LE
15630 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
15640 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
15650 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15660 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c   bRev ? OP_MoveL
15670 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  t : OP_MoveGe, i
15680 43 75 72 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20  Cur, brk, r1);. 
15690 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
156a0 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
156b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
156c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
156d0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
156e0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
156f0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
15700 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rt);.      }else
15710 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15720 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
15730 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
15740 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
15750 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
15760 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b       if( pEnd ){
15770 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
15780 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
15790 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pEnd->pExpr;.   
157a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
157b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
157c0 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
157d0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
157e0 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
157f0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
15800 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  >nMem;.        s
15810 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15820 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
15830 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29  t, pLevel->iMem)
15840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
15850 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
15860 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
15870 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
15880 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
15890 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20  : OP_Ge;.       
158a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
158b0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
158c0 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
158d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
158e0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
158f0 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
15900 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
15910 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15920 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15930 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
15940 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
15950 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
15960 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
15970 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
15980 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
15990 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
159a0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
159b0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
159c0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
159d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
159e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
159f0 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
15a00 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Cur, r1);.      
15a10 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
15a20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
15a30 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  py, pLevel->iMem
15a40 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  , 0); */.       
15a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a60 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 70 4c  p3(v, testOp, pL
15a70 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 62 72 6b 2c  evel->iMem, brk,
15a80 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
15a90 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15aa0 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  5(v, SQLITE_AFF_
15ab0 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45  NUMERIC | SQLITE
15ac0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
15ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15ae0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15af0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
15b00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
15b10 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
15b20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15b30 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
15b40 45 51 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  EQ) ){.      /* 
15b50 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
15b60 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
15b70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15b80 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45           The WHE
15b90 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f  RE clause may co
15ba0 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f  ntain zero or mo
15bb0 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20  re equality .   
15bc0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
15bd0 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
15be0 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
15bf0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
15c00 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15c10 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
15c20 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
15c30 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
15c40 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 20  ntain.      **  
15c50 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
15c60 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
15c70 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
15c80 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
15c90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
15ca0 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
15cb0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
15cc0 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
15cd0 20 4f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20   Only .      ** 
15ce0 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
15cf0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
15d00 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
15d10 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
15d20 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
15d30 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
15d40 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
15d50 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
15d60 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 20 20  , if the .      
15d70 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
15d80 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
15d90 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
15da0 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
15db0 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ll .      **    
15dc0 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a       optimized:.
15dd0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15de0 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
15df0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15e00 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
15e10 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  0.      **      
15e20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
15e30 31 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  10.      **     
15e40 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
15e50 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  >5 AND y<10.    
15e60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
15e70 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
15e80 7a 3c 3d 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20  z<=10.      **. 
15e90 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15ea0 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66  The z<10 term of
15eb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
15ec0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f  annot be used, o
15ed0 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nly.      **    
15ee0 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
15ef0 6d 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  m:.      **.    
15f00 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
15f10 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
15f20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
15f30 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20         N may be 
15f40 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
15f50 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
15f60 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 20 20  straints..      
15f70 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
15f80 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
15f90 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
15fa0 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
15fb0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15fc0 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
15fd0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
15fe0 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
15ff0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
16000 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
16010 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
16020 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
16030 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
16040 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
16050 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
16060 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  er.      **     
16070 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
16080 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
16090 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
160a0 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a  RDER BY..      *
160b0 2f 20 20 0a 20 20 20 20 20 20 69 6e 74 20 61 53  /  .      int aS
160c0 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
160d0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
160e0 30 2c 0a 20 20 20 20 20 20 20 20 4f 50 5f 52 65  0,.        OP_Re
160f0 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
16100 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
16110 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
16120 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
16130 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4c 61  */.        OP_La
16140 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
16150 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
16160 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
16170 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
16180 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
16190 76 65 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  veGt,           
161a0 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
161b0 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
161c0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
161d0 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
161e0 76 65 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20  veLt,           
161f0 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 5: (start_con
16200 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
16210 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
16220 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
16230 76 65 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  veGe,           
16240 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
16250 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
16260 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
16270 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
16280 76 65 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  veLe            
16290 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
162a0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
162b0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
162c0 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
162d0 20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d    int aEndOp[] =
162e0 20 7b 0a 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f   {.        OP_No
162f0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
16300 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
16310 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
16320 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20      OP_IdxGE,   
16330 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
16340 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
16350 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
16360 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
16370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
16380 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
16390 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
163a0 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
163b0 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
163c0 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  q;.      int isM
163d0 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
163e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
163f0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
16400 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
16410 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
16420 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
16430 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
16440 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
16450 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
16460 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
16470 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16480 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
16490 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
164a0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
164b0 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
164c0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
164d0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
164e0 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 20 20   start */.      
164f0 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
16500 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
16510 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
16520 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
16530 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
16540 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16560 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
16570 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
16580 3d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  = */.      int e
16590 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
165a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
165b0 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
165c0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
165d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  /.      int star
165e0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
165f0 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
16600 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
16610 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  ained */.      i
16620 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
16630 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 2f 2a 20 43  olumn[nEq]; /* C
16640 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61  olumn for inequa
16650 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16660 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
16670 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
16680 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16690 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
166a0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
166b0 74 20 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t op;..      /* 
166c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
166d0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
166e0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
166f0 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
16700 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
16710 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
16720 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
16730 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
16740 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ers.      ** sta
16750 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
16760 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16770 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41   regBase = codeA
16780 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
16790 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20  pParse, pLevel, 
167a0 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 32  &wc, notReady, 2
167b0 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70  );.      nxt = p
167c0 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20  Level->nxt;..   
167d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f     /* If this lo
167e0 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73  op satisfies a s
167f0 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65  ort order (pOrde
16800 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61  rBy) request tha
16810 74 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  t .      ** was 
16820 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
16830 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
16840 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
16850 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
16860 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
16870 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
16880 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
16890 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
168a0 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c        ** a singl
168b0 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
168c0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
168d0 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
168e0 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  ned.      ** sho
168f0 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
16900 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
16910 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
16920 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 20 20  mn 'x' is.      
16930 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
16940 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
16950 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16960 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
16970 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  ,.      ** this 
16980 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
16990 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
169a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
169b0 66 28 20 28 77 66 6c 61 67 73 26 57 48 45 52 45  f( (wflags&WHERE
169c0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
169d0 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  .       && (pLev
169e0 65 6c 2d 3e 66 6c 61 67 73 26 57 48 45 52 45 5f  el->flags&WHERE_
169f0 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 20 20  ORDERBY).       
16a00 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
16a10 6e 3e 6e 45 71 29 0a 20 20 20 20 20 20 20 26 26  n>nEq).       &&
16a20 20 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d   (pOrderBy->a[0]
16a30 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
16a40 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
16a50 6e 45 71 5d 29 0a 20 20 20 20 20 20 29 7b 0a 20  nEq]).      ){. 
16a60 20 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72         isMinQuer
16a70 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  y = 1;.      }..
16a80 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e        /* Find an
16a90 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
16aa0 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
16ab0 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
16ac0 65 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66  end .      ** of
16ad0 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20   the range. .   
16ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16af0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
16b00 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
16b10 29 7b 0a 20 20 20 20 20 20 20 20 70 52 61 6e 67  ){.        pRang
16b20 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  eEnd = findTerm(
16b30 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
16b40 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57  tReady, (WO_LT|W
16b50 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_LE), pIdx);.  
16b60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16b70 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
16b80 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
16b90 29 7b 0a 20 20 20 20 20 20 20 20 70 52 61 6e 67  ){.        pRang
16ba0 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  eStart = findTer
16bb0 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20  m(&wc, iCur, k, 
16bc0 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47 54  notReady, (WO_GT
16bd0 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a  |WO_GE), pIdx);.
16be0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16bf0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
16c00 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64 65  g a reverse orde
16c10 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63  r scan on an asc
16c20 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72  ending index, or
16c30 0a 20 20 20 20 20 20 2a 2a 20 61 20 66 6f 72 77  .      ** a forw
16c40 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f  ard order scan o
16c50 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
16c60 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67  ndex, interchang
16c70 65 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  e the .      ** 
16c80 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
16c90 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
16ca0 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
16cb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16cc0 69 66 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d  if( bRev==(pIdx-
16cd0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
16ce0 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29  ==SQLITE_SO_ASC)
16cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 57 41 50   ){.        SWAP
16d00 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52  (WhereTerm *, pR
16d10 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53  angeEnd, pRangeS
16d20 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  tart);.      }..
16d30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16d40 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20 70  pRangeStart && p
16d50 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
16d60 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b  rator & WO_LE );
16d70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16d80 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
16d90 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
16da0 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29  erator & WO_GE )
16db0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16dc0 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
16dd0 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
16de0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
16df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16e00 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
16e10 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
16e20 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
16e30 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
16e40 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
16e50 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
16e60 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
16e70 45 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71 20  E);.      endEq 
16e80 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
16e90 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
16ea0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
16eb0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 73 74  WO_GE);.      st
16ec0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
16ed0 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c  = pRangeStart ||
16ee0 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 20 20 2f   nEq>0;..      /
16ef0 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78  * Seek the index
16f00 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
16f10 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  tart of the rang
16f20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6e  e. */.      nCon
16f30 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20  straint = nEq;. 
16f40 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53       if( pRangeS
16f50 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
16f60 69 6e 74 20 64 63 63 20 3d 20 70 50 61 72 73 65  int dcc = pParse
16f70 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
16f80 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
16f90 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20  RangeEnd ){.    
16fa0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69        pParse->di
16fb0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b  sableColCache++;
16fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16fd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16fe0 64 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67  de(pParse, pRang
16ff0 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70  eStart->pExpr->p
17000 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
17010 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  Eq);.        pPa
17020 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
17030 61 63 68 65 20 3d 20 64 63 63 3b 0a 20 20 20 20  ache = dcc;.    
17040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
17060 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
17070 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 6e   nxt);.        n
17080 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
17090 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
170a0 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20  MinQuery ){.    
170b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
170c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
170d0 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  , 0, regBase+nEq
170e0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73  );.        nCons
170f0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
17100 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
17110 20 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e         start_con
17120 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20  straints = 1;.  
17130 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 64 65      }.      code
17140 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
17150 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
17160 43 6f 6e 73 74 72 61 69 6e 74 2c 20 70 49 64 78  Constraint, pIdx
17170 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 53  );.      op = aS
17180 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
17190 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
171a0 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
171b0 52 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Rev];.      asse
171c0 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20  rt( op!=0 );.   
171d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
171e0 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
171f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17200 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
17210 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17220 3d 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20  =OP_MoveGt );.  
17230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17240 3d 3d 4f 50 5f 4d 6f 76 65 47 65 20 29 3b 0a 20  ==OP_MoveGe );. 
17250 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17260 70 3d 3d 4f 50 5f 4d 6f 76 65 4c 65 20 29 3b 0a  p==OP_MoveLe );.
17270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17280 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 4c 74 20 29 3b  op==OP_MoveLt );
17290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
172a0 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
172b0 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 72 65  iIdxCur, nxt, re
172c0 67 42 61 73 65 2c 20 0a 20 20 20 20 20 20 20 20  gBase, .        
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 28 63 68 61 72 2a 29 6e 43 6f 6e 73 74 72 61 69  (char*)nConstrai
172f0 6e 74 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 0a  nt, P4_INT32);..
17300 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68        /* Load th
17310 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
17320 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
17330 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64  raint at the end
17340 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
17350 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e   range (if any).
17360 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17370 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
17380 71 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 61  q;.      if( pRa
17390 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
173a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
173b0 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65  e(pParse, pRange
173c0 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  End->pExpr->pRig
173d0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
173e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
173f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17400 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
17410 65 2b 6e 45 71 2c 20 6e 78 74 29 3b 0a 20 20 20  e+nEq, nxt);.   
17420 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
17430 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
17440 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70  egBase, nEq+1, p
17450 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  Idx);.        nC
17460 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
17470 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
17480 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62  op of the loop b
17490 6f 64 79 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65  ody */.      pLe
174a0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
174b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
174c0 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  (v);..      /* C
174d0 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65  heck if the inde
174e0 78 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  x cursor is past
174f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17500 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  range. */.      
17510 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
17520 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
17530 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
17540 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17550 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20  ==OP_Noop );.   
17560 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17570 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
17580 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17590 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20  =OP_IdxLT );.   
175a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
175b0 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp4(v, op, iIdx
175c0 43 75 72 2c 20 6e 78 74 2c 20 72 65 67 42 61 73  Cur, nxt, regBas
175d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
175e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
175f0 2a 29 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 50  *)nConstraint, P
17600 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
17610 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17620 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52  eP5(v, endEq!=bR
17630 65 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ev);..      /* I
17640 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65 71  f there are ineq
17650 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17660 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ts, check that t
17670 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
17680 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
17690 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69  olumn that the i
176a0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61  nequality contra
176b0 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ins is not NULL.
176c0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20  .      ** If it 
176d0 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  is, jump to the 
176e0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
176f0 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
17700 20 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20    */.      r1 = 
17710 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17720 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17730 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65   testcase( pLeve
17740 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
17750 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
17760 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
17770 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
17780 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
17790 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
177a0 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
177b0 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52  E_BTM_LIMIT|WHER
177c0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a  E_TOP_LIMIT) ){.
177d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
177e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
177f0 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
17800 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
17810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17820 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
17830 6c 2c 20 72 31 2c 20 63 6f 6e 74 29 3b 0a 20 20  l, r1, cont);.  
17840 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17850 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
17860 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
17870 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
17880 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
17890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
178a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
178b0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
178c0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
178d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
178e0 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43  v, OP_MoveGe, iC
178f0 75 72 2c 20 30 2c 20 72 31 29 3b 20 20 2f 2a 20  ur, 0, r1);  /* 
17900 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
17910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
17920 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17930 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17940 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f  ;..      /* Reco
17950 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
17960 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
17970 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44  nate the loop. D
17980 69 73 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a  isable .      **
17990 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
179a0 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
179b0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
179c0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
179d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65    */.      pLeve
179e0 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
179f0 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
17a00 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
17a10 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
17a20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
17a30 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
17a40 61 72 74 29 3b 0a 20 20 20 20 20 20 64 69 73 61  art);.      disa
17a50 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
17a60 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20  pRangeEnd);.    
17a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
17a80 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20 69  Case 4:  There i
17a90 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
17aa0 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
17ab0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20   complete.      
17ac0 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
17ad0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
17ae0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  able..      */. 
17af0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
17b00 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
17b10 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d     assert( bRev=
17b20 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  =0 );.      pLev
17b30 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
17b40 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
17b50 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
17b60 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
17b70 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
17b80 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
17b90 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
17ba0 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79    }.    notReady
17bb0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61   &= ~getMask(&ma
17bc0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20  skSet, iCur);.. 
17bd0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64     /* Insert cod
17be0 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20  e to test every 
17bf0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68  subexpression th
17c00 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65  at can be comple
17c10 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  tely.    ** comp
17c20 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
17c30 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
17c40 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bles..    */.   
17c50 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
17c60 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30   j=wc.nTerm; j>0
17c70 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
17c80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b  .      Expr *pE;
17c90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17ca0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
17cb0 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
17cc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17cd0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
17ce0 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
17cf0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
17d00 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
17d10 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
17d20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17d30 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
17d40 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61  ereqAll & notRea
17d50 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  dy)!=0 ) continu
17d60 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54  e;.      pE = pT
17d70 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
17d80 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20    assert( pE!=0 
17d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
17da0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
17db0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
17dc0 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
17dd0 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
17de0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
17df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
17e00 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17e10 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 53 51 4c 49  , pE, cont, SQLI
17e20 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
17e30 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61        pTerm->fla
17e40 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
17e50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17e60 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
17e70 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
17e80 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
17e90 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
17ea0 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65  hat.    ** at le
17eb0 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74  ast one row of t
17ec0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68  he right table h
17ed0 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c  as matched the l
17ee0 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20  eft table.  .   
17ef0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76   */.    if( pLev
17f00 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
17f10 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74  .      pLevel->t
17f20 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
17f30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
17f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17f60 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c  teger, 1, pLevel
17f70 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
17f80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
17f90 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
17fa0 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
17fb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17fc0 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28  learColumnCache(
17fd0 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  pParse, pLevel->
17fe0 69 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20  iTabCur);.      
17ff0 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72  sqlite3ExprClear
18000 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
18010 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
18020 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Cur);.      for(
18030 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b  pTerm=wc.a, j=0;
18040 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b   j<wc.nTerm; j++
18050 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
18060 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
18070 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
18080 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
18090 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
180a0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
180b0 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
180c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
180d0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
180e0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
180f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
18100 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
18110 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
18120 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74  Ready)!=0 ) cont
18130 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73  inue;.        as
18140 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
18150 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pr );.        sq
18160 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
18170 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
18180 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20 53 51 4c  pExpr, cont, SQL
18190 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
181a0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
181b0 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
181c0 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  DED;.      }.   
181d0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
181e0 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
181f0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
18200 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
18210 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
18220 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
18230 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
18240 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
18250 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
18260 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
18270 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
18280 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
18290 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
182a0 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
182b0 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
182c0 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
182d0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
182e0 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
182f0 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
18300 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
18310 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
18320 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
18330 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
18340 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
18350 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
18360 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
18370 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  n;.    pLevel = 
18380 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
18390 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
183a0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
183b0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
183c0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
183d0 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
183e0 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
183f0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
18400 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29     n = strlen(z)
18410 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c  ;.    if( n+nQPl
18420 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69  an < sizeof(sqli
18430 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d  te3_query_plan)-
18440 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  10 ){.      if( 
18450 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
18460 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
18470 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
18480 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
18490 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
184a0 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  }", 2);.        
184b0 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
184c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
184d0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
184e0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
184f0 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  lan], z, n);.   
18500 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
18510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18520 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
18530 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
18540 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65   ';.    }.    te
18550 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
18560 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
18570 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65  WID_EQ );.    te
18580 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
18590 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
185a0 57 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20  WID_RANGE );.   
185b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
185c0 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
185d0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
185e0 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
185f0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
18600 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
18610 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20  an], "* ", 2);. 
18620 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
18630 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18640 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d 30 20  pLevel->pIdx==0 
18650 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18660 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
18670 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d  lan[nQPlan], "{}
18680 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 6e 51   ", 3);.      nQ
18690 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d  Plan += 3;.    }
186a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
186b0 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70  strlen(pLevel->p
186c0 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
186d0 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20     if( n+nQPlan 
186e0 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  < sizeof(sqlite3
186f0 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29  _query_plan)-2 )
18700 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
18710 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
18720 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c  plan[nQPlan], pL
18730 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
18740 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, n);.        n
18750 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
18760 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
18770 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d  y_plan[nQPlan++]
18780 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a   = ' ';.      }.
18790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
187a0 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73  e( nQPlan>0 && s
187b0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
187c0 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27  n[nQPlan-1]==' '
187d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
187e0 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50  query_plan[--nQP
187f0 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lan] = 0;.  }.  
18800 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
18810 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  an[nQPlan] = 0;.
18820 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65    nQPlan = 0;.#e
18830 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
18840 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61  EST // Testing a
18850 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
18860 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52   only */..  /* R
18870 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e  ecord the contin
18880 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69  uation address i
18890 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  n the WhereInfo 
188a0 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e  structure.  Then
188b0 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61  .  ** clean up a
188c0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
188d0 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69    pWInfo->iConti
188e0 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68  nue = cont;.  wh
188f0 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
18900 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  wc);.  return pW
18910 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  Info;..  /* Jump
18920 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20   here if malloc 
18930 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65  fails */.whereBe
18940 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65 72  ginNoMem:.  wher
18950 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63  eClauseClear(&wc
18960 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  );.  whereInfoFr
18970 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
18980 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18990 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e   Generate the en
189a0 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c  d of the WHERE l
189b0 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e  oop.  See commen
189c0 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65  ts on .** sqlite
189d0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f  3WhereBegin() fo
189e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
189f0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  ormation..*/.voi
18a00 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
18a10 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
18a20 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
18a30 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
18a40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
18a50 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  ;.  WhereLevel *
18a60 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73  pLevel;.  SrcLis
18a70 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57  t *pTabList = pW
18a80 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
18a90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c  .  /* Generate l
18aa0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  oop termination 
18ab0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  code..  */.  sql
18ac0 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
18ad0 75 6d 6e 43 61 63 68 65 28 70 57 49 6e 66 6f 2d  umnCache(pWInfo-
18ae0 3e 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a 20 20  >pParse, -1);.  
18af0 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e  for(i=pTabList->
18b00 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nSrc-1; i>=0; i-
18b10 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
18b20 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
18b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
18b40 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
18b50 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20  Level->cont);.  
18b60 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
18b70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
18b80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18b90 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
18ba0 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
18bb0 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
18bc0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
18bd0 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  l->nIn ){.      
18be0 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
18bf0 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
18c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18c10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18c20 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b 0a  , pLevel->nxt);.
18c30 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
18c40 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c  el->nIn, pIn=&pL
18c50 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d  evel->aInLoop[j-
18c60 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
18c70 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
18c80 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18c90 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64  e(v, pIn->topAdd
18ca0 72 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r+1);.        sq
18cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18cc0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d  v, OP_Next, pIn-
18cd0 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f 70 41  >iCur, pIn->topA
18ce0 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ddr);.        sq
18cf0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18d00 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64  e(v, pIn->topAdd
18d10 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r-1);.      }.  
18d20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18d30 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
18d40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18d50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18d60 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
18d70 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  brk);.    if( pL
18d80 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
18d90 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
18da0 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
18db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18dc0 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
18dd0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
18de0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18df0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18e00 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
18e10 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
18e20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
18e30 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
18e40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18e50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18e60 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
18e70 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
18e80 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
18e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18ea0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
18eb0 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20  vel->top);.     
18ec0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18ed0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
18ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
18ef0 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74  he "break" point
18f00 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70   is here, just p
18f10 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
18f20 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20  he outer loop.. 
18f30 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f   ** Set it..  */
18f40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
18f50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57  solveLabel(v, pW
18f60 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a  Info->iBreak);..
18f70 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
18f80 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
18f90 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
18fa0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
18fb0 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  gin..  */.  for(
18fc0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
18fd0 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
18fe0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
18ff0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
19000 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19010 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
19020 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
19030 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
19040 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
19050 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
19060 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
19070 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
19080 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62  >isEphem || pTab
19090 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
190a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 70  inue;.    if( !p
190b0 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
190c0 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61   && (pLevel->fla
190d0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
190e0 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)==0 ){.     
190f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19100 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
19110 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
19120 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
19130 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d  ( pLevel->pIdx!=
19140 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
19150 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19160 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
19170 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
19180 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
19190 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69  s scan uses an i
191a0 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20  ndex, make code 
191b0 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f  substitutions to
191c0 20 72 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a   read data.    *
191d0 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  * from the index
191e0 20 69 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74   in preference t
191f0 6f 20 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d  o the table. Som
19200 65 74 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61  etimes, this mea
19210 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  ns.    ** the ta
19220 62 6c 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62  ble need never b
19230 65 20 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69  e read from. Thi
19240 73 20 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s is a performan
19250 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a  ce boost,.    **
19260 20 61 73 20 74 68 65 20 76 64 62 65 20 6c 65 76   as the vdbe lev
19270 65 6c 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74  el waits until t
19280 68 65 20 74 61 62 6c 65 20 69 73 20 72 65 61 64  he table is read
19290 20 62 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79   before actually
192a0 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20  .    ** seeking 
192b0 74 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  the table cursor
192c0 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63   to the record c
192d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
192e0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
192f0 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  ** position in t
19300 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  he index..    **
19310 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74   .    ** Calls t
19320 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
19330 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ator in between 
19340 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
19350 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c  n and.    ** sql
19360 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c  ite3WhereEnd wil
19370 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63  l have created c
19380 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  ode that referen
19390 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20  ces the table.  
193a0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20    ** directly.  
193b0 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20  This loop scans 
193c0 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f  all that code lo
193d0 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65  oking for opcode
193e0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  s.    ** that re
193f0 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c  ference the tabl
19400 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74  e and converts t
19410 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73  hem into opcodes
19420 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66   that.    ** ref
19430 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78  erence the index
19440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19450 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b   pLevel->pIdx ){
19460 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
19470 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
19480 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
19490 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
194a0 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
194b0 20 20 69 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e    int useIndexOn
194c0 6c 79 20 3d 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  ly = pLevel->fla
194d0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
194e0 4e 4c 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  NLY;..      asse
194f0 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
19500 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
19510 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
19520 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20  WInfo->iTop);.  
19530 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
19540 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19550 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
19560 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20  k=pWInfo->iTop; 
19570 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70  k<last; k++, pOp
19580 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19590 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c   pOp->p1!=pLevel
195a0 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74  ->iTabCur ) cont
195b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
195c0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
195d0 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  P_Column ){.    
195e0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
195f0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
19600 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
19610 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
19620 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
19630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19640 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
19660 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
19670 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
19680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19690 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
196a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
196b0 20 61 73 73 65 72 74 28 21 75 73 65 49 6e 64 65   assert(!useInde
196c0 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d  xOnly || j<pIdx-
196d0 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >nColumn);.     
196e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
196f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
19700 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
19710 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
19720 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
19730 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
19740 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
19750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
19760 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
19770 50 5f 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65  P_NullRow && use
19780 49 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20  IndexOnly ){.   
19790 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
197a0 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
197b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
197c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
197d0 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
197e0 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  */.  whereInfoFr
197f0 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
19800 74 75 72 6e 3b 0a 7d 0a                          turn;.}.