/ Hex Artifact Content
Login

Artifact 44042c8b9d0d054cc318c3a0df052215ebf49d2d:


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 36 31   where.c,v 1.261
0340: 20 32 30 30 37 2f 30 39 2f 31 33 20 31 37 3a 35   2007/09/13 17:5
0350: 34 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a 2a  4:40 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  )../*.** Trace o
03f0: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0400: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0410: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0420: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0430: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68  ).int sqlite3_wh
0440: 65 72 65 5f 74 72 61 63 65 20 3d 20 30 3b 0a 23  ere_trace = 0;.#
0450: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0460: 43 45 28 58 29 20 20 69 66 28 73 71 6c 69 74 65  CE(X)  if(sqlite
0470: 33 5f 77 68 65 72 65 5f 74 72 61 63 65 29 20 73  3_where_trace) s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  f X.#else.# defi
04a0: 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58 29  ne WHERETRACE(X)
04b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
04c0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f  ard reference.*/
04d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
04e0: 57 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72  WhereClause Wher
04f0: 65 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66  eClause;.typedef
0500: 20 73 74 72 75 63 74 20 45 78 70 72 4d 61 73 6b   struct ExprMask
0510: 53 65 74 20 45 78 70 72 4d 61 73 6b 53 65 74 3b  Set ExprMaskSet;
0520: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0530: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
0540: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
0550: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
0560: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
0570: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
0580: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
0590: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
05a0: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
05b0: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
05c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
05d0: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
05e0: 20 6f 74 68 65 72 73 20 62 79 20 61 6e 20 41 4e   others by an AN
05f0: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  D operator..**.*
0600: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
0610: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
0620: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
0630: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
0640: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
0650: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
0660: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
0670: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
0680: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
0690: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
06a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
06b0: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
06c0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
06d0: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
06e0: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
06f0: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
0700: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
0710: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
0720: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
0730: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
0740: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
0750: 65 72 6d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72  erm.leftColumn r
0760: 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63 75 72  ecord the.** cur
0770: 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64 20 63  sor number and c
0780: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72  olumn number for
0790: 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d 2e 6f   X.  WhereTerm.o
07a0: 70 65 72 61 74 6f 72 20 72 65 63 6f 72 64 73 0a  perator records.
07b0: 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e  ** the <op> usin
07c0: 67 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f  g a bitmask enco
07d0: 64 69 6e 67 20 64 65 66 69 6e 65 64 20 62 79 20  ding defined by 
07e0: 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e 20 20 54  WO_xxx below.  T
07f0: 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20 61 20 62  he.** use of a b
0800: 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20  itmask encoding 
0810: 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72  for the operator
0820: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 73 65   allows us to se
0830: 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20  arch.** quickly 
0840: 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 6d  for terms that m
0850: 61 74 63 68 20 61 6e 79 20 6f 66 20 73 65 76 65  atch any of seve
0860: 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 6f 70  ral different op
0870: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70  erators..**.** p
0880: 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70  rereqRight and p
0890: 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64 20  rereqAll record 
08a0: 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20 6e  sets of cursor n
08b0: 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74  umbers,.** but t
08c0: 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72 65  hey do so indire
08d0: 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ctly.  A single 
08e0: 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75  ExprMaskSet stru
08f0: 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74 65 73  cture translates
0900: 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  .** cursor numbe
0910: 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e 64 20  r into bits and 
0920: 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64 20 62  the translated b
0930: 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  it is stored in 
0940: 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20 66 69  the prereq.** fi
0950: 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61 6e 73  elds.  The trans
0960: 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  lation is used i
0970: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78 69 6d  n order to maxim
0980: 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ize the number o
0990: 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74 20 77  f.** bits that w
09a0: 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42 69 74  ill fit in a Bit
09b0: 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42 45 20  mask.  The VDBE 
09c0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
09d0: 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72 65 61  ight be.** sprea
09e0: 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65 20 6e  d out over the n
09f0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
0a00: 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61 6d 70  gers.  For examp
0a10: 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  le, the cursor.*
0a20: 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  * numbers might 
0a30: 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20  be 3, 8, 9, 10, 
0a40: 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e 64 20  20, 23, 41, and 
0a50: 34 35 2e 20 20 54 68 65 20 45 78 70 72 4d 61 73  45.  The ExprMas
0a60: 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  kSet.** translat
0a70: 65 73 20 74 68 65 73 65 20 73 70 61 72 73 65 20  es these sparse 
0a80: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
0a90: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
0aa0: 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62 65 67 69  integers.** begi
0ab0: 6e 6e 69 6e 67 20 77 69 74 68 20 30 20 69 6e 20  nning with 0 in 
0ac0: 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74 68  order to make th
0ad0: 65 20 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20  e best possible 
0ae0: 75 73 65 20 6f 66 20 74 68 65 20 61 76 61 69 6c  use of the avail
0af0: 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20  able.** bits in 
0b00: 74 68 65 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f  the Bitmask.  So
0b10: 2c 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  , in the example
0b20: 20 61 62 6f 76 65 2c 20 74 68 65 20 63 75 72 73   above, the curs
0b30: 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f  or numbers.** wo
0b40: 75 6c 64 20 62 65 20 6d 61 70 70 65 64 20 69 6e  uld be mapped in
0b50: 74 6f 20 69 6e 74 65 67 65 72 73 20 30 20 74 68  to integers 0 th
0b60: 72 6f 75 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65  rough 7..*/.type
0b70: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0b80: 54 65 72 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a  Term WhereTerm;.
0b90: 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72 6d  struct WhereTerm
0ba0: 20 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72   {.  Expr *pExpr
0bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0bc0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  Pointer to the s
0bd0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
0be0: 20 20 69 31 36 20 69 50 61 72 65 6e 74 3b 20 20    i16 iParent;  
0bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
0c00: 61 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72  able pWC->a[iPar
0c10: 65 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74  ent] when this t
0c20: 65 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  erm disabled */.
0c30: 20 20 69 31 36 20 6c 65 66 74 43 75 72 73 6f 72    i16 leftCursor
0c40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
0c50: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  sor number of X 
0c60: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
0c70: 3e 22 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74  >" */.  i16 left
0c80: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
0c90: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
0ca0: 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e   of X in "X <op>
0cb0: 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31   <expr>" */.  u1
0cc0: 36 20 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 20  6 eOperator;    
0cd0: 20 20 20 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78        /* A WO_xx
0ce0: 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 69 6e   value describin
0cf0: 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66  g <op> */.  u8 f
0d00: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
0d10: 20 20 20 20 2f 2a 20 42 69 74 20 66 6c 61 67 73      /* Bit flags
0d20: 2e 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a  .  See below */.
0d30: 20 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20    u8 nChild;    
0d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0d50: 62 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20  ber of children 
0d60: 74 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c  that must disabl
0d70: 65 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  e us */.  WhereC
0d80: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20  lause *pWC;     
0d90: 20 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20    /* The clause 
0da0: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
0db0: 74 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73  t of */.  Bitmas
0dc0: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
0dd0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
0de0: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70  tables used by p
0df0: 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61  Right */.  Bitma
0e00: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
0e10: 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66     /* Bitmask of
0e20: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
0e30: 65 64 20 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f  ed by p */.};../
0e40: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
0e50: 75 65 73 20 6f 66 20 57 68 65 72 65 54 65 72 6d  ues of WhereTerm
0e60: 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  .flags.*/.#defin
0e70: 65 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20  e TERM_DYNAMIC  
0e80: 20 20 30 78 30 31 20 20 20 2f 2a 20 4e 65 65 64    0x01   /* Need
0e90: 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
0ea0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
0eb0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
0ec0: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
0ed0: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
0ee0: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
0ef0: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
0f00: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
0f10: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
0f20: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
0f30: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
0f40: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
0f50: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
0f60: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
0f70: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
0f80: 4f 4b 20 20 20 20 20 20 30 78 31 30 20 20 20 2f  OK      0x10   /
0f90: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
0fa0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
0fb0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ng */../*.** An 
0fc0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0fe0: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
0ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1000: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
1010: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
1020: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
1030: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
1040: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
1050: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
1060: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
1070: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se;           /*
1080: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1090: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  ext */.  ExprMas
10a0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
10b0: 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20    /* Mapping of 
10c0: 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f  table indices to
10d0: 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 69   bitmasks */.  i
10e0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
10f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1100: 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r of terms */.  
1110: 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20  int nSlot;      
1120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1130: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1140: 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54   a[] */.  WhereT
1150: 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20  erm *a;         
1160: 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64     /* Each a[] d
1170: 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d 20  escribes a term 
1180: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 75  of the WHERE clu
1190: 61 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ase */.  WhereTe
11a0: 72 6d 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20  rm aStatic[10]; 
11b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
11c0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
11d0: 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ] */.};../*.** A
11e0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
11f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1200: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
1210: 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a  k of a mapping.*
1220: 2a 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63  * between VDBE c
1230: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e  ursor numbers an
1240: 64 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69  d bits of the bi
1250: 74 6d 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54  tmasks in WhereT
1260: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  erm..**.** The V
1270: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1280: 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74  rs are small int
1290: 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  egers contained 
12a0: 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69  in .** SrcList_i
12b0: 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20  tem.iCursor and 
12c0: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
12d0: 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76  ds.  For any giv
12e0: 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61  en WHERE .** cla
12f0: 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  use, the cursor 
1300: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f  numbers might no
1310: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
1320: 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a  nd they might.**
1330: 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e   contain gaps in
1340: 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73   the numbering s
1350: 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65  equence.  But we
1360: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61   want to make ma
1370: 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20  ximum.** use of 
1380: 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20  the bits in our 
1390: 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20  bitmasks.  This 
13a0: 73 74 72 75 63 74 75 72 65 20 70 72 6f 76 69 64  structure provid
13b0: 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  es a mapping.** 
13c0: 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20  from the sparse 
13d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69  cursor numbers i
13e0: 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20  nto consecutive 
13f0: 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69  integers beginni
1400: 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a  ng.** with 0..**
1410: 0a 2a 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53  .** If ExprMaskS
1420: 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d  et.ix[A]==B it m
1430: 65 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d  eans that The A-
1440: 74 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d  th bit of a Bitm
1450: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
1460: 64 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ds VDBE cursor n
1470: 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d  umber B.  The A-
1480: 74 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d  th bit of a bitm
1490: 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a  ask is 1<<A..**.
14a0: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
14b0: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
14c0: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75  use expression u
14d0: 73 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a  sed these VDBE.*
14e0: 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35  * cursors:  4, 5
14f0: 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e  , 8, 29, 57, 73.
1500: 20 20 54 68 65 6e 20 74 68 65 20 20 45 78 70 72    Then the  Expr
1510: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
1520: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
1530: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
1540: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
1550: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
1560: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
1570: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
1580: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
1590: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
15a0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
15b0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
15c0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
15d0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
15e0: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
15f0: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
1600: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
1610: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
1620: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
1630: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
1640: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
1650: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
1660: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
1670: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
1680: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
1690: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
16a0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
16b0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
16c0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45  aps..*/.struct E
16d0: 78 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69  xprMaskSet {.  i
16e0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1700: 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e  Number of assign
1710: 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73  ed cursor values
1720: 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a   */.  int ix[siz
1730: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b  eof(Bitmask)*8];
1740: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73      /* Cursor as
1750: 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62  signed to each b
1760: 69 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  it */.};.../*.**
1770: 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68   Bitmasks for th
1780: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
1790: 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c   indices are abl
17a0: 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41  e to exploit.  A
17b0: 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69  n.** OR-ed combi
17c0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  nation of these 
17d0: 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73  values can be us
17e0: 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  ed when searchin
17f0: 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69  g for.** terms i
1800: 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  n the where clau
1810: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se..*/.#define W
1820: 4f 5f 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69  O_IN     1.#defi
1830: 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 32 0a 23  ne WO_EQ     2.#
1840: 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20  define WO_LT    
1850: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d   (WO_EQ<<(TK_LT-
1860: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
1870: 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_LE     (WO_EQ
1880: 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29  <<(TK_LE-TK_EQ))
1890: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20  .#define WO_GT  
18a0: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47     (WO_EQ<<(TK_G
18b0: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
18c0: 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f  e WO_GE     (WO_
18d0: 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51  EQ<<(TK_GE-TK_EQ
18e0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41  )).#define WO_MA
18f0: 54 43 48 20 20 36 34 0a 23 64 65 66 69 6e 65 20  TCH  64.#define 
1900: 57 4f 5f 49 53 4e 55 4c 4c 20 31 32 38 0a 0a 2f  WO_ISNULL 128../
1910: 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 66  *.** Value for f
1920: 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1930: 20 62 65 73 74 49 6e 64 65 78 28 29 2e 20 20 0a   bestIndex().  .
1940: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74 20  **.** The least 
1950: 73 69 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65  significant byte
1960: 20 69 73 20 72 65 73 65 72 76 65 64 20 61 73 20   is reserved as 
1970: 61 20 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76  a mask for WO_ v
1980: 61 6c 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  alues above..** 
1990: 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 66  The WhereLevel.f
19a0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 75 73  lags field is us
19b0: 75 61 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f  ually set to WO_
19c0: 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  IN|WO_EQ|WO_ISNU
19d0: 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  LL..** But if th
19e0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  e table is the r
19f0: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
1a00: 6c 65 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65  left join, Where
1a10: 4c 65 76 65 6c 2e 66 6c 61 67 73 0a 2a 2a 20 69  Level.flags.** i
1a20: 73 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57  s set to WO_IN|W
1a30: 4f 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65  O_EQ.  The Where
1a40: 4c 65 76 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c  Level.flags fiel
1a50: 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73  d can then be us
1a60: 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70  ed as.** the "op
1a70: 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66  " parameter to f
1a80: 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20  indTerm when we 
1a90: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71  are resolving eq
1aa0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1ab0: 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f  ts..** ISNULL co
1ac0: 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74  nstraints will t
1ad0: 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20  hen not be used 
1ae0: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  on the right tab
1af0: 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20  le of a left.** 
1b00: 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23  join.  Tickets #
1b10: 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a  2177 and #2189..
1b20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1b30: 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78  _ROWID_EQ     0x
1b40: 30 30 30 31 30 30 20 20 20 2f 2a 20 72 6f 77 69  000100   /* rowi
1b50: 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20  d=EXPR or rowid 
1b60: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1b70: 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  ine WHERE_ROWID_
1b80: 52 41 4e 47 45 20 20 30 78 30 30 30 32 30 30 20  RANGE  0x000200 
1b90: 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20    /* rowid<EXPR 
1ba0: 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50  and/or rowid>EXP
1bb0: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1bc0: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20  RE_COLUMN_EQ    
1bd0: 30 78 30 30 31 30 30 30 20 20 20 2f 2a 20 78 3d  0x001000   /* x=
1be0: 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e  EXPR or x IN (..
1bf0: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1c00: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1c10: 20 30 78 30 30 32 30 30 30 20 20 20 2f 2a 20 78   0x002000   /* x
1c20: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45  <EXPR and/or x>E
1c30: 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  XPR */.#define W
1c40: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20  HERE_COLUMN_IN  
1c50: 20 20 30 78 30 30 34 30 30 30 20 20 20 2f 2a 20    0x004000   /* 
1c60: 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  x IN (...) */.#d
1c70: 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f  efine WHERE_TOP_
1c80: 4c 49 4d 49 54 20 20 20 20 30 78 30 31 30 30 30  LIMIT    0x01000
1c90: 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72  0   /* x<EXPR or
1ca0: 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61   x<=EXPR constra
1cb0: 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  int */.#define W
1cc0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20  HERE_BTM_LIMIT  
1cd0: 20 20 30 78 30 32 30 30 30 30 20 20 20 2f 2a 20    0x020000   /* 
1ce0: 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50  x>EXPR or x>=EXP
1cf0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
1d00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
1d10: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 38 30  X_ONLY     0x080
1d20: 30 30 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64  000   /* Use ind
1d30: 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74  ex only - omit t
1d40: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
1d50: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20  WHERE_ORDERBY   
1d60: 20 20 20 30 78 31 30 30 30 30 30 20 20 20 2f 2a     0x100000   /*
1d70: 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70   Output will app
1d80: 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f  ear in correct o
1d90: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1da0: 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20  WHERE_REVERSE   
1db0: 20 20 20 30 78 32 30 30 30 30 30 20 20 20 2f 2a     0x200000   /*
1dc0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
1dd0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
1de0: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
1df0: 20 20 20 20 20 30 78 34 30 30 30 30 30 20 20 20       0x400000   
1e00: 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f  /* Selects no mo
1e10: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
1e20: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1e30: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78  _VIRTUALTABLE 0x
1e40: 38 30 30 30 30 30 20 20 20 2f 2a 20 55 73 65 20  800000   /* Use 
1e50: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72  virtual-table pr
1e60: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a  ocessing */../*.
1e70: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
1e80: 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65  preallocated Whe
1e90: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1ea0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1eb0: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  id whereClauseIn
1ec0: 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  it(.  WhereClaus
1ed0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f  e *pWC,        /
1ee0: 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73  * The WhereClaus
1ef0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
1f00: 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  zed */.  Parse *
1f10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1f20: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1f30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1f40: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
1f50: 53 65 74 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e  Set    /* Mappin
1f60: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64  g from table ind
1f70: 69 63 65 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  ices to bitmasks
1f80: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
1f90: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
1fa0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
1fb0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
1fc0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
1fd0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
1fe0: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
1ff0: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2000: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a  pWC->aStatic;.}.
2010: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
2020: 65 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20  e a WhereClause 
2030: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
2040: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
2050: 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20  cture.** itself 
2060: 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54  is not freed.  T
2070: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
2080: 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68  he inverse of wh
2090: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e  ereClauseInit().
20a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20b0: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
20c0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
20d0: 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  C){.  int i;.  W
20e0: 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66  hereTerm *a;.  f
20f0: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
2100: 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d  1, a=pWC->a; i>=
2110: 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20  0; i--, a++){.  
2120: 20 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26    if( a->flags &
2130: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
2140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2150: 70 72 44 65 6c 65 74 65 28 61 2d 3e 70 45 78 70  prDelete(a->pExp
2160: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2170: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
2180: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
2190: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 43  sqlite3_free(pWC
21a0: 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ->a);.  }.}../*.
21b0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74  ** Add a new ent
21c0: 72 69 65 73 20 74 6f 20 74 68 65 20 57 68 65 72  ries to the Wher
21d0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
21e0: 65 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68 65  e.  Increase the
21f0: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 70   allocated.** sp
2200: 61 63 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  ace as necessary
2210: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2220: 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e  lags argument in
2230: 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41  cludes TERM_DYNA
2240: 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e  MIC, then respon
2250: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20  sibility.** for 
2260: 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72  freeing the expr
2270: 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75  ession p is assu
2280: 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65  med by the Where
2290: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 2a  Clause object..*
22a0: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54  *.** WARNING:  T
22b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
22c0: 74 20 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65  t reallocate the
22d0: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 73   space used to s
22e0: 74 6f 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72  tore.** WhereTer
22f0: 6d 73 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72  ms.  All pointer
2300: 73 20 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20  s to WhereTerms 
2310: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69  should be invali
2320: 64 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ded after.** cal
2330: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
2340: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
2350: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
2360: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
2370: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
2380: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
2390: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
23a0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
23b0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
23c0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
23d0: 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  s){.  WhereTerm 
23e0: 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64  *pTerm;.  int id
23f0: 78 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  x;.  if( pWC->nT
2400: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
2410: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
2420: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
2430: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
2440: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
2450: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
2460: 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29 3b 0a  pWC->nSlot*2 );.
2470: 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61 3d 3d      if( pWC->a==
2480: 30 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e  0 ){.      pWC->
2490: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
24a0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
24b0: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
24c0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
24d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24e0: 78 70 72 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  xprDelete(p);.  
24f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2500: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
2510: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
2520: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
2530: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
2540: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
2550: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
2560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2570: 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20  free(pOld);.    
2580: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
2590: 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65   *= 2;.  }.  pTe
25a0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
25b0: 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a   = pWC->nTerm];.
25c0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b 0a    pWC->nTerm++;.
25d0: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
25e0: 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c 61   p;.  pTerm->fla
25f0: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70 54  gs = flags;.  pT
2600: 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  erm->pWC = pWC;.
2610: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
2620: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
2630: 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  idx;.}../*.** Th
2640: 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74  is routine ident
2650: 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73  ifies subexpress
2660: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
2670: 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a  E clause where.*
2680: 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  * each subexpres
2690: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
26a0: 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65  d by the AND ope
26b0: 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74  rator or some ot
26c0: 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  her.** operator 
26d0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
26e0: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20   op parameter.  
26f0: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
2700: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20  structure.** is 
2710: 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e  filled with poin
2720: 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65  ters to subexpre
2730: 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61  ssions.  For exa
2740: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57  mple:.**.**    W
2750: 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27  HERE  a=='hello'
2760: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c   AND coalesce(b,
2770: 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32  11)<10 AND (c+12
2780: 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a  !=d OR c==22).**
2790: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
27a0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
27b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
27c0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
27d0: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
27e0: 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20   slot[0]        
27f0: 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20      slot[1]     
2800: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32            slot[2
2810: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ].**.** The orig
2820: 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
2830: 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e  e in pExpr is un
2840: 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68  altered.  All th
2850: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
2860: 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b  es is make slot[
2870: 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20  ] entries point 
2880: 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20  to substructure 
2890: 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a  within pExpr..**
28a0: 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69  .** In the previ
28b0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64  ous sentence and
28c0: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c   in the diagram,
28d0: 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73   "slot[]" refers
28e0: 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65   to.** the Where
28f0: 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79  Clause.a[] array
2900: 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67 72  .  This array gr
2910: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
2920: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
2930: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2940: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
2950: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
2960: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
2970: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
2980: 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  pr, int op){.  i
2990: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
29a0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
29b0: 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20  r->op!=op ){.   
29c0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
29d0: 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30  rt(pWC, pExpr, 0
29e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29f0: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
2a00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70  pExpr->pLeft, op
2a10: 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  );.    whereSpli
2a20: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52  t(pWC, pExpr->pR
2a30: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
2a40: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2a50: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
2a60: 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65   mask set.*/.#de
2a70: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
2a80: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
2a90: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
2aa0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2ab0: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
2ac0: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
2ad0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
2ae0: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
2af0: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
2b10: 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61  k getMask(ExprMa
2b20: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2b30: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2b40: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2b50: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
2b60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2b70: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
2b80: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
2b90: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
2ba0: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
2bb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2bd0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
2be0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
2bf0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
2c00: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
2c10: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
2c20: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
2c30: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
2c40: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2c50: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
2c60: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
2c70: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
2c80: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
2c90: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
2ca0: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
2cb0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
2cc0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
2cd0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
2ce0: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
2cf0: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2d00: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
2d10: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
2d20: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
2d30: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
2d40: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
2d50: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
2d60: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d80: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
2d90: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
2da0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
2db0: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
2dc0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
2dd0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
2de0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
2df0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
2e00: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
2e10: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
2e20: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
2e30: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2e40: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
2e50: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
2e60: 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72  oked sqlite3Expr
2e70: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 6f  ResolveNames() o
2e80: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2e90: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
2ea0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
2eb0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
2ec0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2ed0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
2ee0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
2ef0: 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  veNames() routin
2f00: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
2f10: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
2f20: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
2f30: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
2f40: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
2f50: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
2f60: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
2f70: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
2f80: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
2f90: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
2fa0: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
2fb0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2fc0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
2fd0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
2fe0: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
2ff0: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
3000: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3010: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
3020: 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 45  (ExprMaskSet*, E
3030: 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
3040: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
3050: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 45  lectTableUsage(E
3060: 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c  xprMaskSet*, Sel
3070: 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ect*);.static Bi
3080: 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55  tmask exprTableU
3090: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
30a0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
30b0: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
30c0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
30d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
30e0: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
30f0: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
3100: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
3110: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
3120: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
3130: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  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 52  (pMaskSet, p->pR
3160: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
3170: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
3180: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
3190: 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ft);.  mask |= e
31a0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
31b0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
31c0: 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  List);.  mask |=
31d0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
31e0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
31f0: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  p->pSelect);.  r
3200: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
3210: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
3220: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
3230: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
3240: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
3250: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
3260: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
3270: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
3280: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
3290: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
32a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
32b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
32c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
32d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
32e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
32f0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
3300: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
3310: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
3320: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  e(ExprMaskSet *p
3330: 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20  MaskSet, Select 
3340: 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  *pS){.  Bitmask 
3350: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c  mask = 0;.  whil
3360: 65 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73  e( pS ){.    mas
3370: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
3380: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
3390: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  , pS->pEList);. 
33a0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
33b0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
33c0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f  askSet, pS->pGro
33d0: 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  upBy);.    mask 
33e0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
33f0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
3400: 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  pS->pOrderBy);. 
3410: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
3420: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
3430: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
3440: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
3450: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
3460: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
3470: 67 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d  g);.    pS = pS-
3480: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
3490: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
34a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
34b0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
34c0: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
34d0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
34e0: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
34f0: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
3500: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
3510: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
3520: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
3530: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
3540: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61  ", "<=", ">=", a
3550: 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74  nd "IN"..*/.stat
3560: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
3570: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
3580: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
3590: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
35a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
35b0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
35c0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
35d0: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
35e0: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
35f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
3600: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
3610: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
3620: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
3630: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
3640: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
3650: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
3660: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
3670: 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53   T..*/.#define S
3680: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
3690: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
36a0: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
36b0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e  te a comparision
36c0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72   operator.  Expr
36d0: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
36e0: 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20  orm "X op Y".** 
36f0: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
3700: 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a  to "Y op X"..**.
3710: 2a 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f  ** If a collatio
3720: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73  n sequence is as
3730: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69  sociated with ei
3740: 74 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72  ther the left or
3750: 20 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f   right.** side o
3760: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
3770: 2c 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73  , it remains ass
3780: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3790: 20 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72   same side after
37a0: 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74  .** the commutat
37b0: 69 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61  ion. So "Y colla
37c0: 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20  te NOCASE op X" 
37d0: 62 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63  becomes .** "X c
37e0: 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70  ollate NOCASE op
37f0: 20 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63   Y". This is bec
3800: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
3810: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
3820: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
3830: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
3840: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
3850: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
3860: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
3870: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
3880: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
3890: 61 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43  ason the EP_ExpC
38a0: 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69  ollate flag.** i
38b0: 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a  s not commuted..
38c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
38d0: 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20  xprCommute(Expr 
38e0: 2a 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65  *pExpr){.  u16 e
38f0: 78 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72  xpRight = (pExpr
3900: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
3910: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
3920: 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20  ;.  u16 expLeft 
3930: 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
3940: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
3950: 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72  ollate);.  asser
3960: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
3970: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
3980: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
3990: 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70   SWAP(CollSeq*,p
39a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
39b0: 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  oll,pExpr->pLeft
39c0: 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70  ->pColl);.  pExp
39d0: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
39e0: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
39f0: 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45  t->flags & ~EP_E
3a00: 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70  xpCollate) | exp
3a10: 4c 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70  Left;.  pExpr->p
3a20: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70  Left->flags = (p
3a30: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
3a40: 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c  gs & ~EP_ExpColl
3a50: 61 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b  ate) | expRight;
3a60: 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45  .  SWAP(Expr*,pE
3a70: 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70  xpr->pRight,pExp
3a80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
3a90: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
3aa0: 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
3ab0: 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
3ac0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  );.    assert( T
3ad0: 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b  K_GE==TK_LE+2 );
3ae0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3af0: 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  GT>TK_EQ );.    
3b00: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b  assert( TK_GT<TK
3b10: 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LE );.    asser
3b20: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  t( pExpr->op>=TK
3b30: 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _GT && pExpr->op
3b40: 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70  <=TK_GE );.    p
3b50: 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78  Expr->op = ((pEx
3b60: 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29  pr->op-TK_GT)^2)
3b70: 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f  +TK_GT;.  }.}../
3b80: 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66  *.** Translate f
3b90: 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74  rom TK_xx operat
3ba0: 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d  or to WO_xx bitm
3bb0: 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ask..*/.static i
3bc0: 6e 74 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28  nt operatorMask(
3bd0: 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 63  int op){.  int c
3be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
3bf0: 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69  wedOp(op) );.  i
3c00: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
3c10: 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20      c = WO_IN;. 
3c20: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
3c30: 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
3c40: 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  c = WO_ISNULL;. 
3c50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20   }else{.    c = 
3c60: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
3c70: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
3c80: 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c   op!=TK_ISNULL |
3c90: 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  | c==WO_ISNULL )
3ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3cb0: 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49  TK_IN || c==WO_I
3cc0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  N );.  assert( o
3cd0: 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57  p!=TK_EQ || c==W
3ce0: 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74  O_EQ );.  assert
3cf0: 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63  ( op!=TK_LT || c
3d00: 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73  ==WO_LT );.  ass
3d10: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c  ert( op!=TK_LE |
3d20: 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20  | c==WO_LE );.  
3d30: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
3d40: 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b  T || c==WO_GT );
3d50: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3d60: 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45  K_GE || c==WO_GE
3d70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a   );.  return c;.
3d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
3d90: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
3da0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
3db0: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
3dc0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
3dd0: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
3de0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
3df0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
3e00: 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f  able iCur and <o
3e10: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20  p> is one of.** 
3e20: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
3e30: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
3e40: 65 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72  ed by the op par
3e50: 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72  ameter..** Retur
3e60: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
3e70: 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e  he term.  Return
3e80: 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e   0 if not found.
3e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
3ea0: 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a  Term *findTerm(.
3eb0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3ec0: 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  WC,     /* The W
3ed0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
3ee0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
3ef0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
3f00: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
3f10: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
3f20: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
3f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3f40: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  mn number of LHS
3f50: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
3f60: 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52  tReady,     /* R
3f70: 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72  HS must not over
3f80: 6c 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61  lap with this ma
3f90: 73 6b 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20  sk */.  u16 op, 
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3fb0: 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76   Mask of WO_xx v
3fc0: 61 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67  alues describing
3fd0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49   operator */.  I
3fe0: 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
3ff0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
4000: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
4010: 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e  this index, if n
4020: 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
4030: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
4040: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 66 6f 72  ;.  int k;.  for
4050: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b  (pTerm=pWC->a, k
4060: 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20  =pWC->nTerm; k; 
4070: 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  k--, pTerm++){. 
4080: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
4090: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20  ftCursor==iCur. 
40a0: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
40b0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
40c0: 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20  otReady)==0.    
40d0: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66     && pTerm->lef
40e0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
40f0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72  .       && (pTer
4100: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f  m->eOperator & o
4110: 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  p)!=0.    ){.   
4120: 20 20 20 69 66 28 20 69 43 75 72 3e 3d 30 20 26     if( iCur>=0 &
4130: 26 20 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d  & pIdx && pTerm-
4140: 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49  >eOperator!=WO_I
4150: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
4160: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
4170: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
4180: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
4190: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
41a0: 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69  dxaff;.        i
41b0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61  nt j;.        Pa
41c0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
41d0: 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20  C->pParse;..    
41e0: 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49 64      idxaff = pId
41f0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
4200: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
4210: 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
4220: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
4230: 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66  nityOk(pX, idxaf
4240: 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  f) ) continue;..
4250: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72          /* Figur
4260: 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74  e out the collat
4270: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71  ion sequence req
4280: 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e  uired from an in
4290: 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20  dex for.        
42a0: 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73 65 66  ** it to be usef
42b0: 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e  ul for optimisin
42c0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e  g expression pX.
42d0: 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20   Store this.    
42e0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20      ** value in 
42f0: 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a  variable pColl..
4300: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4310: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
4320: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43  eft);.        pC
4330: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
4340: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
4350: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
4360: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
4370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
4380: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
4390: 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
43a0: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
43b0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
43c0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
43d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Idx->nColumn && 
43e0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
43f0: 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  ]!=iColumn; j++)
4400: 7b 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  {}.        asser
4410: 74 28 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  t( j<pIdx->nColu
4420: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  mn );.        if
4430: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
4440: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
4450: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20  Idx->azColl[j]) 
4460: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4470: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
4480: 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
4490: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
44a0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
44b0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
44c0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
44d0: 28 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65  (SrcList*, Where
44e0: 43 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a  Clause*, int);..
44f0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41  /*.** Call exprA
4500: 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65  nalyze on all te
4510: 72 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63  rms in a WHERE c
4520: 6c 61 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  lause.  .**.**.*
4530: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
4540: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20  prAnalyzeAll(.  
4550: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
4560: 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  t,       /* the 
4570: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
4580: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4590: 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  C         /* the
45a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
45b0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
45c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
45d0: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
45e0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
45f0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54    exprAnalyze(pT
4600: 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b  abList, pWC, i);
4610: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
4620: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
4630: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
4640: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
4650: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
4660: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49  pression is a LI
4670: 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61  KE or GLOB opera
4680: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  tor that.** can 
4690: 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69  be optimized usi
46a0: 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ng inequality co
46b0: 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75  nstraints.  Retu
46c0: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
46d0: 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65  .** so and false
46e0: 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
46f0: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  n order for the 
4700: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
4710: 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20  ptimizible, the 
4720: 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73 74  RHS must be a st
4730: 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20  ring.** literal 
4740: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  that does not be
4750: 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63  gin with a wildc
4760: 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  ard.  .*/.static
4770: 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   int isLikeOrGlo
4780: 62 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b(.  sqlite3 *db
4790: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ,      /* The da
47a0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 45 78 70 72  tabase */.  Expr
47b0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
47c0: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
47d0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ssion */.  int *
47e0: 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a 20  pnPattern,   /* 
47f0: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
4800: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
4810: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69 6e  aracters */.  in
4820: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 20  t *pisComplete  
4830: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
4840: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
4850: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
4860: 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  aracter */.){.  
4870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
4880: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
4890: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 4c 69 73  pLeft;.  ExprLis
48a0: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
48b0: 63 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 6e 6f  c, cnt;.  int no
48c0: 43 61 73 65 3b 0a 20 20 63 68 61 72 20 77 63 5b  Case;.  char wc[
48d0: 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  3];.  CollSeq *p
48e0: 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20 21 73 71  Coll;..  if( !sq
48f0: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
4900: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 26  ion(db, pExpr, &
4910: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
4920: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4930: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
4940: 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68  ->pList;.  pRigh
4950: 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t = pList->a[0].
4960: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69  pExpr;.  if( pRi
4970: 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49  ght->op!=TK_STRI
4980: 4e 47 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  NG ){.    return
4990: 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20   0;.  }.  pLeft 
49a0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  = pList->a[1].pE
49b0: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  xpr;.  if( pLeft
49c0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
49d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
49e0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 70  .  }.  pColl = p
49f0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 69  Left->pColl;.  i
4a00: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20  f( pColl==0 ){. 
4a10: 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 6f 76 65     /* TODO: Cove
4a20: 72 61 67 65 20 74 65 73 74 69 6e 67 20 64 6f 65  rage testing doe
4a30: 73 6e 27 74 20 67 65 74 20 74 68 69 73 20 63 61  sn't get this ca
4a40: 73 65 2e 20 49 73 20 69 74 20 61 63 74 75 61 6c  se. Is it actual
4a50: 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
4a60: 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73  ** for an expres
4a70: 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b 5f  sion of type TK_
4a80: 43 4f 4c 55 4d 4e 20 74 6f 20 6e 6f 74 20 68 61  COLUMN to not ha
4a90: 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20 63  ve an assigned c
4aa0: 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  ollation .    **
4ab0: 20 73 65 71 75 65 6e 63 65 20 61 74 20 74 68 69   sequence at thi
4ac0: 73 20 70 6f 69 6e 74 3f 0a 20 20 20 20 2a 2f 0a  s point?.    */.
4ad0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
4ae0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20  pDfltColl;.  }. 
4af0: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70   if( (pColl->typ
4b00: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  e!=SQLITE_COLL_B
4b10: 49 4e 41 52 59 20 7c 7c 20 6e 6f 43 61 73 65 29  INARY || noCase)
4b20: 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c   &&.      (pColl
4b30: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
4b40: 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 6e  OLL_NOCASE || !n
4b50: 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65  oCase) ){.    re
4b60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
4b70: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
4b80: 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  (db, pRight);.  
4b90: 7a 20 3d 20 28 63 68 61 72 20 2a 29 70 52 69 67  z = (char *)pRig
4ba0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66  ht->token.z;.  f
4bb0: 6f 72 28 63 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63  or(cnt=0; (c=z[c
4bc0: 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63  nt])!=0 && c!=wc
4bd0: 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20  [0] && c!=wc[1] 
4be0: 26 26 20 63 21 3d 77 63 5b 32 5d 3b 20 63 6e 74  && c!=wc[2]; cnt
4bf0: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 6e 74 3d  ++){}.  if( cnt=
4c00: 3d 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a  =0 || 255==(u8)z
4c10: 5b 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74  [cnt] ){.    ret
4c20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69  urn 0;.  }.  *pi
4c30: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e  sComplete = z[cn
4c40: 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63  t]==wc[0] && z[c
4c50: 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50  nt+1]==0;.  *pnP
4c60: 61 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20  attern = cnt;.  
4c70: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
4c80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4c90: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
4ca0: 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  ION */...#ifndef
4cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4cc0: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
4cd0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
4ce0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
4cf0: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
4d00: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  orm.**.**       
4d10: 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
4d20: 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  xpr.**.** If it 
4d30: 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54  is then return T
4d40: 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65  RUE.  If not, re
4d50: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
4d60: 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63  tatic int isMatc
4d70: 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70  hOfColumn(.  Exp
4d80: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a  r *pExpr      /*
4d90: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
4da0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  ssion */.){.  Ex
4db0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a  prList *pList;..
4dc0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
4dd0: 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a  =TK_FUNCTION ){.
4de0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4df0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  }.  if( pExpr->t
4e00: 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20  oken.n!=5 ||.   
4e10: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49      sqlite3StrNI
4e20: 43 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  Cmp((const char*
4e30: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
4e40: 22 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b  "match",5)!=0 ){
4e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4e60: 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78   }.  pList = pEx
4e70: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
4e80: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32   pList->nExpr!=2
4e90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4ea0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
4eb0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[1].pExpr->o
4ec0: 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29  p != TK_COLUMN )
4ed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4ee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
4ef0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
4f00: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4f10: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ABLE */../*.** I
4f20: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
4f30: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
4f40: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
4f50: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
4f60: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
4f70: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
4f80: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
4f90: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
4fa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4fb0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
4fc0: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
4fd0: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
4fe0: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
4ff0: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
5000: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
5010: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
5020: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
5030: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
5040: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69  JoinTable;.}..#i
5050: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5060: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
5070: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
5080: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5090: 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20  SUBQUERY)./*.** 
50a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
50b0: 68 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f 66  he given term of
50c0: 20 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63 61   an OR clause ca
50d0: 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0a 2a  n be converted.*
50e0: 2a 20 69 6e 74 6f 20 61 6e 20 49 4e 20 63 6c 61  * into an IN cla
50f0: 75 73 65 2e 20 20 54 68 65 20 69 43 75 72 73 6f  use.  The iCurso
5100: 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 20 64 65  r and iColumn de
5110: 66 69 6e 65 20 74 68 65 20 6c 65 66 74 2d 68 61  fine the left-ha
5120: 6e 64 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68  nd.** side of th
5130: 65 20 49 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  e IN clause..**.
5140: 2a 2a 20 54 68 65 20 63 6f 6e 74 65 78 74 20 69  ** The context i
5150: 73 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6d  s that we have m
5160: 75 6c 74 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65  ultiple OR-conne
5170: 63 74 65 64 20 65 71 75 61 6c 69 74 79 20 74 65  cted equality te
5180: 72 6d 73 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  rms.** like this
5190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
51a0: 20 20 61 3d 3c 65 78 70 72 31 3e 20 4f 52 20 20    a=<expr1> OR  
51b0: 61 3d 3c 65 78 70 72 32 3e 20 4f 52 20 62 3d 3c  a=<expr2> OR b=<
51c0: 65 78 70 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a  expr3>  OR ....*
51d0: 2a 0a 2a 2a 20 54 68 65 20 70 4f 72 54 65 72 6d  *.** The pOrTerm
51e0: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
51f0: 6f 75 74 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e  outine correspon
5200: 64 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 74  ds to a single t
5210: 65 72 6d 20 6f 66 0a 2a 2a 20 74 68 69 73 20 4f  erm of.** this O
5220: 52 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72  R clause.  In or
5230: 64 65 72 20 66 6f 72 20 74 68 65 20 74 65 72 6d  der for the term
5240: 20 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 64 61   to be a condida
5250: 74 65 20 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72  te for.** conver
5260: 73 69 6f 6e 20 74 6f 20 61 6e 20 49 4e 20 6f 70  sion to an IN op
5270: 65 72 61 74 6f 72 2c 20 74 68 65 20 66 6f 6c 6c  erator, the foll
5280: 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72  owing must be tr
5290: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ue:.**.**     * 
52a0: 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
52b0: 69 64 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ide of the term 
52c0: 6d 75 73 74 20 62 65 20 74 68 65 20 63 6f 6c 75  must be the colu
52d0: 6d 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 20 20  mn which.**     
52e0: 20 20 20 69 73 20 69 64 65 6e 74 69 66 69 65 64     is identified
52f0: 20 62 79 20 69 43 75 72 73 6f 72 20 61 6e 64 20   by iCursor and 
5300: 69 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20  iColumn..**.**  
5310: 20 20 20 2a 20 20 49 66 20 74 68 65 20 72 69 67     *  If the rig
5320: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
5330: 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  also a column, t
5340: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69  hen the affiniti
5350: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  es.**        of 
5360: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
5370: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
5380: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
5390: 79 70 65 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  ype.**        co
53a0: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65  nversions are re
53b0: 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69  quired on the ri
53c0: 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32  ght.  (Ticket #2
53d0: 32 34 39 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f  249).**.** If bo
53e0: 74 68 20 6f 66 20 74 68 65 73 65 20 63 6f 6e 64  th of these cond
53f0: 69 74 69 6f 6e 73 20 61 72 65 20 74 72 75 65 2c  itions are true,
5400: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 72 75   then return tru
5410: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
5420: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
5430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 72 54  /.static int orT
5440: 65 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74  ermIsOptCandidat
5450: 65 28 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72  e(WhereTerm *pOr
5460: 54 65 72 6d 2c 20 69 6e 74 20 69 43 75 72 73 6f  Term, int iCurso
5470: 72 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b  r, int iColumn){
5480: 0a 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20  .  int affLeft, 
5490: 61 66 66 52 69 67 68 74 3b 0a 20 20 61 73 73 65  affRight;.  asse
54a0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  rt( pOrTerm->eOp
54b0: 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b  erator==WO_EQ );
54c0: 0a 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  .  if( pOrTerm->
54d0: 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
54e0: 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
54f0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
5500: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75  OrTerm->leftColu
5510: 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  mn!=iColumn ){. 
5520: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5530: 0a 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71  .  affRight = sq
5540: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
5550: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
5560: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28  ->pRight);.  if(
5570: 20 61 66 66 52 69 67 68 74 3d 3d 30 20 29 7b 0a   affRight==0 ){.
5580: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5590: 7d 0a 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71  }.  affLeft = sq
55a0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
55b0: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
55c0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
55d0: 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66  affRight!=affLef
55e0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
55f0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5600: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
5610: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
5620: 69 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20  iven term of an 
5630: 4f 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65  OR clause can be
5640: 20 69 67 6e 6f 72 65 64 20 64 75 72 69 6e 67 0a   ignored during.
5650: 2a 2a 20 61 20 63 68 65 63 6b 20 74 6f 20 6d 61  ** a check to ma
5660: 6b 65 20 73 75 72 65 20 61 6c 6c 20 4f 52 20 74  ke sure all OR t
5670: 65 72 6d 73 20 61 72 65 20 63 61 6e 64 69 64 61  erms are candida
5680: 74 65 73 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61  tes for optimiza
5690: 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  tion..** In othe
56a0: 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
56b0: 74 72 75 65 20 69 66 20 61 20 63 61 6c 6c 20 74  true if a call t
56c0: 6f 20 74 68 65 20 6f 72 54 65 72 6d 49 73 4f 70  o the orTermIsOp
56d0: 74 43 61 6e 64 69 64 61 74 65 28 29 0a 2a 2a 20  tCandidate().** 
56e0: 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 66  above returned f
56f0: 61 6c 73 65 20 62 75 74 20 69 74 20 69 73 20 6e  alse but it is n
5700: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
5710: 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 0a 2a  disqualify the.*
5720: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  * optimization..
5730: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
5740: 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 70 68  e original OR ph
5750: 72 61 73 65 20 77 61 73 20 74 68 69 73 3a 0a 2a  rase was this:.*
5760: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
5770: 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52  =4  OR  a=11  OR
5780: 20 20 61 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69    a=b.**.** Duri
5790: 6e 67 20 61 6e 61 6c 79 73 69 73 2c 20 74 68 65  ng analysis, the
57a0: 20 74 68 69 72 64 20 74 65 72 6d 20 67 65 74 73   third term gets
57b0: 20 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64 20   flipped around 
57c0: 61 6e 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a  and duplicate.**
57d0: 20 73 6f 20 74 68 61 74 20 77 65 20 61 72 65 20   so that we are 
57e0: 6c 65 66 74 20 77 69 74 68 20 74 68 69 73 3a 0a  left with this:.
57f0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
5800: 61 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f  a=4  OR  a=11  O
5810: 52 20 20 61 3d 62 20 20 4f 52 20 20 62 3d 61 0a  R  a=b  OR  b=a.
5820: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  **.** Since the 
5830: 6c 61 73 74 20 74 77 6f 20 74 65 72 6d 73 20 61  last two terms a
5840: 72 65 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f  re duplicates, o
5850: 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a  nly one of them.
5860: 2a 2a 20 68 61 73 20 74 6f 20 71 75 61 6c 69 66  ** has to qualif
5870: 79 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  y in order for t
5880: 68 65 20 77 68 6f 6c 65 20 70 68 72 61 73 65 20  he whole phrase 
5890: 74 6f 20 71 75 61 6c 69 66 79 2e 20 20 57 68 65  to qualify.  Whe
58a0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
58b0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
58c0: 6b 6e 6f 77 20 74 68 61 74 20 70 4f 72 54 65 72  know that pOrTer
58d0: 6d 20 64 69 64 20 6e 6f 74 20 71 75 61 6c 69 66  m did not qualif
58e0: 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  y..** This routi
58f0: 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73  ne merely checks
5900: 20 74 6f 20 73 65 65 20 69 66 20 70 4f 72 54 65   to see if pOrTe
5910: 72 6d 20 68 61 73 20 61 20 64 75 70 6c 69 63 61  rm has a duplica
5920: 74 65 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  te that.** might
5930: 20 71 75 61 6c 69 66 79 2e 20 20 49 66 20 74 68   qualify.  If th
5940: 65 72 65 20 69 73 20 61 20 64 75 70 6c 69 63 61  ere is a duplica
5950: 74 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  te that has not 
5960: 79 65 74 20 62 65 65 6e 0a 2a 2a 20 64 69 73 71  yet been.** disq
5970: 75 61 6c 69 66 69 65 64 2c 20 74 68 65 6e 20 72  ualified, then r
5980: 65 74 75 72 6e 20 74 72 75 65 2e 20 20 49 66 20  eturn true.  If 
5990: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 75 70  there are no dup
59a0: 6c 69 63 61 74 65 73 2c 20 6f 72 0a 2a 2a 20 74  licates, or.** t
59b0: 68 65 20 64 75 70 6c 69 63 61 74 65 20 68 61 73  he duplicate has
59c0: 20 61 6c 73 6f 20 62 65 65 6e 20 64 69 73 71 75   also been disqu
59d0: 61 6c 69 66 65 64 2c 20 72 65 74 75 72 6e 20 66  alifed, return f
59e0: 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alse..*/.static 
59f0: 69 6e 74 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44  int orTermHasOkD
5a00: 75 70 6c 69 63 61 74 65 28 57 68 65 72 65 43 6c  uplicate(WhereCl
5a10: 61 75 73 65 20 2a 70 4f 72 2c 20 57 68 65 72 65  ause *pOr, Where
5a20: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a  Term *pOrTerm){.
5a30: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66    if( pOrTerm->f
5a40: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
5a50: 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ED ){.    /* Thi
5a60: 73 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61  s is the origina
5a70: 6c 20 74 65 72 6d 2e 20 20 54 68 65 20 64 75 70  l term.  The dup
5a80: 6c 69 63 61 74 65 20 69 73 20 74 6f 20 74 68 65  licate is to the
5a90: 20 6c 65 66 74 20 68 61 64 0a 20 20 20 20 2a 2a   left had.    **
5aa0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
5ab0: 6e 20 61 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74  n analyzed and t
5ac0: 68 75 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20  hus has not yet 
5ad0: 62 65 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65  been disqualifie
5ae0: 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
5af0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   1;.  }.  if( (p
5b00: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  OrTerm->flags & 
5b10: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30  TERM_VIRTUAL)!=0
5b20: 0a 20 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61  .     && (pOr->a
5b30: 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e  [pOrTerm->iParen
5b40: 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  t].flags & TERM_
5b50: 4f 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20  OR_OK)!=0 ){.   
5b60: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 64 75   /* This is a du
5b70: 70 6c 69 63 61 74 65 20 74 65 72 6d 2e 20 20 54  plicate term.  T
5b80: 68 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c  he original qual
5b90: 69 66 69 65 64 20 73 6f 20 74 68 69 73 20 6f 6e  ified so this on
5ba0: 65 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  e.    ** does no
5bb0: 74 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20  t have to. */.  
5bc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
5bd0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69 74    /* This is eit
5be0: 68 65 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20  her a singleton 
5bf0: 74 65 72 6d 20 6f 72 20 65 6c 73 65 20 69 74 20  term or else it 
5c00: 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66  is a duplicate f
5c10: 6f 72 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68  or.  ** which th
5c20: 65 20 6f 72 69 67 69 6e 61 6c 20 64 69 64 20 6e  e original did n
5c30: 6f 74 20 71 75 61 6c 69 66 79 2e 20 20 45 69 74  ot qualify.  Eit
5c40: 68 65 72 20 77 61 79 20 77 65 20 61 72 65 20 64  her way we are d
5c50: 6f 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65  one for. */.  re
5c60: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
5c70: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
5c80: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
5c90: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
5ca0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
5cb0: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f  .** The input to
5cc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5cd0: 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74   an WhereTerm st
5ce0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
5cf0: 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22  y the.** "pExpr"
5d00: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
5d10: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
5d20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
5d30: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
5d40: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
5d50: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
5d60: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
5d70: 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d  of the WhereTerm
5d80: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
5d90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
5da0: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5db0: 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f   form "<expr> <o
5dc0: 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f  p> X" it gets co
5dd0: 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  mmuted.** to the
5de0: 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f   standard form o
5df0: 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  f "X <op> <expr>
5e00: 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  ".  If the expre
5e10: 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74  ssion is of.** t
5e20: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
5e30: 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20  Y" where both X 
5e40: 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e  and Y are column
5e50: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
5e60: 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69  inal.** expressi
5e70: 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  on is unchanged 
5e80: 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  and a new virtua
5e90: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  l expression of 
5ea0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
5eb0: 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20  op> X" is added 
5ec0: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
5ed0: 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64  use and analyzed
5ee0: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a   separately..*/.
5ef0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5f00: 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69  Analyze(.  SrcLi
5f10: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
5f20: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
5f30: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
5f40: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
5f50: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
5f60: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
5f70: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
5f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
5f90: 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74  ex of the term t
5fa0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
5fb0: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
5fc0: 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
5fd0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78 70  [idxTerm];.  Exp
5fe0: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
5ff0: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
6000: 65 74 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  et;.  Expr *pExp
6010: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
6020: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  ;.  Bitmask prer
6030: 65 71 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73  eqLeft;.  Bitmas
6040: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69  k prereqAll;.  i
6050: 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69  nt nPattern;.  i
6060: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
6070: 20 69 6e 74 20 6f 70 3b 0a 20 20 50 61 72 73 65   int op;.  Parse
6080: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
6090: 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
60a0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
60b0: 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  db;..  if( db->m
60c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
60d0: 74 75 72 6e 3b 0a 20 20 70 72 65 72 65 71 4c 65  turn;.  prereqLe
60e0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
60f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
6100: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
6110: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
6120: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
6130: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
6140: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
6150: 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  ;.    pTerm->pre
6160: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c  reqRight = exprL
6170: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
6180: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
6190: 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20 20  List).          
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  | exprSelectTabl
61c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
61d0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29   pExpr->pSelect)
61e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
61f0: 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
6200: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
6210: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Right = 0;.  }el
6220: 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70  se{.    pTerm->p
6230: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
6240: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
6250: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  kSet, pExpr->pRi
6260: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72  ght);.  }.  prer
6270: 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c  eqAll = exprTabl
6280: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
6290: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45   pExpr);.  if( E
62a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
62b0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
62c0: 6e 29 20 29 7b 0a 20 20 20 20 70 72 65 72 65 71  n) ){.    prereq
62d0: 41 6c 6c 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70  All |= getMask(p
62e0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
62f0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
6300: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70  ;.  }.  pTerm->p
6310: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
6320: 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c  qAll;.  pTerm->l
6330: 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  eftCursor = -1;.
6340: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
6350: 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e   = -1;.  pTerm->
6360: 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20  eOperator = 0;. 
6370: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f   if( allowedOp(o
6380: 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72  p) && (pTerm->pr
6390: 65 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72  ereqRight & prer
63a0: 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20  eqLeft)==0 ){.  
63b0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
63c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
63d0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
63e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
63f0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
6400: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
6410: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66        pTerm->lef
6420: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
6430: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
6440: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
6450: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
6460: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
6470: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
6480: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20  atorMask(op);.  
6490: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
64a0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
64b0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
64c0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
64d0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
64e0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
64f0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
6500: 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sor>=0 ){.      
6510: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
6520: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
6530: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
6540: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6550: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
6560: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
6570: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6580: 65 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ete(pDup);.     
6590: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
65a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
65b0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
65c0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
65d0: 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  Dup, TERM_VIRTUA
65e0: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
65f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
6600: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
6610: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
6620: 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b  &pWC->a[idxNew];
6630: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
6640: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
6650: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
6660: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
6670: 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  m];.        pTer
6680: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
6690: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c         pTerm->fl
66a0: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49  ags |= TERM_COPI
66b0: 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ED;.      }else{
66c0: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
66d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  pExpr;.        p
66e0: 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  New = pTerm;.   
66f0: 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43     }.      exprC
6700: 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20  ommute(pDup);.  
6710: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70      pLeft = pDup
6720: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  ->pLeft;.      p
6730: 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  New->leftCursor 
6740: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
6750: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66  .      pNew->lef
6760: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
6770: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
6780: 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68  pNew->prereqRigh
6790: 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a  t = prereqLeft;.
67a0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
67b0: 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c  eqAll = prereqAl
67c0: 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  l;.      pNew->e
67d0: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
67e0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
67f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
6800: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6810: 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49  T_BETWEEN_OPTIMI
6820: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61  ZATION.  /* If a
6830: 20 74 65 72 6d 20 69 73 20 74 68 65 20 42 45 54   term is the BET
6840: 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63  WEEN operator, c
6850: 72 65 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69  reate two new vi
6860: 72 74 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a  rtual terms.  **
6870: 20 74 68 61 74 20 64 65 66 69 6e 65 20 74 68 65   that define the
6880: 20 72 61 6e 67 65 20 74 68 61 74 20 74 68 65 20   range that the 
6890: 42 45 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e  BETWEEN implemen
68a0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ts..  */.  else 
68b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
68c0: 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20  K_BETWEEN ){.   
68d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
68e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
68f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6900: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
6910: 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20  ops[] = {TK_GE, 
6920: 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65  TK_LE};.    asse
6930: 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
6940: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
6950: 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20  t->nExpr==2 );. 
6960: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
6970: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6980: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
6990: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
69a0: 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20       pNewExpr = 
69b0: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
69c0: 6f 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45  ops[i], sqlite3E
69d0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
69e0: 2d 3e 70 4c 65 66 74 29 2c 0a 20 20 20 20 20 20  ->pLeft),.      
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6a10: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
6a20: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29  >a[i].pExpr), 0)
6a30: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
6a40: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
6a50: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
6a60: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
6a70: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
6a80: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
6a90: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
6aa0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
6ab0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
6ac0: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
6ad0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
6ae0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
6af0: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
6b00: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
6b10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6b20: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
6b30: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
6b40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6b50: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6b60: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6b70: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6b80: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74  BQUERY).  /* Att
6b90: 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20  empt to convert 
6ba0: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  OR-connected ter
6bb0: 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70  ms into an IN op
6bc0: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20  erator so that. 
6bd0: 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b   ** they can mak
6be0: 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  e use of indices
6bf0: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  .  Example:.  **
6c00: 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  .  **      x = e
6c10: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
6c20: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
6c30: 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  r3.  **.  ** is 
6c40: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20  converted into. 
6c50: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20   **.  **      x 
6c60: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
6c70: 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  expr3).  **.  **
6c80: 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
6c90: 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74  on must be omitt
6ca0: 65 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55  ed if OMIT_SUBQU
6cb0: 45 52 59 20 69 73 20 64 65 66 69 6e 65 64 20 62  ERY is defined b
6cc0: 65 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20  ecause.  ** the 
6cd0: 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65  compiler for the
6ce0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
6cf0: 20 69 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d   is part of sub-
6d00: 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
6d10: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
6d20: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
6d30: 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74   int ok;.    int
6d40: 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69   i, j;.    int i
6d50: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b  Column, iCursor;
6d60: 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
6d70: 20 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54   sOr;.    WhereT
6d80: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20  erm *pOrTerm;.. 
6d90: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
6da0: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
6db0: 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20  DYNAMIC)==0 );. 
6dc0: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
6dd0: 69 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50  it(&sOr, pWC->pP
6de0: 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
6df0: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
6e00: 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f  &sOr, pExpr, TK_
6e10: 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  OR);.    exprAna
6e20: 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26 73  lyzeAll(pSrc, &s
6e30: 4f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Or);.    assert(
6e40: 20 73 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b   sOr.nTerm>=2 );
6e50: 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
6e60: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
6e70: 28 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b  ( j<sOr.nTerm );
6e80: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
6e90: 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f   sOr.a[j].leftCo
6ea0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72  lumn;.      iCur
6eb0: 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c  sor = sOr.a[j].l
6ec0: 65 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  eftCursor;.     
6ed0: 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30   ok = iCursor>=0
6ee0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f  ;.      for(i=sO
6ef0: 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  r.nTerm-1, pOrTe
6f00: 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26  rm=sOr.a; i>=0 &
6f10: 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  & ok; i--, pOrTe
6f20: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
6f30: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  f( pOrTerm->eOpe
6f40: 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a  rator!=WO_EQ ){.
6f50: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f            goto o
6f60: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a  r_not_possible;.
6f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f80: 20 20 69 66 28 20 6f 72 54 65 72 6d 49 73 4f 70    if( orTermIsOp
6f90: 74 43 61 6e 64 69 64 61 74 65 28 70 4f 72 54 65  tCandidate(pOrTe
6fa0: 72 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69 43 6f  rm, iCursor, iCo
6fb0: 6c 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lumn) ){.       
6fc0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
6fd0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
6fe0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6ff0: 66 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75  f( orTermHasOkDu
7000: 70 6c 69 63 61 74 65 28 26 73 4f 72 2c 20 70 4f  plicate(&sOr, pO
7010: 72 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20  rTerm) ){.      
7020: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61      pOrTerm->fla
7030: 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f  gs &= ~TERM_OR_O
7040: 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
7050: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d  {.          ok =
7060: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
7070: 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
7080: 28 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b  ( !ok && (sOr.a[
7090: 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52  j++].flags & TER
70a0: 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20  M_COPIED)!=0 && 
70b0: 6a 3c 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  j<2 );.    if( o
70c0: 6b 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  k ){.      ExprL
70d0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a  ist *pList = 0;.
70e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
70f0: 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 45  , *pDup;.      E
7100: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr *pLeft = 0;.
7110: 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e        for(i=sOr.
7120: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
7130: 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20  =sOr.a; i>=0 && 
7140: 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  ok; i--, pOrTerm
7150: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
7160: 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73   (pOrTerm->flags
7170: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
7180: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
7190: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
71a0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
71b0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
71c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
71d0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
71e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
71f0: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73  WC->pParse, pLis
7200: 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20  t, pDup, 0);.   
7210: 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72       pLeft = pOr
7220: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Term->pExpr->pLe
7230: 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ft;.      }.    
7240: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
7250: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70  =0 );.      pDup
7260: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7270: 70 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  p(db, pLeft);.  
7280: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
7290: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
72a0: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
72b0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
72c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
72d0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
72e0: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
72f0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
7300: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7310: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  ist = pList;.   
7320: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
7330: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
7340: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
7350: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
7360: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 65  AMIC);.        e
7370: 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c  xprAnalyze(pSrc,
7380: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
7390: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
73a0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
73b0: 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  .        pWC->a[
73c0: 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20  idxNew].iParent 
73d0: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
73e0: 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64     pTerm->nChild
73f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
7400: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7410: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7420: 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  (pList);.      }
7430: 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f  .    }.or_not_po
7440: 73 73 69 62 6c 65 3a 0a 20 20 20 20 77 68 65 72  ssible:.    wher
7450: 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 73 4f  eClauseClear(&sO
7460: 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  r);.  }.#endif /
7470: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
7480: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
7490: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
74a0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
74b0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
74c0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
74d0: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
74e0: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
74f0: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
7500: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
7510: 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  if( isLikeOrGlob
7520: 28 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50 61  (db, pExpr, &nPa
7530: 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65  ttern, &isComple
7540: 74 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20  te) ){.    Expr 
7550: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
7560: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31  .    Expr *pStr1
7570: 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78  , *pStr2;.    Ex
7580: 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a  pr *pNewExpr1, *
7590: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
75a0: 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78 4e  nt idxNew1, idxN
75b0: 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20  ew2;..    pLeft 
75c0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
75d0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
75e0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
75f0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
7600: 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73  r;.    pStr1 = s
7610: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
7620: 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 30  se, TK_STRING, 0
7630: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
7640: 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20 20   pStr1 ){.      
7650: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
7660: 28 64 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f 6b  (db, &pStr1->tok
7670: 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  en, &pRight->tok
7680: 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72 31  en);.      pStr1
7690: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61 74  ->token.n = nPat
76a0: 74 65 72 6e 3b 0a 20 20 20 20 20 20 70 53 74 72  tern;.      pStr
76b0: 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f 44 65  1->flags = EP_De
76c0: 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d 0a 20 20  quoted;.    }.  
76d0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
76e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
76f0: 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  r1);.    if( pSt
7700: 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r2 ){.      asse
7710: 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e  rt( pStr2->token
7720: 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 2b 2b  .dyn );.      ++
7730: 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f  *(u8*)&pStr2->to
7740: 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31  ken.z[nPattern-1
7750: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  ];.    }.    pNe
7760: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
7770: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7780: 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _GE, sqlite3Expr
7790: 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20 70  Dup(db,pLeft), p
77a0: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str1, 0);.    id
77b0: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
77c0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
77d0: 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56  NewExpr1, TERM_V
77e0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
77f0: 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  MIC);.    exprAn
7800: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
7810: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
7820: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
7830: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
7840: 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78  TK_LT, sqlite3Ex
7850: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c  prDup(db,pLeft),
7860: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
7870: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
7880: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
7890: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
78a0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
78b0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72  NAMIC);.    expr
78c0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
78d0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
78e0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
78f0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
7900: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
7910: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
7920: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
7930: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
7940: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
7950: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7960: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
7970: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
7980: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
7990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
79a0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
79b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
79c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
79d0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
79e0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
79f0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
7a00: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
7a10: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
7a20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
7a30: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
7a40: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
7a50: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
7a60: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
7a70: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
7a80: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
7a90: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
7aa0: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
7ab0: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
7ac0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
7ad0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
7ae0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
7af0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7b00: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
7b10: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
7b20: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
7b30: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
7b40: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
7b50: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
7b60: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
7b70: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
7b80: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
7b90: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
7ba0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
7bb0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
7bc0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7bd0: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
7be0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
7bf0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
7c00: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
7c10: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
7c20: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7c30: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
7c40: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
7c50: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
7c60: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
7c70: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
7c80: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
7c90: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41 54  3Expr(db, TK_MAT
7ca0: 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  CH, 0, sqlite3Ex
7cb0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
7cc0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
7cd0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
7ce0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
7cf0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
7d00: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
7d10: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
7d20: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
7d30: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
7d40: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7d50: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
7d60: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
7d70: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
7d80: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
7d90: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
7da0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
7db0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
7dc0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
7dd0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
7de0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
7df0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
7e00: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
7e10: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7e20: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
7e30: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
7e40: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
7e50: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
7e60: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
7e70: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
7e80: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
7e90: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7eb0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ALTABLE */.}../*
7ec0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
7ed0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  if any of the ex
7ee0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69  pressions in pLi
7ef0: 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d  st->a[iFirst...]
7f00: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65   contain.** a re
7f10: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74  ference to any t
7f20: 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  able other than 
7f30: 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e  the iBase table.
7f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7f50: 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61  eferencesOtherTa
7f60: 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74  bles(.  ExprList
7f70: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
7f80: 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72    /* Search expr
7f90: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c  essions in ths l
7fa0: 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  ist */.  ExprMas
7fb0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7fc0: 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
7fd0: 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74  om tables to bit
7fe0: 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46  maps */.  int iF
7ff0: 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
8000: 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68      /* Be search
8010: 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69  ing with the iFi
8020: 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f  rst-th expressio
8030: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  n */.  int iBase
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72   /* Ignore refer
8060: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
8070: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d  ble */.){.  Bitm
8080: 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67  ask allowed = ~g
8090: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
80a0: 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65   iBase);.  while
80b0: 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e  ( iFirst<pList->
80c0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28  nExpr ){.    if(
80d0: 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65   (exprTableUsage
80e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
80f0: 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45  ->a[iFirst++].pE
8100: 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30  xpr)&allowed)!=0
8110: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8120: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
8130: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
8140: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8150: 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78   decides if pIdx
8160: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
8170: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
8180: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  R BY.** clause. 
8190: 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72   If it can, it r
81a0: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49  eturns 1.  If pI
81b0: 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  dx cannot satisf
81c0: 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  y the.** ORDER B
81d0: 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72  Y clause, this r
81e0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
81f0: 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  ..**.** pOrderBy
8200: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
8210: 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45  clause from a SE
8220: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
8230: 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20   pTab is the.** 
8240: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
8250: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8260: 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20  se of that same 
8270: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8280: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c   and.** the tabl
8290: 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e  e has a cursor n
82a0: 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e  umber of "base".
82b0: 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64    pIdx is an ind
82c0: 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a  ex on pTab..**.*
82d0: 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20  * nEqCol is the 
82e0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
82f0: 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61  s of pIdx that a
8300: 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c  re used as equal
8310: 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
8320: 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73  ts.  Any of thes
8330: 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  e columns may be
8340: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68   missing from th
8350: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
8360: 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74  ause and the mat
8370: 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  ch can still be 
8380: 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  a success..**.**
8390: 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   All terms of th
83a0: 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20  e ORDER BY that 
83b0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
83c0: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
83d0: 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72  either.** ASC or
83e0: 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f   DESC.  (Terms o
83f0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
8400: 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20 65  lause past the e
8410: 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a  nd of a UNIQUE.*
8420: 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e  * index do not n
8430: 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  eed to satisfy t
8440: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29  his constraint.)
8450: 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c    The *pbRev val
8460: 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
8470: 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  1 if the ORDER B
8480: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
8490: 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20 73  DESC and it is s
84a0: 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68  et to 0 if.** th
84b0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
84c0: 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f  e is all ASC..*/
84d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f  .static int isSo
84e0: 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61  rtingIndex(.  Pa
84f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8500: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8510: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8520: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
8530: 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67  Set,  /* Mapping
8540: 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64 69   from table indi
8550: 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a  ces to bitmaps *
8560: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
8570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8580: 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  he index we are 
8590: 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  testing */.  int
85a0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
85b0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
85c0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
85d0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
85e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
85f0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
8600: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
8610: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
8620: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
8630: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
8640: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
8650: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
8660: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8680: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
8690: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
86a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
86d0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
86e0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
8700: 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20  OR of index and 
8710: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69  ORDER BY sort di
8720: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rection */.  int
8730: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8750: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
8760: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
8770: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8780: 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  em *pTerm;    /*
8790: 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   A term of the O
87a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
87b0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
87c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
87d0: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
87e0: 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20  y!=0 );.  nTerm 
87f0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
8800: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  r;.  assert( nTe
8810: 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  rm>0 );..  /* Ma
8820: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
8830: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8840: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
8850: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
8860: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
8870: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
8880: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
8890: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
88a0: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
88b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
88c0: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
88d0: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
88e0: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
88f0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
8900: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
8910: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
8920: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
8930: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
8940: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
8950: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
8960: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
8970: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
8980: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
8990: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
89a0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
89b0: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
89c0: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
89d0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
89e0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
89f0: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
8a00: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
8a10: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
8a20: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
8a30: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
8a40: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
8a50: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
8a60: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
8a70: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
8a80: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
8a90: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
8aa0: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
8ab0: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
8ac0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
8ad0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
8ae0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
8af0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8b00: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
8b10: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
8b20: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
8b30: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
8b40: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
8b50: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
8b60: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
8b70: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
8b80: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
8b90: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
8ba0: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
8bb0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
8bc0: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
8bd0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
8be0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
8bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
8c00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
8c10: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
8c20: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
8c30: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
8c40: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
8c50: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
8c60: 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  f( i<pIdx->nColu
8c70: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c  mn ){.      iCol
8c80: 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  umn = pIdx->aiCo
8c90: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
8ca0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
8cb0: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
8cc0: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75  ){.        iColu
8cd0: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  mn = -1;.      }
8ce0: 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65  .      iSortOrde
8cf0: 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  r = pIdx->aSortO
8d00: 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a  rder[i];.      z
8d10: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
8d20: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  oll[i];.    }els
8d30: 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  e{.      iColumn
8d40: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f   = -1;.      iSo
8d50: 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
8d60: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c     zColl = pColl
8d70: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20  ->zName;.    }. 
8d80: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
8d90: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c  olumn!=iColumn |
8da0: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
8db0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
8dc0: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f  Coll) ){.      /
8dd0: 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20  * Term j of the 
8de0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8df0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63  does not match c
8e00: 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69  olumn i of the i
8e10: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
8e20: 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i<nEqCol ){.  
8e30: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
8e40: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
8e50: 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
8e60: 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d  by == fails to m
8e70: 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20  atch an.        
8e80: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
8e90: 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a  , that is OK.  J
8ea0: 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20  ust ignore that 
8eb0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
8ec0: 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  dex.        */. 
8ed0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8ee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8ef0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
8f00: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c  ndex column fail
8f10: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69  s to match and i
8f20: 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  s not constraine
8f30: 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20  d by ==.        
8f40: 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  ** then the inde
8f50: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
8f60: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f   the ORDER BY co
8f70: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20  nstraint..      
8f80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
8f90: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
8fa0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
8fb0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
8fc0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
8fd0: 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  rt( pTerm->sortO
8fe0: 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d  rder==0 || pTerm
8ff0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
9000: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
9010: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69  ortOrder==0 || i
9020: 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  SortOrder==1 );.
9030: 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65      termSortOrde
9040: 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e  r = iSortOrder ^
9050: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
9060: 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71  r;.    if( i>nEq
9070: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
9080: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
9090: 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
90a0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20       /* Indices 
90b0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
90c0: 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   if all ORDER BY
90d0: 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a   terms past the.
90e0: 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c          ** equal
90f0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
9100: 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44  are all either D
9110: 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20  ESC or ASC. */. 
9120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
9130: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9140: 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72  se{.      sortOr
9150: 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72  der = termSortOr
9160: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  der;.    }.    j
9170: 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b  ++;.    pTerm++;
9180: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
9190: 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63 65  <0 && !reference
91a0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
91b0: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
91c0: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
91d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
91e0: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74  exed column is t
91f0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61  he primary key a
9200: 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d 61  nd everything ma
9210: 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 73  tches.      ** s
9220: 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f  o far and none o
9230: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
9240: 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67 68  erms to the righ
9250: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  t reference othe
9260: 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  r.      ** table
9270: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74  s in the join, t
9280: 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75 72  hen we are assur
9290: 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ed that the inde
92a0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 20  x can be used . 
92b0: 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20       ** to sort 
92c0: 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69 6d  because the prim
92d0: 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71 75  ary key is uniqu
92e0: 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66  e and so none of
92f0: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 20   the other.     
9300: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c   ** columns will
9310: 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72   make any differ
9320: 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ence.      */.  
9330: 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20      j = nTerm;. 
9340: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52     }.  }..  *pbR
9350: 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d  ev = sortOrder!=
9360: 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72  0;.  if( j>=nTer
9370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  m ){.    /* All 
9380: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
9390: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
93a0: 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69 73   covered by this
93b0: 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a   index so.    **
93c0: 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20   this index can 
93d0: 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
93e0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ing. */.    retu
93f0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
9400: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
9410: 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64  E_None && i==pId
9420: 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  x->nColumn.     
9430: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
9440: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
9450: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
9460: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f  , base) ){.    /
9470: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
9480: 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20  his index match 
9490: 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74  some prefix of t
94a0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
94b0: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  se.    ** and th
94c0: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
94d0: 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f  E and no terms o
94e0: 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  n the tail of th
94f0: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
9500: 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e  * clause referen
9510: 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ce other tables 
9520: 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74  in a join.  If t
9530: 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20  his is all true 
9540: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
9550: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
9560: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20  is superfluous. 
9570: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
9580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
9590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
95a0: 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20  table to see if 
95b0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
95c0: 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20  use in pOrderBy 
95d0: 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
95e0: 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69  .** by sorting i
95f0: 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44  n order of ROWID
9600: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
9610: 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62  f so and set *pb
9620: 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75  Rev to be.** tru
9630: 65 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f  e for reverse RO
9640: 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  WID and false fo
9650: 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20  r forward ROWID 
9660: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
9670: 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52   int sortableByR
9680: 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65  owid(.  int base
9690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
96a0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
96b0: 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65   for table to be
96c0: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70   sorted */.  Exp
96d0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
96e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
96f0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
9700: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
9710: 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70  askSet,  /* Mapp
9720: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20  ing from tables 
9730: 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20  to bitmaps */.  
9740: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
9750: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
9760: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
9770: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
9780: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
9790: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
97a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
97b0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
97c0: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
97d0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
97e0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
97f0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
9800: 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43  e==base && p->iC
9810: 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26 26  olumn==-1.    &&
9820: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
9830: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
9840: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c 20 62  , pMaskSet, 1, b
9850: 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70 62 52  ase) ){.    *pbR
9860: 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  ev = pOrderBy->a
9870: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
9880: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
98a0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
98b0: 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f  crude estimate o
98c0: 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  f the logarithm 
98d0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
98e0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ue..** The resul
98f0: 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65  ts need not be e
9900: 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f  xact.  This is o
9910: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74  nly used for est
9920: 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  imating.** the t
9930: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72  otal cost of per
9940: 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6e  forming operatin
9950: 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20  gs with O(logN) 
9960: 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63  or O(NlogN).** c
9970: 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61  omplexity.  Beca
9980: 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20  use N is just a 
9990: 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20  guess, it is no 
99a0: 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66  great tragedy if
99b0: 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69  .** logN is a li
99c0: 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  ttle off..*/.sta
99d0: 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f  tic double estLo
99e0: 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64  g(double N){.  d
99f0: 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a  ouble logN = 1;.
9a00: 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b    double x = 10;
9a10: 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b  .  while( N>x ){
9a20: 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a  .    logN += 1;.
9a30: 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d      x *= 10;.  }
9a40: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a  .  return logN;.
9a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
9a60: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
9a70: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
9a80: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
9a90: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
9aa0: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
9ab0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
9ac0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
9ad0: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
9ae0: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
9af0: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
9b00: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
9b10: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
9b20: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
9b30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9b40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
9b50: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
9b60: 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
9b70: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
9b80: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
9b90: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
9ba0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
9bb0: 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74 72 61  qlite3_where_tra
9bc0: 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  ce ) return;.  f
9bd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
9be0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
9bf0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
9c00: 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72  Printf("  constr
9c10: 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  aint[%d]: col=%d
9c20: 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64   termid=%d op=%d
9c30: 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a   usabled=%d\n",.
9c40: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9c50: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
9c60: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
9c70: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
9c80: 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[i].iTermOffset
9c90: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
9ca0: 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20  straint[i].op,. 
9cb0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
9cc0: 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b  aint[i].usable);
9cd0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
9ce0: 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69  i<p->nOrderBy; i
9cf0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9d00: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
9d10: 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d  rderby[%d]: col=
9d20: 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20  %d desc=%d\n",. 
9d30: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
9d40: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69  p->aOrderBy[i].i
9d50: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
9d60: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  ->aOrderBy[i].de
9d70: 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  sc);.  }.}.stati
9d80: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
9d90: 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33  _OUTPUTS(sqlite3
9da0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
9db0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
9dc0: 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  !sqlite3_where_t
9dd0: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
9de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9df0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
9e00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
9e10: 75 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67  ugPrintf("  usag
9e20: 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25  e[%d]: argvIdx=%
9e30: 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20  d omit=%d\n",.  
9e40: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
9e50: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
9e60: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c  ge[i].argvIndex,
9e70: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
9e80: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
9e90: 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mit);.  }.  sqli
9ea0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
9eb0: 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20    idxNum=%d\n", 
9ec0: 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71  p->idxNum);.  sq
9ed0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
9ee0: 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22  ("  idxStr=%s\n"
9ef0: 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  , p->idxStr);.  
9f00: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
9f10: 74 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e  tf("  orderByCon
9f20: 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e  sumed=%d\n", p->
9f30: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
9f40: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
9f50: 50 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61  Printf("  estima
9f60: 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70  tedCost=%g\n", p
9f70: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
9f80: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
9f90: 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55  e TRACE_IDX_INPU
9fa0: 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52  TS(A).#define TR
9fb0: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
9fc0: 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  A).#endif..#ifnd
9fd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
9fe0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
9ff0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65  * Compute the be
a000: 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76  st index for a v
a010: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
a020: 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64  .** The best ind
a030: 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62  ex is computed b
a040: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
a050: 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76   method of the v
a060: 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  irtual.** table 
a070: 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f  module.  This ro
a080: 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20  utine is really 
a090: 6a 75 73 74 20 61 20 77 72 61 70 70 65 72 20 74  just a wrapper t
a0a0: 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74  hat sets up.** t
a0b0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a0c0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
a0d0: 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
a0e0: 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68  communicate with
a0f0: 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a  .** xBestIndex..
a100: 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c  **.** In a join,
a110: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
a120: 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75  ght be called mu
a130: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72  ltiple times for
a140: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72   the.** same vir
a150: 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
a160: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
a170: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
a180: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
a190: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74  initialized on t
a1a0: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
a1b0: 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f  ion and reused o
a1c0: 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  n all subsequent
a1d0: 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  .** invocations.
a1e0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
a1f0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
a200: 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  re is also used 
a210: 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20  when.** code is 
a220: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63  generated to acc
a230: 65 73 73 20 74 68 65 20 76 69 72 74 75 61 6c 20  ess the virtual 
a240: 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72  table.  The wher
a250: 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a  eInfoDelete() .*
a260: 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20  * routine takes 
a270: 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20  care of freeing 
a280: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
a290: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
a2a0: 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62   after.** everyb
a2b0: 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68 65 64  ody has finished
a2c0: 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61   with it..*/.sta
a2d0: 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 56  tic double bestV
a2e0: 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20 20 50  irtualIndex(.  P
a2f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a310: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
a320: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
a330: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
a340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
a360: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a370: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
a380: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
a390: 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
a3a0: 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
a3b0: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
a3c0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
a3d0: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
a3e0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
a3f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a400: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
a410: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
a420: 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
a430: 20 69 6e 74 20 6f 72 64 65 72 42 79 55 73 61 62   int orderByUsab
a440: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
a450: 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 63 61  /* True if we ca
a460: 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f 72 74  n potential sort
a470: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
a480: 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78  dex_info **ppIdx
a490: 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20 69 6e  Info /* Index in
a4a0: 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
a4b0: 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 20 2a   to xBestIndex *
a4c0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
a4d0: 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
a4e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
a4f0: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
a500: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
a510: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
a520: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
a530: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
a540: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
a550: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
a560: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
a570: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
a580: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
a590: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
a5a0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
a5b0: 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  t nOrderBy;.  in
a5c0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t rc;..  /* If t
a5d0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a5e0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
a5f0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
a600: 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c  viously.  ** all
a610: 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69  ocated and initi
a620: 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69 73 20  alized for this 
a630: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74  virtual table, t
a640: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  hen allocate.  *
a650: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
a660: 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70   it now.  */.  p
a670: 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78  IdxInfo = *ppIdx
a680: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
a690: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 57  Info==0 ){.    W
a6a0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
a6b0: 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  .    int nTerm;.
a6c0: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
a6d0: 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64  "Recomputing ind
a6e0: 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e  ex info for %s..
a6f0: 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .\n", pTab->zNam
a700: 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75  e));..    /* Cou
a710: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
a720: 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45 20   possible WHERE 
a730: 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e  clause constrain
a740: 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20 20  ts referring.   
a750: 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72 74   ** to this virt
a760: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ual table */.   
a770: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
a780: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
a790: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
a7a0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
a7b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
a7c0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
a7d0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
a7e0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
a7f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
a800: 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65  WO_IN ) continue
a810: 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b  ;.      nTerm++;
a820: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a830: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
a840: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f  lause contains o
a850: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  nly columns in t
a860: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
a870: 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
a880: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
a890: 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
a8a0: 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
a8b0: 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
a8c0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
a8d0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
a8e0: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    nOrderBy = 0;.
a8f0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
a900: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a910: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
a920: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
a930: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
a940: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
a950: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
a960: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
a970: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
a980: 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
a990: 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
a9a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a9b0: 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d  if( i==pOrderBy-
a9c0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
a9d0: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
a9e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
a9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
aa00: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
aa10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
aa20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20  nfo structure.  
aa30: 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66    */.    pIdxInf
aa40: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
aa50: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
aa60: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78  db, sizeof(*pIdx
aa70: 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20  Info).          
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49     + (sizeof(*pI
aaa0: 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66  dxCons) + sizeof
aab0: 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d  (*pUsage))*nTerm
aac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
aae0: 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
aaf0: 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
ab00: 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66  .    if( pIdxInf
ab10: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o==0 ){.      sq
ab20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ab30: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
ab40: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 72 65  mory");.      re
ab50: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a  turn 0.0;.    }.
ab60: 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d      *ppIdxInfo =
ab70: 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20   pIdxInfo;..    
ab80: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
ab90: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
aba0: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
abb0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
abc0: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d  ontains.    ** m
abd0: 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20  any fields that 
abe0: 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f  are declared "co
abf0: 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20  nst" to prevent 
ac00: 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a  xBestIndex from.
ac10: 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20      ** changing 
ac20: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
ac30: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
ac40: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
ac50: 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69   to.    ** initi
ac60: 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
ac70: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
ac80: 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63  IdxCons = (struc
ac90: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
aca0: 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64  constraint*)&pId
acb0: 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49  xInfo[1];.    pI
acc0: 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
acd0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
ace0: 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
acf0: 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20  Cons[nTerm];.   
ad00: 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63   pUsage = (struc
ad10: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
ad20: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
ad30: 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e  *)&pIdxOrderBy[n
ad40: 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28  OrderBy];.    *(
ad50: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
ad60: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
ad70: 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  erm;.    *(int*)
ad80: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
ad90: 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  rBy = nOrderBy;.
ada0: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(struct sql
adb0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
adc0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
add0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
ade0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a   pIdxCons;.    *
adf0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
ae00: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
ae10: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
ae20: 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
ae30: 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20  y;.    *(struct 
ae40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
ae50: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
ae60: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
ae70: 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 20      pUsage;..   
aed0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
aee0: 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
aef0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
af00: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
af10: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
af20: 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72  or != pSrc->iCur
af30: 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  sor ) continue;.
af40: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
af50: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
af60: 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  N ) continue;.  
af70: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
af80: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
af90: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  >leftColumn;.   
afa0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
afb0: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
afc0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
afd0: 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f  ].op = pTerm->eO
afe0: 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 2f  perator;.      /
aff0: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
b000: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
b010: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
b020: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
b030: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
b040: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
b050: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b060: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
b070: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
b080: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
b090: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
b0a0: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
b0b0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
b0c0: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
b0d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
b0e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
b0f0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
b100: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
b110: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b120: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
b130: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b140: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LE );.      ass
b150: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
b160: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b170: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  INT_GT );.      
b180: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
b190: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b1a0: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
b1b0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
b1c0: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
b1d0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
b1e0: 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CH );.      asse
b1f0: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
b200: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
b210: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
b220: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
b230: 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  );.      j++;.  
b240: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
b250: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
b260: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b270: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
b280: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
b290: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
b2a0: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
b2b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
b2c0: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
b2d0: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
b2e0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
b2f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
b300: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
b310: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
b320: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
b330: 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20  e that pIdxInfo 
b340: 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77  points.  ** to w
b350: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ill have been in
b360: 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65  itialized, eithe
b370: 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  r during the cur
b380: 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
b390: 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73  or.  ** during s
b3a0: 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  ome prior invoca
b3b0: 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75  tion.  Now we ju
b3c0: 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f  st have to custo
b3d0: 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65  mize the.  ** de
b3e0: 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66  tails of pIdxInf
b3f0: 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  o for the curren
b400: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
b410: 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a   pass it to.  **
b420: 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a   xBestIndex..  *
b430: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75  /..  /* The modu
b440: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
b450: 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62  defined. Also, b
b460: 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  y this point the
b470: 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  re must.  ** be 
b480: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
b490: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
b4a0: 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
b4b0: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69  e.  ** sqlite3Vi
b4c0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
b4d0: 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69  () would have pi
b4e0: 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f  cked up the erro
b4f0: 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  r. .  */.  asser
b500: 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  t( pTab->azModul
b510: 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a  eArg && pTab->az
b520: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a  ModuleArg[0] );.
b530: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
b540: 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a 20  pVtab );.#if 0. 
b550: 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62   if( pTab->pVtab
b560: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
b570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b580: 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f  e, "undefined mo
b590: 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c  dule %s for tabl
b5a0: 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  e %s",.        p
b5b0: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
b5c0: 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  [0], pTab->zName
b5d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e  );.    return 0.
b5e0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
b5f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e   /* Set the aCon
b600: 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
b610: 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74   fields and init
b620: 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a  ialize all .  **
b630: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
b640: 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  s to zero..  **.
b650: 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
b660: 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
b670: 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
b680: 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
b690: 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65  t-hand.  ** side
b6a0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
b6b0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
b6c0: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
b6d0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
b6e0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
b6f0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
b700: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
b710: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
b720: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
b730: 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a    column = expr.
b740: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65    **.  ** and we
b750: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
b760: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
b770: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63   constraint on c
b780: 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f  olumn is .  ** o
b790: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c  nly valid if all
b7a0: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
b7b0: 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72  ed in expr occur
b7c0: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
b7d0: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
b7e0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
b7f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
b800: 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
b810: 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
b820: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
b830: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f  nstraints.  ** o
b840: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
b850: 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77  ble.  That way w
b860: 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63  e only have to c
b870: 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20  ompute it once. 
b880: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
b890: 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20  we might try to 
b8a0: 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e  pick the best in
b8b0: 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  dex multiple tim
b8c0: 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63  es..  ** For eac
b8d0: 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63  h attempt at pic
b8e0: 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74  king an index, t
b8f0: 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  he order of tabl
b900: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a  es in the.  ** j
b910: 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66  oin might be dif
b920: 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76  ferent so we hav
b930: 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  e to recompute t
b940: 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20  he usable flag. 
b950: 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20   ** each time.. 
b960: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
b970: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
b980: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
b990: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
b9a0: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  aConstraint;.  p
b9b0: 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
b9c0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
b9d0: 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ge;.  for(i=0; i
b9e0: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
b9f0: 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
ba00: 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20  xCons++){.    j 
ba10: 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
ba20: 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65  mOffset;.    pTe
ba30: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
ba40: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
ba50: 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d  sable =  (pTerm-
ba60: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
ba70: 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20 7d  otReady)==0;.  }
ba80: 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
ba90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
baa0: 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
bab0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
bac0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
bad0: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
bae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
baf0: 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
bb00: 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
bb10: 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
bb20: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
bb30: 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
bb40: 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
bb50: 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
bb60: 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
bb70: 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
bb80: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
bb90: 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
bba0: 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a  _BIG_DBL / 2.0;.
bbb0: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
bbc0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
bbd0: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
bbe0: 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72  >nOrderBy && !or
bbf0: 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20  derByUsable ){. 
bc00: 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49     *(int*)&pIdxI
bc10: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
bc20: 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  0;.  }..  sqlite
bc30: 33 53 61 66 65 74 79 4f 66 66 28 70 50 61 72 73  3SafetyOff(pPars
bc40: 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52 45 54  e->db);.  WHERET
bc50: 52 41 43 45 28 28 22 78 42 65 73 74 49 6e 64 65  RACE(("xBestInde
bc60: 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54 61  x for %s\n", pTa
bc70: 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54 52  b->zName));.  TR
bc80: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
bc90: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  IdxInfo);.  rc =
bca0: 20 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70 4d   pTab->pVtab->pM
bcb0: 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65  odule->xBestInde
bcc0: 78 28 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 70  x(pTab->pVtab, p
bcd0: 49 64 78 49 6e 66 6f 29 3b 0a 20 20 54 52 41 43  IdxInfo);.  TRAC
bce0: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 49  E_IDX_OUTPUTS(pI
bcf0: 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
bd00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bd10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bd20: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
bd30: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
bd40: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
bd50: 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20      }else {.    
bd60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bd70: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
bd80: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
bd90: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
bda0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 50  lite3SafetyOn(pP
bdb0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 65 6c  arse->db);.  }el
bdc0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
bdd0: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 50 61  ite3SafetyOn(pPa
bde0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  rse->db);.  }.  
bdf0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
be00: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
be10: 64 65 72 42 79 3b 0a 0a 20 20 72 65 74 75 72 6e  derBy;..  return
be20: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
be30: 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64  atedCost;.}.#end
be40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
be50: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
be60: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  /../*.** Find th
be70: 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
be80: 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72   accessing a par
be90: 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
bea0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
beb0: 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64 65 78  .** to the index
bec0: 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64 65 73  , flags that des
bed0: 63 72 69 62 65 20 68 6f 77 20 74 68 65 20 69 6e  cribe how the in
bee0: 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 75 73  dex should be us
bef0: 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65  ed, the.** numbe
bf00: 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
bf10: 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74  nstraints, and t
bf20: 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20 74 68  he "cost" for th
bf30: 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  is index..**.** 
bf40: 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  The lowest cost 
bf50: 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54 68 65  index wins.  The
bf60: 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69   cost is an esti
bf70: 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75  mate of the amou
bf80: 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64  nt of.** CPU and
bf90: 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74   disk I/O need t
bfa0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65  o process the re
bfb0: 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20  quest using the 
bfc0: 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 2e 0a  selected index..
bfd0: 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74 20  ** Factors that 
bfe0: 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69  influence cost i
bff0: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
c000: 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74 65   *  The estimate
c010: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
c020: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
c030: 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a  trieved.  (The.*
c040: 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74 68  *       fewer th
c050: 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a  e better.).**.**
c060: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
c070: 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75  r not sorting mu
c080: 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20  st occur..**.** 
c090: 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72     *  Whether or
c0a0: 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20   not there must 
c0b0: 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b  be separate look
c0c0: 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ups in the.**   
c0d0: 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e      index and in
c0e0: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
c0f0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  .**.*/.static do
c100: 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28 0a  uble bestIndex(.
c110: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c130: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
c140: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
c150: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
c160: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
c170: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
c180: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
c190: 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
c1a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
c1b0: 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
c1c0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
c1d0: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
c1e0: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
c1f0: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
c200: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
c210: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
c220: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c230: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
c240: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70 49  */.  Index **ppI
c250: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
c260: 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65   /* Make *ppInde
c270: 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62  x point to the b
c280: 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  est index */.  i
c290: 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20  nt *pFlags,     
c2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
c2b0: 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62 69  t flags describi
c2c0: 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20 69  ng this choice i
c2d0: 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20 69  n *pFlags */.  i
c2e0: 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20 20  nt *pnEq        
c2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
c300: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
c310: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
c320: 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ints here */.){.
c330: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
c340: 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65 73  rm;.  Index *bes
c350: 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  tIdx = 0;       
c360: 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
c370: 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73 74  gives the lowest
c380: 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62 6c   cost */.  doubl
c390: 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20  e lowestCost;   
c3a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
c3b0: 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73 74  st of using best
c3c0: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73  Idx */.  int bes
c3d0: 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  tFlags = 0;     
c3e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
c3f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62 65  sociated with be
c400: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
c410: 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20  estNEq = 0;     
c420: 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 76         /* Best v
c430: 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f 0a  alue for nEq */.
c440: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
c450: 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
c460: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
c470: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
c480: 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64  ccessed */.  Ind
c490: 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
c4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
c4b0: 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
c4c0: 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  uating */.  int 
c4d0: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
c4e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c4f0: 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
c500: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  se order */.  in
c510: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
c520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
c530: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
c540: 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69  th pProbe */.  i
c550: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
c560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c570: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
c580: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
c590: 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
c5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c5b0: 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   Mask of valid e
c5c0: 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
c5d0: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
c5e0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
c5f0: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
c600: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20  ing pProbe */.. 
c610: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65   WHERETRACE(("be
c620: 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20  stIndex: tbl=%s 
c630: 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c 20  notReady=%x\n", 
c640: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
c650: 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20  e, notReady));. 
c660: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51   lowestCost = SQ
c670: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20  LITE_BIG_DBL;.  
c680: 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70  pProbe = pSrc->p
c690: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20  Tab->pIndex;..  
c6a0: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
c6b0: 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20 61  has no indices a
c6c0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
c6d0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
c6e0: 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74  re.  ** clause t
c6f0: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
c700: 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65 20   ROWID, then we 
c710: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 62  will never be ab
c720: 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e  le to do.  ** an
c730: 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
c740: 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  n a full table s
c750: 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  can on this tabl
c760: 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 0a  e.  We might as.
c770: 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69 74    ** well put it
c780: 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a 6f   first in the jo
c790: 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74 20  in order.  That 
c7a0: 77 61 79 2c 20 70 65 72 68 61 70 73 20 69 74 20  way, perhaps it 
c7b0: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66 65  can be.  ** refe
c7c0: 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72 20  renced by other 
c7d0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
c7e0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
c7f0: 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20 20  Probe==0 &&.    
c800: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
c810: 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
c820: 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f  Q|WO_IN|WO_LT|WO
c830: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
c840: 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28 70  0)==0 &&.     (p
c850: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21 73  OrderBy==0 || !s
c860: 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69  ortableByRowid(i
c870: 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  Cur, pOrderBy, p
c880: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72  WC->pMaskSet, &r
c890: 65 76 29 29 20 29 7b 0a 20 20 20 20 2a 70 46 6c  ev)) ){.    *pFl
c8a0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70  ags = 0;.    *pp
c8b0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 2a  Index = 0;.    *
c8c0: 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 72 65  pnEq = 0;.    re
c8d0: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20  turn 0.0;.  }.. 
c8e0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
c8f0: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
c900: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  wid IN (...) con
c910: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
c920: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
c930: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
c940: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
c950: 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66 28  WO_IN, 0);.  if(
c960: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45 78   pTerm ){.    Ex
c970: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 2a  pr *pExpr;.    *
c980: 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  ppIndex = 0;.   
c990: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48 45   bestFlags = WHE
c9a0: 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20  RE_ROWID_EQ;.   
c9b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
c9c0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b  rator & WO_EQ ){
c9d0: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d  .      /* Rowid=
c9e0: 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  = is always the 
c9f0: 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b  best pick.  Look
ca00: 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65   no further.  Be
ca10: 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20  cause only.     
ca20: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   ** a single row
ca30: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f   is generated, o
ca40: 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20  utput is always 
ca50: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
ca60: 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73  */.      *pFlags
ca70: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   = WHERE_ROWID_E
ca80: 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45  Q | WHERE_UNIQUE
ca90: 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20  ;.      *pnEq = 
caa0: 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  1;.      WHERETR
cab0: 41 43 45 28 28 22 2e 2e 2e 20 62 65 73 74 20 69  ACE(("... best i
cac0: 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20  s rowid\n"));.  
cad0: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
cae0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
caf0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
cb00: 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20 29  xpr)->pList!=0 )
cb10: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  {.      /* Rowid
cb20: 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73 74   IN (LIST): cost
cb30: 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
cb40: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
cb50: 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20 2a 2a  of list.      **
cb60: 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20   elements.  */. 
cb70: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
cb80: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
cb90: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 6c 6f 77  nExpr;.      low
cba0: 65 73 74 43 6f 73 74 20 2a 3d 20 65 73 74 4c 6f  estCost *= estLo
cbb0: 67 28 6c 6f 77 65 73 74 43 6f 73 74 29 3b 0a 20  g(lowestCost);. 
cbc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cbd0: 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53 45 4c  /* Rowid IN (SEL
cbe0: 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c  ECT): cost is Nl
cbf0: 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  ogN where N is t
cc00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
cc10: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  s.      ** in th
cc20: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
cc30: 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57  inner select.  W
cc40: 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  e have no way to
cc50: 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20   estimate.      
cc60: 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20 73 6f  ** that value so
cc70: 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67 75 65   make a wild gue
cc80: 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77  ss. */.      low
cc90: 65 73 74 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20  estCost = 200;. 
cca0: 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52     }.    WHERETR
ccb0: 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20  ACE(("... rowid 
ccc0: 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22  IN cost: %.9g\n"
ccd0: 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a  , lowestCost));.
cce0: 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61    }..  /* Estima
ccf0: 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  te the cost of a
cd00: 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66   table scan.  If
cd10: 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
cd20: 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e  how many.  ** en
cd30: 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65  tries are in the
cd40: 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69   table, use 1 mi
cd50: 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73  llion as a guess
cd60: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20 3d 20  ..  */.  cost = 
cd70: 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d  pProbe ? pProbe-
cd80: 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31  >aiRowEst[0] : 1
cd90: 30 30 30 30 30 30 3b 0a 20 20 57 48 45 52 45 54  000000;.  WHERET
cda0: 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c 65  RACE(("... table
cdb0: 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74 3a   scan base cost:
cdc0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
cdd0: 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52  ;.  flags = WHER
cde0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 0a  E_ROWID_RANGE;..
cdf0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
ce00: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61 20  onstraints on a 
ce10: 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73 20  range of rowids 
ce20: 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e  in a table scan.
ce30: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
ce40: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
ce50: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
ce60: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
ce70: 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20  _GT|WO_GE, 0);. 
ce80: 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
ce90: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
cea0: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
ceb0: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
cec0: 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _LE, 0) ){.     
ced0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
cee0: 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
cef0: 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20   cost /= 3;  /* 
cf00: 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64  Guess that rowid
cf10: 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73  <EXPR eliminates
cf20: 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20 72   two-thirds or r
cf30: 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ows */.    }.   
cf40: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
cf50: 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74  C, iCur, -1, not
cf60: 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
cf70: 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  GE, 0) ){.      
cf80: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  flags |= WHERE_B
cf90: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
cfa0: 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47  cost /= 3;  /* G
cfb0: 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e  uess that rowid>
cfc0: 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20  EXPR eliminates 
cfd0: 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f  two-thirds of ro
cfe0: 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ws */.    }.    
cff0: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
d000: 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72 65 64   rowid range red
d010: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
d020: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
d030: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73  }else{.    flags
d040: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
d050: 49 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  If the table sca
d060: 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73  n does not satis
d070: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
d080: 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73 65  clause, increase
d090: 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62  .  ** the cost b
d0a0: 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72  y NlogN to cover
d0b0: 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20   the expense of 
d0c0: 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  sorting. */.  if
d0d0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
d0e0: 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42 79    if( sortableBy
d0f0: 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
d100: 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b  erBy, pWC->pMask
d110: 53 65 74 2c 20 26 72 65 76 29 20 29 7b 0a 20 20  Set, &rev) ){.  
d120: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
d130: 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52 45  RE_ORDERBY|WHERE
d140: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20  _ROWID_RANGE;.  
d150: 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20      if( rev ){. 
d160: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
d170: 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
d180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d190: 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20  {.      cost += 
d1a0: 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74  cost*estLog(cost
d1b0: 29 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  );.      WHERETR
d1c0: 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e  ACE(("... sortin
d1d0: 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  g increases cost
d1e0: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
d1f0: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
d200: 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74   if( cost<lowest
d210: 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65  Cost ){.    lowe
d220: 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
d230: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
d240: 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lags;.  }..  /* 
d250: 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62 6c  If the pSrc tabl
d260: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
d270: 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  able of a LEFT J
d280: 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79 20  OIN then we may 
d290: 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20  not.  ** use an 
d2a0: 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66 79  index to satisfy
d2b0: 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61   IS NULL constra
d2c0: 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61 62  ints on that tab
d2d0: 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  le.  This is.  *
d2e0: 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e  * because column
d2f0: 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  s might end up b
d300: 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68 65  eing NULL if the
d310: 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20   table does not 
d320: 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63  match -.  ** a c
d330: 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69 63  ircumstance whic
d340: 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  h the index cann
d350: 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63 6f  ot help us disco
d360: 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32 31  ver.  Ticket #21
d370: 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  77..  */.  if( (
d380: 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  pSrc->jointype &
d390: 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
d3a0: 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
d3b0: 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
d3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65 72  }else{.    eqTer
d3d0: 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
d3e0: 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20  _IN|WO_ISNULL;. 
d3f0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74   }..  /* Look at
d400: 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a   each index..  *
d410: 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65  /.  for(; pProbe
d420: 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
d430: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
d440: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d460: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
d470: 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70   double inMultip
d480: 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20 57  lier = 1;..    W
d490: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
d4a0: 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70 50  index %s:\n", pP
d4b0: 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  robe->zName));..
d4c0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65      /* Count the
d4d0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
d4e0: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
d4f0: 74 68 61 74 20 61 72 65 20 73 61 74 69 73 66 69  that are satisfi
d500: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d 45  ed.    ** by x=E
d510: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  XPR constraints 
d520: 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63 6f  or x IN (...) co
d530: 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
d540: 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30 3b  /.    flags = 0;
d550: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d560: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
d570: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
d580: 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   j = pProbe->aiC
d590: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
d5a0: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
d5b0: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
d5c0: 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d 4d  otReady, eqTermM
d5d0: 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
d5e0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
d5f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d600: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  flags |= WHERE_C
d610: 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20  OLUMN_EQ;.      
d620: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
d630: 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a  ator & WO_IN ){.
d640: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
d650: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
d660: 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67  pr;.        flag
d670: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
d680: 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66  N_IN;.        if
d690: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
d6a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
d6b0: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d   inMultiplier *=
d6c0: 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   25;.        }el
d6d0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
d6e0: 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist!=0 ){.      
d6f0: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
d700: 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   *= pExpr->pList
d710: 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20  ->nExpr + 1;.   
d720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d730: 20 20 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20     }.    cost = 
d740: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
d750: 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69  [i] * inMultipli
d760: 65 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75  er * estLog(inMu
d770: 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e  ltiplier);.    n
d780: 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20  Eq = i;.    if( 
d790: 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
d7a0: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61  =OE_None && (fla
d7b0: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
d7c0: 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  N_IN)==0.       
d7d0: 20 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65    && nEq==pProbe
d7e0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
d7f0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d800: 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  E_UNIQUE;.    }.
d810: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
d820: 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69  "...... nEq=%d i
d830: 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d  nMult=%.9g cost=
d840: 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75  %.9g\n",nEq,inMu
d850: 6c 74 69 70 6c 69 65 72 2c 63 6f 73 74 29 29 3b  ltiplier,cost));
d860: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  ..    /* Look fo
d870: 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  r range constrai
d880: 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nts.    */.    i
d890: 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  f( nEq<pProbe->n
d8a0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
d8b0: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
d8c0: 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20  aiColumn[nEq];. 
d8d0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
d8e0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
d8f0: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
d900: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
d910: 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a  WO_GE, pProbe);.
d920: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 20        if( pTerm 
d930: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
d940: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
d950: 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20  _RANGE;.        
d960: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
d970: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
d980: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
d990: 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
d9a0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
d9b0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
d9d0: 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
d9e0: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
d9f0: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
da00: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
da10: 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65  GT|WO_GE, pProbe
da20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
da30: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
da40: 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
da50: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20     cost /= 3;.  
da60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
da70: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
da80: 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65  ... range reduce
da90: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
daa0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
dab0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
dac0: 20 41 64 64 20 74 68 65 20 61 64 64 69 74 69 6f   Add the additio
dad0: 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  nal cost of sort
dae0: 69 6e 67 20 69 66 20 74 68 61 74 20 69 73 20 61  ing if that is a
daf0: 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a   factor..    */.
db00: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
db10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
db20: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
db30: 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20  UMN_IN)==0 &&.  
db40: 20 20 20 20 20 20 20 20 20 69 73 53 6f 72 74 69           isSorti
db50: 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70  ngIndex(pParse,p
db60: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72  WC->pMaskSet,pPr
db70: 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42  obe,iCur,pOrderB
db80: 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20  y,nEq,&rev) ){. 
db90: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73         if( flags
dba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
dbb0: 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43   flags = WHERE_C
dbc0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
dbd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
dbe0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
dbf0: 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69  DERBY;.        i
dc00: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
dc10: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
dc20: 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  RE_REVERSE;.    
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
dc40: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  e{.        cost 
dc50: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
dc60: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48  ost);.        WH
dc70: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
dc80: 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61  . orderby increa
dc90: 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
dca0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
dcb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
dcc0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
dcd0: 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77  if we can get aw
dce0: 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75  ay with using ju
dcf0: 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  st the index wit
dd00: 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72  hout.    ** ever
dd10: 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62   reading the tab
dd20: 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  le.  If that is 
dd30: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68  the case, then h
dd40: 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  alve the.    ** 
dd50: 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64  cost of this ind
dd60: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
dd70: 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63  f( flags && pSrc
dd80: 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42  ->colUsed < (((B
dd90: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
dda0: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74  1)) ){.      Bit
ddb0: 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
ddc0: 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e  olUsed;.      in
ddd0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
dde0: 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; j<pProbe->nC
ddf0: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
de00: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72       int x = pPr
de10: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  obe->aiColumn[j]
de20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
de30: 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
de40: 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
de50: 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
de60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
de70: 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
de80: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
de90: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
dea0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  .        cost /=
deb0: 20 32 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52   2;.        WHER
dec0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
ded0: 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73  idx-only reduces
dee0: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
def0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
df00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
df10: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  If this index ha
df20: 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c  s achieved the l
df30: 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61  owest cost so fa
df40: 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a  r, then use it..
df50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
df60: 6c 61 67 73 20 26 26 20 63 6f 73 74 20 3c 20 6c  lags && cost < l
df70: 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20  owestCost ){.   
df80: 20 20 20 62 65 73 74 49 64 78 20 3d 20 70 50 72     bestIdx = pPr
df90: 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73  obe;.      lowes
dfa0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
dfb0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
dfc0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73  flags;.      bes
dfd0: 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20  tNEq = nEq;.    
dfe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f  }.  }..  /* Repo
dff0: 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75  rt the best resu
e000: 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64  lt.  */.  *ppInd
e010: 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20  ex = bestIdx;.  
e020: 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
e030: 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63  t index is %s, c
e040: 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d  ost=%.9g, flags=
e050: 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  %x, nEq=%d\n",. 
e060: 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3f         bestIdx ?
e070: 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20   bestIdx->zName 
e080: 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65  : "(none)", lowe
e090: 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61 67  stCost, bestFlag
e0a0: 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20 20  s, bestNEq));.  
e0b0: 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  *pFlags = bestFl
e0c0: 61 67 73 20 7c 20 65 71 54 65 72 6d 4d 61 73 6b  ags | eqTermMask
e0d0: 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74  ;.  *pnEq = best
e0e0: 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f  NEq;.  return lo
e0f0: 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a  westCost;.}.../*
e100: 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
e110: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
e120: 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
e130: 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
e140: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
e150: 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
e160: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
e170: 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
e180: 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
e190: 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
e1a0: 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
e1b0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
e1c0: 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
e1d0: 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
e1e0: 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
e1f0: 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
e200: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
e210: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
e220: 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
e230: 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
e240: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
e250: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
e260: 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
e270: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
e280: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
e290: 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
e2a0: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
e2b0: 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
e2c0: 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
e2d0: 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
e2e0: 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
e2f0: 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
e300: 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
e310: 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
e320: 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
e330: 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
e340: 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
e350: 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
e360: 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
e370: 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
e380: 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
e390: 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
e3a0: 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
e3b0: 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
e3c0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
e3d0: 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
e3e0: 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
e3f0: 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
e400: 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
e410: 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
e420: 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
e430: 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
e440: 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
e450: 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
e460: 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
e470: 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
e480: 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
e490: 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
e4a0: 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
e4b0: 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
e4c0: 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
e4d0: 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
e4e0: 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
e4f0: 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
e500: 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
e510: 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
e520: 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
e530: 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
e540: 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
e550: 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
e560: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
e570: 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
e580: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
e590: 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
e5a0: 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
e5b0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67   && (pTerm->flag
e5c0: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
e5d0: 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  =0.      && (pLe
e5e0: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
e5f0: 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
e600: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
e610: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
e620: 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
e630: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
e640: 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
e650: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
e660: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
e670: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
e680: 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
e690: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
e6a0: 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
e6b0: 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
e6c0: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
e6d0: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
e6e0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
e6f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
e700: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
e710: 61 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f 62  at builds a prob
e720: 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a  e for an index..
e730: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f 75  **.** There shou
e740: 6c 64 20 62 65 20 6e 43 6f 6c 75 6d 6e 20 76 61  ld be nColumn va
e750: 6c 75 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63  lues on the stac
e760: 6b 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 2a 2a  k.  The index.**
e770: 20 74 6f 20 62 65 20 70 72 6f 62 65 64 20 69 73   to be probed is
e780: 20 70 49 64 78 2e 20 20 50 6f 70 20 74 68 65 20   pIdx.  Pop the 
e790: 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20  values from the 
e7a0: 73 74 61 63 6b 20 61 6e 64 0a 2a 2a 20 72 65 70  stack and.** rep
e7b0: 6c 61 63 65 20 74 68 65 6d 20 61 6c 6c 20 77 69  lace them all wi
e7c0: 74 68 20 61 20 73 69 6e 67 6c 65 20 72 65 63 6f  th a single reco
e7d0: 72 64 20 74 68 61 74 20 69 73 20 74 68 65 20 69  rd that is the i
e7e0: 6e 64 65 78 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2e  ndex.** problem.
e7f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e800: 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
e810: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
e820: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
e830: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
e840: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
e850: 6e 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d  n,    /* The num
e860: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ber of columns t
e870: 6f 20 63 68 65 63 6b 20 66 6f 72 20 4e 55 4c 4c  o check for NULL
e880: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
e890: 78 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74  x     /* Index t
e8a0: 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 73  hat we will be s
e8b0: 65 61 72 63 68 69 6e 67 20 2a 2f 0a 29 7b 0a 20  earching */.){. 
e8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e8d0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
e8e0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
e8f0: 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  .  sqlite3IndexA
e900: 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
e910: 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  dx);.}.../*.** G
e920: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
e930: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
e940: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
e950: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
e960: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
e970: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
e980: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
e990: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
e9a0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
e9b0: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
e9c0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
e9d0: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
e9e0: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 6f 6e  raint is left on
e9f0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
ea00: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stack..**.** For
ea10: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
ea20: 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
ea30: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
ea40: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
ea50: 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
ea60: 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
ea70: 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
ea80: 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
ea90: 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
eaa0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
eab0: 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
eac0: 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
ead0: 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
eae0: 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  f X..*/.static v
eaf0: 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69 74 79  oid codeEquality
eb00: 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
eb10: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
eb20: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
eb30: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  xt */.  WhereTer
eb40: 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54  m *pTerm,   /* T
eb50: 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  he term of the W
eb60: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
eb70: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
eb80: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
eb90: 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
eba0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
ebb0: 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
ebc0: 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72   on */.){.  Expr
ebd0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
ebe0: 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
ebf0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ec00: 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
ec10: 5f 45 51 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _EQ ){.    sqlit
ec20: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ec30: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
ec40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e    }else if( pX->
ec50: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
ec60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ec70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
ec80: 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
ec90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
eca0: 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20  QUERY.  }else{. 
ecb0: 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
ecc0: 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
ecd0: 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  pIn;..    assert
ece0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
ecf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
ed00: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
ed10: 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61  se, pX);.    iTa
ed20: 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  b = pX->iTable;.
ed30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ed40: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
ed50: 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
ed60: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ed70: 20 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73   "# %.*s", pX->s
ed80: 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e  pan.n, pX->span.
ed90: 7a 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  z));.    if( pLe
eda0: 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  vel->nIn==0 ){. 
edb0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74       pLevel->nxt
edc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
edd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ede0: 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  }.    pLevel->nI
edf0: 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
ee00: 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  >aInLoop = sqlit
ee10: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
ee20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
ee30: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20  evel->aInLoop,. 
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
ee70: 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  ->aInLoop[0])*pL
ee80: 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20  evel->nIn);.    
ee90: 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49  pIn = pLevel->aI
eea0: 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
eeb0: 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
eec0: 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d  += pLevel->nIn -
eed0: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
eee0: 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
eef0: 20 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20 3d    pIn->topAddr =
ef00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ef10: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
ef20: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  iTab, 0);.      
ef30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ef40: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d  (v, OP_IsNull, -
ef50: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  1, 0);.    }else
ef60: 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
ef70: 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  nIn = 0;.    }.#
ef80: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61  endif.  }.  disa
ef90: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
efa0: 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pTerm);.}../*.**
efb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
efc0: 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
efd0: 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
efe0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
eff0: 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68  an.** index.  Th
f000: 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
f010: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
f020: 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
f030: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ck..**.** For ex
f040: 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
f050: 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
f060: 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
f070: 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
f080: 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
f090: 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
f0a0: 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
f0b0: 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
f0c0: 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
f0d0: 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
f0e0: 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
f0f0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
f100: 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
f110: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
f120: 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
f130: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
f140: 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
f150: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
f160: 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
f170: 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
f180: 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
f190: 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
f1a0: 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
f1b0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
f1c0: 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
f1d0: 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e  ll be left.** on
f1e0: 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69   the stack - a i
f1f0: 73 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e  s the deepest an
f200: 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65  d b the shallowe
f210: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  st..**.** In the
f220: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e   example above n
f230: 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73  Eq==2.  But this
f240: 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b   subroutine work
f250: 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a  s for any value.
f260: 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64  ** of nEq includ
f270: 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d  ing 0.  If nEq==
f280: 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  0, this routine 
f290: 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f  is nearly a no-o
f2a0: 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  p..** The only t
f2b0: 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20  hing it does is 
f2c0: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65  allocate the pLe
f2d0: 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79  vel->iMem memory
f2e0: 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   cell..**.** Thi
f2f0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73  s routine always
f300: 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65   allocates at le
f310: 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63  ast one memory c
f320: 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20  ell and puts.** 
f330: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
f340: 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
f350: 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e  in pLevel->iMem.
f360: 20 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a    The code that.
f370: 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
f380: 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70  utine will use p
f390: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73  Level->iMem to s
f3a0: 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61  tore the termina
f3b0: 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75  tion.** key valu
f3c0: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
f3d0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49  If one or more I
f3e0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65  N operators appe
f3f0: 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  ar, then.** this
f400: 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
f410: 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c  es an additional
f420: 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   nEq memory cell
f430: 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a  s for internal.*
f440: 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  * use..*/.static
f450: 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75   void codeAllEqu
f460: 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
f470: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f480: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f490: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
f4a0: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
f4b0: 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
f4c0: 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
f4d0: 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
f4e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
f4f0: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
f500: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
f510: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
f520: 52 65 61 64 79 20 20 20 20 20 20 2f 2a 20 57 68  Ready      /* Wh
f530: 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
f540: 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
f550: 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a  een coded */.){.
f560: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
f570: 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20  el->nEq;        
f580: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
f590: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
f5a0: 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
f5b0: 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65  .  int termsInMe
f5c0: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
f5d0: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f   /* If true, sto
f5e0: 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b  re value in mem[
f5f0: 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62  ] cells */.  Vdb
f600: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f610: 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
f620: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
f630: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
f640: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
f650: 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
f660: 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69  pIdx;   /* The i
f670: 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
f680: 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
f690: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
f6a0: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
f6b0: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
f6c0: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
f6d0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f6e0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
f6f0: 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
f700: 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
f710: 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f730: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f740: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
f750: 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
f760: 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
f770: 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
f780: 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65  te them..  ** We
f790: 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20   always need at 
f7a0: 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74  least one used t
f7b0: 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70  o store the loop
f7c0: 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a   terminator.  **
f7d0: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72   value.  If ther
f7e0: 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f  e are IN operato
f7f0: 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e  rs we'll need on
f800: 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72  e for each == or
f810: 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61  .  ** IN constra
f820: 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76  int..  */.  pLev
f830: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
f840: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28  e->nMem++;.  if(
f850: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
f860: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
f870: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
f880: 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e  nMem += pLevel->
f890: 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e  nEq;.    termsIn
f8a0: 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  Mem = 1;.  }..  
f8b0: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
f8c0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
f8d0: 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ints.  */.  asse
f8e0: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
f8f0: 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28  n>=nEq );.  for(
f900: 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
f910: 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  {.    int k = pI
f920: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
f930: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
f940: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
f950: 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
f960: 65 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64  evel->flags, pId
f970: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  x);.    if( pTer
f980: 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
f990: 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
f9a0: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
f9b0: 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
f9c0: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
f9d0: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
f9e0: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28  pLevel);.    if(
f9f0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
fa00: 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c  or & (WO_ISNULL|
fa10: 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20  WO_IN))==0 ){.  
fa20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fa30: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  ddOp(v, OP_IsNul
fa40: 6c 2c 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3f 20  l, termsInMem ? 
fa50: 2d 31 20 3a 20 2d 28 6a 2b 31 29 2c 20 70 4c 65  -1 : -(j+1), pLe
fa60: 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d  vel->brk);.    }
fa70: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73 49 6e  .    if( termsIn
fa80: 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Mem ){.      sql
fa90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
faa0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
fab0: 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20  evel->iMem+j+1, 
fac0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
fad0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
fae0: 6c 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  l the constraint
faf0: 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e 20 74   values are on t
fb00: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
fb10: 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 74  ack.  */.  if( t
fb20: 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20  ermsInMem ){.   
fb30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
fb40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
fb50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fb60: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65   OP_MemLoad, pLe
fb70: 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 30  vel->iMem+j+1, 0
fb80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fb90: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
fba0: 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54  TE_TEST)./*.** T
fbb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
fbc0: 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65  iable holds a te
fbd0: 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  xt description o
fbe0: 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e  f query plan gen
fbf0: 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  erated.** by the
fc00: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
fc10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
fc20: 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20  eBegin().  Each 
fc30: 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67  call to WhereBeg
fc40: 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  in.** overwrites
fc50: 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20   the previous.  
fc60: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
fc70: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
fc80: 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c  ting and.** anal
fc90: 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68  ysis only..*/.ch
fca0: 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  ar sqlite3_query
fcb0: 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b  _plan[BMS*2*40];
fcc0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
fcd0: 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20   join */.static 
fce0: 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20  int nQPlan = 0; 
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd00: 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69  Next free slow i
fd10: 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20  n _query_plan[] 
fd20: 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
fd30: 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  LITE_TEST */.../
fd40: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
fd50: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
fd60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
fd70: 68 65 72 65 49 6e 66 6f 46 72 65 65 28 57 68 65  hereInfoFree(Whe
fd80: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
fd90: 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b  .  if( pWInfo ){
fda0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fdb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66  for(i=0; i<pWInf
fdc0: 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  o->nLevel; i++){
fdd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
fde0: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f  ndex_info *pInfo
fdf0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e   = pWInfo->a[i].
fe00: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
fe10: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
fe20: 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
fe30: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
fe40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
fe50: 20 43 6f 76 65 72 61 67 65 3a 20 44 6f 6e 27 74   Coverage: Don't
fe60: 20 74 68 69 6e 6b 20 74 68 69 73 20 63 61 6e 20   think this can 
fe70: 62 65 20 72 65 61 63 68 65 64 2e 20 42 79 20 74  be reached. By t
fe80: 68 65 20 74 69 6d 65 20 74 68 69 73 0a 20 20 20  he time this.   
fe90: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
fea0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
feb0: 65 20 69 6e 64 65 78 2d 73 74 72 69 6e 67 73 20  e index-strings 
fec0: 68 61 76 65 20 62 65 65 6e 20 70 61 73 73 65 64  have been passed
fed0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
fee0: 20 74 68 65 20 76 64 62 65 20 6c 61 79 65 72 20   the vdbe layer 
fef0: 66 6f 72 20 64 65 6c 65 74 69 6f 6e 2e 0a 20 20  for deletion..  
ff00: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ff10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ff20: 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29  e(pInfo->idxStr)
ff30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ff40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff50: 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  (pInfo);.      }
ff60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ff70: 65 33 5f 66 72 65 65 28 70 57 49 6e 66 6f 29 3b  e3_free(pWInfo);
ff80: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
ff90: 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
ffa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
ffb0: 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
ffc0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
ffd0: 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
ffe0: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
fff0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
10000 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
10010 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
10020 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
10030 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
10040 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
10050 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
10060 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
10070 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
10080 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
10090 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
100a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
100b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
100c0 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
100d0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
100e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
100f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
10100 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
10110 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
10120 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
10130 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
10140 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
10150 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
10160 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
10170 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
10180 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
10190 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
101a0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
101b0 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
101c0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
101d0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
101e0 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
101f0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
10200 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
10210 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
10220 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
10230 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
10240 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
10250 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
10260 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
10270 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
10280 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
10290 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
102a0 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
102b0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
102c0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
102d0 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
102e0 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
102f0 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
10300 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
10310 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
10320 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
10330 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
10340 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
10350 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
10360 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
10370 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10390 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
103a0 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
103b0 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
103d0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
103e0 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
103f0 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
10400 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
10410 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
10420 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
10430 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
10440 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
10450 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
10460 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
10470 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
10480 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
10490 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
104a0 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
104b0 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
104c0 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
104d0 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
104e0 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
104f0 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
10500 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
10510 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
10520 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
10530 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
10540 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
10550 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
10560 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
10570 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
10580 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
10590 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
105a0 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
105b0 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
105c0 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
105d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
105e0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
105f0 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
10600 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
10610 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10620 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
10630 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
10640 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
10650 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
10660 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
10670 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
10680 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
10690 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
106a0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
106b0 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
106c0 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
106d0 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
106e0 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
106f0 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
10700 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
10710 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
10720 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
10730 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
10740 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
10750 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10760 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
10770 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
10780 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
10790 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
107a0 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
107b0 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
107c0 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
107d0 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
107e0 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
107f0 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
10800 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
10810 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
10820 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
10830 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
10840 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
10850 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
10860 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
10870 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
10880 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
10890 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
108a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
108b0 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
108c0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
108d0 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
108e0 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
108f0 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
10900 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
10910 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
10920 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
10930 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
10940 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
10950 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
10960 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
10970 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
10980 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
10990 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
109a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
109b0 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
109c0 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
109d0 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
109e0 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
109f0 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
10a00 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
10a10 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
10a20 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
10a30 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
10a40 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
10a50 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
10a60 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
10a70 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
10a80 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
10a90 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
10aa0 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
10ab0 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
10ac0 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
10ad0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
10ae0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
10af0 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
10b00 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
10b10 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
10b20 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
10b30 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
10b40 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
10b50 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
10b60 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
10b70 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
10b80 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
10b90 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
10ba0 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
10bb0 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
10bc0 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
10bd0 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
10be0 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
10bf0 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f  SSING.**.** *ppO
10c00 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
10c10 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
10c20 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20   BY clause of a 
10c30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10c40 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  ,.** if there is
10c50 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
10c60 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
10c70 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
10c80 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
10c90 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
10ca0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
10cb0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
10cc0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
10cd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ..**.** If an in
10ce0 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
10cf0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75  so that the natu
10d00 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72  ral output order
10d10 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
10d20 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74   scan is correct
10d30 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
10d40 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
10d50 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65  hat index is use
10d60 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65  d and.** *ppOrde
10d70 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55  rBy is set to NU
10d80 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  LL.  This is an 
10d90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
10da0 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a  t prevents an.**
10db0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
10dc0 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
10dd0 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20  set if an index 
10de0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
10df0 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
10e00 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
10e10 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
10e20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
10e30 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
10e40 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
10e50 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
10e60 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
10e70 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72  , then the *ppOr
10e80 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67  derBy is unchang
10e90 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
10ea0 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
10eb0 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
10ec0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10ed0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
10ee0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
10ef0 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
10f00 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
10f10 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
10f20 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
10f30 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
10f40 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
10f50 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
10f60 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a   **ppOrderBy  /*
10f70 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
10f80 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
10f90 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
10fc0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
10fd0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
10fe0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
10ff0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
11000 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
11010 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
11020 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
11030 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
11040 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
11050 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f  */.  int brk, co
11060 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
11070 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65  /* Addresses use
11080 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  d during code ge
11090 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  neration */.  Bi
110a0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
110b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
110c0 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
110d0 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
110e0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
110f0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11100 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
11110 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
11120 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
11130 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20  skSet maskSet;  
11140 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
11150 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
11160 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11170 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   wc;            
11180 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11190 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69  use is divided i
111a0 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20  nto these terms 
111b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
111c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
111d0 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
111e0 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
111f0 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
11200 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
11210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
11220 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
11230 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
11240 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
11270 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
11280 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
11290 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
112a0 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
112b0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
112c0 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67   all wc.a[].flag
112d0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
112e0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
112f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11300 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
11310 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
11320 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
11330 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
11340 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
11350 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
11360 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
11370 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
11380 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20  t->nSrc>BMS ){. 
11390 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
113a0 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d  sg(pParse, "at m
113b0 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e  ost %d tables in
113c0 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a   a join", BMS);.
113d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
113e0 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  }..  /* Split th
113f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
11400 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
11410 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
11420 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
11430 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
11440 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
11450 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
11460 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d    initMaskSet(&m
11470 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
11480 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20  ClauseInit(&wc, 
11490 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53 65 74  pParse, &maskSet
114a0 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
114b0 26 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  &wc, pWhere, TK_
114c0 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
114d0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
114e0 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
114f0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
11500 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
11510 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
11520 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64   value..  */.  d
11530 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11540 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
11550 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
11560 62 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  b,  .           
11570 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11580 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70  f(WhereInfo) + p
11590 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69  TabList->nSrc*si
115a0 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
115b0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
115c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
115d0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
115e0 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49  NoMem;.  }.  pWI
115f0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54  nfo->nLevel = pT
11600 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20  abList->nSrc;.  
11610 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
11620 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
11630 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
11640 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
11650 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
11660 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11670 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61  v);..  /* Specia
11680 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
11690 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
116a0 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
116b0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
116c0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
116d0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
116e0 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
116f0 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
11700 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
11710 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
11720 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
11730 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
11740 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
11750 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
11760 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
11770 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
11780 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68  eak, 1);.    pWh
11790 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
117a0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
117b0 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
117c0 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
117d0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
117e0 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
117f0 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
11800 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
11810 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11820 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
11830 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
11840 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
11850 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
11860 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
11870 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
11880 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
11890 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
118a0 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
118b0 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
118c0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
118d0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
118e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61  ; i++){.    crea
118f0 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  teMask(&maskSet,
11900 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
11910 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
11920 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
11930 54 61 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20  TabList, &wc);. 
11940 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11950 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
11960 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
11970 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  m;.  }..  /* Cho
11980 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
11990 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
119a0 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
119b0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
119c0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
119d0 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
119e0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
119f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
11a00 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
11a10 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
11a20 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
11a30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
11a40 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
11a50 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45  .flags     WHERE
11a60 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
11a70 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
11a80 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
11a90 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
11aa0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
11ab0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
11ac0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
11ad0 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
11ae0 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  en term of the F
11af0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
11b00 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
11b10 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
11b20 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
11b30 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
11b40 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
11b50 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
11b60 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
11b70 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
11b80 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
11b90 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
11ba0 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
11bb0 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
11bc0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
11bd0 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
11be0 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
11bf0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
11c00 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
11c10 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
11c20 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
11c30 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
11c40 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
11c50 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
11c60 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
11c70 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c    for(i=iFrom=0,
11c80 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
11c90 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
11ca0 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
11cb0 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
11cc0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
11cd0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
11ce0 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
11cf0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
11d00 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
11d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11d20 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64  lags asssociated
11d30 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
11d40 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d60 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
11d70 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
11d80 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  */.    double co
11d90 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
11da0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66     /* The cost f
11db0 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  or pIdx */.    i
11dc0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
11dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
11de0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
11df0 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
11e00 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
11e10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
11e20 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
11e30 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
11e40 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73     int bestFlags
11e50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
11e60 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
11e70 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
11e80 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71  .    int bestNEq
11e90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11ea0 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74   /* nEq associat
11eb0 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
11ec0 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  .    double lowe
11ed0 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
11ee0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20   /* Cost of the 
11ef0 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
11f00 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20   bestJ = 0;     
11f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11f20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
11f30 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f50 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
11f60 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
11f70 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
11f80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11f90 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69   /* True when fi
11fa0 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65  rst table is see
11fb0 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  n */.    sqlite3
11fc0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
11fd0 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  dex; /* Current 
11fe0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f  virtual index */
11ff0 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74  ..    lowestCost
12000 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
12010 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72  L;.    for(j=iFr
12020 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54  om, pTabItem=&pT
12030 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
12040 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
12050 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29  j++, pTabItem++)
12060 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f  {.      int doNo
12070 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72  tReorder;  /* Tr
12080 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ue if this table
12090 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72   should not be r
120a0 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20  eordered */..   
120b0 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
120c0 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
120d0 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
120e0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
120f0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
12100 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
12110 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
12120 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
12130 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
12140 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
12150 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
12160 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12170 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
12180 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
12190 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
121a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
121b0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
121c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
121d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
121e0 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
121f0 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
12200 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
12210 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
12220 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
12230 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d   = &pWInfo->a[j]
12240 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
12250 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69     cost = bestVi
12260 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
12270 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
12280 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
122b0 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
122c0 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
122f0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  IdxInfo);.      
12300 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
12310 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
12320 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a        pIndex = *
12330 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  ppIdxInfo;.     
12340 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
12350 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79   pIndex->orderBy
12360 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
12370 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
12380 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
12390 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   | WHERE_ORDERBY
123a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
123b0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
123c0 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20        nEq = 0;. 
123d0 20 20 20 20 20 20 20 69 66 28 20 28 53 51 4c 49         if( (SQLI
123e0 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c  TE_BIG_DBL/2.0)<
123f0 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  cost ){.        
12400 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73    /* The cost is
12410 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
12420 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53  be larger than S
12430 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74  QLITE_BIG_DBL (t
12440 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
12450 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20  inital value of 
12460 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68  lowestCost in th
12470 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69  is loop. If it i
12480 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  s, then.        
12490 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c    ** the (cost<l
124a0 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20  owestCost) test 
124b0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72  below will never
124c0 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20   be true and.   
124d0 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c         ** pLevel
124e0 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76 65 72  ->pBestIdx never
124f0 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
12500 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  */ .          co
12510 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47  st = (SQLITE_BIG
12520 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20  _DBL/2.0);.     
12530 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12540 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b   .#endif.      {
12550 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20  .        cost = 
12560 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
12570 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c  , &wc, pTabItem,
12580 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
125b0 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
125c0 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20  erBy : 0,.      
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73     &pIdx, &flags
125f0 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  , &nEq);.       
12600 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
12610 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
12620 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29  ost<lowestCost )
12630 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  {.        once =
12640 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65   1;.        lowe
12650 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
12660 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
12670 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73  Idx;.        bes
12680 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
12690 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20          bestNEq 
126a0 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62  = nEq;.        b
126b0 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
126c0 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49    pLevel->pBestI
126d0 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  dx = pIndex;.   
126e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
126f0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
12700 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  eak;.    }.    W
12710 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
12720 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65  Optimizer choose
12730 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f   table %d for lo
12740 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c  op %d\n", bestJ,
12750 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76  .           pLev
12760 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a  el-pWInfo->a));.
12770 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c 61      if( (bestFla
12780 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
12790 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)!=0 ){.      
127a0 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
127b0 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
127c0 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b  gs &= bestFlags;
127d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61  .    pLevel->fla
127e0 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a  gs = bestFlags;.
127f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78      pLevel->pIdx
12800 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c   = pBest;.    pL
12810 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74  evel->nEq = best
12820 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  NEq;.    pLevel-
12830 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  >aInLoop = 0;.  
12840 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20    pLevel->nIn = 
12850 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73 74  0;.    if( pBest
12860 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
12870 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
12880 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
128a0 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
128b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  1;.    }.    not
128c0 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
128d0 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
128e0 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69  List->a[bestJ].i
128f0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65  Cursor);.    pLe
12900 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73  vel->iFrom = bes
12910 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54  tJ;.  }.  WHERET
12920 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d  RACE(("*** Optim
12930 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a  izer Finished **
12940 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  *\n"));..  /* If
12950 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
12960 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20   only selects a 
12970 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e  single row, then
12980 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
12990 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72 72  ** clause is irr
129a0 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20  elevant..  */.  
129b0 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20  if( (andFlags & 
129c0 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30  WHERE_UNIQUE)!=0
129d0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b   && ppOrderBy ){
129e0 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20  .    *ppOrderBy 
129f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 0;.  }..  /* O
12a00 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
12a10 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
12a20 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
12a30 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
12a40 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
12a50 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
12a60 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
12a70 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
12a80 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
12a90 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
12aa0 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72  er Goto */.  for
12ab0 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
12ac0 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
12ad0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
12ae0 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
12af0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
12b00 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
12b10 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
12b20 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  x;      /* Index
12b30 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
12b40 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f  pTab (if any) */
12b50 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
12b60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12b70 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
12b80 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
12b90 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  x */.    int iId
12ba0 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
12bb0 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66  IdxCur;..#ifndef
12bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
12bd0 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61  LAIN.    if( pPa
12be0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
12bf0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
12c00 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63  Msg;.      struc
12c10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12c20 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
12c30 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
12c40 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  om];.      zMsg 
12c50 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
12c60 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c  (db, "TABLE %s",
12c70 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
12c80 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
12c90 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
12ca0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
12cb0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
12cc0 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70   AS %s", zMsg, p
12cd0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
12ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12cf0 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
12d00 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
12d10 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
12d20 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
12d30 7a 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22  z WITH INDEX %s"
12d40 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61  , zMsg, pIx->zNa
12d50 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
12d60 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
12d70 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
12d80 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
12d90 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
12da0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
12db0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a  3MPrintf(db, "%z
12dc0 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
12dd0 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
12de0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12df0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12e00 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20  ABLE.      else 
12e10 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
12e20 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  tIdx ){.        
12e30 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
12e40 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70  fo *pBestIdx = p
12e50 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b  Level->pBestIdx;
12e60 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
12e70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
12e80 62 2c 20 22 25 7a 20 56 49 52 54 55 41 4c 20 54  b, "%z VIRTUAL T
12e90 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
12ea0 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
12ec0 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70  stIdx->idxNum, p
12ed0 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29  BestIdx->idxStr)
12ee0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12ef0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
12f00 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
12f10 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20  _ORDERBY ){.    
12f20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
12f30 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
12f40 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  z ORDER BY", zMs
12f50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
12f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
12f70 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
12f80 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  i, pLevel->iFrom
12f90 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d  , zMsg, P3_DYNAM
12fa0 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  IC);.    }.#endi
12fb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12fc0 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20  _EXPLAIN */.    
12fd0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
12fe0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
12ff0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
13000 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
13010 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
13020 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13030 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
13040 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13050 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70    if( pTab->isEp
13060 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  hem || pTab->pSe
13070 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
13080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13090 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
130a0 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  E.    if( pLevel
130b0 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20  ->pBestIdx ){.  
130c0 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70      int iCur = p
130d0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
130e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
130f0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 4f 70  dbeOp3(v, OP_VOp
13100 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 28 63 6f  en, iCur, 0, (co
13110 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d 3e  nst char*)pTab->
13120 70 56 74 61 62 2c 20 50 33 5f 56 54 41 42 29 3b  pVtab, P3_VTAB);
13130 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
13140 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
13150 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
13160 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
13170 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
13180 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
13190 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
131a0 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
131b0 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
131c0 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c    if( pTab->nCol
131d0 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  <(sizeof(Bitmask
131e0 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  )*8) ){.        
131f0 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
13200 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
13210 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
13220 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
13230 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
13240 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
13250 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
13260 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13270 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 6e 29  entAddr(v)-1, n)
13280 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13290 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
132a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
132b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
132c0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
132d0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
132e0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
132f0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
13300 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
13310 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
13320 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70  rsor;.    if( (p
13330 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  Ix = pLevel->pId
13340 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 4b  x)!=0 ){.      K
13350 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
13360 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
13370 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
13380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13390 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  Ix->pSchema==pTa
133a0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
133b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
133c0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
133d0 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20  er, iDb, 0);.   
133e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
133f0 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d 3e  v, "# %s", pIx->
13400 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
13410 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13420 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
13430 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
13440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13450 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13460 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
13470 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a 20  ANDOFF);.    }. 
13480 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
13490 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  flags & (WHERE_I
134a0 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 43 4f  DX_ONLY|WHERE_CO
134b0 4c 55 4d 4e 5f 52 41 4e 47 45 29 29 21 3d 30 20  LUMN_RANGE))!=0 
134c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  ){.      /* Only
134d0 20 63 61 6c 6c 20 4f 50 5f 53 65 74 4e 75 6d 43   call OP_SetNumC
134e0 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68 65 20 69 6e  olumns on the in
134f0 64 65 78 20 69 66 20 77 65 20 6d 69 67 68 74 20  dex if we might 
13500 6c 61 74 65 72 20 75 73 65 0a 20 20 20 20 20 20  later use.      
13510 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 6e 20  ** OP_Column on 
13520 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  the index. */.  
13530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13540 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
13550 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43 75  mColumns, iIdxCu
13560 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  r, pIx->nColumn+
13570 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  1);.    }.    sq
13580 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13590 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
135a0 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
135b0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
135c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
135d0 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  v);..  /* Genera
135e0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
135f0 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
13600 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
13610 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
13620 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
13630 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
13640 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
13650 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
13660 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
13670 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
13680 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
13690 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
136a0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
136b0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
136c0 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a  el++){.    int j
136d0 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d  ;.    int iCur =
136e0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
136f0 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45  or;  /* The VDBE
13700 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
13710 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e 64  table */.    Ind
13720 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
13730 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
13740 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
13750 0a 20 20 20 20 69 6e 74 20 6e 78 74 3b 20 20 20  .    int nxt;   
13760 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
13770 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
13780 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
13790 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
137a0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
137b0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
137c0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
137d0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
137e0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
137f0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
13800 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
13810 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76   */.    int bRev
13820 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
13830 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
13840 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
13850 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70   order */..    p
13860 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
13870 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
13880 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20  From];.    iCur 
13890 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
138a0 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  sor;.    pIdx = 
138b0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20  pLevel->pIdx;.  
138c0 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
138d0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
138e0 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d   bRev = (pLevel-
138f0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
13900 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20  EVERSE)!=0;.    
13910 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
13920 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13930 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b  RE_IDX_ONLY)!=0;
13940 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
13950 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
13960 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
13970 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
13980 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ns.    ** for th
13990 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20  e current loop. 
139a0 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20   Jump to brk to 
139b0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
139c0 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70  oop..    ** Jump
139d0 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
139e0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
139f0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
13a00 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   of the.    ** l
13a10 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oop..    **.    
13a20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
13a30 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
13a40 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
13a50 22 6e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74  "nxt" label that
13a60 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f  .    ** means to
13a70 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
13a80 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65  he next IN value
13a90 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57   combination.  W
13aa0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  hen.    ** there
13ab0 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
13ac0 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
13ad0 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 6e 78  traints, the "nx
13ae0 74 22 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a 20  t" label.    ** 
13af0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22  is the same as "
13b00 62 72 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  brk"..    */.   
13b10 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
13b20 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74  rk = pLevel->nxt
13b30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13b40 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13b50 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63  cont = pLevel->c
13b60 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
13b70 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
13b80 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
13b90 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
13ba0 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  e of a LEFT OUTE
13bb0 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65  R JOIN, allocate
13bc0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74   and.    ** init
13bd0 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
13be0 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
13bf0 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
13c00 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20  matches any.    
13c10 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
13c20 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
13c30 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  join..    */.   
13c40 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72   if( pLevel->iFr
13c50 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  om>0 && (pTabIte
13c60 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m[0].jointype & 
13c70 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
13c80 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
13c90 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
13ca0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
13cb0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
13cc0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
13cd0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
13ce0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13cf0 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65  MemInt, 0, pLeve
13d00 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
13d10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13d20 28 28 76 2c 20 22 23 20 69 6e 69 74 20 4c 45 46  ((v, "# init LEF
13d30 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
13d40 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  flag"));.    }..
13d50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13d60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13d70 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
13d80 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20  >pBestIdx ){.   
13d90 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
13da0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
13db0 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
13dc0 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
13dd0 64 20 56 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a  d VNext.      **
13de0 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
13df0 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
13e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13e10 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
13e20 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42  3_index_info *pB
13e30 65 73 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  estIdx = pLevel-
13e40 3e 70 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20  >pBestIdx;.     
13e50 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
13e60 20 3d 20 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f   = pBestIdx->nCo
13e70 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20  nstraint;.      
13e80 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
13e90 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
13ea0 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a  usage *aUsage =.
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e    pBestIdx->aCon
13ef0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
13f00 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
13f10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
13f20 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73  onstraint *aCons
13f30 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20  traint =.       
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13f70 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
13f80 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ;..      for(j=1
13f90 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; j<=nConstraint
13fa0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
13fb0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
13fc0 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74  or(k=0; k<nConst
13fd0 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20  raint; k++){.   
13fe0 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67         if( aUsag
13ff0 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d  e[k].argvIndex==
14000 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
14010 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
14020 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72  nstraint[k].iTer
14030 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
14040 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14050 43 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e  Code(pParse, wc.
14060 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e  a[iTerm].pExpr->
14070 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
14080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
140a0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
140b0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62  =nConstraint ) b
140c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
140d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
140e0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
140f0 65 72 2c 20 6a 2d 31 2c 20 30 29 3b 0a 20 20 20  er, j-1, 0);.   
14100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14110 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
14120 72 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  r, pBestIdx->idx
14130 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  Num, 0);.      s
14140 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
14150 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
14160 72 2c 20 62 72 6b 2c 20 70 42 65 73 74 49 64 78  r, brk, pBestIdx
14170 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20  ->idxStr,.      
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 70 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f  pBestIdx->needTo
141a0 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 33 5f  FreeIdxStr ? P3_
141b0 4d 50 52 49 4e 54 46 20 3a 20 50 33 5f 53 54 41  MPRINTF : P3_STA
141c0 54 49 43 29 3b 0a 20 20 20 20 20 20 70 42 65 73  TIC);.      pBes
141d0 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65  tIdx->needToFree
141e0 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20  IdxStr = 0;.    
141f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 42 65    for(j=0; j<pBe
14200 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69  stIdx->nConstrai
14210 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
14220 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e    if( aUsage[j].
14230 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  omit ){.        
14240 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
14250 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
14260 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
14270 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
14280 70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54  pLevel, &wc.a[iT
14290 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  erm]);.        }
142a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
142b0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
142c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
142d0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
142e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
142f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14300 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
14310 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
14320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
14330 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
14340 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
14350 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
14360 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  D_EQ ){.      /*
14370 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
14380 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
14390 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
143a0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20   using an.      
143b0 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
143c0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
143d0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
143e0 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
143f0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
14400 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
14410 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
14420 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
14430 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  )".      **     
14440 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
14450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
14460 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
14470 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
14480 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
14490 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_IN, 0);.      
144a0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
144b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
144c0 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
144d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
144e0 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
144f0 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
14500 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
14510 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
14520 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
14530 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
14540 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
14550 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nxt = pLevel->n
14560 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
14570 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14580 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20 6e  _MustBeInt, 1, n
14590 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
145a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
145b0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
145c0 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 56  r, nxt);.      V
145d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
145e0 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c 65  pk"));.      pLe
145f0 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f  vel->op = OP_Noo
14600 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
14610 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
14620 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
14630 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  GE ){.      /* C
14640 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
14650 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
14660 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
14670 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
14680 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14690 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50   int testOp = OP
146a0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74  _Noop;.      int
146b0 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 57 68   start;.      Wh
146c0 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c  ereTerm *pStart,
146d0 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61   *pEnd;..      a
146e0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
146f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 74  ==0 );.      pSt
14700 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  art = findTerm(&
14710 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
14720 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
14730 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  _GE, 0);.      p
14740 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  End = findTerm(&
14750 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
14760 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
14770 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  _LE, 0);.      i
14780 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
14790 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72     pTerm = pStar
147a0 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74 61 72  t;.        pStar
147b0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
147c0 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a    pEnd = pTerm;.
147d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
147e0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
147f0 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
14800 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61 72        pX = pStar
14810 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  t->pExpr;.      
14820 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
14830 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
14840 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  t( pStart->leftC
14850 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
14860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
14870 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
14880 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
14890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
148a0 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 72 63 65  ddOp(v, OP_Force
148b0 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  Int, pX->op==TK_
148c0 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LE || pX->op==TK
148d0 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  _GT, brk);.     
148e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
148f0 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  dOp(v, bRev ? OP
14900 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76  _MoveLt : OP_Mov
14910 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  eGe, iCur, brk);
14920 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
14930 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
14940 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
14950 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
14960 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  art);.      }els
14970 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14980 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62  e3VdbeAddOp(v, b
14990 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
149a0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
149b0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
149c0 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b       if( pEnd ){
149d0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
149e0 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
149f0 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pEnd->pExpr;.   
14a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
14a10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
14a20 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
14a30 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
14a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
14a50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14a60 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
14a70 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
14a80 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
14a90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ++;.        sqli
14aa0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14ab0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
14ac0 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
14ad0 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f         if( pX->o
14ae0 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
14af0 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
14b00 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
14b10 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f  bRev ? OP_Le : O
14b20 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  P_Ge;.        }e
14b30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74  lse{.          t
14b40 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
14b50 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20  P_Lt : OP_Gt;.  
14b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14b70 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
14b80 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 20  el, pEnd);.     
14b90 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d   }.      start =
14ba0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14bb0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14bc0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
14bd0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
14be0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  OP_Next;.      p
14bf0 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
14c00 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
14c10 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
14c20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
14c30 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
14c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c50 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  p(v, OP_Rowid, i
14c60 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
14c70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c80 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
14c90 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
14ca0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14cb0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
14cc0 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f 41 46  estOp, SQLITE_AF
14cd0 46 5f 4e 55 4d 45 52 49 43 7c 30 78 31 30 30 2c  F_NUMERIC|0x100,
14ce0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
14cf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
14d00 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
14d10 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
14d20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
14d30 20 33 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c   3: The WHERE cl
14d40 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 72  ause term that r
14d50 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69 67  efers to the rig
14d60 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ht-most.      **
14d70 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
14d80 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
14d90 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
14da0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
14db0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
14dc0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f 6e   the index is on
14dd0 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65   (x,y,z) and the
14de0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
14df0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
14e00 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22 78           form "x
14e10 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68 65  =5 AND y<10" the
14e20 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20 75  n this case is u
14e30 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20  sed.  Only the. 
14e40 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
14e50 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
14e60 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
14e70 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
14e80 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  t must.      ** 
14e90 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
14ea0 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
14eb0 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a  erators..      *
14ec0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
14ed0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
14ee0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
14ef0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
14f00 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 2a  E clause.      *
14f10 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
14f20 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
14f30 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
14f40 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
14f50 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
14f60 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75   to force the ou
14f70 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f  tput order to co
14f80 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45  nform to an ORDE
14f90 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  R BY..      */. 
14fa0 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
14fb0 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20        int nEq = 
14fc0 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20  pLevel->nEq;.   
14fd0 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20     int topEq=0; 
14fe0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14ff0 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73 65 73  f top limit uses
15000 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20 73 74   ==. False is st
15010 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20  rictly < */.    
15020 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20    int btmEq=0;  
15030 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15040 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65 73 20   btm limit uses 
15050 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73 74 72  ==. False if str
15060 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20  ictly > */.     
15070 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f   int topOp, btmO
15080 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72  p;   /* Operator
15090 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20 61 6e  s for the top an
150a0 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63 68 20  d bottom search 
150b0 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20  bounds */.      
150c0 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20 20 20  int testOp;.    
150d0 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d    int topLimit =
150e0 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
150f0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
15100 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74  T)!=0;.      int
15110 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65   btmLimit = (pLe
15120 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
15130 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30  RE_BTM_LIMIT)!=0
15140 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
15150 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
15160 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
15170 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
15180 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20   == or IN.      
15190 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74 68 65  ** and level the
151a0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65   values of those
151b0 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74   terms on the st
151c0 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
151d0 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c      codeAllEqual
151e0 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ityTerms(pParse,
151f0 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f   pLevel, &wc, no
15200 74 52 65 61 64 79 29 3b 0a 0a 20 20 20 20 20 20  tReady);..      
15210 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
15220 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76   equality term v
15230 61 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68  alues because th
15240 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20  ey will all be. 
15250 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69       ** used twi
15260 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65  ce: once to make
15270 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
15280 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f   key and once to
15290 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20   make the.      
152a0 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20  ** start key..  
152b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
152c0 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
152d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
152e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
152f0 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29  P_Dup, nEq-1, 0)
15300 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15310 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
15320 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  hat comparison o
15330 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20  perators to use 
15340 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74  for top and bott
15350 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61  om .      ** sea
15360 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20  rch bounds. For 
15370 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
15380 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62  ex, the bottom b
15390 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e  ound is a > or >
153a0 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61  =.      ** opera
153b0 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20  tor and the top 
153c0 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20  bound is a < or 
153d0 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f  <= operator.  Fo
153e0 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20  r a descending. 
153f0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68       ** index th
15400 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  e operators are 
15410 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20  reversed..      
15420 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  */.      if( pId
15430 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
15440 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
15450 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 70  C ){.        top
15460 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  Op = WO_LT|WO_LE
15470 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20  ;.        btmOp 
15480 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20  = WO_GT|WO_GE;. 
15490 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
154a0 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 47      topOp = WO_G
154b0 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 20  T|WO_GE;.       
154c0 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57   btmOp = WO_LT|W
154d0 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53 57  O_LE;.        SW
154e0 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69 74  AP(int, topLimit
154f0 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20 20  , btmLimit);.   
15500 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
15510 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d  enerate the term
15520 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68  ination key.  Th
15530 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61  is is the key va
15540 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lue that.      *
15550 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73  * will end the s
15560 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
15570 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   no termination 
15580 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20  key if there.   
15590 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75     ** are no equ
155a0 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
155b0 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e  no "X<..." term.
155c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
155d0 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20  ** 2002-Dec-04: 
155e0 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  On a reverse-ord
155f0 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d  er scan, the so-
15600 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74  called "terminat
15610 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65  ion".      ** ke
15620 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20  y computed here 
15630 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62  really ends up b
15640 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b  eing the start k
15650 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
15660 20 20 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d     nxt = pLevel-
15670 3e 6e 78 74 3b 0a 20 20 20 20 20 20 69 66 28 20  >nxt;.      if( 
15680 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  topLimit ){.    
15690 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
156a0 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49        int k = pI
156b0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
156c0 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
156d0 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
156e0 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
156f0 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29 3b 0a  , topOp, pIdx);.
15700 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15710 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
15720 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e      pX = pTerm->
15730 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
15740 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
15750 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
15760 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
15770 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15780 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
15790 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ght);.        sq
157a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
157b0 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 28 6e  , OP_IsNull, -(n
157c0 45 71 2a 32 2b 31 29 2c 20 6e 78 74 29 3b 0a 20  Eq*2+1), nxt);. 
157d0 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70         topEq = p
157e0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
157f0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
15800 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
15810 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
15820 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  rm);.        tes
15830 74 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a  tOp = OP_IdxGE;.
15840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15850 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45       testOp = nE
15860 71 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a  q>0 ? OP_IdxGE :
15870 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
15880 20 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20    topEq = 1;.   
15890 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
158a0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
158b0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
158c0 6f 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69  ol = nEq + topLi
158d0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  mit;.        pLe
158e0 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
158f0 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
15900 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
15910 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64  obe(v, nCol, pId
15920 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
15930 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15940 20 20 69 6e 74 20 6f 70 20 3d 20 74 6f 70 45 71    int op = topEq
15950 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f   ? OP_MoveLe : O
15960 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20  P_MoveLt;.      
15970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15980 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64 78  ddOp(v, op, iIdx
15990 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  Cur, nxt);.     
159a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
159b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
159c0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
159d0 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
159e0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  m, 1);.        }
159f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15a00 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20   bRev ){.       
15a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a20 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49  p(v, OP_Last, iI
15a30 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
15a40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
15a50 65 6e 65 72 61 74 65 20 74 68 65 20 73 74 61 72  enerate the star
15a60 74 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20  t key.  This is 
15a70 74 68 65 20 6b 65 79 20 74 68 61 74 20 64 65 66  the key that def
15a80 69 6e 65 73 20 74 68 65 20 6c 6f 77 65 72 0a 20  ines the lower. 
15a90 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e       ** bound on
15aa0 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68   the search.  Th
15ab0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 72 74 20  ere is no start 
15ac0 6b 65 79 20 69 66 20 74 68 65 72 65 20 61 72 65  key if there are
15ad0 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20 65 71 75   no.      ** equ
15ae0 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
15af0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  if there is no "
15b00 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20 20 49 6e  X>..." term.  In
15b10 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63  .      ** that c
15b20 61 73 65 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ase, generate a 
15b30 22 52 65 77 69 6e 64 22 20 69 6e 73 74 72 75 63  "Rewind" instruc
15b40 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66  tion in place of
15b50 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74   the.      ** st
15b60 61 72 74 20 6b 65 79 20 73 65 61 72 63 68 2e 0a  art key search..
15b70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15b80 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 49  * 2002-Dec-04: I
15b90 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20  n the case of a 
15ba0 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 65  reverse-order se
15bb0 61 72 63 68 2c 20 74 68 65 20 73 6f 2d 63 61 6c  arch, the so-cal
15bc0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 22 73 74  led.      ** "st
15bd0 61 72 74 22 20 6b 65 79 20 72 65 61 6c 6c 79 20  art" key really 
15be0 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 75 73  ends up being us
15bf0 65 64 20 61 73 20 74 68 65 20 74 65 72 6d 69 6e  ed as the termin
15c00 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20 20 20 20  ation key..     
15c10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 74   */.      if( bt
15c20 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  mLimit ){.      
15c30 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
15c40 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
15c50 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
15c60 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
15c70 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
15c80 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
15c90 62 74 6d 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20  btmOp, pIdx);.  
15ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
15cb0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  erm!=0 );.      
15cc0 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
15cd0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73  xpr;.        ass
15ce0 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61  ert( (pTerm->fla
15cf0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
15d00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
15d10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
15d20 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
15d30 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
15d40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15d50 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 28 6e 45 71  OP_IsNull, -(nEq
15d60 2b 31 29 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  +1), nxt);.     
15d70 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72 6d     btmEq = pTerm
15d80 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
15d90 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
15da0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
15db0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
15dc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15dd0 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 31 3b        btmEq = 1;
15de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15df0 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c  f( nEq>0 || btmL
15e00 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
15e10 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b  int nCol = nEq +
15e20 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20   btmLimit;.     
15e30 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
15e40 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64 78  be(v, nCol, pIdx
15e50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  );.        if( b
15e60 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
15e70 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20   pLevel->iMem = 
15e80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
15e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15ea0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15eb0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
15ec0 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  l->iMem, 1);.   
15ed0 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15ee0 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20 20 20  OP_IdxLT;.      
15ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15f00 20 20 20 69 6e 74 20 6f 70 20 3d 20 62 74 6d 45     int op = btmE
15f10 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20  q ? OP_MoveGe : 
15f20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20  OP_MoveGt;.     
15f30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15f40 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64  AddOp(v, op, iId
15f50 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20  xCur, nxt);.    
15f60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
15f70 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
15f80 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
15f90 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65  P_Noop;.      }e
15fa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
15fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15fc0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78   OP_Rewind, iIdx
15fd0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
15fe0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
15ff0 65 72 61 74 65 20 74 68 65 20 74 68 65 20 74 6f  erate the the to
16000 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  p of the loop.  
16010 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65  If there is a te
16020 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  rmination.      
16030 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65 20 74  ** key we have t
16040 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61 74 20  o test for that 
16050 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74  key and abort at
16060 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
16070 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20        ** loop.. 
16080 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16090 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
160a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
160b0 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
160c0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
160d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
160e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
160f0 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
16100 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
16110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16120 28 76 2c 20 74 65 73 74 4f 70 2c 20 69 49 64 78  (v, testOp, iIdx
16130 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20  Cur, nxt);.     
16140 20 20 20 69 66 28 20 28 74 6f 70 45 71 20 26 26     if( (topEq &&
16150 20 21 62 52 65 76 29 20 7c 7c 20 28 21 62 74 6d   !bRev) || (!btm
16160 45 71 20 26 26 20 62 52 65 76 29 20 29 7b 0a 20  Eq && bRev) ){. 
16170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16180 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
16190 2d 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54  -1, "+", P3_STAT
161a0 49 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IC);.        }. 
161b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
161c0 20 74 6f 70 4c 69 6d 69 74 20 7c 20 62 74 6d 4c   topLimit | btmL
161d0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
161e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161f0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
16200 49 64 78 43 75 72 2c 20 6e 45 71 29 3b 0a 20 20  IdxCur, nEq);.  
16210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16220 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
16230 75 6c 6c 2c 20 31 2c 20 63 6f 6e 74 29 3b 0a 20  ull, 1, cont);. 
16240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16250 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
16260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16270 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
16280 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
16290 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
162a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
162b0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
162c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
162d0 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
162e0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75  he instruction u
162f0 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  sed to terminate
16300 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20   the loop..     
16310 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
16320 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
16330 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
16340 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
16350 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
16360 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
16370 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  start;.    }else
16380 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
16390 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
163a0 4e 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  N_EQ ){.      /*
163b0 20 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20   Case 4:  There 
163c0 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  is an index and 
163d0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
163e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
163f0 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  at.      **     
16400 20 20 20 20 20 72 65 66 65 72 20 74 6f 20 74 68       refer to th
16410 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  e index using th
16420 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f  e "==" or "IN" o
16430 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20  perators..      
16440 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
16450 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  rt;.      int nE
16460 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
16470 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
16480 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
16490 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  uate all constra
164a0 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20  int terms using 
164b0 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a  == or IN.      *
164c0 2a 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  * and leave the 
164d0 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20  values of those 
164e0 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61  terms on the sta
164f0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
16500 20 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69     codeAllEquali
16510 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  tyTerms(pParse, 
16520 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74  pLevel, &wc, not
16530 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 6e 78  Ready);.      nx
16540 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b  t = pLevel->nxt;
16550 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
16560 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79  ate a single key
16570 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
16580 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74  ed to both start
16590 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a 20   and terminate. 
165a0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72       ** the sear
165b0 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ch.      */.    
165c0 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
165d0 65 28 76 2c 20 6e 45 71 2c 20 70 49 64 78 29 3b  e(v, nEq, pIdx);
165e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
165f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16600 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
16610 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20  iMem, 0);..     
16620 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16630 65 20 28 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f  e (1) to move to
16640 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
16650 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
16660 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  he table..      
16670 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72 61 74 65  ** Then generate
16680 20 63 6f 64 65 20 28 32 29 20 74 68 61 74 20 6a   code (2) that j
16690 75 6d 70 73 20 74 6f 20 22 6e 78 74 22 20 61 66  umps to "nxt" af
166a0 74 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 69  ter the cursor i
166b0 73 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  s past.      ** 
166c0 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68 69 6e  the last matchin
166d0 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  g element of the
166e0 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 64   table.  The cod
166f0 65 20 28 31 29 20 69 73 20 65 78 65 63 75 74 65  e (1) is execute
16700 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20  d.      ** once 
16710 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
16720 65 20 73 65 61 72 63 68 2c 20 74 68 65 20 63 6f  e search, the co
16730 64 65 20 28 32 29 20 69 73 20 65 78 65 63 75 74  de (2) is execut
16740 65 64 20 62 65 66 6f 72 65 20 65 61 63 68 0a 20  ed before each. 
16750 20 20 20 20 20 2a 2a 20 69 74 65 72 61 74 69 6f       ** iteratio
16760 6e 20 6f 66 20 74 68 65 20 73 63 61 6e 20 74 6f  n of the scan to
16770 20 73 65 65 20 69 66 20 74 68 65 20 73 63 61 6e   see if the scan
16780 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 20 2a   has finished. *
16790 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76  /.      if( bRev
167a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
167b0 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
167c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
167d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
167e0 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65 2c 20 69  (v, OP_MoveLe, i
167f0 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
16800 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
16810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16820 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
16830 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
16840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16850 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
16860 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20 6e  dxLT, iIdxCur, n
16870 78 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  xt);.        pLe
16880 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
16890 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  v;.      }else{.
168a0 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
168b0 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f  in the forward o
168c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
168d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
168e0 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
168f0 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
16900 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
16910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
16920 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
16930 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
16940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16950 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  dbeOp3(v, OP_Idx
16960 47 45 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74  GE, iIdxCur, nxt
16970 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43  , "+", P3_STATIC
16980 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
16990 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
169a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
169b0 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b  f( !omitTable ){
169c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
169d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
169e0 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
169f0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  r, 0);.        s
16a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16a10 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43  v, OP_MoveGe, iC
16a20 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ur, 0);.      }.
16a30 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
16a40 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
16a50 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
16a60 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tart;.    }else{
16a70 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35  .      /* Case 5
16a80 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75  :  There is no u
16a90 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65  sable index.  We
16aa0 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c   must do a compl
16ab0 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ete.      **    
16ac0 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68        scan of th
16ad0 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a  e entire table..
16ae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
16af0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
16b00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
16b10 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a  ert( bRev==0 );.
16b20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
16b30 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
16b40 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
16b50 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
16b60 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69  l->p2 = 1 + sqli
16b70 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16b80 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
16b90 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20   brk);.    }.   
16ba0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
16bb0 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
16bc0 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  iCur);..    /* I
16bd0 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
16be0 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
16bf0 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
16c00 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
16c10 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
16c20 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
16c30 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
16c40 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54     */.    for(pT
16c50 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e  erm=wc.a, j=wc.n
16c60 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
16c70 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
16c80 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
16c90 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
16ca0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
16cb0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
16cc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
16cd0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
16ce0 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
16cf0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
16d00 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d        pE = pTerm
16d10 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
16d20 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
16d30 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
16d40 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
16d50 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16d60 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
16d70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
16d80 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
16d90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
16da0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
16db0 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20  E, cont, 1);.   
16dc0 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
16dd0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
16de0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
16df0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
16e00 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
16e10 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
16e20 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
16e30 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  .    ** at least
16e40 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
16e50 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
16e60 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
16e70 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f   table.  .    */
16e80 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
16e90 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
16ea0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20      pLevel->top 
16eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16ec0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
16ed0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ee0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
16ef0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  , 1, pLevel->iLe
16f00 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56  ftJoin);.      V
16f10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
16f20 23 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f  # record LEFT JO
16f30 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20  IN hit"));.     
16f40 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
16f50 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d   j=0; j<wc.nTerm
16f60 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
16f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
16f80 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
16f90 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
16fa0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
16fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
16fc0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
16fd0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
16fe0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16ff0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
17000 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
17010 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
17020 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
17030 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74  erm->pExpr, cont
17040 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54  , 1);.        pT
17050 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
17060 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20  RM_CODED;.      
17070 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  }.    }.  }..#if
17080 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
17090 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
170a0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
170b0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
170c0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
170d0 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
170e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
170f0 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
17100 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
17110 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
17120 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
17130 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
17140 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
17150 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
17160 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
17170 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
17180 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
17190 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
171a0 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
171b0 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
171c0 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
171d0 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
171e0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
171f0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
17200 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
17210 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
17220 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
17230 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
17240 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
17250 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
17260 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
17270 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
17280 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
17290 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
172a0 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  me;.    n = strl
172b0 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  en(z);.    if( n
172c0 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
172d0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
172e0 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
172f0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
17300 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
17310 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
17320 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
17330 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
17340 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
17350 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
17360 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17370 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
17380 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
17390 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
173a0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
173b0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
173c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
173d0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
173e0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
173f0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
17400 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
17410 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
17420 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
17430 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
17440 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17450 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b  Plan], "* ", 2);
17460 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
17470 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
17480 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d  ( pLevel->pIdx==
17490 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
174a0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
174b0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
174c0 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  {} ", 3);.      
174d0 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20  nQPlan += 3;.   
174e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
174f0 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d  = strlen(pLevel-
17500 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pIdx->zName);. 
17510 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61       if( n+nQPla
17520 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
17530 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32  e3_query_plan)-2
17540 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
17550 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
17560 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
17570 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
17580 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
17590 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
175a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
175b0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
175c0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
175d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
175e0 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
175f0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
17600 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
17610 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
17620 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
17630 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
17640 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
17650 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
17660 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
17670 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17680 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
17690 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
176a0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
176b0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
176c0 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
176d0 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
176e0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
176f0 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
17700 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
17710 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
17720 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
17730 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
17740 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
17750 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
17760 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
17770 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
17780 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
17790 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
177a0 77 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  wc);.  whereInfo
177b0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
177c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
177d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
177e0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
177f0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
17800 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
17810 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
17820 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17830 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
17840 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
17850 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
17860 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
17870 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
17880 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
17890 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
178a0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
178b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
178c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
178d0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
178e0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
178f0 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
17900 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
17910 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
17920 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
17930 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
17940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17950 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
17960 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
17970 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
17980 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
17990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
179a0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  Op(v, pLevel->op
179b0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
179c0 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d  evel->p2);.    }
179d0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
179e0 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 73 74  >nIn ){.      st
179f0 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
17a00 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
17a10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17a20 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17a30 70 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b 0a 20 20  pLevel->nxt);.  
17a40 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
17a50 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76  ->nIn, pIn=&pLev
17a60 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  el->aInLoop[j-1]
17a70 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
17a80 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
17a90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17aa0 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2b  v, pIn->topAddr+
17ab0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17ac0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17ad0 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43  OP_Next, pIn->iC
17ae0 75 72 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72  ur, pIn->topAddr
17af0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17b00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17b10 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 2d 31  , pIn->topAddr-1
17b20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17b30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
17b40 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a  evel->aInLoop);.
17b50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17b60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17b70 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b  l(v, pLevel->brk
17b80 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
17b90 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
17ba0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
17bb0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
17bc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17bd0 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c   OP_IfMemPos, pL
17be0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c  evel->iLeftJoin,
17bf0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
17c00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
17c10 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c  P_NullRow, pTabL
17c20 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
17c30 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
17c40 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
17c50 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
17c60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
17c70 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
17c80 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
17c90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17cb0 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
17cc0 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a  , pLevel->top);.
17cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ce0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17cf0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
17d00 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
17d10 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
17d20 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
17d30 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
17d40 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
17d50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
17d60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17d70 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
17d80 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  k);..  /* Close 
17d90 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
17da0 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
17db0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
17dc0 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
17dd0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
17de0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
17df0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
17e00 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
17e10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
17e20 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
17e30 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
17e40 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
17e50 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
17e60 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
17e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
17e80 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
17e90 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c  pTab->isEphem ||
17ea0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
17eb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
17ec0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  f( (pLevel->flag
17ed0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
17ee0 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
17ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f00 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
17f10 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
17f20 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
17f30 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21  f( pLevel->pIdx!
17f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17f50 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
17f60 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
17f70 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  ->iIdxCur, 0);. 
17f80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
17f90 65 20 63 75 72 73 6f 72 20 73 75 62 73 74 69 74  e cursor substit
17fa0 75 74 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73  utions for cases
17fb0 20 77 68 65 72 65 20 77 65 20 77 61 6e 74 20 74   where we want t
17fc0 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73  o use.    ** jus
17fd0 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  t the index and 
17fe0 6e 65 76 65 72 20 72 65 66 65 72 65 6e 63 65 20  never reference 
17ff0 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
18000 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
18010 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
18020 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
18030 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18040 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
18050 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
18060 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
18070 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
18080 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
18090 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
180a0 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
180b0 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
180c0 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
180d0 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
180e0 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
180f0 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
18100 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
18110 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
18120 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
18130 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
18140 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
18150 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
18160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c   ){.      int k,
18170 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20 20   j, last;.      
18180 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
18190 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
181a0 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a   pLevel->pIdx;..
181b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
181c0 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  dx!=0 );.      p
181d0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
181e0 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d  GetOp(v, pWInfo-
181f0 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61  >iTop);.      la
18200 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
18210 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
18220 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e        for(k=pWIn
18230 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74  fo->iTop; k<last
18240 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; k++, pOp++){. 
18250 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
18260 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62  p1!=pLevel->iTab
18270 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Cur ) continue;.
18280 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
18290 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
182a0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
182b0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
182c0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
182d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
182e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  pIdx->nColumn; j
182f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
18300 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49   if( pOp->p2==pI
18310 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
18320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
18330 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20   pOp->p2 = j;.  
18340 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
18350 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
18360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18370 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
18380 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
18390 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
183a0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
183b0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
183c0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
183d0 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
183e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
183f0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
18400 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20  =OP_NullRow ){. 
18410 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
18420 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
18430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18440 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18450 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
18460 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f    */.  whereInfo
18470 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
18480 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.