/ Hex Artifact Content
Login

Artifact 12387641659605318ae03d87f0687f223dfc9568:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 35 33   where.c,v 1.253
0340: 20 32 30 30 37 2f 30 36 2f 31 31 20 31 32 3a 35   2007/06/11 12:5
0350: 36 3a 31 35 20 64 72 68 20 45 78 70 20 24 0a 2a  6:15 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  )../*.** Trace o
03f0: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0410: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0420: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0430: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68  ).int sqlite3_wh
0440: 65 72 65 5f 74 72 61 63 65 20 3d 20 30 3b 0a 23  ere_trace = 0;.#
0450: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0460: 43 45 28 58 29 20 20 69 66 28 73 71 6c 69 74 65  CE(X)  if(sqlite
0470: 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29 20 73  3_where_trace) s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  f X.#else.# defi
04a0: 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29  ne WHERETRACE(X)
04b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
04c0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f  ard reference.*/
04d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04e0: 57 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72  WhereClause Wher
04f0: 65 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66  eClause;.typedef
0500: 20 73 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b   struct ExprMask
0510: 53 65 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b  Set ExprMaskSet;
0520: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0530: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0540: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0550: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
0560: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
0570: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
0580: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
0590: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05a0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05b0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
05c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
05d0: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
05e0: 20 6f 74 68 65 72 73 20 62 79 20 61 6e 20 41 4e   others by an AN
05f0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  D operator..**.*
0600: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
0610: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
0620: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
0630: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
0640: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
0650: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
0660: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
0670: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
0680: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
0690: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
06a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
06b0: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
06c0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
06d0: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
06e0: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
06f0: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
0700: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
0710: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
0720: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
0730: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
0740: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
0750: 65 72 6d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72  erm.leftColumn r
0760: 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75 72  ecord the.** cur
0770: 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  sor number and c
0780: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72  olumn number for
0790: 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d 2e 6f   X.  WhereTerm.o
07a0: 70 65 72 61 74 6f 72 20 72 65 63 6f 72 64 73 0a  perator records.
07b0: 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e  ** the <op> usin
07c0: 67 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  g a bitmask enco
07d0: 64 69 6e 67 20 64 65 66 69 6e 65 64 20 62 79 20  ding defined by 
07e0: 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20 20 54  WO_xxx below.  T
07f0: 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61 20 62  he.** use of a b
0800: 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20  itmask encoding 
0810: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
0820: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 65   allows us to se
0830: 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20  arch.** quickly 
0840: 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 6d  for terms that m
0850: 61 74 63 68 20 61 6e 79 20 6f 66 20 73 65 76 65  atch any of seve
0860: 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 6f 70  ral different op
0870: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70  erators..**.** p
0880: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
0890: 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64 20  rereqAll record 
08a0: 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20 6e  sets of cursor n
08b0: 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74  umbers,.** but t
08c0: 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72 65  hey do so indire
08d0: 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ctly.  A single 
08e0: 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75  ExprMaskSet stru
08f0: 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74 65 73  cture translates
0900: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
0910: 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e 64 20  r into bits and 
0920: 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20 62  the translated b
0930: 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
0940: 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20 66 69  the prereq.** fi
0950: 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61 6e 73  elds.  The trans
0960: 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  lation is used i
0970: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78 69 6d  n order to maxim
0980: 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ize the number o
0990: 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74 20 77  f.** bits that w
09a0: 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42 69 74  ill fit in a Bit
09b0: 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42 45 20  mask.  The VDBE 
09c0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
09d0: 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72 65 61  ight be.** sprea
09e0: 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20 6e  d out over the n
09f0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
0a00: 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  gers.  For examp
0a10: 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  le, the cursor.*
0a20: 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  * numbers might 
0a30: 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20  be 3, 8, 9, 10, 
0a40: 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64 20  20, 23, 41, and 
0a50: 34 35 2e 20 20 54 68 65 20 45 78 70 72 4d 61 73  45.  The ExprMas
0a60: 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  kSet.** translat
0a70: 65 73 20 74 68 65 73 65 20 73 70 61 72 73 65 20  es these sparse 
0a80: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
0a90: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
0aa0: 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65 67 69  integers.** begi
0ab0: 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69 6e 20  nning with 0 in 
0ac0: 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68  order to make th
0ad0: 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  e best possible 
0ae0: 75 73 65 20 6f 66 20 74 68 65 20 61 76 61 69 6c  use of the avail
0af0: 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20  able.** bits in 
0b00: 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f  the Bitmask.  So
0b10: 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  , in the example
0b20: 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75 72 73   above, the curs
0b30: 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f  or numbers.** wo
0b40: 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 69 6e  uld be mapped in
0b50: 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20 74 68  to integers 0 th
0b60: 72 6f 75 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65  rough 7..*/.type
0b70: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0b80: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0b90: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0ba0: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0bc0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0bd0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
0be0: 20 20 69 31 36 20 69 50 61 72 65 6e 74 3b 20 20    i16 iParent;  
0bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
0c00: 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72  able pWC->a[iPar
0c10: 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74  ent] when this t
0c20: 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  erm disabled */.
0c30: 20 20 69 31 36 20 6c 65 66 74 43 75 72 73 6f 72    i16 leftCursor
0c40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
0c50: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  sor number of X 
0c60: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
0c70: 3e 22 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74  >" */.  i16 left
0c80: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
0c90: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
0ca0: 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e   of X in "X <op>
0cb0: 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31   <expr>" */.  u1
0cc0: 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20  6 eOperator;    
0cd0: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
0ce0: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
0cf0: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66  g <op> */.  u8 f
0d00: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
0d10: 20 20 20 20 2f 2a 20 42 69 74 20 66 6c 61 67 73      /* Bit flags
0d20: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
0d30: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
0d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0d50: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
0d60: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
0d70: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
0d80: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
0d90: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
0da0: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
0db0: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
0dc0: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
0dd0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
0de0: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
0df0: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
0e00: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
0e10: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
0e20: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
0e30: 65 64 20 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f  ed by p */.};../
0e40: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0e50: 75 65 73 20 6f 66 20 57 68 65 72 65 54 65 72 6d  ues of WhereTerm
0e60: 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  .flags.*/.#defin
0e70: 65 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20  e TERM_DYNAMIC  
0e80: 20 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64    0x01   /* Need
0e90: 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
0ea0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
0eb0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
0ec0: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
0ed0: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
0ee0: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
0ef0: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
0f00: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
0f10: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
0f20: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
0f30: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
0f40: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
0f50: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
0f60: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
0f70: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
0f80: 4f 4b 20 20 20 20 20 20 30 78 31 30 20 20 20 2f  OK      0x10   /
0f90: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
0fa0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
0fb0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ng */../*.** An 
0fc0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0fe0: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
0ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1000: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
1010: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
1020: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
1030: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
1040: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
1050: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
1060: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
1070: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
1080: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1090: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  ext */.  ExprMas
10a0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
10b0: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20    /* Mapping of 
10c0: 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f  table indices to
10d0: 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 69   bitmasks */.  i
10e0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
10f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1100: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1110: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1130: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1140: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1150: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1160: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1170: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1180: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1190: 61 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ase */.  WhereTe
11a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20  rm aStatic[10]; 
11b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
11c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
11d0: 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ] */.};../*.** A
11e0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
11f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1200: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
1210: 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a  k of a mapping.*
1220: 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63  * between VDBE c
1230: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e  ursor numbers an
1240: 64 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69  d bits of the bi
1250: 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54  tmasks in WhereT
1260: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  erm..**.** The V
1270: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1280: 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74  rs are small int
1290: 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  egers contained 
12a0: 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69  in .** SrcList_i
12b0: 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20  tem.iCursor and 
12c0: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
12d0: 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76  ds.  For any giv
12e0: 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61  en WHERE .** cla
12f0: 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  use, the cursor 
1300: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f  numbers might no
1310: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
1320: 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a  nd they might.**
1330: 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e   contain gaps in
1340: 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73   the numbering s
1350: 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65  equence.  But we
1360: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61   want to make ma
1370: 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20  ximum.** use of 
1380: 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20  the bits in our 
1390: 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20  bitmasks.  This 
13a0: 73 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64  structure provid
13b0: 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  es a mapping.** 
13c0: 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20  from the sparse 
13d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
13e0: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
13f0: 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69  integers beginni
1400: 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a  ng.** with 0..**
1410: 0a 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53  .** If ExprMaskS
1420: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
1430: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
1440: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
1450: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
1460: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
1470: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
1480: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
1490: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
14a0: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
14b0: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
14c0: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
14d0: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
14e0: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
14f0: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
1500: 20 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72    Then the  Expr
1510: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
1520: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
1530: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
1540: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
1550: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
1560: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
1570: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
1580: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
1590: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
15a0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
15b0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
15c0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
15d0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
15e0: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
15f0: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
1600: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
1610: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
1620: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
1630: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
1640: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
1650: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
1660: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
1670: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
1680: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
1690: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
16a0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
16b0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
16c0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45  aps..*/.struct E
16d0: 78 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69  xprMaskSet {.  i
16e0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1700: 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e  Number of assign
1710: 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73  ed cursor values
1720: 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a   */.  int ix[siz
1730: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b  eof(Bitmask)*8];
1740: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73      /* Cursor as
1750: 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62  signed to each b
1760: 69 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  it */.};.../*.**
1770: 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68   Bitmasks for th
1780: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
1790: 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c   indices are abl
17a0: 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41  e to exploit.  A
17b0: 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69  n.** OR-ed combi
17c0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  nation of these 
17d0: 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73  values can be us
17e0: 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  ed when searchin
17f0: 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69  g for.** terms i
1800: 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  n the where clau
1810: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se..*/.#define W
1820: 4f 5f 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69  O_IN     1.#defi
1830: 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 32 0a 23  ne WO_EQ     2.#
1840: 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20  define WO_LT    
1850: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d   (WO_EQ<<(TK_LT-
1860: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
1870: 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_LE     (WO_EQ
1880: 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29  <<(TK_LE-TK_EQ))
1890: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20  .#define WO_GT  
18a0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18b0: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
18c0: 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f  e WO_GE     (WO_
18d0: 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51  EQ<<(TK_GE-TK_EQ
18e0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41  )).#define WO_MA
18f0: 54 43 48 20 20 36 34 0a 23 64 65 66 69 6e 65 20  TCH  64.#define 
1900: 57 4f 5f 49 53 4e 55 4c 4c 20 31 32 38 0a 0a 2f  WO_ISNULL 128../
1910: 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 66  *.** Value for f
1920: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1930: 20 62 65 73 74 49 6e 64 65 78 28 29 2e 20 20 0a   bestIndex().  .
1940: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74 20  **.** The least 
1950: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65  significant byte
1960: 20 69 73 20 72 65 73 65 72 76 65 64 20 61 73 20   is reserved as 
1970: 61 20 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76  a mask for WO_ v
1980: 61 6c 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  alues above..** 
1990: 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 66  The WhereLevel.f
19a0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 75 73  lags field is us
19b0: 75 61 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f  ually set to WO_
19c0: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  IN|WO_EQ|WO_ISNU
19d0: 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  LL..** But if th
19e0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  e table is the r
19f0: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
1a00: 6c 65 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65  left join, Where
1a10: 4c 65 76 65 6c 2e 66 6c 61 67 73 0a 2a 2a 20 69  Level.flags.** i
1a20: 73 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57  s set to WO_IN|W
1a30: 4f 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65  O_EQ.  The Where
1a40: 4c 65 76 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c  Level.flags fiel
1a50: 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73  d can then be us
1a60: 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70  ed as.** the "op
1a70: 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66  " parameter to f
1a80: 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20  indTerm when we 
1a90: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71  are resolving eq
1aa0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ab0: 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f  ts..** ISNULL co
1ac0: 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74  nstraints will t
1ad0: 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20  hen not be used 
1ae0: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  on the right tab
1af0: 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20  le of a left.** 
1b00: 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23  join.  Tickets #
1b10: 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a  2177 and #2189..
1b20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1b30: 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78  _ROWID_EQ     0x
1b40: 30 30 30 31 30 30 20 20 20 2f 2a 20 72 6f 77 69  000100   /* rowi
1b50: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
1b60: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1b70: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
1b80: 52 41 4e 47 45 20 20 30 78 30 30 30 32 30 30 20  RANGE  0x000200 
1b90: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
1ba0: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
1bb0: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1bc0: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
1bd0: 30 78 30 30 31 30 30 30 20 20 20 2f 2a 20 78 3d  0x001000   /* x=
1be0: 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e  EXPR or x IN (..
1bf0: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1c00: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1c10: 20 30 78 30 30 32 30 30 30 20 20 20 2f 2a 20 78   0x002000   /* x
1c20: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45  <EXPR and/or x>E
1c30: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
1c40: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20  HERE_COLUMN_IN  
1c50: 20 20 30 78 30 30 34 30 30 30 20 20 20 2f 2a 20    0x004000   /* 
1c60: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
1c70: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f  efine WHERE_TOP_
1c80: 4c 49 4d 49 54 20 20 20 20 30 78 30 31 30 30 30  LIMIT    0x01000
1c90: 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72  0   /* x<EXPR or
1ca0: 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x<=EXPR constra
1cb0: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
1cc0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20  HERE_BTM_LIMIT  
1cd0: 20 20 30 78 30 32 30 30 30 30 20 20 20 2f 2a 20    0x020000   /* 
1ce0: 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50  x>EXPR or x>=EXP
1cf0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
1d00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
1d10: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 38 30  X_ONLY     0x080
1d20: 30 30 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64  000   /* Use ind
1d30: 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74  ex only - omit t
1d40: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
1d50: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20  WHERE_ORDERBY   
1d60: 20 20 20 30 78 31 30 30 30 30 30 20 20 20 2f 2a     0x100000   /*
1d70: 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70   Output will app
1d80: 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f  ear in correct o
1d90: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1da0: 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20  WHERE_REVERSE   
1db0: 20 20 20 30 78 32 30 30 30 30 30 20 20 20 2f 2a     0x200000   /*
1dc0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
1dd0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
1de0: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
1df0: 20 20 20 20 20 30 78 34 30 30 30 30 30 20 20 20       0x400000   
1e00: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
1e10: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
1e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1e30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
1e40: 38 30 30 30 30 30 20 20 20 2f 2a 20 55 73 65 20  800000   /* Use 
1e50: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72  virtual-table pr
1e60: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a  ocessing */../*.
1e70: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
1e80: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
1e90: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1ea0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1eb0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
1ec0: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
1ed0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
1ee0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
1ef0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
1f00: 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  zed */.  Parse *
1f10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1f20: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1f30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1f40: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
1f50: 53 65 74 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e  Set    /* Mappin
1f60: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64  g from table ind
1f70: 69 63 65 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  ices to bitmasks
1f80: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
1f90: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1fa0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
1fb0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
1fc0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
1fd0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
1fe0: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
1ff0: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2000: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a  pWC->aStatic;.}.
2010: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2020: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
2030: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
2040: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2050: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
2060: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
2070: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2080: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
2090: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
20a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20b0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
20c0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
20d0: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
20e0: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66  hereTerm *a;.  f
20f0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
2100: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
2110: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
2120: 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26    if( a->flags &
2130: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
2140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2150: 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78 70  prDelete(a->pExp
2160: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2170: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
2180: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
2190: 73 71 6c 69 74 65 46 72 65 65 28 70 57 43 2d 3e  sqliteFree(pWC->
21a0: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
21b0: 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 69   Add a new entri
21c0: 65 73 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  es to the WhereC
21d0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
21e0: 20 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61    Increase the a
21f0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70 61 63  llocated.** spac
2200: 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
2210: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6c 61  **.** If the fla
2220: 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c  gs argument incl
2230: 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49  udes TERM_DYNAMI
2240: 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73 69  C, then responsi
2250: 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72  bility.** for fr
2260: 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65 73  eeing the expres
2270: 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d 65  sion p is assume
2280: 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43 6c  d by the WhereCl
2290: 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  ause object..**.
22a0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
22b0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
22c0: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
22d0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
22e0: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
22f0: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
2300: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
2310: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 65  ould be invalide
2320: 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69  d after.** calli
2330: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
2340: 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20    Such pointers 
2350: 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c  may be reinitial
2360: 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63  ized by referenc
2370: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e  ing.** the pWC->
2380: 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  a[] array..*/.st
2390: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c  atic int whereCl
23a0: 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65  auseInsert(Where
23b0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70  Clause *pWC, Exp
23c0: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  r *p, int flags)
23d0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
23e0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
23f0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72  .  if( pWC->nTer
2400: 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b  m>=pWC->nSlot ){
2410: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
2420: 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20  pOld = pWC->a;. 
2430: 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69     pWC->a = sqli
2440: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2450: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
2460: 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20  >nSlot*2 );.    
2470: 69 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b  if( pWC->a==0 ){
2480: 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
2490: 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20   & TERM_DYNAMIC 
24a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 29 3b  e3ExprDelete(p);
24c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24d0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
24e0: 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61     memcpy(pWC->a
24f0: 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70  , pOld, sizeof(p
2500: 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e  WC->a[0])*pWC->n
2510: 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Term);.    if( p
2520: 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69  Old!=pWC->aStati
2530: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
2540: 65 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20  eFree(pOld);.   
2550: 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f   }.    pWC->nSlo
2560: 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54  t *= 2;.  }.  pT
2570: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
2580: 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  x = pWC->nTerm];
2590: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b  .  pWC->nTerm++;
25a0: 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  .  pTerm->pExpr 
25b0: 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c  = p;.  pTerm->fl
25c0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
25d0: 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b  Term->pWC = pWC;
25e0: 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  .  pTerm->iParen
25f0: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
2600: 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   idx;.}../*.** T
2610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e  his routine iden
2620: 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73  tifies subexpres
2630: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
2640: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a  RE clause where.
2650: 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65  ** each subexpre
2660: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
2670: 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70  ed by the AND op
2680: 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f  erator or some o
2690: 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  ther.** operator
26a0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
26b0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20  e op parameter. 
26c0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
26d0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73   structure.** is
26e0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69   filled with poi
26f0: 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72  nters to subexpr
2700: 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78  essions.  For ex
2710: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
2720: 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f  WHERE  a=='hello
2730: 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62  ' AND coalesce(b
2740: 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31  ,11)<10 AND (c+1
2750: 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a  2!=d OR c==22).*
2760: 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f  *           \___
2770: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
2780: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
2790: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
27a0: 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
27b0: 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20    slot[0]       
27c0: 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20       slot[1]    
27d0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
27e0: 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69  2].**.** The ori
27f0: 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75  ginal WHERE clau
2800: 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75  se in pExpr is u
2810: 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74  naltered.  All t
2820: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
2830: 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74  oes is make slot
2840: 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74  [] entries point
2850: 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65   to substructure
2860: 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a   within pExpr..*
2870: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76  *.** In the prev
2880: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e  ious sentence an
2890: 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  d in the diagram
28a0: 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72  , "slot[]" refer
28b0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72  s to.** the Wher
28c0: 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61  eClause.a[] arra
28d0: 79 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67  y.  This array g
28e0: 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74  rows as needed t
28f0: 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c  o contain.** all
2900: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2910: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  ERE clause..*/.s
2920: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
2930: 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73  Split(WhereClaus
2940: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45  e *pWC, Expr *pE
2950: 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  xpr, int op){.  
2960: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
2970: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
2980: 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20  pr->op!=op ){.  
2990: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73    whereClauseIns
29a0: 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20  ert(pWC, pExpr, 
29b0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
29c0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
29d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f   pExpr->pLeft, o
29e0: 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  p);.    whereSpl
29f0: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
2a00: 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a  Right, op);.  }.
2a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2a20: 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ize an expressio
2a30: 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64  n mask set.*/.#d
2a40: 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65  efine initMaskSe
2a50: 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20  t(P)  memset(P, 
2a60: 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a  0, sizeof(*P))..
2a70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2a80: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
2a90: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
2aa0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
2ab0: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
2ac0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
2ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
2ae0: 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d  sk getMask(ExprM
2af0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2b00: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
2b10: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2b20: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
2b30: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
2b40: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
2b50: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
2b60: 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d     return ((Bitm
2b70: 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d  ask)1)<<i;.    }
2b80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
2b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2ba0: 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20   a new mask for 
2bb0: 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a  cursor iCursor..
2bc0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  **.** There is o
2bd0: 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61  ne cursor per ta
2be0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
2bf0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d  clause.  The num
2c00: 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73  ber of.** tables
2c10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2c20: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
2c30: 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69  y a test early i
2c40: 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2c50: 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75  WhereBegin() rou
2c60: 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f  tine.  So we kno
2c70: 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b  w that the pMask
2c80: 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72  Set->ix[].** arr
2c90: 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  ay will never ov
2ca0: 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  erflow..*/.stati
2cb0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73  c void createMas
2cc0: 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  k(ExprMaskSet *p
2cd0: 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75  MaskSet, int iCu
2ce0: 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rsor){.  assert(
2cf0: 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41   pMaskSet->n < A
2d00: 72 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65  rraySize(pMaskSe
2d10: 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73  t->ix) );.  pMas
2d20: 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65  kSet->ix[pMaskSe
2d30: 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f  t->n++] = iCurso
2d40: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
2d50: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28   routine walks (
2d60: 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20  recursively) an 
2d70: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
2d80: 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a  and generates.**
2d90: 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63   a bitmask indic
2da0: 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c  ating which tabl
2db0: 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  es are used in t
2dc0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  hat expression.*
2dd0: 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  * tree..**.** In
2de0: 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20   order for this 
2df0: 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c  routine to work,
2e00: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
2e10: 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a  ction must have.
2e20: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ** previously in
2e30: 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70  voked sqlite3Exp
2e40: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2e50: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
2e60: 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68  n.  See.** the h
2e70: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
2e80: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f   that routine fo
2e90: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
2ea0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  ormation..** The
2eb0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
2ec0: 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69  lveNames() routi
2ed0: 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f  nes looks for co
2ee0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a  lumn names and.*
2ef0: 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63  * sets their opc
2f00: 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  odes to TK_COLUM
2f10: 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72  N and their Expr
2f20: 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74  .iTable fields t
2f30: 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75  o.** the VDBE cu
2f40: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
2f50: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  he table.  This 
2f60: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73  routine just has
2f70: 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65   to.** translate
2f80: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
2f90: 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b  ers into bitmask
2fa0: 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61   values and OR a
2fb0: 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73  ll.** the bitmas
2fc0: 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ks together..*/.
2fd0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2fe0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2ff0: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  e(ExprMaskSet*, 
3000: 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
3010: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53  ic Bitmask exprS
3020: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
3030: 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65  ExprMaskSet*, Se
3040: 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42  lect*);.static B
3050: 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65  itmask exprTable
3060: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
3070: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
3080: 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b  r *p){.  Bitmask
3090: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
30a0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
30b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
30c0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
30d0: 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70  mask = getMask(p
30e0: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62  MaskSet, p->iTab
30f0: 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  le);.    return 
3100: 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b  mask;.  }.  mask
3110: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
3120: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
3130: 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  Right);.  mask |
3140: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3150: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
3160: 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  eft);.  mask |= 
3170: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
3180: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
3190: 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pList);.  mask |
31a0: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
31b0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
31c0: 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20   p->pSelect);.  
31d0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
31e0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
31f0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
3200: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
3210: 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74  askSet, ExprList
3220: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
3230: 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  i;.  Bitmask mas
3240: 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  k = 0;.  if( pLi
3250: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
3260: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
3270: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  r; i++){.      m
3280: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
3290: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
32a0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
32b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
32c0: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73  return mask;.}.s
32d0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
32e0: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
32f0: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
3300: 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74  pMaskSet, Select
3310: 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b   *pS){.  Bitmask
3320: 20 6d 61 73 6b 3b 0a 20 20 69 66 28 20 70 53 3d   mask;.  if( pS=
3330: 3d 30 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  =0 ){.    mask =
3340: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
3350: 20 6d 61 73 6b 20 3d 20 65 78 70 72 4c 69 73 74   mask = exprList
3360: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3370: 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29  Set, pS->pEList)
3380: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3390: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
33a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
33b0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61  GroupBy);.    ma
33c0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
33d0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
33e0: 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29  t, pS->pOrderBy)
33f0: 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  ;.    mask |= ex
3400: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
3410: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72  skSet, pS->pWher
3420: 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  e);.    mask |= 
3430: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
3440: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61  MaskSet, pS->pHa
3450: 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ving);.  }.  ret
3460: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
3470: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3480: 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72  f the given oper
3490: 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74  ator is one of t
34a0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
34b0: 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  t is.** allowed 
34c0: 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  for an indexable
34d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
34e0: 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64  rm.  The allowed
34f0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
3500: 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c  * "=", "<", ">",
3510: 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64   "<=", ">=", and
3520: 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "IN"..*/.static
3530: 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69   int allowedOp(i
3540: 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74  nt op){.  assert
3550: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26  ( TK_GT>TK_EQ &&
3560: 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_GT<TK_GE );.
3570: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e    assert( TK_LT>
3580: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54  TK_EQ && TK_LT<T
3590: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
35a0: 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26  ( TK_LE>TK_EQ &&
35b0: 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LE<TK_GE );.
35c0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
35d0: 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65  =TK_EQ+4 );.  re
35e0: 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c  turn op==TK_IN |
35f0: 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20  | (op>=TK_EQ && 
3600: 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70  op<=TK_GE) || op
3610: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a  ==TK_ISNULL;.}..
3620: 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f  /*.** Swap two o
3630: 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54  bjects of type T
3640: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41  ..*/.#define SWA
3650: 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50  P(TYPE,A,B) {TYP
3660: 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b  E t=A; A=B; B=t;
3670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65  }../*.** Commute
3680: 20 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f   a comparision o
3690: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
36a0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
36b0: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
36c0: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
36d0: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74   "Y op X"..*/.st
36e0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
36f0: 6d 6d 75 74 65 28 45 78 70 72 20 2a 70 45 78 70  mmute(Expr *pExp
3700: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  r){.  assert( al
3710: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
3720: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
3730: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50  =TK_IN );.  SWAP
3740: 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d  (CollSeq*,pExpr-
3750: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70  >pRight->pColl,p
3760: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
3770: 6c 6c 29 3b 0a 20 20 53 57 41 50 28 45 78 70 72  ll);.  SWAP(Expr
3780: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
3790: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
37a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
37b0: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
37c0: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
37d0: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
37e0: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
37f0: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
3800: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
3810: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
3820: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
3830: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
3840: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
3850: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
3860: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
3870: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
3880: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
3890: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
38a0: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
38b0: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
38c0: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
38d0: 69 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d  ic int operatorM
38e0: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69  ask(int op){.  i
38f0: 6e 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  nt c;.  assert( 
3900: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
3910: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
3920: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
3930: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  N;.  }else if( o
3940: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
3950: 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c      c = WO_ISNUL
3960: 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
3970: 63 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  c = WO_EQ<<(op-T
3980: 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73  K_EQ);.  }.  ass
3990: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55  ert( op!=TK_ISNU
39a0: 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55  LL || c==WO_ISNU
39b0: 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
39c0: 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d  op!=TK_IN || c==
39d0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72  WO_IN );.  asser
39e0: 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  t( op!=TK_EQ || 
39f0: 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73  c==WO_EQ );.  as
3a00: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20  sert( op!=TK_LT 
3a10: 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  || c==WO_LT );. 
3a20: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3a30: 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29  LE || c==WO_LE )
3a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3a50: 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GT || c==WO_G
3a60: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
3a70: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57  p!=TK_GE || c==W
3a80: 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  O_GE );.  return
3a90: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61   c;.}../*.** Sea
3aa0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
3ab0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3ac0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
3ad0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
3ae0: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
3af0: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
3b00: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
3b10: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
3b20: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
3b30: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
3b40: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
3b50: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
3b60: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
3b70: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
3b80: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
3b90: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
3ba0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  und..*/.static W
3bb0: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
3bc0: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
3bd0: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
3be0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3bf0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
3c00: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3c20: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
3c30: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
3c40: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
3c50: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c60: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
3c70: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
3c80: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
3c90: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
3ca0: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36 20  s mask */.  u16 
3cb0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
3cc0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
3cd0: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
3ce0: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
3cf0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
3d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
3d10: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
3d20: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
3d30: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
3d40: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3d50: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  Term;.  int k;. 
3d60: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
3d70: 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, k=pWC->nTerm;
3d80: 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
3d90: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
3da0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
3db0: 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  ur.       && (pT
3dc0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
3dd0: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
3de0: 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d         && pTerm-
3df0: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  >leftColumn==iCo
3e00: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28  lumn.       && (
3e10: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
3e20: 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b   & op)!=0.    ){
3e30: 0a 20 20 20 20 20 20 69 66 28 20 69 43 75 72 3e  .      if( iCur>
3e40: 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 70 54  =0 && pIdx && pT
3e50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
3e60: 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
3e70: 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
3e80: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
3e90: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
3ea0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68  Coll;.        ch
3eb0: 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20  ar idxaff;.     
3ec0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
3ed0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3ee0: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a  = pWC->pParse;..
3ef0: 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20 3d          idxaff =
3f00: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
3f10: 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  Col[iColumn].aff
3f20: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69  inity;.        i
3f30: 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78  f( !sqlite3Index
3f40: 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69  AffinityOk(pX, i
3f50: 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75  dxaff) ) continu
3f60: 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  e;..        /* F
3f70: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f  igure out the co
3f80: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
3f90: 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61   required from a
3fa0: 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20  n index for.    
3fb0: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
3fc0: 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d  useful for optim
3fd0: 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  ising expression
3fe0: 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a   pX. Store this.
3ff0: 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
4000: 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f   in variable pCo
4010: 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
4020: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 58         assert(pX
4030: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
4040: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
4050: 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
4060: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58  llSeq(pParse, pX
4070: 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69  ->pLeft, pX->pRi
4080: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ght);.        if
4090: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
40a0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
40b0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
40c0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  oll;.        }..
40d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
40e0: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
40f0: 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75   && pIdx->aiColu
4100: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
4110: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 61  j++){}.        a
4120: 73 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e 6e  ssert( j<pIdx->n
4130: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
4140: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
4150: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
4160: 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  e, pIdx->azColl[
4170: 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  j]) ) continue;.
4180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
4190: 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20  turn pTerm;.    
41a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
41b0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
41c0: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
41d0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
41e0: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
41f0: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
4200: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
4210: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
4220: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
4230: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a  RE clause.  .**.
4240: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
4250: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
4260: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
4270: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
4280: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
4290: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
42a0: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
42b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
42c0: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
42d0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
42e0: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
42f0: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
4300: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
4310: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
4320: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
4330: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4340: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
4350: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
4360: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
4370: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4380: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
4390: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
43a0: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
43b0: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
43c0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
43d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
43e0: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
43f0: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
4400: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
4410: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
4420: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
4430: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
4440: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
4450: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
4460: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
4470: 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74  ildcard.  .*/.st
4480: 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f  atic int isLikeO
4490: 72 47 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65 33  rGlob(.  sqlite3
44a0: 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 54 68   *db,      /* Th
44b0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
44c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
44d0: 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65    /* Test this e
44e0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
44f0: 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20  nt *pnPattern,  
4500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f   /* Number of no
4510: 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69  n-wildcard prefi
4520: 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a  x characters */.
4530: 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65    int *pisComple
4540: 74 65 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  te  /* True if t
4550: 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64  he only wildcard
4560: 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73   is % in the las
4570: 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 29  t character */.)
4580: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4590: 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  z;.  Expr *pRigh
45a0: 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78 70  t, *pLeft;.  Exp
45b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
45c0: 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 69 6e  int c, cnt;.  in
45d0: 74 20 6e 6f 43 61 73 65 3b 0a 20 20 63 68 61 72  t noCase;.  char
45e0: 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65   wc[3];.  CollSe
45f0: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28  q *pColl;..  if(
4600: 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46   !sqlite3IsLikeF
4610: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70  unction(db, pExp
4620: 72 2c 20 26 6e 6f 43 61 73 65 2c 20 77 63 29 20  r, &noCase, wc) 
4630: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4640: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
4650: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70  Expr->pList;.  p
4660: 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61  Right = pList->a
4670: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
4680: 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
4690: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72 65  STRING ){.    re
46a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
46b0: 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31  eft = pList->a[1
46c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
46d0: 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Left->op!=TK_COL
46e0: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
46f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c  n 0;.  }.  pColl
4700: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
4710: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
4720: 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
4730: 43 6f 76 65 72 61 67 65 20 74 65 73 74 69 6e 67  Coverage testing
4740: 20 64 6f 65 73 6e 27 74 20 67 65 74 20 74 68 69   doesn't get thi
4750: 73 20 63 61 73 65 2e 20 49 73 20 69 74 20 61 63  s case. Is it ac
4760: 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 0a  tually possible.
4770: 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 20 65 78      ** for an ex
4780: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70 65  pression of type
4790: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 6f 20 6e 6f   TK_COLUMN to no
47a0: 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  t have an assign
47b0: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ed collation .  
47c0: 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 61 74    ** sequence at
47d0: 20 74 68 69 73 20 70 6f 69 6e 74 3f 0a 20 20 20   this point?.   
47e0: 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   */.    pColl = 
47f0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4800: 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d   }.  if( (pColl-
4810: 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f  >type!=SQLITE_CO
4820: 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 6e 6f 43  LL_BINARY || noC
4830: 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70  ase) &&.      (p
4840: 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49  Coll->type!=SQLI
4850: 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c  TE_COLL_NOCASE |
4860: 7c 20 21 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20  | !noCase) ){.  
4870: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4880: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4890: 45 78 70 72 28 70 52 69 67 68 74 29 3b 0a 20 20  Expr(pRight);.  
48a0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 52 69 67  z = (char *)pRig
48b0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66  ht->token.z;.  f
48c0: 6f 72 28 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63  or(cnt=0; (c=z[c
48d0: 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63  nt])!=0 && c!=wc
48e0: 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20  [0] && c!=wc[1] 
48f0: 26 26 20 63 21 3d 77 63 5b 32 5d 3b 20 63 6e 74  && c!=wc[2]; cnt
4900: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 6e 74 3d  ++){}.  if( cnt=
4910: 3d 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a  =0 || 255==(u8)z
4920: 5b 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74  [cnt] ){.    ret
4930: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69  urn 0;.  }.  *pi
4940: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e  sComplete = z[cn
4950: 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63  t]==wc[0] && z[c
4960: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50  nt+1]==0;.  *pnP
4970: 61 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20  attern = cnt;.  
4980: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4990: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
49a0: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
49b0: 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  ION */...#ifndef
49c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
49d0: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
49e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
49f0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
4a00: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
4a10: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  orm.**.**       
4a20: 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
4a30: 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  xpr.**.** If it 
4a40: 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54  is then return T
4a50: 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65  RUE.  If not, re
4a60: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
4a70: 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63  tatic int isMatc
4a80: 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70  hOfColumn(.  Exp
4a90: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a  r *pExpr      /*
4aa0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
4ab0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  ssion */.){.  Ex
4ac0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a  prList *pList;..
4ad0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
4ae0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
4af0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4b00: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  }.  if( pExpr->t
4b10: 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20  oken.n!=5 ||.   
4b20: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49      sqlite3StrNI
4b30: 43 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  Cmp((const char*
4b40: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
4b50: 22 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b  "match",5)!=0 ){
4b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4b70: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
4b80: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
4b90: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
4ba0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4bb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
4bc0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
4bd0: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
4be0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
4c00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4c10: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4c20: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
4c30: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
4c40: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
4c50: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
4c60: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
4c70: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
4c80: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
4c90: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
4ca0: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
4cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4cc0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
4cd0: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
4ce0: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
4cf0: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
4d00: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
4d10: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
4d20: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
4d30: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
4d40: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
4d50: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69  JoinTable;.}..#i
4d60: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4d70: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
4d80: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
4d90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4da0: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
4db0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
4dc0: 68 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f 66  he given term of
4dd0: 20 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63 61   an OR clause ca
4de0: 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0a 2a  n be converted.*
4df0: 2a 20 69 6e 74 6f 20 61 6e 20 49 4e 20 63 6c 61  * into an IN cla
4e00: 75 73 65 2e 20 20 54 68 65 20 69 43 75 72 73 6f  use.  The iCurso
4e10: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 20 64 65  r and iColumn de
4e20: 66 69 6e 65 20 74 68 65 20 6c 65 66 74 2d 68 61  fine the left-ha
4e30: 6e 64 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68  nd.** side of th
4e40: 65 20 49 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  e IN clause..**.
4e50: 2a 2a 20 54 68 65 20 63 6f 6e 74 65 78 74 20 69  ** The context i
4e60: 73 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6d  s that we have m
4e70: 75 6c 74 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65  ultiple OR-conne
4e80: 63 74 65 64 20 65 71 75 61 6c 69 74 79 20 74 65  cted equality te
4e90: 72 6d 73 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  rms.** like this
4ea0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
4eb0: 20 20 61 3d 3c 65 78 70 72 31 3e 20 4f 52 20 20    a=<expr1> OR  
4ec0: 61 3d 3c 65 78 70 72 32 3e 20 4f 52 20 62 3d 3c  a=<expr2> OR b=<
4ed0: 65 78 70 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a  expr3>  OR ....*
4ee0: 2a 0a 2a 2a 20 54 68 65 20 70 4f 72 54 65 72 6d  *.** The pOrTerm
4ef0: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
4f00: 6f 75 74 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e  outine correspon
4f10: 64 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 74  ds to a single t
4f20: 65 72 6d 20 6f 66 0a 2a 2a 20 74 68 69 73 20 4f  erm of.** this O
4f30: 52 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72  R clause.  In or
4f40: 64 65 72 20 66 6f 72 20 74 68 65 20 74 65 72 6d  der for the term
4f50: 20 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 64 61   to be a condida
4f60: 74 65 20 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72  te for.** conver
4f70: 73 69 6f 6e 20 74 6f 20 61 6e 20 49 4e 20 6f 70  sion to an IN op
4f80: 65 72 61 74 6f 72 2c 20 74 68 65 20 66 6f 6c 6c  erator, the foll
4f90: 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72  owing must be tr
4fa0: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ue:.**.**     * 
4fb0: 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
4fc0: 69 64 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ide of the term 
4fd0: 6d 75 73 74 20 62 65 20 74 68 65 20 63 6f 6c 75  must be the colu
4fe0: 6d 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 20 20  mn which.**     
4ff0: 20 20 20 69 73 20 69 64 65 6e 74 69 66 69 65 64     is identified
5000: 20 62 79 20 69 43 75 72 73 6f 72 20 61 6e 64 20   by iCursor and 
5010: 69 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20  iColumn..**.**  
5020: 20 20 20 2a 20 20 49 66 20 74 68 65 20 72 69 67     *  If the rig
5030: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
5040: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
5050: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
5060: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  es.**        of 
5070: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
5080: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
5090: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
50a0: 79 70 65 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  ype.**        co
50b0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
50c0: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
50d0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
50e0: 32 34 39 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f  249).**.** If bo
50f0: 74 68 20 6f 66 20 74 68 65 73 65 20 63 6f 6e 64  th of these cond
5100: 69 74 69 6f 6e 73 20 61 72 65 20 74 72 75 65 2c  itions are true,
5110: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 72 75   then return tru
5120: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
5130: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
5140: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 72 54  /.static int orT
5150: 65 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74  ermIsOptCandidat
5160: 65 28 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72  e(WhereTerm *pOr
5170: 54 65 72 6d 2c 20 69 6e 74 20 69 43 75 72 73 6f  Term, int iCurso
5180: 72 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b  r, int iColumn){
5190: 0a 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20  .  int affLeft, 
51a0: 61 66 66 52 69 67 68 74 3b 0a 20 20 61 73 73 65  affRight;.  asse
51b0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
51c0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
51d0: 0a 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  .  if( pOrTerm->
51e0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
51f0: 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
5200: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
5210: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75  OrTerm->leftColu
5220: 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn!=iColumn ){. 
5230: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5240: 0a 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71  .  affRight = sq
5250: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
5260: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
5270: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28  ->pRight);.  if(
5280: 20 61 66 66 52 69 67 68 74 3d 3d 30 20 29 7b 0a   affRight==0 ){.
5290: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
52a0: 7d 0a 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71  }.  affLeft = sq
52b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
52c0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
52d0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
52e0: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
52f0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
5300: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5310: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
5320: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
5330: 69 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20  iven term of an 
5340: 4f 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65  OR clause can be
5350: 20 69 67 6e 6f 72 65 64 20 64 75 72 69 6e 67 0a   ignored during.
5360: 2a 2a 20 61 20 63 68 65 63 6b 20 74 6f 20 6d 61  ** a check to ma
5370: 6b 65 20 73 75 72 65 20 61 6c 6c 20 4f 52 20 74  ke sure all OR t
5380: 65 72 6d 73 20 61 72 65 20 63 61 6e 64 69 64 61  erms are candida
5390: 74 65 73 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61  tes for optimiza
53a0: 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  tion..** In othe
53b0: 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
53c0: 74 72 75 65 20 69 66 20 61 20 63 61 6c 6c 20 74  true if a call t
53d0: 6f 20 74 68 65 20 6f 72 54 65 72 6d 49 73 4f 70  o the orTermIsOp
53e0: 74 43 61 6e 64 69 64 61 74 65 28 29 0a 2a 2a 20  tCandidate().** 
53f0: 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 66  above returned f
5400: 61 6c 73 65 20 62 75 74 20 69 74 20 69 73 20 6e  alse but it is n
5410: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
5420: 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 0a 2a  disqualify the.*
5430: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  * optimization..
5440: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
5450: 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 70 68  e original OR ph
5460: 72 61 73 65 20 77 61 73 20 74 68 69 73 3a 0a 2a  rase was this:.*
5470: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
5480: 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52  =4  OR  a=11  OR
5490: 20 20 61 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69    a=b.**.** Duri
54a0: 6e 67 20 61 6e 61 6c 79 73 69 73 2c 20 74 68 65  ng analysis, the
54b0: 20 74 68 69 72 64 20 74 65 72 6d 20 67 65 74 73   third term gets
54c0: 20 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64 20   flipped around 
54d0: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a  and duplicate.**
54e0: 20 73 6f 20 74 68 61 74 20 77 65 20 61 72 65 20   so that we are 
54f0: 6c 65 66 74 20 77 69 74 68 20 74 68 69 73 3a 0a  left with this:.
5500: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
5510: 61 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f  a=4  OR  a=11  O
5520: 52 20 20 61 3d 62 20 20 4f 52 20 20 62 3d 61 0a  R  a=b  OR  b=a.
5530: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  **.** Since the 
5540: 6c 61 73 74 20 74 77 6f 20 74 65 72 6d 73 20 61  last two terms a
5550: 72 65 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f  re duplicates, o
5560: 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a  nly one of them.
5570: 2a 2a 20 68 61 73 20 74 6f 20 71 75 61 6c 69 66  ** has to qualif
5580: 79 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  y in order for t
5590: 68 65 20 77 68 6f 6c 65 20 70 68 72 61 73 65 20  he whole phrase 
55a0: 74 6f 20 71 75 61 6c 69 66 79 2e 20 20 57 68 65  to qualify.  Whe
55b0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
55c0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
55d0: 6b 6e 6f 77 20 74 68 61 74 20 70 4f 72 54 65 72  know that pOrTer
55e0: 6d 20 64 69 64 20 6e 6f 74 20 71 75 61 6c 69 66  m did not qualif
55f0: 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  y..** This routi
5600: 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73  ne merely checks
5610: 20 74 6f 20 73 65 65 20 69 66 20 70 4f 72 54 65   to see if pOrTe
5620: 72 6d 20 68 61 73 20 61 20 64 75 70 6c 69 63 61  rm has a duplica
5630: 74 65 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  te that.** might
5640: 20 71 75 61 6c 69 66 79 2e 20 20 49 66 20 74 68   qualify.  If th
5650: 65 72 65 20 69 73 20 61 20 64 75 70 6c 69 63 61  ere is a duplica
5660: 74 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  te that has not 
5670: 79 65 74 20 62 65 65 6e 0a 2a 2a 20 64 69 73 71  yet been.** disq
5680: 75 61 6c 69 66 69 65 64 2c 20 74 68 65 6e 20 72  ualified, then r
5690: 65 74 75 72 6e 20 74 72 75 65 2e 20 20 49 66 20  eturn true.  If 
56a0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 75 70  there are no dup
56b0: 6c 69 63 61 74 65 73 2c 20 6f 72 0a 2a 2a 20 74  licates, or.** t
56c0: 68 65 20 64 75 70 6c 69 63 61 74 65 20 68 61 73  he duplicate has
56d0: 20 61 6c 73 6f 20 62 65 65 6e 20 64 69 73 71 75   also been disqu
56e0: 61 6c 69 66 65 64 2c 20 72 65 74 75 72 6e 20 66  alifed, return f
56f0: 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alse..*/.static 
5700: 69 6e 74 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44  int orTermHasOkD
5710: 75 70 6c 69 63 61 74 65 28 57 68 65 72 65 43 6c  uplicate(WhereCl
5720: 61 75 73 65 20 2a 70 4f 72 2c 20 57 68 65 72 65  ause *pOr, Where
5730: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a  Term *pOrTerm){.
5740: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66    if( pOrTerm->f
5750: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
5760: 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ED ){.    /* Thi
5770: 73 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61  s is the origina
5780: 6c 20 74 65 72 6d 2e 20 20 54 68 65 20 64 75 70  l term.  The dup
5790: 6c 69 63 61 74 65 20 69 73 20 74 6f 20 74 68 65  licate is to the
57a0: 20 6c 65 66 74 20 68 61 64 0a 20 20 20 20 2a 2a   left had.    **
57b0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
57c0: 6e 20 61 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74  n analyzed and t
57d0: 68 75 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20  hus has not yet 
57e0: 62 65 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65  been disqualifie
57f0: 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
5800: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   1;.  }.  if( (p
5810: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  OrTerm->flags & 
5820: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
5830: 0a 20 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61  .     && (pOr->a
5840: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
5850: 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  t].flags & TERM_
5860: 4f 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20  OR_OK)!=0 ){.   
5870: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 64 75   /* This is a du
5880: 70 6c 69 63 61 74 65 20 74 65 72 6d 2e 20 20 54  plicate term.  T
5890: 68 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c  he original qual
58a0: 69 66 69 65 64 20 73 6f 20 74 68 69 73 20 6f 6e  ified so this on
58b0: 65 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  e.    ** does no
58c0: 74 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20  t have to. */.  
58d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
58e0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69 74    /* This is eit
58f0: 68 65 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20  her a singleton 
5900: 74 65 72 6d 20 6f 72 20 65 6c 73 65 20 69 74 20  term or else it 
5910: 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66  is a duplicate f
5920: 6f 72 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68  or.  ** which th
5930: 65 20 6f 72 69 67 69 6e 61 6c 20 64 69 64 20 6e  e original did n
5940: 6f 74 20 71 75 61 6c 69 66 79 2e 20 20 45 69 74  ot qualify.  Eit
5950: 68 65 72 20 77 61 79 20 77 65 20 61 72 65 20 64  her way we are d
5960: 6f 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65  one for. */.  re
5970: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
5980: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
5990: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
59a0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
59b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
59c0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
59d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
59e0: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
59f0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
5a00: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
5a10: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
5a20: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
5a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
5a40: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
5a50: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
5a60: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
5a70: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
5a80: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
5a90: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
5aa0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
5ab0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5ac0: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
5ad0: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
5ae0: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
5af0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
5b00: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
5b10: 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  ".  If the expre
5b20: 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74  ssion is of.** t
5b30: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
5b40: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
5b50: 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e  and Y are column
5b60: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
5b70: 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69  inal.** expressi
5b80: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
5b90: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
5ba0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  l expression of 
5bb0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
5bc0: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
5bd0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
5be0: 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64  use and analyzed
5bf0: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a   separately..*/.
5c00: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5c10: 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69  Analyze(.  SrcLi
5c20: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
5c30: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
5c40: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
5c50: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
5c60: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
5c70: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
5c80: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
5c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
5ca0: 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74  ex of the term t
5cb0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
5cc0: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
5cd0: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
5ce0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78 70  [idxTerm];.  Exp
5cf0: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
5d00: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
5d10: 65 74 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  et;.  Expr *pExp
5d20: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5d30: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  ;.  Bitmask prer
5d40: 65 71 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73  eqLeft;.  Bitmas
5d50: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69  k prereqAll;.  i
5d60: 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69  nt nPattern;.  i
5d70: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
5d80: 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 69 66 28 20   int op;..  if( 
5d90: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
5da0: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
5db0: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
5dc0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
5dd0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
5de0: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
5df0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
5e00: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
5e10: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
5e20: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
5e30: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
5e40: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
5e50: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
5e60: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 0a  , pExpr->pList).
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70 72            | expr
5e90: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
5ea0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
5eb0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  ->pSelect);.  }e
5ec0: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
5ed0: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65  SNULL ){.    pTe
5ee0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5ef0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
5f00: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
5f10: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
5f20: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
5f30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
5f40: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
5f50: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
5f60: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
5f70: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
5f80: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5f90: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
5fa0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d      prereqAll |=
5fb0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
5fc0: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
5fd0: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a  JoinTable);.  }.
5fe0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41    pTerm->prereqA
5ff0: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
6000: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
6010: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72  sor = -1;.  pTer
6020: 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b  m->iParent = -1;
6030: 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  .  pTerm->eOpera
6040: 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  tor = 0;.  if( a
6050: 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20  llowedOp(op) && 
6060: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
6070: 67 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74  ght & prereqLeft
6080: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
6090: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
60a0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72  >pLeft;.    Expr
60b0: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
60c0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66  ->pRight;.    if
60d0: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
60e0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
60f0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
6100: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
6110: 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  e;.      pTerm->
6120: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
6130: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
6140: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
6150: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
6160: 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sk(op);.    }.  
6170: 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20    if( pRight && 
6180: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
6190: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57  OLUMN ){.      W
61a0: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a  hereTerm *pNew;.
61b0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
61c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
61d0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30  m->leftCursor>=0
61e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
61f0: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  idxNew;.        
6200: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
6210: 70 72 44 75 70 28 70 45 78 70 72 29 3b 0a 20 20  prDup(pExpr);.  
6220: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6230: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
6240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6250: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6260: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
6270: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
6280: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
6290: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
62a0: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
62b0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
62c0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
62d0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
62e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
62f0: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
6300: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
6310: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
6320: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
6330: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
6340: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
6350: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
6360: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
6370: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
6380: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
6390: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
63a0: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
63b0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
63c0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
63d0: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
63e0: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70  e(pDup);.      p
63f0: 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65  Left = pDup->pLe
6400: 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ft;.      pNew->
6410: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
6420: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
6430: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75    pNew->leftColu
6440: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
6450: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  umn;.      pNew-
6460: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
6470: 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20  rereqLeft;.     
6480: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
6490: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
64a0: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
64b0: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
64c0: 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20  sk(pDup->op);.  
64d0: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
64e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
64f0: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
6500: 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d  N.  /* If a term
6510: 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20   is the BETWEEN 
6520: 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65  operator, create
6530: 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c   two new virtual
6540: 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74   terms.  ** that
6550: 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67   define the rang
6560: 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45  e that the BETWE
6570: 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20  EN implements.. 
6580: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
6590: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
65a0: 57 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72  WEEN ){.    Expr
65b0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
65c0: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
65d0: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
65e0: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
65f0: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
6600: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
6610: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
6620: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
6630: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
6640: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
6650: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
6660: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
6670: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
6680: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
6690: 65 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c 20 73  e3Expr(ops[i], s
66a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45  qlite3ExprDup(pE
66b0: 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20  xpr->pLeft),.   
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
66e0: 33 45 78 70 72 44 75 70 28 70 4c 69 73 74 2d 3e  3ExprDup(pList->
66f0: 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b  a[i].pExpr), 0);
6700: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
6710: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
6720: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
6730: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
6740: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
6750: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
6760: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
6770: 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
6780: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
6790: 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ];.      pWC->a[
67a0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
67b0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d  = idxTerm;.    }
67c0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69  .    pTerm->nChi
67d0: 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64  ld = 2;.  }.#end
67e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
67f0: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
6800: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21  ZATION */..#if !
6810: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6820: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
6830: 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  ION) && !defined
6840: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
6850: 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74 65  QUERY).  /* Atte
6860: 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f  mpt to convert O
6870: 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
6880: 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65  s into an IN ope
6890: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20  rator so that.  
68a0: 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65  ** they can make
68b0: 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
68c0: 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a    Example:.  **.
68d0: 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78    **      x = ex
68e0: 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d  pr1  OR  expr2 =
68f0: 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72   x  OR  x = expr
6900: 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63  3.  **.  ** is c
6910: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20 20  onverted into.  
6920: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 49  **.  **      x I
6930: 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65  N (expr1,expr2,e
6940: 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  xpr3).  **.  ** 
6950: 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  This optimizatio
6960: 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74 65  n must be omitte
6970: 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55 45  d if OMIT_SUBQUE
6980: 52 59 20 69 73 20 64 65 66 69 6e 65 64 20 62 65  RY is defined be
6990: 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 63  cause.  ** the c
69a0: 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65 20  ompiler for the 
69b0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
69c0: 69 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d 71  is part of sub-q
69d0: 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65  ueries..  */.  e
69e0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
69f0: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
6a00: 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20  int ok;.    int 
6a10: 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43  i, j;.    int iC
6a20: 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a  olumn, iCursor;.
6a30: 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
6a40: 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65  sOr;.    WhereTe
6a50: 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20  rm *pOrTerm;..  
6a60: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
6a70: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  ->flags & TERM_D
6a80: 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20  YNAMIC)==0 );.  
6a90: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
6aa0: 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61  t(&sOr, pWC->pPa
6ab0: 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a  rse, pMaskSet);.
6ac0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26      whereSplit(&
6ad0: 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  sOr, pExpr, TK_O
6ae0: 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  R);.    exprAnal
6af0: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26 73 4f  yzeAll(pSrc, &sO
6b00: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
6b10: 73 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a  sOr.nTerm>=2 );.
6b20: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 64      j = 0;.    d
6b30: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
6b40: 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a   j<sOr.nTerm );.
6b50: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
6b60: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c  sOr.a[j].leftCol
6b70: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73  umn;.      iCurs
6b80: 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65  or = sOr.a[j].le
6b90: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
6ba0: 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b  ok = iCursor>=0;
6bb0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72  .      for(i=sOr
6bc0: 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  .nTerm-1, pOrTer
6bd0: 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26  m=sOr.a; i>=0 &&
6be0: 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72   ok; i--, pOrTer
6bf0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
6c00: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
6c10: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
6c20: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72           goto or
6c30: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20  _not_possible;. 
6c40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6c50: 20 69 66 28 20 6f 72 54 65 72 6d 49 73 4f 70 74   if( orTermIsOpt
6c60: 43 61 6e 64 69 64 61 74 65 28 70 4f 72 54 65 72  Candidate(pOrTer
6c70: 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  m, iCursor, iCol
6c80: 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  umn) ){.        
6c90: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
6ca0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
6cb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6cc0: 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70  ( orTermHasOkDup
6cd0: 6c 69 63 61 74 65 28 26 73 4f 72 2c 20 70 4f 72  licate(&sOr, pOr
6ce0: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  Term) ){.       
6cf0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
6d00: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
6d10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6d20: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20  .          ok = 
6d30: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
6d40: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
6d50: 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a   !ok && (sOr.a[j
6d60: 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d  ++].flags & TERM
6d70: 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a  _COPIED)!=0 && j
6d80: 3c 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b  <2 );.    if( ok
6d90: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   ){.      ExprLi
6da0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  st *pList = 0;. 
6db0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c       Expr *pNew,
6dc0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 45 78   *pDup;.      Ex
6dd0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr *pLeft = 0;. 
6de0: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
6df0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
6e00: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
6e10: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
6e20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6e30: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
6e40: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
6e50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6e60: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
6e70: 74 65 33 45 78 70 72 44 75 70 28 70 4f 72 54 65  te3ExprDup(pOrTe
6e80: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
6e90: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  t);.        pLis
6ea0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6eb0: 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c  istAppend(pList,
6ec0: 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20 20   pDup, 0);.     
6ed0: 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65     pLeft = pOrTe
6ee0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
6ef0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6f00: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
6f10: 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d   );.      pDup =
6f20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6f30: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e  pLeft);.      pN
6f40: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
6f50: 28 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c  (TK_IN, pDup, 0,
6f60: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
6f70: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
6f80: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
6f90: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
6fa0: 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45  arkings(pNew, pE
6fb0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
6fc0: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
6fd0: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
6fe0: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
6ff0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
7000: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
7010: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
7020: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
7030: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
7040: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
7050: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7060: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
7070: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
7080: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
7090: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
70a0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
70b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
70c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70d0: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
70e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f       }.    }.or_
70f0: 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20  not_possible:.  
7100: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
7110: 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65  ar(&sOr);.  }.#e
7120: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7130: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
7140: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
7150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
7160: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
7170: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
7180: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
7190: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
71a0: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
71b0: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
71c0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65   */.  if( isLike
71d0: 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50 61 72  OrGlob(pWC->pPar
71e0: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 26  se->db, pExpr, &
71f0: 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d  nPattern, &isCom
7200: 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20 45 78  plete) ){.    Ex
7210: 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  pr *pLeft, *pRig
7220: 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  ht;.    Expr *pS
7230: 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20  tr1, *pStr2;.   
7240: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
7250: 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20  , *pNewExpr2;.  
7260: 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69    int idxNew1, i
7270: 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65  dxNew2;..    pLe
7280: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ft = pExpr->pLis
7290: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
72a0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
72b0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
72c0: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20  Expr;.    pStr1 
72d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
72e0: 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30  _STRING, 0, 0, 0
72f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 31  );.    if( pStr1
7300: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7310: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53 74 72  3TokenCopy(&pStr
7320: 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68  1->token, &pRigh
7330: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
7340: 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20   pStr1->token.n 
7350: 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20  = nPattern;.    
7360: 20 20 70 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d    pStr1->flags =
7370: 20 45 50 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20   EP_Dequoted;.  
7380: 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20    }.    pStr2 = 
7390: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
73a0: 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  Str1);.    if( p
73b0: 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73  Str2 ){.      as
73c0: 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b  sert( pStr2->tok
73d0: 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20  en.dyn );.      
73e0: 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e  ++*(u8*)&pStr2->
73f0: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
7400: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
7410: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
7420: 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71  e3Expr(TK_GE, sq
7430: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
7440: 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  ft), pStr1, 0);.
7450: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
7460: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
7470: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
7480: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
7490: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
74a0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
74b0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b  , pWC, idxNew1);
74c0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
74d0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
74e0: 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  LT, sqlite3ExprD
74f0: 75 70 28 70 4c 65 66 74 29 2c 20 70 53 74 72 32  up(pLeft), pStr2
7500: 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  , 0);.    idxNew
7510: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
7520: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
7530: 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
7540: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
7550: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
7560: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
7570: 4e 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d  New2);.    pTerm
7580: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
7590: 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43  rm];.    if( isC
75a0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
75b0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d   pWC->a[idxNew1]
75c0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
75d0: 72 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  rm;.      pWC->a
75e0: 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e  [idxNew2].iParen
75f0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
7600: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
7610: 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 2;.    }.  }.
7620: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7630: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
7640: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e  IZATION */..#ifn
7650: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7660: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
7670: 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48  * Add a WO_MATCH
7680: 20 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20   auxiliary term 
7690: 74 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  to the constrain
76a0: 74 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a  t set if the.  *
76b0: 2a 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73  * current expres
76c0: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
76d0: 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54  orm:  column MAT
76e0: 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68  CH expr..  ** Th
76f0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
7700: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42  s used by the xB
7710: 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73  estIndex methods
7720: 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c   of.  ** virtual
7730: 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61   tables.  The na
7740: 74 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d  tive query optim
7750: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74  izer does not at
7760: 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f  tempt.  ** to do
7770: 20 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d   anything with M
7780: 41 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ATCH functions..
7790: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74    */.  if( isMat
77a0: 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72  chOfColumn(pExpr
77b0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  ) ){.    int idx
77c0: 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  New;.    Expr *p
77d0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20  Right, *pLeft;. 
77e0: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
77f0: 65 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d  ewTerm;.    Bitm
7800: 61 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  ask prereqColumn
7810: 2c 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20  , prereqExpr;.. 
7820: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
7830: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
7840: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
7850: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
7860: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
7870: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
7880: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
7890: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
78a0: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
78b0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
78c0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
78d0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
78e0: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
78f0: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
7900: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
7910: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
7920: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  r = sqlite3Expr(
7930: 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20 73 71 6c  TK_MATCH, 0, sql
7940: 69 74 65 33 45 78 70 72 44 75 70 28 70 52 69 67  ite3ExprDup(pRig
7950: 68 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ht), 0);.      i
7960: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
7970: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
7980: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
7990: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
79a0: 49 43 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IC);.      pNewT
79b0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
79c0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
79d0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
79e0: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
79f0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
7a00: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
7a10: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
7a20: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
7a30: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
7a40: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
7a50: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
7a60: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
7a70: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
7a80: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7a90: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
7aa0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7ab0: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
7ac0: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
7ad0: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
7ae0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
7af0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
7b00: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
7b10: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
7b20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
7b30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7b40: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a  TUALTABLE */.}..
7b50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
7b60: 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  E if any of the 
7b70: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
7b80: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e  List->a[iFirst..
7b90: 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20  .] contain.** a 
7ba0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
7bb0: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
7bc0: 6e 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c  n the iBase tabl
7bd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7be0: 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72   referencesOther
7bf0: 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69  Tables(.  ExprLi
7c00: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
7c10: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78      /* Search ex
7c20: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73  pressions in ths
7c30: 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d   list */.  ExprM
7c40: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
7c50: 2c 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  ,    /* Mapping 
7c60: 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62  from tables to b
7c70: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20  itmaps */.  int 
7c80: 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
7c90: 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72        /* Be sear
7ca0: 63 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69  ching with the i
7cb0: 46 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73  First-th express
7cc0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  ion */.  int iBa
7cd0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
7ce0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66     /* Ignore ref
7cf0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
7d00: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69  table */.){.  Bi
7d10: 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20  tmask allowed = 
7d20: 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  ~getMask(pMaskSe
7d30: 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69  t, iBase);.  whi
7d40: 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74  le( iFirst<pList
7d50: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
7d60: 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61  f( (exprTableUsa
7d70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
7d80: 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e  st->a[iFirst++].
7d90: 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21  pExpr)&allowed)!
7da0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
7db0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
7dc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
7dd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7de0: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
7df0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
7e00: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
7e10: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
7e20: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
7e30: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
7e40: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
7e50: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
7e60: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
7e70: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7e80: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
7e90: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
7ea0: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
7eb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7ec0: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
7ed0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
7ee0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
7ef0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
7f00: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7f10: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
7f20: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
7f30: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
7f40: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
7f50: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
7f60: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
7f70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
7f80: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
7f90: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
7fa0: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
7fb0: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
7fc0: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
7fd0: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
7fe0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
7ff0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
8000: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
8010: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
8020: 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** All terms of 
8030: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61  the ORDER BY tha
8040: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
8050: 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
8060: 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20  e either.** ASC 
8070: 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73  or DESC.  (Terms
8080: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8090: 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65   clause past the
80a0: 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45   end of a UNIQUE
80b0: 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74  .** index do not
80c0: 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79   need to satisfy
80d0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
80e0: 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76  .)  The *pbRev v
80f0: 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
8100: 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52  o 1 if the ORDER
8110: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
8120: 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73  l DESC and it is
8130: 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20   set to 0 if.** 
8140: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8150: 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a  use is all ASC..
8160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
8170: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
8180: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8190: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
81a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
81b0: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
81c0: 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69  skSet,  /* Mappi
81d0: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e  ng from table in
81e0: 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73  dices to bitmaps
81f0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8200: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
8210: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
8220: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
8230: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
8240: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
8250: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
8260: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
8270: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
8280: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
8290: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
82a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
82b0: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
82c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
82d0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
82e0: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
82f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
8300: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
8310: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
8320: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
8330: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
8340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8350: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8360: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
8370: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8390: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
83a0: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
83b0: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
83c0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
83f0: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
8400: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8410: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
8420: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
8430: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8440: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8450: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8460: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
8470: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
8480: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
8490: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
84a0: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
84b0: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
84c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
84d0: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
84e0: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
84f0: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
8500: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
8510: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
8520: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
8530: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
8540: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
8550: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
8560: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
8570: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
8580: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
8590: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
85a0: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
85b0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
85c0: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
85d0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
85e0: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
85f0: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
8600: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
8610: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
8620: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
8630: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
8640: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
8650: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
8660: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
8670: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8680: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
8690: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
86a0: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
86b0: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
86c0: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
86d0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
86e0: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
86f0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
8700: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
8710: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
8720: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
8730: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
8740: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
8750: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
8760: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
8770: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8780: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8790: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
87a0: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
87b0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
87c0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
87d0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
87e0: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
87f0: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
8800: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
8810: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
8820: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
8830: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
8840: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
8850: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
8860: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
8870: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
8880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
8890: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
88a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
88b0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
88c0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
88d0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
88e0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
88f0: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
8900: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
8910: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
8920: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
8930: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
8940: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
8950: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
8960: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
8970: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
8980: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
8990: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
89a0: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
89b0: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
89c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
89d0: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
89e0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
89f0: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
8a00: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
8a10: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
8a20: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
8a30: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
8a40: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
8a50: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
8a60: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
8a70: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8a80: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
8a90: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
8aa0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
8ab0: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
8ac0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
8ad0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
8ae0: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
8af0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
8b00: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
8b10: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
8b20: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
8b30: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
8b40: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
8b50: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
8b60: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
8b70: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
8b80: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
8b90: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
8ba0: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
8bb0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
8bc0: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
8bd0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
8be0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
8bf0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
8c00: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
8c10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
8c20: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
8c30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
8c40: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
8c50: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  der!=0 );.    as
8c60: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
8c70: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
8c80: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
8c90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8ca0: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
8cb0: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
8cc0: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
8cd0: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
8ce0: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
8cf0: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
8d00: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
8d10: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
8d20: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
8d30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
8d40: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
8d50: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
8d60: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
8d70: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
8d80: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
8d90: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
8da0: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
8db0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8dc0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
8dd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
8de0: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
8df0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
8e00: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
8e10: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
8e20: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
8e30: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
8e40: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
8e50: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
8e60: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
8e70: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
8e80: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
8e90: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
8ea0: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
8eb0: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
8ec0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8ed0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
8ee0: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
8ef0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
8f00: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
8f10: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
8f20: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
8f30: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
8f40: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
8f50: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
8f60: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
8f70: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
8f80: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
8f90: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
8fa0: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
8fb0: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
8fc0: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
8fd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
8fe0: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
8ff0: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
9000: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
9010: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
9020: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
9030: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
9040: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
9050: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
9060: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
9070: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
9080: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9090: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
90a0: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
90b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
90c0: 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65     && !reference
90d0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
90e0: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
90f0: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
9100: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
9110: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63   this index matc
9120: 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66  h some prefix of
9130: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9140: 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ause.    ** and 
9150: 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49  the index is UNI
9160: 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73  QUE and no terms
9170: 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20   on the tail of 
9180: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
9190: 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72   ** clause refer
91a0: 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65  ence other table
91b0: 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66  s in a join.  If
91c0: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75   this is all tru
91d0: 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  e then.    ** th
91e0: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
91f0: 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  e is superfluous
9200: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
9210: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
9220: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  0;.}../*.** Chec
9230: 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69  k table to see i
9240: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
9250: 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42  lause in pOrderB
9260: 79 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  y can be satisfi
9270: 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67  ed.** by sorting
9280: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57   in order of ROW
9290: 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ID.  Return true
92a0: 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a   if so and set *
92b0: 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74  pbRev to be.** t
92c0: 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20  rue for reverse 
92d0: 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20  ROWID and false 
92e0: 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49  for forward ROWI
92f0: 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  D order..*/.stat
9300: 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42  ic int sortableB
9310: 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61  yRowid(.  int ba
9320: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
9330: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
9340: 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20  er for table to 
9350: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45  be sorted */.  E
9360: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9370: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
9380: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
9390: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
93a0: 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61  pMaskSet,  /* Ma
93b0: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
93c0: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
93d0: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
93e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
93f0: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
9400: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
9410: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
9420: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
9430: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9440: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
9450: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
9460: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
9470: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
9480: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
9490: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
94a0: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20  iColumn==-1.    
94b0: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
94c0: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
94d0: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c  By, pMaskSet, 1,
94e0: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70   base) ){.    *p
94f0: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
9500: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
9510: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9530: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
9540: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
9550: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
9560: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
9570: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
9580: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
9590: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
95a0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
95b0: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
95c0: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
95d0: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
95e0: 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ings with O(logN
95f0: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
9600: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
9610: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
9620: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
9630: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
9640: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
9650: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
9660: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
9670: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
9680: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
9690: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
96a0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
96b0: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
96c0: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
96d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
96e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
96f0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
9700: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
9710: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
9720: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
9730: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
9740: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
9750: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
9760: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
9770: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
9780: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
9790: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
97a0: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
97b0: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
97c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
97d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
97e0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
97f0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
9800: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
9810: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
9820: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
9830: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
9840: 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  !sqlite3_where_t
9850: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
9860: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9870: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
9880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
9890: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
98a0: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
98b0: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
98c0: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
98d0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
98e0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
98f0: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
9900: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
9910: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
9920: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
9930: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
9940: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
9950: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
9960: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
9970: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
9980: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9990: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
99a0: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
99b0: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
99c0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
99d0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
99e0: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
99f0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
9a00: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
9a10: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
9a20: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
9a30: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
9a40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
9a50: 28 20 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65  ( !sqlite3_where
9a60: 5f 74 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  _trace ) return;
9a70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9a80: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
9a90: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
9aa0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
9ab0: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
9ac0: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
9ad0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9ae0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
9af0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
9b00: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
9b10: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
9b20: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
9b30: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
9b40: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
9b50: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
9b60: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
9b70: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
9b80: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
9b90: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
9ba0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
9bb0: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
9bc0: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
9bd0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
9be0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
9bf0: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
9c00: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
9c10: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
9c20: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
9c30: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
9c40: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
9c50: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  S(A).#endif..#if
9c60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9c70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
9c80: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
9c90: 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61  best index for a
9ca0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
9cb0: 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69  **.** The best i
9cc0: 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64  ndex is computed
9cd0: 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
9ce0: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ex method of the
9cf0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
9d00: 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20  e module.  This 
9d10: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c  routine is reall
9d20: 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72  y just a wrapper
9d30: 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a   that sets up.**
9d40: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
9d50: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
9d60: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  e that is used t
9d70: 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69  o communicate wi
9d80: 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  th.** xBestIndex
9d90: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69  ..**.** In a joi
9da0: 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
9db0: 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20  might be called 
9dc0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66  multiple times f
9dd0: 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76  or the.** same v
9de0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
9df0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
9e00: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
9e10: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
9e20: 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e  d initialized on
9e30: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
9e40: 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ation and reused
9e50: 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   on all subseque
9e60: 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  nt.** invocation
9e70: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
9e80: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
9e90: 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65  ture is also use
9ea0: 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69  d when.** code i
9eb0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61  s generated to a
9ec0: 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61  ccess the virtua
9ed0: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68  l table.  The wh
9ee0: 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20  ereInfoDelete() 
9ef0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65  .** routine take
9f00: 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e  s care of freein
9f10: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  g the sqlite3_in
9f20: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
9f30: 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72  re after.** ever
9f40: 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68  ybody has finish
9f50: 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73  ed with it..*/.s
9f60: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73  tatic double bes
9f70: 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
9f80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
9fb0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
9fc0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
9fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9fe0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
9ff0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
a000: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
a010: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
a020: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
a030: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
a040: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
a050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
a060: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
a070: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
a080: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
a090: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
a0a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
a0b0: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
a0c0: 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79 55 73  .  int orderByUs
a0d0: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
a0e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
a0f0: 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f  can potential so
a100: 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rt */.  sqlite3_
a110: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
a120: 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20  dxInfo /* Index 
a130: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
a140: 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
a150: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a160: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
a170: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
a180: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
a190: 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
a1a0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
a1b0: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
a1c0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
a1d0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
a1e0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
a1f0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
a200: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
a210: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
a220: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
a230: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
a240: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
a250: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66  int rc;..  /* If
a260: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a270: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a280: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  e has not been p
a290: 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  reviously.  ** a
a2a0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69  llocated and ini
a2b0: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69  tialized for thi
a2c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  s virtual table,
a2d0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20   then allocate. 
a2e0: 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69   ** and initiali
a2f0: 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20  ze it now.  */. 
a300: 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49   pIdxInfo = *ppI
a310: 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
a320: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
a330: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a340: 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  m;.    int nTerm
a350: 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
a360: 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69  (("Recomputing i
a370: 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73  ndex info for %s
a380: 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ...\n", pTab->zN
a390: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
a3a0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
a3b0: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
a3c0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
a3d0: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
a3e0: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69     ** to this vi
a3f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
a400: 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30     for(i=nTerm=0
a410: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
a420: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
a430: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
a440: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a450: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
a460: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
a470: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
a480: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a490: 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e  ==WO_IN ) contin
a4a0: 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b  ue;.      nTerm+
a4b0: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
a4c0: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
a4d0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
a4e0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
a4f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
a500: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
a510: 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  le then allocate
a520: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
a530: 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a  OrderBy part of.
a540: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
a550: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
a560: 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
a570: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
a580: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
a590: 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
a5a0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
a5b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a5c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
a5d0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
a5e0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
a5f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
a600: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
a610: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
a620: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
a630: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a640: 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42    if( i==pOrderB
a650: 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
a660: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
a670: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
a680: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a690: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
a6a0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a6b0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
a6c0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49      */.    pIdxI
a6d0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
a6e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  oc( sizeof(*pIdx
a6f0: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
a720: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
a730: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
a760: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
a770: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
a780: 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
a790: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o==0 ){.      sq
a7a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a7b0: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
a7c0: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 72 65  mory");.      re
a7d0: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a  turn 0.0;.    }.
a7e0: 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d      *ppIdxInfo =
a7f0: 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20   pIdxInfo;..    
a800: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
a810: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
a820: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
a830: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
a840: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d  ontains.    ** m
a850: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
a860: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
a870: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
a880: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
a890: 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20      ** changing 
a8a0: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
a8b0: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
a8c0: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
a8d0: 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69   to.    ** initi
a8e0: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
a8f0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
a900: 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
a910: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
a920: 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
a930: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49  xInfo[1];.    pI
a940: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
a950: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
a960: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
a970: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20  Cons[nTerm];.   
a980: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
a990: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
a9a0: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
a9b0: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
a9c0: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28  OrderBy];.    *(
a9d0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
a9e0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
a9f0: 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  erm;.    *(int*)
aa00: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
aa10: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
aa20: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(struct sql
aa30: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
aa40: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
aa50: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
aa60: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a   pIdxCons;.    *
aa70: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
aa80: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
aa90: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
aaa0: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
aab0: 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20  y;.    *(struct 
aac0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
aad0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
aae0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
aaf0: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 20      pUsage;..   
ab50: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
ab60: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
ab70: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
ab80: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
ab90: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
aba0: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
abb0: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
abc0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
abd0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
abe0: 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
abf0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
ac00: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
ac10: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  >leftColumn;.   
ac20: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
ac30: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
ac40: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
ac50: 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f  ].op = pTerm->eO
ac60: 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 2f  perator;.      /
ac70: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
ac80: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
ac90: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
aca0: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
acb0: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
acc0: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
acd0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
ace0: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
acf0: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
ad00: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
ad10: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
ad20: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
ad30: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
ad40: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
ad50: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
ad60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
ad70: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
ad80: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
ad90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ada0: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
adb0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
adc0: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LE );.      ass
add0: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
ade0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
adf0: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  INT_GT );.      
ae00: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
ae10: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
ae20: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
ae30: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
ae40: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
ae50: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
ae60: 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CH );.      asse
ae70: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
ae80: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
ae90: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
aea0: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
aeb0: 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  );.      j++;.  
aec0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
aed0: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
aee0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
aef0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
af00: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
af10: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
af20: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
af30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
af40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
af50: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
af60: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
af70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
af80: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
af90: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
afa0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
afb0: 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20  e that pIdxInfo 
afc0: 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77  points.  ** to w
afd0: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ill have been in
afe0: 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65  itialized, eithe
aff0: 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  r during the cur
b000: 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
b010: 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73  or.  ** during s
b020: 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  ome prior invoca
b030: 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75  tion.  Now we ju
b040: 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f  st have to custo
b050: 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65  mize the.  ** de
b060: 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66  tails of pIdxInf
b070: 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  o for the curren
b080: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
b090: 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a   pass it to.  **
b0a0: 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a   xBestIndex..  *
b0b0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75  /..  /* The modu
b0c0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
b0d0: 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62  defined. Also, b
b0e0: 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  y this point the
b0f0: 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  re must.  ** be 
b100: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
b110: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
b120: 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
b130: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69  e.  ** sqlite3Vi
b140: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
b150: 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69  () would have pi
b160: 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f  cked up the erro
b170: 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  r. .  */.  asser
b180: 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  t( pTab->azModul
b190: 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a  eArg && pTab->az
b1a0: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a  ModuleArg[0] );.
b1b0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
b1c0: 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a 20  pVtab );.#if 0. 
b1d0: 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62   if( pTab->pVtab
b1e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b1f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b200: 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f  e, "undefined mo
b210: 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c  dule %s for tabl
b220: 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  e %s",.        p
b230: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
b240: 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  [0], pTab->zName
b250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e  );.    return 0.
b260: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
b270: 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e   /* Set the aCon
b280: 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
b290: 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74   fields and init
b2a0: 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a  ialize all .  **
b2b0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
b2c0: 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  s to zero..  **.
b2d0: 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
b2e0: 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
b2f0: 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
b300: 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
b310: 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65  t-hand.  ** side
b320: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
b330: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
b340: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
b350: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
b360: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
b370: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
b380: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
b390: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
b3a0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
b3b0: 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a    column = expr.
b3c0: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65    **.  ** and we
b3d0: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
b3e0: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
b3f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63   constraint on c
b400: 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f  olumn is .  ** o
b410: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c  nly valid if all
b420: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
b430: 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72  ed in expr occur
b440: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
b450: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
b460: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
b470: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
b480: 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
b490: 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
b4a0: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
b4b0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f  nstraints.  ** o
b4c0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
b4d0: 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77  ble.  That way w
b4e0: 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63  e only have to c
b4f0: 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20  ompute it once. 
b500: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
b510: 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20  we might try to 
b520: 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e  pick the best in
b530: 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  dex multiple tim
b540: 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63  es..  ** For eac
b550: 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63  h attempt at pic
b560: 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74  king an index, t
b570: 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  he order of tabl
b580: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a  es in the.  ** j
b590: 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66  oin might be dif
b5a0: 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76  ferent so we hav
b5b0: 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  e to recompute t
b5c0: 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20  he usable flag. 
b5d0: 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20   ** each time.. 
b5e0: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
b5f0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
b600: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
b610: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
b620: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  aConstraint;.  p
b630: 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
b640: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
b650: 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ge;.  for(i=0; i
b660: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
b670: 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
b680: 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20  xCons++){.    j 
b690: 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
b6a0: 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65  mOffset;.    pTe
b6b0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
b6c0: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
b6d0: 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d  sable =  (pTerm-
b6e0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
b6f0: 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20 7d  otReady)==0;.  }
b700: 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
b710: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
b720: 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
b730: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
b740: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
b750: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
b760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
b770: 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
b780: 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
b790: 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
b7a0: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
b7b0: 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
b7c0: 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
b7d0: 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
b7e0: 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
b7f0: 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
b800: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
b810: 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
b820: 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a  _BIG_DBL / 2.0;.
b830: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
b840: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
b850: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
b860: 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72  >nOrderBy && !or
b870: 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20  derByUsable ){. 
b880: 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49     *(int*)&pIdxI
b890: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
b8a0: 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  0;.  }..  sqlite
b8b0: 33 53 61 66 65 74 79 4f 66 66 28 70 50 61 72 73  3SafetyOff(pPars
b8c0: 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52 45 54  e->db);.  WHERET
b8d0: 52 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65  RACE(("xBestInde
b8e0: 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61  x for %s\n", pTa
b8f0: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52  b->zName));.  TR
b900: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
b910: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  IdxInfo);.  rc =
b920: 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70 4d   pTab->pVtab->pM
b930: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
b940: 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 70  x(pTab->pVtab, p
b950: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43  IdxInfo);.  TRAC
b960: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 49  E_IDX_OUTPUTS(pI
b970: 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
b980: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b990: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b9a0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
b9b0: 20 20 73 71 6c 69 74 65 33 46 61 69 6c 65 64 4d    sqlite3FailedM
b9c0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
b9d0: 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  se {.      sqlit
b9e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b9f0: 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
ba00: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
ba10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61   }.    sqlite3Sa
ba20: 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64  fetyOn(pParse->d
ba30: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
ba40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 61 66   rc = sqlite3Saf
ba50: 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62  etyOn(pParse->db
ba60: 29 3b 0a 20 20 7d 0a 20 20 2a 28 69 6e 74 2a 29  );.  }.  *(int*)
ba70: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
ba80: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
ba90: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
baa0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
bab0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
bac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
bad0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
bae0: 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74 20  * Find the best 
baf0: 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73 73  index for access
bb00: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
bb10: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
bb20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
bb30: 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67 73  the index, flags
bb40: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 68   that describe h
bb50: 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f  ow the index sho
bb60: 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68 65  uld be used, the
bb70: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 71  .** number of eq
bb80: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
bb90: 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f 73  ts, and the "cos
bba0: 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  t" for this inde
bbb0: 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  x..**.** The low
bbc0: 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20 77  est cost index w
bbd0: 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
bbe0: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
bbf0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
bc00: 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
bc10: 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65  /O need to proce
bc20: 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75  ss the request u
bc30: 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65  sing the selecte
bc40: 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63 74  d index..** Fact
bc50: 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e  ors that influen
bc60: 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a  ce cost include:
bc70: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65  .**.**    *  The
bc80: 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
bc90: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
bca0: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64  ill be retrieved
bcb0: 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20  .  (The.**      
bcc0: 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65   fewer the bette
bcd0: 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  r.).**.**    *  
bce0: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73  Whether or not s
bcf0: 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75  orting must occu
bd00: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  r..**.**    *  W
bd10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
bd20: 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61  ere must be sepa
bd30: 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20  rate lookups in 
bd40: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64  the.**       ind
bd50: 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61  ex and in the ma
bd60: 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a  in table..**.*/.
bd70: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65  static double be
bd80: 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  stIndex(.  Parse
bd90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
bda0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
bdb0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bdc0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
bdd0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
bde0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
bdf0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
be00: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
be10: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
be20: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
be30: 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
be40: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
be50: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
be60: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
be70: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
be80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
be90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
bea0: 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62    /* The order b
beb0: 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e  y clause */.  In
bec0: 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20 20  dex **ppIndex,  
bed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
bee0: 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e 74  e *ppIndex point
bef0: 20 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e 64   to the best ind
bf00: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 6c  ex */.  int *pFl
bf10: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
bf20: 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67 73      /* Put flags
bf30: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69 73   describing this
bf40: 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c 61   choice in *pFla
bf50: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  gs */.  int *pnE
bf60: 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q               
bf70: 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20 6e      /* Put the n
bf80: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
bf90: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68 65  N constraints he
bfa0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  re */.){.  Where
bfb0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 49  Term *pTerm;.  I
bfc0: 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d 20  ndex *bestIdx = 
bfd0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  0;         /* In
bfe0: 64 65 78 20 74 68 61 74 20 67 69 76 65 73 20 74  dex that gives t
bff0: 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 2a  he lowest cost *
c000: 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73  /.  double lowes
c010: 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  tCost;          
c020: 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 75  /* The cost of u
c030: 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f 0a  sing bestIdx */.
c040: 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20    int bestFlags 
c050: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
c060: 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
c070: 64 20 77 69 74 68 20 62 65 73 74 49 64 78 20 2a  d with bestIdx *
c080: 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20  /.  int bestNEq 
c090: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c0a0: 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66 6f  /* Best value fo
c0b0: 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20 69  r nEq */.  int i
c0c0: 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
c0d0: 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
c0e0: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
c0f0: 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
c100: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
c110: 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
c120: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
c130: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
c140: 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20 20  */.  int rev;   
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e   /* True to scan
c170: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
c180: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
c190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c1a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f     /* Flags asso
c1b0: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72 6f  ciated with pPro
c1c0: 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b  be */.  int nEq;
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c1f0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
c200: 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65  aints */.  int e
c210: 71 54 65 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20  qTermMask;      
c220: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
c230: 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
c240: 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
c250: 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20  double cost;    
c260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c270: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 70 50 72  ost of using pPr
c280: 6f 62 65 20 2a 2f 0a 0a 20 20 57 48 45 52 45 54  obe */..  WHERET
c290: 52 41 43 45 28 28 22 62 65 73 74 49 6e 64 65 78  RACE(("bestIndex
c2a0: 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64  : tbl=%s notRead
c2b0: 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70  y=%x\n", pSrc->p
c2c0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52  Tab->zName, notR
c2d0: 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74  eady));.  lowest
c2e0: 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
c2f0: 47 5f 44 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20  G_DBL;.  pProbe 
c300: 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
c310: 6e 64 65 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ndex;..  /* If t
c320: 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20  he table has no 
c330: 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
c340: 65 20 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69  e are no terms i
c350: 6e 20 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a  n the where.  **
c360: 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66   clause that ref
c370: 65 72 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c  er to the ROWID,
c380: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
c390: 76 65 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64  ver be able to d
c3a0: 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20  o.  ** anything 
c3b0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c  other than a ful
c3c0: 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20  l table scan on 
c3d0: 74 68 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20  this table.  We 
c3e0: 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65  might as.  ** we
c3f0: 6c 6c 20 70 75 74 20 69 74 20 66 69 72 73 74 20  ll put it first 
c400: 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65  in the join orde
c410: 72 2e 20 20 54 68 61 74 20 77 61 79 2c 20 70 65  r.  That way, pe
c420: 72 68 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a  rhaps it can be.
c430: 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20    ** referenced 
c440: 62 79 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  by other tables 
c450: 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  in the join..  *
c460: 2f 0a 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d  /.  if( pProbe==
c470: 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65  0 &&.     findTe
c480: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
c490: 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  , 0, WO_EQ|WO_IN
c4a0: 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f  |WO_LT|WO_LE|WO_
c4b0: 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26  GT|WO_GE,0)==0 &
c4c0: 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72 42 79  &.     (pOrderBy
c4d0: 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65  ==0 || !sortable
c4e0: 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
c4f0: 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61  rderBy, pWC->pMa
c500: 73 6b 53 65 74 2c 20 26 72 65 76 29 29 20 29 7b  skSet, &rev)) ){
c510: 0a 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 30  .    *pFlags = 0
c520: 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d  ;.    *ppIndex =
c530: 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71 20 3d 20   0;.    *pnEq = 
c540: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e  0;.    return 0.
c550: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
c560: 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45  ck for a rowid=E
c570: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
c580: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
c590: 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d  s.  */.  pTerm =
c5a0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
c5b0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
c5c0: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
c5d0: 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
c5e0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
c5f0: 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78  pr;.    *ppIndex
c600: 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c   = 0;.    bestFl
c610: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
c620: 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54  D_EQ;.    if( pT
c630: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
c640: 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20   WO_EQ ){.      
c650: 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c  /* Rowid== is al
c660: 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69  ways the best pi
c670: 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72  ck.  Look no fur
c680: 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f  ther.  Because o
c690: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  nly.      ** a s
c6a0: 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e  ingle row is gen
c6b0: 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69  erated, output i
c6c0: 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74  s always in sort
c6d0: 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
c6e0: 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52    *pFlags = WHER
c6f0: 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45  E_ROWID_EQ | WHE
c700: 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  RE_UNIQUE;.     
c710: 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20   *pnEq = 1;.    
c720: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
c730: 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77 69 64  .. best is rowid
c740: 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
c750: 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c  urn 0.0;.    }el
c760: 73 65 20 69 66 28 20 28 70 45 78 70 72 20 3d 20  se if( (pExpr = 
c770: 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70  pTerm->pExpr)->p
c780: 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  List!=0 ){.     
c790: 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 4c 49   /* Rowid IN (LI
c7a0: 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f  ST): cost is Nlo
c7b0: 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  gN where N is th
c7c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 73 74  e number of list
c7d0: 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
c7e0: 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f  ts.  */.      lo
c7f0: 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78 70 72  westCost = pExpr
c800: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
c810: 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74        lowestCost
c820: 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73   *= estLog(lowes
c830: 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  tCost);.    }els
c840: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  e{.      /* Rowi
c850: 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a 20 63  d IN (SELECT): c
c860: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
c870: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
c880: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20  er of rows.     
c890: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
c8a0: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  t of the inner s
c8b0: 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76 65 20  elect.  We have 
c8c0: 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69 6d 61  no way to estima
c8d0: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  te.      ** that
c8e0: 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61   value so make a
c8f0: 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a   wild guess. */.
c900: 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74        lowestCost
c910: 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a 20 20   = 200;.    }.  
c920: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
c930: 2e 2e 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74  .. rowid IN cost
c940: 3a 20 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73  : %.9g\n", lowes
c950: 74 43 6f 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20  tCost));.  }..  
c960: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
c970: 63 6f 73 74 20 6f 66 20 61 20 74 61 62 6c 65 20  cost of a table 
c980: 73 63 61 6e 2e 20 20 49 66 20 77 65 20 64 6f 20  scan.  If we do 
c990: 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e  not know how man
c9a0: 79 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 61  y.  ** entries a
c9b0: 72 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  re in the table,
c9c0: 20 75 73 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61   use 1 million a
c9d0: 73 20 61 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a  s a guess..  */.
c9e0: 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 20    cost = pProbe 
c9f0: 3f 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45  ? pProbe->aiRowE
ca00: 73 74 5b 30 5d 20 3a 20 31 30 30 30 30 30 30 3b  st[0] : 1000000;
ca10: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
ca20: 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62  ... table scan b
ca30: 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e  ase cost: %.9g\n
ca40: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61  ", cost));.  fla
ca50: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
ca60: 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68  _RANGE;..  /* Ch
ca70: 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  eck for constrai
ca80: 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f  nts on a range o
ca90: 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61  f rowids in a ta
caa0: 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20  ble scan..  */. 
cab0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
cac0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
cad0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
cae0: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
caf0: 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  GE, 0);.  if( pT
cb00: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 66  erm ){.    if( f
cb10: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
cb20: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
cb30: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
cb40: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
cb50: 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
cb60: 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f  IT;.      cost /
cb70: 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74  = 3;  /* Guess t
cb80: 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65  hat rowid<EXPR e
cb90: 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68  liminates two-th
cba0: 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a  irds or rows */.
cbb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69      }.    if( fi
cbc0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
cbd0: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
cbe0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20  WO_GT|WO_GE, 0) 
cbf0: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
cc00: 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
cc10: 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  T;.      cost /=
cc20: 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68   3;  /* Guess th
cc30: 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c  at rowid>EXPR el
cc40: 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69  iminates two-thi
cc50: 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  rds of rows */. 
cc60: 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52     }.    WHERETR
cc70: 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
cc80: 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
cc90: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
cca0: 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ost));.  }else{.
ccb0: 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20      flags = 0;. 
ccc0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
ccd0: 74 61 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20  table scan does 
cce0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20  not satisfy the 
ccf0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
cd00: 20 69 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20 74   increase.  ** t
cd10: 68 65 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e  he cost by NlogN
cd20: 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78   to cover the ex
cd30: 70 65 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67  pense of sorting
cd40: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  . */.  if( pOrde
cd50: 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73  rBy ){.    if( s
cd60: 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69  ortableByRowid(i
cd70: 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  Cur, pOrderBy, p
cd80: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72  WC->pMaskSet, &r
cd90: 65 76 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  ev) ){.      fla
cda0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
cdb0: 52 42 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  RBY|WHERE_ROWID_
cdc0: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 69 66 28  RANGE;.      if(
cdd0: 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
cde0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  flags |= WHERE_R
cdf0: 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
ce00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ce10: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
ce20: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
ce30: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
ce40: 2e 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65  .. sorting incre
ce50: 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
ce60: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
ce70: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f    }.  }.  if( co
ce80: 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b  st<lowestCost ){
ce90: 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20  .    lowestCost 
cea0: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 62 65 73 74  = cost;.    best
ceb0: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
cec0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
ced0: 70 53 72 63 20 74 61 62 6c 65 20 69 73 20 74 68  pSrc table is th
cee0: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
cef0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65   a LEFT JOIN the
cf00: 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a  n we may not.  *
cf10: 2a 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 74  * use an index t
cf20: 6f 20 73 61 74 69 73 66 79 20 49 53 20 4e 55 4c  o satisfy IS NUL
cf30: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  L constraints on
cf40: 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68   that table.  Th
cf50: 69 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75  is is.  ** becau
cf60: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74  se columns might
cf70: 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 4e 55   end up being NU
cf80: 4c 4c 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  LL if the table 
cf90: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d  does not match -
cfa0: 0a 20 20 2a 2a 20 61 20 63 69 72 63 75 6d 73 74  .  ** a circumst
cfb0: 61 6e 63 65 20 77 68 69 63 68 20 74 68 65 20 69  ance which the i
cfc0: 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70  ndex cannot help
cfd0: 20 75 73 20 64 69 73 63 6f 76 65 72 2e 20 20 54   us discover.  T
cfe0: 69 63 6b 65 74 20 23 32 31 37 37 2e 0a 20 20 2a  icket #2177..  *
cff0: 2f 0a 20 20 69 66 28 20 28 70 53 72 63 2d 3e 6a  /.  if( (pSrc->j
d000: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
d010: 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 65 71 54  T)!=0 ){.    eqT
d020: 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
d030: 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WO_IN;.  }else{.
d040: 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
d050: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
d060: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f  ISNULL;.  }..  /
d070: 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69  * Look at each i
d080: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ndex..  */.  for
d090: 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  (; pProbe; pProb
d0a0: 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29  e=pProbe->pNext)
d0b0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d0e0: 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65  er */.    double
d0f0: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20   inMultiplier = 
d100: 31 3b 0a 0a 20 20 20 20 57 48 45 52 45 54 52 41  1;..    WHERETRA
d110: 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25  CE(("... index %
d120: 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a  s:\n", pProbe->z
d130: 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
d140: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
d150: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
d160: 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  he index that ar
d170: 65 20 73 61 74 69 73 66 69 65 64 0a 20 20 20 20  e satisfied.    
d180: 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f 6e  ** by x=EXPR con
d190: 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49 4e  straints or x IN
d1a0: 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e   (...) constrain
d1b0: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ts..    */.    f
d1c0: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  lags = 0;.    fo
d1d0: 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d  r(i=0; i<pProbe-
d1e0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
d1f0: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
d200: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  robe->aiColumn[i
d210: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
d220: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d230: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
d240: 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50  , eqTermMask, pP
d250: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
d260: 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
d270: 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  k;.      flags |
d280: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
d290: 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  Q;.      if( pTe
d2a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
d2b0: 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
d2c0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
d2d0: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
d2e0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
d2f0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20  ERE_COLUMN_IN;. 
d300: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
d310: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a  ->pSelect!=0 ){.
d320: 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
d330: 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20  iplier *= 25;.  
d340: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d350: 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20  pExpr->pList!=0 
d360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d  ){.          inM
d370: 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78  ultiplier *= pEx
d380: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
d390: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 1;.        }.
d3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d3b0: 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d    cost = pProbe-
d3c0: 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69  >aiRowEst[i] * i
d3d0: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73  nMultiplier * es
d3e0: 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65  tLog(inMultiplie
d3f0: 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b  r);.    nEq = i;
d400: 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
d410: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
d420: 65 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48  e && (flags & WH
d430: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
d440: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45  0.         && nE
d450: 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
d460: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  mn ){.      flag
d470: 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55  s |= WHERE_UNIQU
d480: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45  E;.    }.    WHE
d490: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e  RETRACE(("......
d4a0: 20 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25   nEq=%d inMult=%
d4b0: 2e 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22  .9g cost=%.9g\n"
d4c0: 2c 20 6e 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c  , nEq, inMultipl
d4d0: 69 65 72 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20  ier, cost));..  
d4e0: 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61    /* Look for ra
d4f0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nge constraints.
d500: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
d510: 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
d520: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  mn ){.      int 
d530: 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
d540: 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
d550: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
d560: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
d570: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
d580: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
d590: 45 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  E, pProbe);.    
d5a0: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
d5b0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
d5c0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
d5d0: 47 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  GE;.        if( 
d5e0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
d5f0: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
d600: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50   WO_LT|WO_LE, pP
d610: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
d620: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d630: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
d640: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
d650: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d660: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
d670: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
d680: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
d690: 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_GE, pProbe) ){
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
d6b0: 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
d6c0: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
d6d0: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
d6e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
d6f0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
d700: 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
d710: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
d720: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
d730: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
d740: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
d750: 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
d760: 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
d770: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
d780: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
d790: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
d7a0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
d7b0: 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  IN)==0 &&.      
d7c0: 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e       isSortingIn
d7d0: 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e  dex(pParse,pWC->
d7e0: 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c  pMaskSet,pProbe,
d7f0: 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45  iCur,pOrderBy,nE
d800: 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20  q,&rev) ){.     
d810: 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 30 20     if( flags==0 
d820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
d830: 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs = WHERE_COLUM
d840: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
d850: 20 7d 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73   }.        flags
d860: 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42   |= WHERE_ORDERB
d870: 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  Y;.        if( r
d880: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
d890: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  flags |= WHERE_R
d8a0: 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
d8b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
d8c0: 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63         cost += c
d8d0: 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
d8e0: 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
d8f0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72  RACE(("...... or
d900: 64 65 72 62 79 20 69 6e 63 72 65 61 73 65 73 20  derby increases 
d910: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
d920: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
d930: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
d940: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
d950: 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77  e can get away w
d960: 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ith using just t
d970: 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74  he index without
d980: 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61  .    ** ever rea
d990: 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ding the table. 
d9a0: 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
d9b0: 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65  case, then halve
d9c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
d9d0: 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a   of this index..
d9e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
d9f0: 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f  lags && pSrc->co
da00: 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61  lUsed < (((Bitma
da10: 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
da20: 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
da30: 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
da40: 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
da50: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
da60: 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j<pProbe->nColum
da70: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
da80: 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d   int x = pProbe-
da90: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
daa0: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
dab0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  1 ){.          m
dac0: 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
dad0: 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20  1)<<x);.        
dae0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
daf0: 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
db00: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
db10: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
db20: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a       cost /= 2;.
db30: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
db40: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d  CE(("...... idx-
db50: 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73  only reduces cos
db60: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
db70: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
db80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
db90: 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63  his index has ac
dba0: 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73  hieved the lowes
dbb0: 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74  t cost so far, t
dbc0: 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  hen use it..    
dbd0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74 20  */.    if( cost 
dbe0: 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  < lowestCost ){.
dbf0: 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d 20        bestIdx = 
dc00: 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f  pProbe;.      lo
dc10: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
dc20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
dc30: 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20 20 20  lags!=0 );.     
dc40: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
dc50: 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45  gs;.      bestNE
dc60: 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20  q = nEq;.    }. 
dc70: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
dc80: 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a  the best result.
dc90: 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20    */.  *ppIndex 
dca0: 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 57 48 45  = bestIdx;.  WHE
dcb0: 52 45 54 52 41 43 45 28 28 22 62 65 73 74 20 69  RETRACE(("best i
dcc0: 6e 64 65 78 20 69 73 20 25 73 2c 20 63 6f 73 74  ndex is %s, cost
dcd0: 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d 25 78 2c  =%.9g, flags=%x,
dce0: 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   nEq=%d\n",.    
dcf0: 20 20 20 20 62 65 73 74 49 64 78 20 3f 20 62 65      bestIdx ? be
dd00: 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22  stIdx->zName : "
dd10: 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65 73 74 43  (none)", lowestC
dd20: 6f 73 74 2c 20 62 65 73 74 46 6c 61 67 73 2c 20  ost, bestFlags, 
dd30: 62 65 73 74 4e 45 71 29 29 3b 0a 20 20 2a 70 46  bestNEq));.  *pF
dd40: 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73  lags = bestFlags
dd50: 20 7c 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 20   | eqTermMask;. 
dd60: 20 2a 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71   *pnEq = bestNEq
dd70: 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73  ;.  return lowes
dd80: 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  tCost;.}.../*.**
dd90: 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20   Disable a term 
dda0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
ddb0: 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  use.  Except, do
ddc0: 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65   not disable the
ddd0: 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63   term.** if it c
dde0: 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f  ontrols a LEFT O
ddf0: 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74  UTER JOIN and it
de00: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
de10: 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20  te in the ON.** 
de20: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
de30: 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a  of that join..**
de40: 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65  .** Consider the
de50: 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20   term t2.z='ok' 
de60: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
de70: 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20   queries:.**.** 
de80: 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20    (1)  SELECT * 
de90: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
dea0: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
deb0: 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b  x WHERE t2.z='ok
dec0: 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45  '.**   (2)  SELE
ded0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
dee0: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
def0: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
df00: 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53  'ok'.**   (3)  S
df10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
df20: 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74   t2 WHERE t1.a=t
df30: 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
df40: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a  '.**.** The t2.z
df50: 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65  ='ok' is disable
df60: 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20  d in the in (2) 
df70: 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69  because it origi
df80: 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20  nates.** in the 
df90: 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  ON clause.  The 
dfa0: 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64  term is disabled
dfb0: 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20   in (3) because 
dfc0: 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a  it is not part.*
dfd0: 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  * of a LEFT OUTE
dfe0: 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c  R JOIN.  In (1),
dff0: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
e000: 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a   disabled..**.**
e010: 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72   Disabling a ter
e020: 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65  m causes that te
e030: 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73  rm to not be tes
e040: 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  ted in the inner
e050: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20   loop.** of the 
e060: 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67  join.  Disabling
e070: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
e080: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73  ion.  When terms
e090: 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
e0a0: 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65  * by indices, we
e0b0: 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f   disable them to
e0c0: 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61   prevent redunda
e0d0: 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20  nt tests in the 
e0e0: 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20  inner.** loop.  
e0f0: 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65  We would get the
e100: 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73   correct results
e110: 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65   if nothing were
e120: 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a   ever disabled,.
e130: 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67  ** but joins mig
e140: 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
e150: 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69  slower.  The tri
e160: 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65  ck is to disable
e170: 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77   as much.** as w
e180: 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69  e can without di
e190: 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68  sabling too much
e1a0: 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65  .  If we disable
e1b0: 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67  d in (1), we'd g
e1c0: 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20  et.** the wrong 
e1d0: 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63  answer.  See tic
e1e0: 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
e1f0: 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
e200: 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
e210: 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65  *pLevel, WhereTe
e220: 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66  rm *pTerm){.  if
e230: 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26  ( pTerm.      &&
e240: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
e250: 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a   TERM_CODED)==0.
e260: 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c        && (pLevel
e270: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c  ->iLeftJoin==0 |
e280: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
e290: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
e2a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20  EP_FromJoin)).  
e2b0: 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  ){.    pTerm->fl
e2c0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
e2d0: 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
e2e0: 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
e2f0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
e300: 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
e310: 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
e320: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
e330: 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
e340: 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
e350: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
e360: 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
e370: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e380: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
e390: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
e3a0: 62 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20 66  builds a probe f
e3b0: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2a 0a  or an index..**.
e3c0: 2a 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  ** There should 
e3d0: 62 65 20 6e 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  be nColumn value
e3e0: 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  s on the stack. 
e3f0: 20 54 68 65 20 69 6e 64 65 78 0a 2a 2a 20 74 6f   The index.** to
e400: 20 62 65 20 70 72 6f 62 65 64 20 69 73 20 70 49   be probed is pI
e410: 64 78 2e 20 20 50 6f 70 20 74 68 65 20 76 61 6c  dx.  Pop the val
e420: 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ues from the sta
e430: 63 6b 20 61 6e 64 0a 2a 2a 20 72 65 70 6c 61 63  ck and.** replac
e440: 65 20 74 68 65 6d 20 61 6c 6c 20 77 69 74 68 20  e them all with 
e450: 61 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20  a single record 
e460: 74 68 61 74 20 69 73 20 74 68 65 20 69 6e 64 65  that is the inde
e470: 78 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  x.** problem..*/
e480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 75 69  .static void bui
e490: 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 0a 20 20  ldIndexProbe(.  
e4a0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
e4b0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
e4c0: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
e4d0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
e4e0: 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
e4f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 63   of columns to c
e500: 68 65 63 6b 20 66 6f 72 20 4e 55 4c 4c 20 2a 2f  heck for NULL */
e510: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
e520: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
e530: 20 77 65 20 77 69 6c 6c 20 62 65 20 73 65 61 72   we will be sear
e540: 63 68 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 73 71  ching */.){.  sq
e550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e560: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
e570: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
e580: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
e590: 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78 29  nityStr(v, pIdx)
e5a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
e5b0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
e5c0: 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
e5d0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
e5e0: 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
e5f0: 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
e600: 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
e610: 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
e620: 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
e630: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
e640: 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
e650: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e660: 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
e670: 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  nt is left on th
e680: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
e690: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ck..**.** For a 
e6a0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
e6b0: 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74  e form X=expr, t
e6c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
e6d0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
e6e0: 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  ts.** result is 
e6f0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
e700: 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69  k.  For constrai
e710: 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
e720: 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68  X IN (...).** th
e730: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
e740: 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  up a loop that w
e750: 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72  ill iterate over
e760: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58   all values of X
e770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e780: 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
e790: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
e7a0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
e7b0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
e7c0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
e7d0: 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20  pTerm,   /* The 
e7e0: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
e7f0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63  E clause to be c
e800: 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
e810: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a  evel *pLevel  /*
e820: 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
e830: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
e840: 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
e850: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
e860: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
e870: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
e880: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
e890: 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  f( pX->op==TK_EQ
e8a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e8b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e8c0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pX->pRight);.  }
e8d0: 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
e8e0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
e8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e900: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
e910: 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
e920: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
e930: 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  RY.  }else{.    
e940: 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74  int iTab;.    st
e950: 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
e960: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
e970: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
e980: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
e990: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
e9a0: 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d   pX);.    iTab =
e9b0: 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
e9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e9d0: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
e9e0: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64  iTab, 0);.    Vd
e9f0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
ea00: 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e   %.*s", pX->span
ea10: 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29  .n, pX->span.z))
ea20: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
ea30: 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ->nIn==0 ){.    
ea40: 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20    pLevel->nxt = 
ea50: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ea60: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20  abel(v);.    }. 
ea70: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b     pLevel->nIn++
ea80: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49  ;.    pLevel->aI
ea90: 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 52 65  nLoop = sqliteRe
eaa0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 4c 65 76  allocOrFree(pLev
eab0: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  el->aInLoop,.   
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
eaf0: 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
eb00: 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  el->nIn);.    pI
eb10: 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  n = pLevel->aInL
eb20: 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  oop;.    if( pIn
eb30: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d   ){.      pIn +=
eb40: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20 31   pLevel->nIn - 1
eb50: 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75  ;.      pIn->iCu
eb60: 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20  r = iTab;.      
eb70: 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20 73  pIn->topAddr = s
eb80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
eb90: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
eba0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ab, 0);.      sq
ebb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ebc0: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 31 2c  , OP_IsNull, -1,
ebd0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ebe0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49        pLevel->nI
ebf0: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
ec00: 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
ec10: 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
ec20: 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  erm);.}../*.** G
ec30: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
ec40: 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
ec50: 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
ec60: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
ec70: 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65 20  .** index.  The 
ec80: 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20 63  values for all c
ec90: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6c  onstraints are l
eca0: 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
ecb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
ecc0: 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
ecd0: 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
ece0: 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
ecf0: 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
ed00: 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
ed10: 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
ed20: 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
ed30: 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
ed40: 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
ed50: 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
ed60: 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
ed70: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
ed80: 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
ed90: 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
eda0: 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
edb0: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
edc0: 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
edd0: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
ede0: 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
edf0: 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
ee00: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
ee10: 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
ee20: 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
ee30: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
ee40: 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
ee50: 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74   be left.** on t
ee60: 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73 20  he stack - a is 
ee70: 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64 20  the deepest and 
ee80: 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73 74  b the shallowest
ee90: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
eea0: 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
eeb0: 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
eec0: 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
eed0: 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
eee0: 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
eef0: 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
ef00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ef10: 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
ef20: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
ef30: 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
ef40: 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
ef50: 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
ef60: 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ell..**.** This 
ef70: 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
ef80: 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
ef90: 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
efa0: 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74 68  l and puts.** th
efb0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 61  e address of tha
efc0: 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  t memory cell in
efd0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20   pLevel->iMem.  
efe0: 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
eff0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
f000: 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c 65  ine will use pLe
f010: 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74 6f  vel->iMem to sto
f020: 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  re the terminati
f030: 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  on.** key value 
f040: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
f050: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
f060: 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
f070: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
f080: 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
f090: 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
f0a0: 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
f0b0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
f0c0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
f0d0: 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c  oid codeAllEqual
f0e0: 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ityTerms(.  Pars
f0f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f100: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
f110: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
f120: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
f130: 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64 20  /* Which nested 
f140: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f 4d  loop of the FROM
f150: 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20 2a   we are coding *
f160: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
f170: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
f180: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
f190: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
f1a0: 61 64 79 20 20 20 20 20 20 2f 2a 20 57 68 69 63  ady      /* Whic
f1b0: 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d 20  h parts of FROM 
f1c0: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65 65  have not yet bee
f1d0: 6e 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20  n coded */.){.  
f1e0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
f1f0: 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a  ->nEq;        /*
f200: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
f210: 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
f220: 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20  nts to code */. 
f230: 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d 20   int termsInMem 
f240: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
f250: 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65  * If true, store
f260: 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d 20   value in mem[] 
f270: 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65 20  cells */.  Vdbe 
f280: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
f290: 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
f2a0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
f2b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
f2c0: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
f2d0: 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
f2e0: 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64  dx;   /* The ind
f2f0: 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  ex being used fo
f300: 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20  r this loop */. 
f310: 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76   int iCur = pLev
f320: 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f  el->iTabCur;   /
f330: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
f340: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
f350: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f370: 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61  A single constra
f380: 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  int term */.  in
f390: 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f3b0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f3c0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
f3d0: 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
f3e0: 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
f3f0: 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
f400: 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61   them..  ** We a
f410: 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65  lways need at le
f420: 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20  ast one used to 
f430: 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74  store the loop t
f440: 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76  erminator.  ** v
f450: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65 20  alue.  If there 
f460: 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  are IN operators
f470: 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20   we'll need one 
f480: 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20  for each == or. 
f490: 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   ** IN constrain
f4a0: 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c  t..  */.  pLevel
f4b0: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
f4c0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28 20 70  >nMem++;.  if( p
f4d0: 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
f4e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
f4f0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  {.    pParse->nM
f500: 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  em += pLevel->nE
f510: 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d 65  q;.    termsInMe
f520: 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m = 1;.  }..  /*
f530: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
f540: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
f550: 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
f560: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
f570: 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  =nEq );.  for(j=
f580: 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  0; j<nEq; j++){.
f590: 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
f5a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
f5b0: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
f5c0: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
f5d0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
f5e0: 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64 78 29  el->flags, pIdx)
f5f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d  ;.    if( pTerm=
f600: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f610: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
f620: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
f630: 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f  ED)==0 );.    co
f640: 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
f650: 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
f660: 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  evel);.    if( (
f670: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f680: 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
f690: 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
f6a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f6b0: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
f6c0: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3f 20 2d 31   termsInMem ? -1
f6d0: 20 3a 20 2d 28 6a 2b 31 29 2c 20 70 4c 65 76 65   : -(j+1), pLeve
f6e0: 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  l->brk);.    }. 
f6f0: 20 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65     if( termsInMe
f700: 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  m ){.      sqlit
f710: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f720: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76  P_MemStore, pLev
f730: 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31 29  el->iMem+j+1, 1)
f740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f750: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
f760: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  the constraint v
f770: 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74 68 65  alues are on the
f780: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
f790: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74 65 72  k.  */.  if( ter
f7a0: 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66  msInMem ){.    f
f7b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
f7c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
f7d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f7e0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
f7f0: 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b  l->iMem+j+1, 0);
f800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
f810: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
f820: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65  _TEST)./*.** The
f830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
f840: 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74  ble holds a text
f850: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
f860: 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72  query plan gener
f870: 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d  ated.** by the m
f880: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
f890: 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
f8a0: 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61  egin().  Each ca
f8b0: 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e  ll to WhereBegin
f8c0: 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74  .** overwrites t
f8d0: 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68  he previous.  Th
f8e0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
f8f0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
f900: 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73  ng and.** analys
f910: 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72  is only..*/.char
f920: 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
f930: 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20  lan[BMS*2*40];  
f940: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a  /* Text of the j
f950: 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oin */.static in
f960: 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20  t nQPlan = 0;   
f970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
f980: 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20  xt free slow in 
f990: 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f  _query_plan[] */
f9a0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
f9b0: 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a  TE_TEST */.../*.
f9c0: 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49  ** Free a WhereI
f9d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f  nfo structure.*/
f9e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
f9f0: 72 65 49 6e 66 6f 46 72 65 65 28 57 68 65 72 65  reInfoFree(Where
fa00: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
fa10: 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
fa20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
fa30: 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
fa40: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
fa50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
fa60: 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
fa70: 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
fa80: 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
fa90: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
faa0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65     if( pInfo->ne
fab0: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
fac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
fad0: 6f 76 65 72 61 67 65 3a 20 44 6f 6e 27 74 20 74  overage: Don't t
fae0: 68 69 6e 6b 20 74 68 69 73 20 63 61 6e 20 62 65  hink this can be
faf0: 20 72 65 61 63 68 65 64 2e 20 42 79 20 74 68 65   reached. By the
fb00: 20 74 69 6d 65 20 74 68 69 73 0a 20 20 20 20 20   time this.     
fb10: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
fb20: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
fb30: 69 6e 64 65 78 2d 73 74 72 69 6e 67 73 20 68 61  index-strings ha
fb40: 76 65 20 62 65 65 6e 20 70 61 73 73 65 64 0a 20  ve been passed. 
fb50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74           ** to t
fb60: 68 65 20 76 64 62 65 20 6c 61 79 65 72 20 66 6f  he vdbe layer fo
fb70: 72 20 64 65 6c 65 74 69 6f 6e 2e 0a 20 20 20 20  r deletion..    
fb80: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fb90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fba0: 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  pInfo->idxStr);.
fbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fbc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
fbd0: 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fo);.      }.   
fbe0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
fbf0: 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  e(pWInfo);.  }.}
fc00: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
fc10: 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
fc20: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
fc30: 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
fc40: 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
fc50: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
fc60: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
fc70: 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
fc80: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
fc90: 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
fca0: 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
fcb0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
fcc0: 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
fcd0: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
fce0: 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
fcf0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
fd00: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
fd10: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
fd20: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
fd30: 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
fd40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
fd50: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
fd60: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
fd70: 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
fd80: 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
fd90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
fda0: 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
fdb0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
fdc0: 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
fdd0: 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
fde0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
fdf0: 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
fe00: 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
fe10: 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
fe20: 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
fe30: 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
fe40: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
fe50: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
fe60: 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
fe70: 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
fe80: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
fe90: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
fea0: 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
feb0: 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
fec0: 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
fed0: 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
fee0: 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
fef0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
ff00: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
ff10: 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
ff20: 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
ff30: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
ff40: 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
ff50: 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
ff60: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
ff70: 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
ff80: 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
ff90: 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
ffa0: 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
ffb0: 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
ffe0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
fff0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
10000 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
10010 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10020 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
10050 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
10060 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
10070 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
10080 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
10090 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
100a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
100b0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
100c0 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
100d0 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
100e0 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
100f0 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
10100 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
10110 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
10120 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10130 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
10140 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
10150 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
10160 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
10170 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
10180 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
10190 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
101a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
101b0 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
101c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
101d0 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
101e0 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
101f0 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
10200 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
10210 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
10220 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
10230 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
10240 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
10250 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
10260 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
10270 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
10280 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
10290 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
102a0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
102b0 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
102c0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
102d0 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
102e0 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
102f0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
10300 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
10310 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
10320 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
10330 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
10340 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
10350 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
10360 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
10370 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
10380 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
10390 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
103a0 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
103b0 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
103c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
103d0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
103e0 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
103f0 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
10400 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
10410 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
10420 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
10430 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
10440 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
10450 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
10460 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
10470 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
10480 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
10490 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
104a0 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
104b0 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
104c0 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
104d0 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
104e0 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
104f0 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
10500 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
10510 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
10520 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
10530 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
10540 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
10550 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
10560 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
10570 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
10580 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
10590 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
105a0 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
105b0 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
105c0 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
105d0 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
105e0 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
105f0 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
10600 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
10610 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
10620 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
10630 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
10640 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
10650 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
10660 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
10670 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
10680 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
10690 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
106a0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
106b0 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
106c0 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
106d0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
106e0 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
106f0 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
10700 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
10710 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
10720 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
10730 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
10740 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
10750 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
10760 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
10770 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
10780 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
10790 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
107a0 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
107b0 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
107c0 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
107d0 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
107e0 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
107f0 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
10800 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
10810 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
10820 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
10830 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
10840 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
10850 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
10860 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
10870 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  **.** *ppOrderBy
10880 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
10890 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
108a0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
108b0 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
108c0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
108d0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
108e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
108f0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
10900 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
10910 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
10920 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
10930 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72  nt, then ppOrder
10940 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
10950 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61  * If an index ca
10960 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61  n be used so tha
10970 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75  t the natural ou
10980 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68  tput order of th
10990 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20  e table.** scan 
109a0 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74  is correct for t
109b0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
109c0 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e  se, then that in
109d0 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a  dex is used and.
109e0 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
109f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54   set to NULL.  T
10a00 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
10a10 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
10a20 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63  ents an.** unnec
10a30 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74  essary sort of t
10a40 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 66  he result set if
10a50 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
10a60 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a  riate for the.**
10a70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10a80 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
10a90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68  .**.** If the wh
10aa0 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73  ere clause loops
10ab0 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e   cannot be arran
10ac0 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  ged to provide t
10ad0 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75  he correct.** ou
10ae0 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e  tput order, then
10af0 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20   the *ppOrderBy 
10b00 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
10b10 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
10b20 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
10b30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10b40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10b50 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
10b60 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
10b70 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
10b80 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
10b90 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
10ba0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
10bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10bc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10bd0 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f    ExprList **ppO
10be0 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52  rderBy  /* An OR
10bf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
10c00 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
10c10 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10c30 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57  p counter */.  W
10c40 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10c50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
10c60 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
10c70 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
10c80 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
10c90 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
10ca0 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
10cb0 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
10cc0 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69  se engine */.  i
10cd0 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30  nt brk, cont = 0
10ce0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10cf0 72 65 73 73 65 73 20 75 73 65 64 20 64 75 72 69  resses used duri
10d00 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
10d10 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
10d20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  notReady;       
10d30 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68     /* Cursors th
10d40 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70  at are not yet p
10d50 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57  ositioned */.  W
10d60 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
10d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
10d80 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  ingle term in th
10d90 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
10da0 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
10db0 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 2f  maskSet;       /
10dc0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
10dd0 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57   mask set */.  W
10de0 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20  hereClause wc;  
10df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10e00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
10e10 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68   divided into th
10e20 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73  ese terms */.  s
10e30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10e40 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
10e50 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  * A single entry
10e60 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a   from pTabList *
10e70 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
10e80 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  pLevel;         
10e90 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
10ea0 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49  level in the pWI
10eb0 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  nfo list */.  in
10ec0 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ee0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52   First unused FR
10ef0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
10f00 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c  t */.  int andFl
10f10 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
10f20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62    /* AND-ed comb
10f30 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77  ination of all w
10f40 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a  c.a[].flags */..
10f50 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
10f60 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
10f70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
10f80 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
10f90 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
10fa0 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
10fb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
10fc0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
10fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10fe0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
10ff0 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
11000 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
11010 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
11020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  .  }..  /* Split
11030 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
11040 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
11050 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
11060 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
11070 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
11080 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
11090 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
110a0 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
110b0 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68  (&maskSet);.  wh
110c0 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77  ereClauseInit(&w
110d0 63 2c 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b  c, pParse, &mask
110e0 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c  Set);.  whereSpl
110f0 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20  it(&wc, pWhere, 
11100 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20  TK_AND);.    .  
11110 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
11120 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
11130 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
11140 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  re that will bec
11150 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74  ome the.  ** ret
11160 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  urn value..  */.
11170 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
11180 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
11190 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
111a0 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
111b0 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
111c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
111d0 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
111e0 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
111f0 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20  ginNoMem;.  }.  
11200 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d  pWInfo->nLevel =
11210 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
11220 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  .  pWInfo->pPars
11230 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57  e = pParse;.  pW
11240 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d  Info->pTabList =
11250 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49   pTabList;.  pWI
11260 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71  nfo->iBreak = sq
11270 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11280 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65  el(v);..  /* Spe
11290 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45  cial case: a WHE
112a0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
112b0 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61  s constant.  Eva
112c0 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65  luate the.  ** e
112d0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69  xpression and ei
112e0 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61  ther jump over a
112f0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f  ll of the code o
11300 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a  r fall thru..  *
11310 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26  /.  if( pWhere &
11320 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
11330 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  c==0 || sqlite3E
11340 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
11350 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
11360 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
11370 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
11380 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
11390 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20  iBreak, 1);.    
113a0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
113b0 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
113c0 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
113d0 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
113e0 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
113f0 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
11400 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
11410 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
11420 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
11430 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
11440 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
11450 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
11460 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
11470 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
11480 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
11490 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
114a0 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
114b0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
114c0 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
114d0 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
114e0 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
114f0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
11500 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53  reateMask(&maskS
11510 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
11520 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
11530 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
11540 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 77 63 29  l(pTabList, &wc)
11550 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ;.  if( sqlite3M
11560 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
11570 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
11580 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a  eginNoMem;.  }..
11590 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62    /* Chose the b
115a0 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
115b0 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
115c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
115d0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
115e0 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e  is loop fills in
115f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
11600 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ields:.  **.  **
11610 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
11620 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64  Idx      The ind
11630 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
11640 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  is level of the 
11650 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49  loop..  **   pWI
11660 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20  nfo->a[].flags  
11670 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61     WHERE_xxx fla
11680 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
11690 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70  th pIdx.  **   p
116a0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20  WInfo->a[].nEq  
116b0 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20       The number 
116c0 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  of == and IN con
116d0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20  straints.  **   
116e0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f  pWInfo->a[].iFro
116f0 6d 20 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20  m     When term 
11700 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
11710 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
11720 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
11730 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
11740 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
11750 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
11760 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
11770 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
11780 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
11790 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
117a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
117b0 6c 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65  loop also figure
117c0 73 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e  s out the nestin
117d0 67 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65  g order of table
117e0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
117f0 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ** clause..  */.
11800 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42    notReady = ~(B
11810 69 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62  itmask)0;.  pTab
11820 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
11830 3e 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70  >a;.  pLevel = p
11840 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46  WInfo->a;.  andF
11850 6c 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45  lags = ~0;.  WHE
11860 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
11870 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
11880 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d  *\n"));.  for(i=
11890 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d  iFrom=0, pLevel=
118a0 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
118b0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
118c0 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
118d0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
118f0 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74  Index for FROM t
11900 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d  able at pTabItem
11910 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   */.    int flag
11920 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
11930 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73      /* Flags ass
11940 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
11950 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  dx */.    int nE
11960 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
11970 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11980 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
11990 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64  traints */.    d
119a0 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20  ouble cost;     
119b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
119c0 65 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20  e cost for pIdx 
119d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
11a00 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c  g over FROM tabl
11a10 65 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  es */.    Index 
11a20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
11a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73        /* The bes
11a40 74 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20  t index seen so 
11a50 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  far */.    int b
11a60 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  estFlags = 0;   
11a70 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
11a80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11a90 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
11aa0 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20   bestNEq = 0;   
11ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20           /* nEq 
11ac0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11ad0 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75  pBest */.    dou
11ae0 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20  ble lowestCost; 
11af0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
11b00 20 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f   of the pBest */
11b10 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d  .    int bestJ =
11b20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11b30 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
11b40 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73   j */.    Bitmas
11b50 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  k m;            
11b60 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
11b70 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20   value for j or 
11b80 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74  bestJ */.    int
11b90 20 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20   once = 0;      
11ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11bb0 20 77 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c   when first tabl
11bc0 65 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  e is seen */.   
11bd0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
11be0 6e 66 6f 20 2a 70 49 6e 64 65 78 3b 20 2f 2a 20  nfo *pIndex; /* 
11bf0 43 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20  Current virtual 
11c00 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f  index */..    lo
11c10 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54  westCost = SQLIT
11c20 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66  E_BIG_DBL;.    f
11c30 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62  or(j=iFrom, pTab
11c40 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e  Item=&pTabList->
11c50 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74  a[j]; j<pTabList
11c60 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61  ->nSrc; j++, pTa
11c70 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  bItem++){.      
11c80 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72  int doNotReorder
11c90 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  ;  /* True if th
11ca0 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  is table should 
11cb0 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64  not be reordered
11cc0 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74   */..      doNot
11cd0 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62  Reorder =  (pTab
11ce0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
11cf0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
11d00 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69  SS))!=0;.      i
11d10 66 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74  f( once && doNot
11d20 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b  Reorder ) break;
11d30 0a 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61  .      m = getMa
11d40 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
11d50 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
11d60 0a 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20  .      if( (m & 
11d70 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
11d80 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69          if( j==i
11d90 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a  From ) iFrom++;.
11da0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
11db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11dc0 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d  assert( pTabItem
11dd0 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65  ->pTab );.#ifnde
11de0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11df0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
11e00 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
11e10 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  TabItem->pTab) )
11e20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11e30 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
11e40 70 49 64 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e  pIdxInfo = &pWIn
11e50 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66  fo->a[j].pIdxInf
11e60 6f 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  o;.        cost 
11e70 3d 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64  = bestVirtualInd
11e80 65 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20  ex(pParse, &wc, 
11e90 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61  pTabItem, notRea
11ea0 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  dy,.            
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 20 70 70 4f 72 64 65 72 42 79 20 3f 20      ppOrderBy ? 
11ed0 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 20  *ppOrderBy : 0, 
11ee0 69 3d 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20  i==0,.          
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29        ppIdxInfo)
11f10 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  ;.        flags 
11f20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
11f30 41 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 70 49  ABLE;.        pI
11f40 6e 64 65 78 20 3d 20 2a 70 70 49 64 78 49 6e 66  ndex = *ppIdxInf
11f50 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o;.        if( p
11f60 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
11f70 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
11f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
11f90 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
11fa0 55 41 4c 54 41 42 4c 45 20 7c 20 57 48 45 52 45  UALTABLE | WHERE
11fb0 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20  _ORDERBY;.      
11fc0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 64 78    }.        pIdx
11fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 45   = 0;.        nE
11fe0 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  q = 0;.        i
11ff0 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44  f( (SQLITE_BIG_D
12000 42 4c 2f 32 2e 30 29 3c 63 6f 73 74 20 29 7b 0a  BL/2.0)<cost ){.
12010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12020 20 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c   cost is not all
12030 6f 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  owed to be large
12040 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49  r than SQLITE_BI
12050 47 5f 44 42 4c 20 28 74 68 65 0a 20 20 20 20 20  G_DBL (the.     
12060 20 20 20 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76       ** inital v
12070 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f  alue of lowestCo
12080 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e  st in this loop.
12090 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 0a   If it is, then.
120a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
120b0 20 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73   (cost<lowestCos
120c0 74 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69  t) test below wi
120d0 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65  ll never be true
120e0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
120f0 2a 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  * pLevel->pBestI
12100 64 78 20 6e 65 76 65 72 20 73 65 74 2e 0a 20 20  dx never set..  
12110 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
12120 20 20 20 20 20 20 63 6f 73 74 20 3d 20 28 53 51        cost = (SQ
12130 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30  LITE_BIG_DBL/2.0
12140 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12150 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66     }else .#endif
12160 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
12170 20 63 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65   cost = bestInde
12180 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70  x(pParse, &wc, p
12190 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
121a0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
121b0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d              (i==
121c0 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29 20  0 && ppOrderBy) 
121d0 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30  ? *ppOrderBy : 0
121e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
121f0 20 20 20 20 20 20 20 20 20 20 20 26 70 49 64 78             &pIdx
12200 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b  , &flags, &nEq);
12210 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20  .        pIndex 
12220 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
12230 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65     if( cost<lowe
12240 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  stCost ){.      
12250 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20    once = 1;.    
12260 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
12270 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70   cost;.        p
12280 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
12290 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
122a0 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
122b0 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20  bestNEq = nEq;. 
122c0 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a         bestJ = j
122d0 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
122e0 2d 3e 70 42 65 73 74 49 64 78 20 3d 20 70 49 6e  ->pBestIdx = pIn
122f0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
12300 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72     if( doNotReor
12310 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
12320 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43   }.    WHERETRAC
12330 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
12340 72 20 63 68 6f 6f 73 65 20 74 61 62 6c 65 20 25  r choose table %
12350 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22  d for loop %d\n"
12360 2c 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20  , bestJ,.       
12370 20 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66      pLevel-pWInf
12380 6f 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20  o->a));.    if( 
12390 28 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45  (bestFlags & WHE
123a0 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29  RE_ORDERBY)!=0 )
123b0 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72  {.      *ppOrder
123c0 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
123d0 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65    andFlags &= be
123e0 73 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65  stFlags;.    pLe
123f0 76 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73  vel->flags = bes
12400 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
12410 65 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74  el->pIdx = pBest
12420 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45  ;.    pLevel->nE
12430 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20  q = bestNEq;.   
12440 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70   pLevel->aInLoop
12450 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c   = 0;.    pLevel
12460 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69  ->nIn = 0;.    i
12470 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
12480 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
12490 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
124a0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
124b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
124c0 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
124d0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
124e0 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53   ~getMask(&maskS
124f0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
12500 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
12510 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
12520 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a  om = bestJ;.  }.
12530 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
12540 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e  ** Optimizer Fin
12550 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  ished ***\n"));.
12560 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74  .  /* If the tot
12570 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65  al query only se
12580 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72  lects a single r
12590 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44  ow, then the ORD
125a0 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73  ER BY.  ** claus
125b0 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e  e is irrelevant.
125c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64  .  */.  if( (and
125d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e  Flags & WHERE_UN
125e0 49 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72  IQUE)!=0 && ppOr
125f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70  derBy ){.    *pp
12600 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
12610 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
12620 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
12630 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
12640 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
12650 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
12660 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
12670 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
12680 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
12690 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20  pParse, -1); /* 
126a0 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69  Insert the cooki
126b0 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20  e verifier Goto 
126c0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
126d0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
126e0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
126f0 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
12700 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
12710 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
12720 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49  to open */.    I
12730 6e 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20  ndex *pIx;      
12740 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
12750 20 61 63 63 65 73 73 20 70 54 61 62 20 28 69 66   access pTab (if
12760 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74   any) */.    int
12770 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
12780 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61   Index of databa
12790 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
127a0 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ble/index */.   
127b0 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70   int iIdxCur = p
127c0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
127d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
127e0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
127f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
12800 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
12810 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
12820 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
12830 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
12840 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
12850 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
12860 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
12870 33 4d 50 72 69 6e 74 66 28 22 54 41 42 4c 45 20  3MPrintf("TABLE 
12880 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
12890 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
128a0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
128b0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
128c0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
128d0 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
128e0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
128f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12900 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
12910 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
12920 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
12930 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 57 49  e3MPrintf("%z WI
12940 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d  TH INDEX %s", zM
12950 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b  sg, pIx->zName);
12960 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12970 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
12980 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51   (WHERE_ROWID_EQ
12990 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
129a0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  GE) ){.        z
129b0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
129c0 69 6e 74 66 28 22 25 7a 20 55 53 49 4e 47 20 50  intf("%z USING P
129d0 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73  RIMARY KEY", zMs
129e0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  g);.      }.#ifn
129f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12a00 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
12a10 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 76     else if( pLev
12a20 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a  el->pBestIdx ){.
12a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12a40 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73  index_info *pBes
12a50 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  tIdx = pLevel->p
12a60 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 20  BestIdx;.       
12a70 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
12a80 50 72 69 6e 74 66 28 22 25 7a 20 56 49 52 54 55  Printf("%z VIRTU
12a90 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
12aa0 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20  d:%s", zMsg,.   
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75   pBestIdx->idxNu
12ad0 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  m, pBestIdx->idx
12ae0 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Str);.      }.#e
12af0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
12b00 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
12b10 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a  HERE_ORDERBY ){.
12b20 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
12b30 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
12b40 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  z ORDER BY", zMs
12b50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
12b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
12b70 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
12b80 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
12b90 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d  , zMsg, P3_DYNAM
12ba0 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  IC);.    }.#endi
12bb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12bc0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20  _EXPLAIN */.    
12bd0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
12be0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
12bf0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
12c00 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
12c10 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
12c20 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
12c30 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
12c40 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
12c50 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70    if( pTab->isEp
12c60 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  hem || pTab->pSe
12c70 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
12c80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12c90 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12ca0 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  E.    if( pLevel
12cb0 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20  ->pBestIdx ){.  
12cc0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
12cd0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
12ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12cf0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 4f 70  dbeOp3(v, OP_VOp
12d00 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 28 63 6f  en, iCur, 0, (co
12d10 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d 3e  nst char*)pTab->
12d20 70 56 74 61 62 2c 20 50 33 5f 56 54 41 42 29 3b  pVtab, P3_VTAB);
12d30 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
12d40 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
12d50 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
12d60 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
12d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
12d80 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12d90 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
12da0 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
12db0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
12dc0 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
12dd0 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  <(sizeof(Bitmask
12de0 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )*8) ){.        
12df0 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
12e00 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
12e10 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
12e20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
12e30 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
12e40 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
12e50 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
12e60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12e70 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 6e 29  entAddr(v)-1, n)
12e80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12e90 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
12ea0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
12ec0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
12ed0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
12ee0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
12ef0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
12f00 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
12f10 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
12f20 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
12f30 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
12f40 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b  x)!=0 ){.      K
12f50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
12f60 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
12f70 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
12f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12f90 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
12fa0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
12fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12fc0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
12fd0 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  er, iDb, 0);.   
12fe0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
12ff0 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e  v, "# %s", pIx->
13000 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
13010 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13020 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
13030 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
13040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13050 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13060 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
13070 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20  ANDOFF);.    }. 
13080 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
13090 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  flags & (WHERE_I
130a0 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 43 4f  DX_ONLY|WHERE_CO
130b0 4c 55 4d 4e 5f 52 41 4e 47 45 29 29 21 3d 30 20  LUMN_RANGE))!=0 
130c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  ){.      /* Only
130d0 20 63 61 6c 6c 20 4f 50 5f 53 65 74 4e 75 6d 43   call OP_SetNumC
130e0 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 69 6e  olumns on the in
130f0 64 65 78 20 69 66 20 77 65 20 6d 69 67 68 74 20  dex if we might 
13100 6c 61 74 65 72 20 75 73 65 0a 20 20 20 20 20 20  later use.      
13110 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 6e 20  ** OP_Column on 
13120 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  the index. */.  
13130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13140 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
13150 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75  mColumns, iIdxCu
13160 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  r, pIx->nColumn+
13170 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
13180 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13190 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
131a0 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
131b0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
131c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
131d0 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  v);..  /* Genera
131e0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
131f0 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
13200 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
13210 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
13220 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
13230 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
13240 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
13250 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
13260 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
13270 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
13280 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
13290 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
132a0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
132b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
132c0 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a  el++){.    int j
132d0 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d  ;.    int iCur =
132e0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
132f0 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45  or;  /* The VDBE
13300 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
13310 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64  table */.    Ind
13320 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
13330 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
13340 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
13350 0a 20 20 20 20 69 6e 74 20 6e 78 74 3b 20 20 20  .    int nxt;   
13360 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
13370 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
13380 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
13390 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
133a0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
133b0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
133c0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
133d0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
133e0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
133f0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
13400 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
13410 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76   */.    int bRev
13420 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
13430 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
13440 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
13450 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70   order */..    p
13460 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
13470 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
13480 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20  From];.    iCur 
13490 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
134a0 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  sor;.    pIdx = 
134b0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20  pLevel->pIdx;.  
134c0 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
134d0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
134e0 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d   bRev = (pLevel-
134f0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
13500 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20  EVERSE)!=0;.    
13510 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
13520 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13530 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b  RE_IDX_ONLY)!=0;
13540 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
13550 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
13560 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
13570 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
13580 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ns.    ** for th
13590 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
135a0 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20   Jump to brk to 
135b0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
135c0 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70  oop..    ** Jump
135d0 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
135e0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
135f0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
13600 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   of the.    ** l
13610 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop..    **.    
13620 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
13630 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
13640 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
13650 22 6e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  "nxt" label that
13660 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  .    ** means to
13670 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
13680 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
13690 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
136a0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  hen.    ** there
136b0 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
136c0 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
136d0 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 6e 78  traints, the "nx
136e0 74 22 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a 20  t" label.    ** 
136f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
13700 62 72 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  brk"..    */.   
13710 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
13720 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74  rk = pLevel->nxt
13730 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13740 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13750 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63  cont = pLevel->c
13760 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
13770 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
13780 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
13790 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
137a0 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
137b0 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
137c0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74   and.    ** init
137d0 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
137e0 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
137f0 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
13800 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20  matches any.    
13810 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
13820 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
13830 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  join..    */.   
13840 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
13850 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
13860 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
13870 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
13880 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
13890 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
138a0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
138b0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
138c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
138d0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
138e0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
138f0 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65  MemInt, 0, pLeve
13900 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
13910 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13920 28 28 76 2c 20 22 23 20 69 6e 69 74 20 4c 45 46  ((v, "# init LEF
13930 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
13940 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  flag"));.    }..
13950 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13960 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13970 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
13980 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20  >pBestIdx ){.   
13990 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
139a0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
139b0 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
139c0 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
139d0 64 20 56 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a  d VNext.      **
139e0 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
139f0 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
13a00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13a10 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
13a20 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42  3_index_info *pB
13a30 65 73 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  estIdx = pLevel-
13a40 3e 70 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20  >pBestIdx;.     
13a50 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
13a60 20 3d 20 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f   = pBestIdx->nCo
13a70 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20  nstraint;.      
13a80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
13a90 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
13aa0 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a  usage *aUsage =.
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 20 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e    pBestIdx->aCon
13af0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
13b00 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
13b10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13b20 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73  onstraint *aCons
13b30 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20  traint =.       
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b60 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13b70 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
13b80 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ;..      for(j=1
13b90 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; j<=nConstraint
13ba0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
13bb0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
13bc0 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74  or(k=0; k<nConst
13bd0 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20  raint; k++){.   
13be0 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67         if( aUsag
13bf0 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d  e[k].argvIndex==
13c00 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
13c10 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
13c20 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72  nstraint[k].iTer
13c30 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
13c40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e  Code(pParse, wc.
13c60 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e  a[iTerm].pExpr->
13c70 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
13c80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13ca0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
13cb0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62  =nConstraint ) b
13cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13cd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13ce0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
13cf0 65 72 2c 20 6a 2d 31 2c 20 30 29 3b 0a 20 20 20  er, j-1, 0);.   
13d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d10 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
13d20 72 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  r, pBestIdx->idx
13d30 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  Num, 0);.      s
13d40 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13d50 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
13d60 72 2c 20 62 72 6b 2c 20 70 42 65 73 74 49 64 78  r, brk, pBestIdx
13d70 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  ->idxStr,.      
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 70 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f  pBestIdx->needTo
13da0 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 33 5f  FreeIdxStr ? P3_
13db0 4d 50 52 49 4e 54 46 20 3a 20 50 33 5f 53 54 41  MPRINTF : P3_STA
13dc0 54 49 43 29 3b 0a 20 20 20 20 20 20 70 42 65 73  TIC);.      pBes
13dd0 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  tIdx->needToFree
13de0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
13df0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 42 65    for(j=0; j<pBe
13e00 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69  stIdx->nConstrai
13e10 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
13e20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e    if( aUsage[j].
13e30 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  omit ){.        
13e40 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
13e50 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
13e60 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
13e70 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
13e80 70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54  pLevel, &wc.a[iT
13e90 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  erm]);.        }
13ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13eb0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
13ec0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
13ed0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
13ee0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
13ef0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13f00 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
13f10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
13f20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13f30 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
13f40 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
13f50 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
13f60 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  D_EQ ){.      /*
13f70 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
13f80 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
13f90 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
13fa0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20   using an.      
13fb0 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
13fc0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
13fd0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
13fe0 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
13ff0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
14000 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
14010 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
14020 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
14030 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  )".      **     
14040 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
14050 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
14060 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
14070 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
14080 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
14090 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_IN, 0);.      
140a0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
140b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
140c0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
140d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
140e0 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
140f0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
14100 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
14110 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
14120 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
14130 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
14140 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
14150 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nxt = pLevel->n
14160 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
14170 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14180 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20 6e  _MustBeInt, 1, n
14190 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
141a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
141b0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
141c0 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 56  r, nxt);.      V
141d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
141e0 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c 65  pk"));.      pLe
141f0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
14200 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
14210 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
14220 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
14230 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  GE ){.      /* C
14240 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
14250 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
14260 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
14270 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
14280 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14290 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
142a0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74  _Noop;.      int
142b0 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 57 68   start;.      Wh
142c0 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
142d0 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61   *pEnd;..      a
142e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
142f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 74  ==0 );.      pSt
14300 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  art = findTerm(&
14310 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
14320 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
14330 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  _GE, 0);.      p
14340 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  End = findTerm(&
14350 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
14360 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
14370 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  _LE, 0);.      i
14380 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
14390 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
143a0 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74 61 72  t;.        pStar
143b0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
143c0 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a    pEnd = pTerm;.
143d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
143e0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
143f0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
14400 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
14410 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
14420 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
14430 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
14440 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  t( pStart->leftC
14450 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
14460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
14470 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
14480 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
14490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
144a0 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 72 63 65  ddOp(v, OP_Force
144b0 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  Int, pX->op==TK_
144c0 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LE || pX->op==TK
144d0 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  _GT, brk);.     
144e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
144f0 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  dOp(v, bRev ? OP
14500 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76  _MoveLt : OP_Mov
14510 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  eGe, iCur, brk);
14520 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
14530 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
14540 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
14550 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
14560 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  art);.      }els
14570 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14580 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62  e3VdbeAddOp(v, b
14590 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
145a0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
145b0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
145c0 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b       if( pEnd ){
145d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
145e0 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
145f0 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pEnd->pExpr;.   
14600 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
14610 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
14620 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
14630 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
14640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14650 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14660 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
14670 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
14680 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
14690 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
146a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
146b0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
146c0 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
146d0 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f         if( pX->o
146e0 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
146f0 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
14700 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
14710 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
14720 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  P_Ge;.        }e
14730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74  lse{.          t
14740 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
14750 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
14760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14770 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
14780 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20  el, pEnd);.     
14790 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d   }.      start =
147a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
147b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
147c0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
147d0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
147e0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
147f0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
14800 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
14810 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
14820 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
14830 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
14840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14850 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  p(v, OP_Rowid, i
14860 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
14870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14880 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
14890 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
148a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
148b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
148c0 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f 41 46  estOp, SQLITE_AF
148d0 46 5f 4e 55 4d 45 52 49 43 7c 30 78 31 30 30 2c  F_NUMERIC|0x100,
148e0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
148f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
14900 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
14910 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
14920 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
14930 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c   3: The WHERE cl
14940 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72  ause term that r
14950 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67  efers to the rig
14960 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ht-most.      **
14970 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
14980 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
14990 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
149a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
149b0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
149c0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e   the index is on
149d0 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65   (x,y,z) and the
149e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
149f0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
14a00 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78           form "x
14a10 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65  =5 AND y<10" the
14a20 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75  n this case is u
14a30 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20  sed.  Only the. 
14a40 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
14a50 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
14a60 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
14a70 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
14a80 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  t must.      ** 
14a90 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
14aa0 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
14ab0 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a  erators..      *
14ac0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
14ad0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
14ae0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
14af0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
14b00 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a  E clause.      *
14b10 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
14b20 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
14b30 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
14b40 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
14b50 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
14b60 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
14b70 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
14b80 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
14b90 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  R BY..      */. 
14ba0 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
14bb0 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
14bc0 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20  pLevel->nEq;.   
14bd0 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20     int topEq=0; 
14be0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14bf0 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65 73  f top limit uses
14c00 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73 74   ==. False is st
14c10 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20  rictly < */.    
14c20 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20    int btmEq=0;  
14c30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14c40 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73 20   btm limit uses 
14c50 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74 72  ==. False if str
14c60 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20  ictly > */.     
14c70 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f   int topOp, btmO
14c80 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72  p;   /* Operator
14c90 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61 6e  s for the top an
14ca0 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68 20  d bottom search 
14cb0 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20  bounds */.      
14cc0 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20  int testOp;.    
14cd0 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d    int topLimit =
14ce0 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
14cf0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
14d00 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74  T)!=0;.      int
14d10 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65   btmLimit = (pLe
14d20 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
14d30 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
14d40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
14d50 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
14d60 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
14d70 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
14d80 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20   == or IN.      
14d90 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65  ** and level the
14da0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
14db0 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74   terms on the st
14dc0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
14dd0 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c      codeAllEqual
14de0 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
14df0 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f   pLevel, &wc, no
14e00 74 52 65 61 64 79 29 3b 0a 0a 20 20 20 20 20 20  tReady);..      
14e10 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
14e20 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76   equality term v
14e30 61 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68  alues because th
14e40 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20  ey will all be. 
14e50 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69       ** used twi
14e60 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65  ce: once to make
14e70 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
14e80 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f   key and once to
14e90 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20   make the.      
14ea0 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20  ** start key..  
14eb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
14ec0 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
14ed0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14ee0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14ef0 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29  P_Dup, nEq-1, 0)
14f00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14f10 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
14f20 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  hat comparison o
14f30 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20  perators to use 
14f40 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74  for top and bott
14f50 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61  om .      ** sea
14f60 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20  rch bounds. For 
14f70 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
14f80 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62  ex, the bottom b
14f90 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e  ound is a > or >
14fa0 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61  =.      ** opera
14fb0 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20  tor and the top 
14fc0 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20  bound is a < or 
14fd0 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f  <= operator.  Fo
14fe0 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20  r a descending. 
14ff0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68       ** index th
15000 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  e operators are 
15010 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20  reversed..      
15020 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  */.      if( pId
15030 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
15040 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
15050 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 70  C ){.        top
15060 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  Op = WO_LT|WO_LE
15070 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20  ;.        btmOp 
15080 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20  = WO_GT|WO_GE;. 
15090 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
150a0 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 47      topOp = WO_G
150b0 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 20  T|WO_GE;.       
150c0 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57   btmOp = WO_LT|W
150d0 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53 57  O_LE;.        SW
150e0 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69 74  AP(int, topLimit
150f0 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20 20  , btmLimit);.   
15100 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
15110 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d  enerate the term
15120 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68  ination key.  Th
15130 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61  is is the key va
15140 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lue that.      *
15150 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73  * will end the s
15160 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
15170 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   no termination 
15180 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20  key if there.   
15190 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75     ** are no equ
151a0 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
151b0 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e  no "X<..." term.
151c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
151d0 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20  ** 2002-Dec-04: 
151e0 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  On a reverse-ord
151f0 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d  er scan, the so-
15200 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74  called "terminat
15210 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65  ion".      ** ke
15220 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20  y computed here 
15230 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62  really ends up b
15240 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b  eing the start k
15250 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
15260 20 20 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d     nxt = pLevel-
15270 3e 6e 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20  >nxt;.      if( 
15280 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  topLimit ){.    
15290 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
152a0 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
152b0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
152c0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
152d0 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
152e0 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
152f0 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29 3b 0a  , topOp, pIdx);.
15300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15310 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
15320 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
15330 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
15340 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
15350 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
15360 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
15370 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15380 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
15390 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ght);.        sq
153a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
153b0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 28 6e  , OP_IsNull, -(n
153c0 45 71 2a 32 2b 31 29 2c 20 6e 78 74 29 3b 0a 20  Eq*2+1), nxt);. 
153d0 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70         topEq = p
153e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
153f0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
15400 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
15410 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
15420 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  rm);.        tes
15430 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a  tOp = OP_IdxGE;.
15440 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15450 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45       testOp = nE
15460 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a  q>0 ? OP_IdxGE :
15470 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
15480 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20    topEq = 1;.   
15490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
154a0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
154b0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
154c0 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69  ol = nEq + topLi
154d0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  mit;.        pLe
154e0 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
154f0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
15500 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
15510 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64  obe(v, nCol, pId
15520 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
15530 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15540 20 20 69 6e 74 20 6f 70 20 3d 20 74 6f 70 45 71    int op = topEq
15550 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f   ? OP_MoveLe : O
15560 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20  P_MoveLt;.      
15570 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15580 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64 78  ddOp(v, op, iIdx
15590 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  Cur, nxt);.     
155a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
155b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
155c0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
155d0 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
155e0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  m, 1);.        }
155f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15600 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
15610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15620 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49  p(v, OP_Last, iI
15630 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
15640 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
15650 65 6e 65 72 61 74 65 20 74 68 65 20 73 74 61 72  enerate the star
15660 74 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20  t key.  This is 
15670 74 68 65 20 6b 65 79 20 74 68 61 74 20 64 65 66  the key that def
15680 69 6e 65 73 20 74 68 65 20 6c 6f 77 65 72 0a 20  ines the lower. 
15690 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e       ** bound on
156a0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68   the search.  Th
156b0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 72 74 20  ere is no start 
156c0 6b 65 79 20 69 66 20 74 68 65 72 65 20 61 72 65  key if there are
156d0 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 65 71 75   no.      ** equ
156e0 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
156f0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  if there is no "
15700 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20 20 49 6e  X>..." term.  In
15710 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63  .      ** that c
15720 61 73 65 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ase, generate a 
15730 22 52 65 77 69 6e 64 22 20 69 6e 73 74 72 75 63  "Rewind" instruc
15740 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66  tion in place of
15750 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74   the.      ** st
15760 61 72 74 20 6b 65 79 20 73 65 61 72 63 68 2e 0a  art key search..
15770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15780 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 49  * 2002-Dec-04: I
15790 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
157a0 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 65  reverse-order se
157b0 61 72 63 68 2c 20 74 68 65 20 73 6f 2d 63 61 6c  arch, the so-cal
157c0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 22 73 74  led.      ** "st
157d0 61 72 74 22 20 6b 65 79 20 72 65 61 6c 6c 79 20  art" key really 
157e0 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 75 73  ends up being us
157f0 65 64 20 61 73 20 74 68 65 20 74 65 72 6d 69 6e  ed as the termin
15800 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20 20 20 20  ation key..     
15810 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 74   */.      if( bt
15820 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  mLimit ){.      
15830 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
15840 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
15850 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
15860 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
15870 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
15880 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
15890 62 74 6d 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20  btmOp, pIdx);.  
158a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
158b0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  erm!=0 );.      
158c0 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
158d0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  xpr;.        ass
158e0 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61  ert( (pTerm->fla
158f0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
15900 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
15910 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15920 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
15930 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
15940 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15950 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 28 6e 45 71  OP_IsNull, -(nEq
15960 2b 31 29 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  +1), nxt);.     
15970 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72 6d     btmEq = pTerm
15980 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
15990 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
159a0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
159b0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
159c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
159d0 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 31 3b        btmEq = 1;
159e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
159f0 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c  f( nEq>0 || btmL
15a00 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
15a10 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b  int nCol = nEq +
15a20 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20   btmLimit;.     
15a30 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
15a40 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64 78  be(v, nCol, pIdx
15a50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  );.        if( b
15a60 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
15a70 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20   pLevel->iMem = 
15a80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
15a90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15aa0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15ab0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
15ac0 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  l->iMem, 1);.   
15ad0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15ae0 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20 20 20  OP_IdxLT;.      
15af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15b00 20 20 20 69 6e 74 20 6f 70 20 3d 20 62 74 6d 45     int op = btmE
15b10 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20  q ? OP_MoveGe : 
15b20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20  OP_MoveGt;.     
15b30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15b40 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64  AddOp(v, op, iId
15b50 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20  xCur, nxt);.    
15b60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15b70 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
15b80 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
15b90 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65  P_Noop;.      }e
15ba0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15bc0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78   OP_Rewind, iIdx
15bd0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
15be0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
15bf0 65 72 61 74 65 20 74 68 65 20 74 68 65 20 74 6f  erate the the to
15c00 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  p of the loop.  
15c10 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65  If there is a te
15c20 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  rmination.      
15c30 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65 20 74  ** key we have t
15c40 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61 74 20  o test for that 
15c50 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74  key and abort at
15c60 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
15c70 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20        ** loop.. 
15c80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
15c90 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15ca0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15cb0 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
15cc0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
15cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ce0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
15cf0 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
15d00 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
15d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d20 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49 64 78  (v, testOp, iIdx
15d30 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  Cur, nxt);.     
15d40 20 20 20 69 66 28 20 28 74 6f 70 45 71 20 26 26     if( (topEq &&
15d50 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62 74 6d   !bRev) || (!btm
15d60 45 71 20 26 26 20 62 52 65 76 29 20 29 7b 0a 20  Eq && bRev) ){. 
15d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15d80 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
15d90 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54  -1, "+", P3_STAT
15da0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
15db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15dc0 20 74 6f 70 4c 69 6d 69 74 20 7c 20 62 74 6d 4c   topLimit | btmL
15dd0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
15de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15df0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
15e00 49 64 78 43 75 72 2c 20 6e 45 71 29 3b 0a 20 20  IdxCur, nEq);.  
15e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15e20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
15e30 75 6c 6c 2c 20 31 2c 20 63 6f 6e 74 29 3b 0a 20  ull, 1, cont);. 
15e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15e50 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
15e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15e70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
15e80 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
15e90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
15ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15eb0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
15ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
15ed0 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
15ee0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
15ef0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
15f00 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20   the loop..     
15f10 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
15f20 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
15f30 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
15f40 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
15f50 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
15f60 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
15f70 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  start;.    }else
15f80 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
15f90 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
15fa0 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  N_EQ ){.      /*
15fb0 20 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20   Case 4:  There 
15fc0 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  is an index and 
15fd0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
15fe0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
15ff0 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  at.      **     
16000 20 20 20 20 20 72 65 66 65 72 20 74 6f 20 74 68       refer to th
16010 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  e index using th
16020 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f  e "==" or "IN" o
16030 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
16040 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
16050 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  rt;.      int nE
16060 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
16070 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
16080 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
16090 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
160a0 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
160b0 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a  == or IN.      *
160c0 2a 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  * and leave the 
160d0 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
160e0 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61  terms on the sta
160f0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
16100 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69     codeAllEquali
16110 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  tyTerms(pParse, 
16120 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74  pLevel, &wc, not
16130 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 6e 78  Ready);.      nx
16140 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b  t = pLevel->nxt;
16150 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
16160 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79  ate a single key
16170 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
16180 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74  ed to both start
16190 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a 20   and terminate. 
161a0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72       ** the sear
161b0 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ch.      */.    
161c0 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
161d0 65 28 76 2c 20 6e 45 71 2c 20 70 49 64 78 29 3b  e(v, nEq, pIdx);
161e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
161f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16200 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
16210 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20  iMem, 0);..     
16220 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16230 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f  e (1) to move to
16240 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
16250 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
16260 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
16270 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74 65  ** Then generate
16280 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20 6a   code (2) that j
16290 75 6d 70 73 20 74 6f 20 22 6e 78 74 22 20 61 66  umps to "nxt" af
162a0 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 69  ter the cursor i
162b0 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  s past.      ** 
162c0 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69 6e  the last matchin
162d0 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
162e0 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 64   table.  The cod
162f0 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74 65  e (1) is execute
16300 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20  d.      ** once 
16310 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
16320 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63 6f  e search, the co
16330 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75 74  de (2) is execut
16340 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a 20  ed before each. 
16350 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f       ** iteratio
16360 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74 6f  n of the scan to
16370 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61 6e   see if the scan
16380 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20 2a   has finished. *
16390 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76  /.      if( bRev
163a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
163b0 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
163c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
163d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
163e0 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69  (v, OP_MoveLe, i
163f0 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
16400 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
16410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16420 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
16430 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
16440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16450 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
16460 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20 6e  dxLT, iIdxCur, n
16470 78 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  xt);.        pLe
16480 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
16490 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  v;.      }else{.
164a0 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
164b0 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f  in the forward o
164c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
164d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
164e0 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
164f0 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
16500 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
16510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16520 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
16530 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
16540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16550 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  dbeOp3(v, OP_Idx
16560 47 45 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74  GE, iIdxCur, nxt
16570 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43  , "+", P3_STATIC
16580 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
16590 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
165a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
165b0 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
165c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
165d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
165e0 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
165f0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  r, 0);.        s
16600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16610 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43  v, OP_MoveGe, iC
16620 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ur, 0);.      }.
16630 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
16640 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
16650 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
16660 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tart;.    }else{
16670 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35  .      /* Case 5
16680 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
16690 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
166a0 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
166b0 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ete.      **    
166c0 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
166d0 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
166e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
166f0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
16700 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
16710 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a  ert( bRev==0 );.
16720 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
16730 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
16740 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
16750 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
16760 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
16770 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16780 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
16790 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20   brk);.    }.   
167a0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
167b0 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
167c0 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  iCur);..    /* I
167d0 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
167e0 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
167f0 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
16800 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
16810 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
16820 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
16830 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
16840 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54     */.    for(pT
16850 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e  erm=wc.a, j=wc.n
16860 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
16870 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
16880 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
16890 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
168a0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
168b0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
168c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
168d0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
168e0 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
168f0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
16900 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d        pE = pTerm
16910 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
16920 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
16930 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
16940 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
16950 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16960 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
16970 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
16980 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
16990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
169a0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
169b0 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  E, cont, 1);.   
169c0 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
169d0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
169e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
169f0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
16a00 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
16a10 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
16a20 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
16a30 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  .    ** at least
16a40 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
16a50 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
16a60 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
16a70 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f   table.  .    */
16a80 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
16a90 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
16aa0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20      pLevel->top 
16ab0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16ac0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
16ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ae0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
16af0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
16b00 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56  ftJoin);.      V
16b10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16b20 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f  # record LEFT JO
16b30 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20  IN hit"));.     
16b40 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
16b50 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d   j=0; j<wc.nTerm
16b60 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
16b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
16b80 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
16b90 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
16ba0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
16bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
16bc0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
16bd0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
16be0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16bf0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
16c00 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
16c10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
16c20 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
16c30 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74  erm->pExpr, cont
16c40 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54  , 1);.        pT
16c50 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
16c60 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20  RM_CODED;.      
16c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  }.    }.  }..#if
16c80 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
16c90 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
16ca0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
16cb0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
16cc0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
16cd0 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
16ce0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
16cf0 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
16d00 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
16d10 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
16d20 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
16d30 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
16d40 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
16d50 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
16d60 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
16d70 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
16d80 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
16d90 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
16da0 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
16db0 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
16dc0 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
16dd0 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
16de0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
16df0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
16e00 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
16e10 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
16e20 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
16e30 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
16e40 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
16e50 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
16e60 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
16e70 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
16e80 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
16e90 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
16ea0 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  me;.    n = strl
16eb0 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  en(z);.    if( n
16ec0 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
16ed0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
16ee0 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
16ef0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
16f00 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
16f10 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
16f20 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
16f30 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
16f40 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
16f50 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
16f60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16f70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
16f80 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
16f90 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
16fa0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
16fb0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
16fc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
16fd0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
16fe0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
16ff0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
17000 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
17010 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
17020 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
17030 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
17040 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17050 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b  Plan], "* ", 2);
17060 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
17070 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
17080 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d  ( pLevel->pIdx==
17090 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
170a0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
170b0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
170c0 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  {} ", 3);.      
170d0 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20  nQPlan += 3;.   
170e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
170f0 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d  = strlen(pLevel-
17100 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pIdx->zName);. 
17110 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61       if( n+nQPla
17120 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
17130 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32  e3_query_plan)-2
17140 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
17150 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
17160 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
17170 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
17180 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
17190 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
171a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
171b0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
171c0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
171d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
171e0 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
171f0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
17200 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
17210 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
17220 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
17230 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
17240 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
17250 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
17260 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
17270 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17280 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
17290 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
172a0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
172b0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
172c0 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
172d0 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
172e0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
172f0 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
17300 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
17310 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
17320 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
17330 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
17340 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
17350 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
17360 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
17370 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
17380 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
17390 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
173a0 77 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  wc);.  whereInfo
173b0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
173c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
173d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
173e0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
173f0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
17400 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
17410 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
17420 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17430 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
17440 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
17450 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
17460 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
17470 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
17480 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
17490 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
174a0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
174b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
174c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
174d0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
174e0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
174f0 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
17500 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
17510 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
17520 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
17530 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
17540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17550 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
17560 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
17570 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
17580 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
17590 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
175a0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  Op(v, pLevel->op
175b0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
175c0 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d  evel->p2);.    }
175d0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
175e0 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 73 74  >nIn ){.      st
175f0 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
17600 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
17610 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17620 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17630 70 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b 0a 20 20  pLevel->nxt);.  
17640 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
17650 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  ->nIn, pIn=&pLev
17660 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  el->aInLoop[j-1]
17670 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
17680 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
17690 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
176a0 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2b  v, pIn->topAddr+
176b0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
176c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
176d0 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43  OP_Next, pIn->iC
176e0 75 72 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72  ur, pIn->topAddr
176f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17700 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17710 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2d 31  , pIn->topAddr-1
17720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17730 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 65 76   sqliteFree(pLev
17740 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  el->aInLoop);.  
17750 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
17760 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17770 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b  v, pLevel->brk);
17780 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17790 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
177a0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
177b0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
177c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
177d0 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76  P_IfMemPos, pLev
177e0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30  el->iLeftJoin, 0
177f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17800 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17810 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
17820 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c  t->a[i].iCursor,
17830 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
17840 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d  Level->iIdxCur>=
17850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
17860 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17870 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
17880 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29  vel->iIdxCur, 0)
17890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
178a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
178b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
178c0 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20  pLevel->top);.  
178d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
178e0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
178f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17900 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f  * The "break" po
17910 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73  int is here, jus
17920 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
17930 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  f the outer loop
17940 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20  ..  ** Set it.. 
17950 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
17960 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17970 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
17980 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
17990 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  l of the cursors
179a0 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65   that were opene
179b0 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
179c0 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  eBegin..  */.  f
179d0 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
179e0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
179f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
17a00 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
17a10 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
17a20 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20  tem *pTabItem = 
17a30 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
17a40 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
17a50 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
17a60 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  TabItem->pTab;. 
17a70 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
17a80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =0 );.    if( pT
17a90 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70  ab->isEphem || p
17aa0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63  Tab->pSelect ) c
17ab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
17ac0 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
17ad0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
17ae0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
17af0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17b00 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
17b10 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
17b20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17b30 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30   pLevel->pIdx!=0
17b40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17b50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
17b60 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
17b70 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
17b80 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
17b90 63 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74  cursor substitut
17ba0 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77  ions for cases w
17bb0 68 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20  here we want to 
17bc0 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20  use.    ** just 
17bd0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65  the index and ne
17be0 76 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68  ver reference th
17bf0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  e table..    ** 
17c00 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
17c10 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
17c20 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
17c30 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17c40 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
17c50 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
17c60 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
17c70 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
17c80 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
17c90 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
17ca0 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
17cb0 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
17cc0 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
17cd0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
17ce0 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
17cf0 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
17d00 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
17d10 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
17d20 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
17d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17d40 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
17d50 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
17d60 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a  {.      int k, j
17d70 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64  , last;.      Vd
17d80 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
17d90 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
17da0 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20  Level->pIdx;..  
17db0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
17dc0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  !=0 );.      pOp
17dd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
17de0 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  tOp(v, pWInfo->i
17df0 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74  Top);.      last
17e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
17e10 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
17e20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f      for(k=pWInfo
17e30 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20  ->iTop; k<last; 
17e40 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  k++, pOp++){.   
17e50 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
17e60 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
17e70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
17e80 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
17e90 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
17ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
17eb0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
17ec0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
17ed0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
17ee0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
17ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17f00 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
17f10 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
17f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
17f30 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
17f40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
17f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17f60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17f70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
17f80 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
17f90 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
17fa0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
17fb0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
17fc0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
17fd0 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
17fe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
17ff0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
18000 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  P_NullRow ){.   
18010 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
18020 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
18030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18040 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18050 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20  Final cleanup.  
18060 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72  */.  whereInfoFr
18070 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
18080 74 75 72 6e 3b 0a 7d 0a                          turn;.}.