/ Hex Artifact Content
Login

Artifact 1b3a67bba14cb19b44496090a66f58370b8c768d:


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 30   where.c,v 1.260
0340: 20 32 30 30 37 2f 30 39 2f 31 32 20 31 35 3a 34   2007/09/12 15:4
0350: 31 3a 30 31 20 64 72 68 20 45 78 70 20 24 0a 2a  1:01 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 20 6e 45 71 2c 20 69 6e  %.9g\n", nEq, in
d850: 4d 75 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73 74  Multiplier, cost
d860: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b  ));..    /* Look
d870: 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74   for range const
d880: 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20  raints.    */.  
d890: 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65    if( nEq<pProbe
d8a0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
d8b0: 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
d8c0: 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  e->aiColumn[nEq]
d8d0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
d8e0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
d8f0: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
d900: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
d910: 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65  GT|WO_GE, pProbe
d920: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
d930: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  rm ){.        fl
d940: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
d950: 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  UMN_RANGE;.     
d960: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
d970: 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
d980: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
d990: 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a  _LE, pProbe) ){.
d9a0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
d9b0: 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
d9c0: 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  IT;.          co
d9d0: 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20  st /= 3;.       
d9e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 66   }.        if( f
d9f0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
da00: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
da10: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
da20: 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
da30: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
da40: 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
da50: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
da60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da70: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
da80: 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64  ...... range red
da90: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
daa0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
dab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
dac0: 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64 69   /* Add the addi
dad0: 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73  tional cost of s
dae0: 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20 69  orting if that i
daf0: 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20  s a factor..    
db00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  */.    if( pOrde
db10: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rBy ){.      if(
db20: 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
db30: 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26  COLUMN_IN)==0 &&
db40: 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53 6f  .           isSo
db50: 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73  rtingIndex(pPars
db60: 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  e,pWC->pMaskSet,
db70: 70 50 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64  pProbe,iCur,pOrd
db80: 65 72 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29  erBy,nEq,&rev) )
db90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  {.        if( fl
dba0: 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ags==0 ){.      
dbb0: 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
dbc0: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a  E_COLUMN_RANGE;.
dbd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbe0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
dbf0: 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20  _ORDERBY;.      
dc00: 20 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20    if( rev ){.   
dc10: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
dc20: 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20  WHERE_REVERSE;. 
dc30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
dc50: 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
dc60: 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  g(cost);.       
dc70: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
dc80: 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63  .... orderby inc
dc90: 72 65 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25  reases cost to %
dca0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
dcb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
dcc0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
dcd0: 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65 74  ee if we can get
dce0: 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e 67   away with using
dcf0: 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20   just the index 
dd00: 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65  without.    ** e
dd10: 76 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ver reading the 
dd20: 74 61 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20  table.  If that 
dd30: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
dd40: 6e 20 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20  n halve the.    
dd50: 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20  ** cost of this 
dd60: 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
dd70: 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 70    if( flags && p
dd80: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28  Src->colUsed < (
dd90: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42  ((Bitmask)1)<<(B
dda0: 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20  MS-1)) ){.      
ddb0: 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63  Bitmask m = pSrc
ddc0: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20  ->colUsed;.     
ddd0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
dde0: 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d  r(j=0; j<pProbe-
ddf0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
de00: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
de10: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
de20: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
de30: 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20   x<BMS-1 ){.    
de40: 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42        m &= ~(((B
de50: 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20  itmask)1)<<x);. 
de60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
de70: 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  .      if( m==0 
de80: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
de90: 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
dea0: 4c 59 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  LY;.        cost
deb0: 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 57   /= 2;.        W
dec0: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
ded0: 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75  .. idx-only redu
dee0: 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ces cost to %.9g
def0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
df00: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
df10: 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
df20: 20 68 61 73 20 61 63 68 69 65 76 65 64 20 74 68   has achieved th
df30: 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 6f  e lowest cost so
df40: 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65 20 69   far, then use i
df50: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
df60: 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43  ( cost < lowestC
df70: 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62 65 73  ost ){.      bes
df80: 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20  tIdx = pProbe;. 
df90: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
dfa0: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 61 73  = cost;.      as
dfb0: 73 65 72 74 28 20 66 6c 61 67 73 21 3d 30 20 29  sert( flags!=0 )
dfc0: 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c 61 67  ;.      bestFlag
dfd0: 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  s = flags;.     
dfe0: 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
dff0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e000: 52 65 70 6f 72 74 20 74 68 65 20 62 65 73 74 20  Report the best 
e010: 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70  result.  */.  *p
e020: 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49 64 78  pIndex = bestIdx
e030: 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ;.  WHERETRACE((
e040: 22 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25  "best index is %
e050: 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c  s, cost=%.9g, fl
e060: 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e  ags=%x, nEq=%d\n
e070: 22 2c 0a 20 20 20 20 20 20 20 20 62 65 73 74 49  ",.        bestI
e080: 64 78 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e  dx ? bestIdx->zN
e090: 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20  ame : "(none)", 
e0a0: 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74  lowestCost, best
e0b0: 46 6c 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29  Flags, bestNEq))
e0c0: 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65  ;.  *pFlags = be
e0d0: 73 74 46 6c 61 67 73 20 7c 20 65 71 54 65 72 6d  stFlags | eqTerm
e0e0: 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45 71 20 3d 20  Mask;.  *pnEq = 
e0f0: 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72  bestNEq;.  retur
e100: 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a  n lowestCost;.}.
e110: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
e120: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
e130: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
e140: 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
e150: 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
e160: 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
e170: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
e180: 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
e190: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
e1a0: 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
e1b0: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
e1c0: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
e1d0: 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
e1e0: 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
e1f0: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
e200: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
e210: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
e220: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
e230: 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
e240: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
e250: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
e260: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
e270: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
e280: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
e290: 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
e2a0: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
e2b0: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
e2c0: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
e2d0: 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
e2e0: 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
e2f0: 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
e300: 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
e310: 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
e320: 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
e330: 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
e340: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
e350: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
e360: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
e370: 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
e380: 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
e390: 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
e3a0: 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
e3b0: 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
e3c0: 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
e3d0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
e3e0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
e3f0: 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
e400: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
e410: 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
e420: 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
e430: 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
e440: 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
e450: 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
e460: 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
e470: 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
e480: 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
e490: 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
e4a0: 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
e4b0: 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
e4c0: 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
e4d0: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
e4e0: 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
e4f0: 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
e500: 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
e510: 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
e520: 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
e530: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
e540: 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
e550: 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
e560: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
e570: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e580: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
e590: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
e5a0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
e5b0: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
e5c0: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
e5d0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
e5e0: 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
e5f0: 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
e600: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
e610: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
e620: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
e630: 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
e640: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
e650: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
e660: 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
e670: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
e680: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
e690: 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
e6a0: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
e6b0: 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
e6c0: 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
e6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
e6e0: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
e6f0: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
e700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e710: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
e720: 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20  e that builds a 
e730: 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64  probe for an ind
e740: 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ex..**.** There 
e750: 73 68 6f 75 6c 64 20 62 65 20 6e 43 6f 6c 75 6d  should be nColum
e760: 6e 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  n values on the 
e770: 73 74 61 63 6b 2e 20 20 54 68 65 20 69 6e 64 65  stack.  The inde
e780: 78 0a 2a 2a 20 74 6f 20 62 65 20 70 72 6f 62 65  x.** to be probe
e790: 64 20 69 73 20 70 49 64 78 2e 20 20 50 6f 70 20  d is pIdx.  Pop 
e7a0: 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  the values from 
e7b0: 74 68 65 20 73 74 61 63 6b 20 61 6e 64 0a 2a 2a  the stack and.**
e7c0: 20 72 65 70 6c 61 63 65 20 74 68 65 6d 20 61 6c   replace them al
e7d0: 6c 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  l with a single 
e7e0: 72 65 63 6f 72 64 20 74 68 61 74 20 69 73 20 74  record that is t
e7f0: 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 72 6f 62  he index.** prob
e800: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lem..*/.static v
e810: 6f 69 64 20 62 75 69 6c 64 49 6e 64 65 78 50 72  oid buildIndexPr
e820: 6f 62 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  obe(.  Vdbe *v, 
e830: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
e840: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
e850: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  s VM */.  int nC
e860: 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 54 68 65  olumn,    /* The
e870: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
e880: 6e 73 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20  ns to check for 
e890: 4e 55 4c 4c 20 2a 2f 0a 20 20 49 6e 64 65 78 20  NULL */.  Index 
e8a0: 2a 70 49 64 78 20 20 20 20 20 2f 2a 20 49 6e 64  *pIdx     /* Ind
e8b0: 65 78 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ex that we will 
e8c0: 62 65 20 73 65 61 72 63 68 69 6e 67 20 2a 2f 0a  be searching */.
e8d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
e8e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
e8f0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
e900: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e   0);.  sqlite3In
e910: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
e920: 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pIdx);.}.../*.
e930: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e940: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71   for a single eq
e950: 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74  uality term of t
e960: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
e970: 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a    An equality.**
e980: 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74   term can be eit
e990: 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20  her X=expr or X 
e9a0: 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
e9b0: 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f  m is the term to
e9c0: 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a   be .** coded..*
e9d0: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
e9e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
e9f0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66  onstraint is lef
ea00: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
ea10: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
ea20: 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
ea30: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
ea40: 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
ea50: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
ea60: 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
ea70: 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
ea80: 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
ea90: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
eaa0: 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
eab0: 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
eac0: 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
ead0: 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
eae0: 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
eaf0: 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
eb00: 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61  ic void codeEqua
eb10: 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
eb20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
eb30: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
eb40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
eb50: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
eb60: 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
eb70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
eb80: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
eb90: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
eba0: 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65 76  vel  /* When lev
ebb0: 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
ebc0: 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
ebd0: 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  king on */.){.  
ebe0: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
ebf0: 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
ec00: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ec10: 62 65 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70  be;.  if( pX->op
ec20: 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 73  ==TK_EQ ){.    s
ec30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ec40: 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
ec50: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
ec60: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
ec70: 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
ec80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ec90: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 23 69 66  Null, 0, 0);.#if
eca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ecb0: 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
ecc0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e{.    int iTab;
ecd0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
ece0: 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
ecf0: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
ed00: 5f 49 4e 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  _IN );.    sqlit
ed10: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
ed20: 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20  pParse, pX);.   
ed30: 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
ed40: 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
ed50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
ed60: 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
ed70: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ed80: 28 28 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70  ((v, "# %.*s", p
ed90: 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73  X->span.n, pX->s
eda0: 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 69 66 28  pan.z));.    if(
edb0: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20   pLevel->nIn==0 
edc0: 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
edd0: 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  >nxt = sqlite3Vd
ede0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
edf0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
ee00: 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65  ->nIn++;.    pLe
ee10: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73  vel->aInLoop = s
ee20: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
ee30: 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
ee40: 2c 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  , pLevel->aInLoo
ee50: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
ee80: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d  evel->aInLoop[0]
ee90: 29 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a  )*pLevel->nIn);.
eea0: 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c      pIn = pLevel
eeb0: 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  ->aInLoop;.    i
eec0: 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
eed0: 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  pIn += pLevel->n
eee0: 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
eef0: 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
ef00: 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64        pIn->topAd
ef10: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
ef20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
ef30: 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  mn, iTab, 0);.  
ef40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ef50: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  ddOp(v, OP_IsNul
ef60: 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 7d  l, -1, 0);.    }
ef70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
ef80: 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
ef90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
efa0: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
efb0: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f  el, pTerm);.}../
efc0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
efd0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
efe0: 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
eff0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
f000: 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
f010: 20 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72    The values for
f020: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
f030: 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65   are left on the
f040: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f   stack..**.** Fo
f050: 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
f060: 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
f070: 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
f080: 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
f090: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
f0a0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
f0b0: 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
f0c0: 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
f0d0: 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
f0e0: 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
f0f0: 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
f100: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f110: 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
f120: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
f130: 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
f140: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
f150: 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
f160: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
f170: 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
f180: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
f190: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
f1a0: 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
f1b0: 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
f1c0: 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
f1d0: 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
f1e0: 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a  b will be left.*
f1f0: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d  * on the stack -
f200: 20 61 20 69 73 20 74 68 65 20 64 65 65 70 65 73   a is the deepes
f210: 74 20 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c  t and b the shal
f220: 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lowest..**.** In
f230: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
f240: 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
f250: 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
f260: 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
f270: 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
f280: 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
f290: 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
f2a0: 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
f2b0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
f2c0: 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
f2d0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
f2e0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
f2f0: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  mory cell..**.**
f300: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
f310: 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
f320: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
f330: 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73  ry cell and puts
f340: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
f350: 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
f360: 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69  ell in pLevel->i
f370: 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74  Mem.  The code t
f380: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
f390: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
f3a0: 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  se pLevel->iMem 
f3b0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72  to store the ter
f3c0: 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20  mination.** key 
f3d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
f3e0: 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
f3f0: 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
f400: 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
f410: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
f420: 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
f430: 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
f440: 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
f450: 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74  al.** use..*/.st
f460: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c  atic void codeAl
f470: 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
f480: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f490: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f4a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f4b0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
f4c0: 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
f4d0: 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
f4e0: 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
f4f0: 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43  ding */.  WhereC
f500: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
f510: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
f520: 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  use */.  Bitmask
f530: 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 2f   notReady      /
f540: 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66  * Which parts of
f550: 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79   FROM have not y
f560: 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f  et been coded */
f570: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  .){.  int nEq = 
f580: 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20  pLevel->nEq;    
f590: 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
f5a0: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
f5b0: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64  nstraints to cod
f5c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73  e */.  int terms
f5d0: 49 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20  InMem = 0;      
f5e0: 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
f5f0: 20 73 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20   store value in 
f600: 6d 65 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20  mem[] cells */. 
f610: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f620: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
f630: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
f640: 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
f650: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  truction */.  In
f660: 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
f670: 65 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54  el->pIdx;   /* T
f680: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75  he index being u
f690: 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  sed for this loo
f6a0: 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20  p */.  int iCur 
f6b0: 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
f6c0: 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  r;   /* The curs
f6d0: 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  or of the table 
f6e0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
f6f0: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
f700: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
f710: 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
f720: 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
f750: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  r */..  /* Figur
f760: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d  e out how many m
f770: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77  emory cells we w
f780: 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c  ill need then al
f790: 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a  locate them..  *
f7a0: 2a 20 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64  * We always need
f7b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73   at least one us
f7c0: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
f7d0: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a  loop terminator.
f7e0: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20    ** value.  If 
f7f0: 74 68 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65  there are IN ope
f800: 72 61 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65  rators we'll nee
f810: 64 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d  d one for each =
f820: 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e  = or.  ** IN con
f830: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
f840: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70  pLevel->iMem = p
f850: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
f860: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
f870: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
f880: 4e 5f 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72  N_IN ){.    pPar
f890: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76  se->nMem += pLev
f8a0: 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72  el->nEq;.    ter
f8b0: 6d 73 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d  msInMem = 1;.  }
f8c0: 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
f8d0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
f8e0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
f8f0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
f900: 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
f910: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
f920: 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 20  j++){.    int k 
f930: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
f940: 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  [j];.    pTerm =
f950: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
f960: 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
f970: 2c 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 2c  , pLevel->flags,
f980: 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
f990: 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
f9a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
f9b0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
f9c0: 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
f9d0: 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79      codeEquality
f9e0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
f9f0: 72 6d 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20  rm, pLevel);.   
fa00: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
fa10: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e  erator & (WO_ISN
fa20: 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29  ULL|WO_IN))==0 )
fa30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
fa40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
fa50: 73 4e 75 6c 6c 2c 20 74 65 72 6d 73 49 6e 4d 65  sNull, termsInMe
fa60: 6d 20 3f 20 2d 31 20 3a 20 2d 28 6a 2b 31 29 2c  m ? -1 : -(j+1),
fa70: 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20   pLevel->brk);. 
fa80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
fa90: 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20  msInMem ){.     
faa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fab0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
fac0: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a  , pLevel->iMem+j
fad0: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  +1, 1);.    }.  
fae0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
faf0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72  e all the constr
fb00: 61 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20  aint values are 
fb10: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
fb20: 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69  e stack.  */.  i
fb30: 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b  f( termsInMem ){
fb40: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
fb50: 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nEq; j++){.     
fb60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb70: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
fb80: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b   pLevel->iMem+j+
fb90: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
fba0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
fbb0: 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
fbc0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
fbd0: 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
fbe0: 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
fbf0: 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
fc00: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
fc10: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
fc20: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
fc30: 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
fc40: 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
fc50: 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
fc60: 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
fc70: 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
fc80: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
fc90: 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
fca0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
fcb0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
fcc0: 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
fcd0: 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
fce0: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
fcf0: 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
fd00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
fd10: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
fd20: 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
fd30: 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
fd40: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
fd50: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
fd60: 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
fd70: 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
fd80: 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
fd90: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
fda0: 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66  fo){.  if( pWInf
fdb0: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  o ){.    int i;.
fdc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
fdd0: 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
fde0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
fdf0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
fe00: 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Info = pWInfo->a
fe10: 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [i].pIdxInfo;.  
fe20: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
fe30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
fe40: 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
fe50: 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  xStr ){.        
fe60: 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 44    /* Coverage: D
fe70: 6f 6e 27 74 20 74 68 69 6e 6b 20 74 68 69 73 20  on't think this 
fe80: 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 2e 20  can be reached. 
fe90: 42 79 20 74 68 65 20 74 69 6d 65 20 74 68 69 73  By the time this
fea0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75  .          ** fu
feb0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
fec0: 2c 20 74 68 65 20 69 6e 64 65 78 2d 73 74 72 69  , the index-stri
fed0: 6e 67 73 20 68 61 76 65 20 62 65 65 6e 20 70 61  ngs have been pa
fee0: 73 73 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ssed.          *
fef0: 2a 20 74 6f 20 74 68 65 20 76 64 62 65 20 6c 61  * to the vdbe la
ff00: 79 65 72 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e  yer for deletion
ff10: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
ff20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ff30: 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78  _free(pInfo->idx
ff40: 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Str);.        }.
ff50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ff60: 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20  free(pInfo);.   
ff70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
ff80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 49 6e  qlite3_free(pWIn
ff90: 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  fo);.  }.}.../*.
ffa0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
ffb0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
ffc0: 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
ffd0: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
ffe0: 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
fff0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
10000 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
10010 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
10020 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
10030 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
10040 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
10050 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
10060 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
10070 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
10080 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
10090 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
100a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
100b0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
100c0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
100d0 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
100e0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
100f0 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
10100 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10110 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
10120 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
10130 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
10140 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
10150 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
10160 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
10170 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
10180 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
10190 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
101a0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
101b0 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
101c0 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
101d0 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
101e0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
101f0 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
10200 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
10210 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
10220 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
10230 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
10240 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
10250 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
10260 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
10270 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
10280 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
10290 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
102a0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
102b0 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
102c0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
102d0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
102e0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
102f0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
10300 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
10310 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
10320 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
10330 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
10340 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
10350 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
10360 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
10370 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
10380 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
103b0 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
103c0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
103f0 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
10400 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
10410 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
10420 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
10430 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
10440 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
10450 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
10460 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
10470 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
10480 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
10490 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
104a0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
104b0 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
104c0 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
104d0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
104e0 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
104f0 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
10500 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
10510 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
10520 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
10530 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
10540 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
10550 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
10560 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
10570 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
10580 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
10590 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
105a0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
105b0 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
105c0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
105d0 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
105e0 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
105f0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
10600 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
10610 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
10620 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
10630 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
10640 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
10650 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
10660 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
10670 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
10680 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
10690 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
106a0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
106b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
106c0 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
106d0 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
106e0 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
106f0 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
10700 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
10710 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
10720 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
10730 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
10740 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
10750 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
10760 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
10770 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
10780 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
10790 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
107a0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
107b0 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
107c0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
107d0 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
107e0 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
107f0 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
10800 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
10810 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
10820 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
10830 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
10840 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
10850 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
10860 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
10870 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
10880 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
10890 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
108a0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
108b0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
108c0 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
108d0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
108e0 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
108f0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
10900 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
10910 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
10920 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10930 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
10940 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
10950 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
10960 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
10970 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
10980 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
10990 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
109a0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
109b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
109c0 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
109d0 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
109e0 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
109f0 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
10a00 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
10a10 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
10a20 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
10a30 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
10a40 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
10a50 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
10a60 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
10a70 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
10a80 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
10a90 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
10aa0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
10ab0 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
10ac0 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
10ad0 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
10ae0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
10af0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
10b00 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
10b10 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
10b20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
10b30 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
10b40 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
10b50 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
10b60 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
10b70 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
10b80 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
10b90 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
10ba0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
10bb0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
10bc0 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
10bd0 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
10be0 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
10bf0 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
10c00 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
10c10 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  *ppOrderBy is a 
10c20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
10c30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
10c40 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
10c50 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
10c60 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
10c70 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
10c80 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
10c90 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
10ca0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
10cb0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
10cc0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
10cd0 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20  en ppOrderBy is 
10ce0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
10cf0 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
10d00 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
10d10 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
10d20 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
10d30 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
10d40 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
10d50 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
10d60 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
10d70 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70   used and.** *pp
10d80 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74  OrderBy is set t
10d90 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73  o NULL.  This is
10da0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
10db0 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
10dc0 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79  n.** unnecessary
10dd0 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
10de0 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e  ult set if an in
10df0 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
10e00 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  for the.** ORDER
10e10 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
10e20 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
10e30 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
10e40 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
10e50 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
10e60 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
10e70 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
10e80 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a  rder, then the *
10e90 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63  ppOrderBy is unc
10ea0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  hanged..*/.Where
10eb0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
10ec0 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
10ed0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10ee0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
10ef0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
10f00 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
10f10 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
10f20 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
10f30 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
10f40 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
10f50 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
10f60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
10f70 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79  List **ppOrderBy
10f80 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
10f90 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
10fa0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10fd0 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
10fe0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
10ff0 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
11000 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
11010 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
11020 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
11030 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11040 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
11050 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
11060 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ine */.  int brk
11070 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  , cont = 0;     
11080 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
11090 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64   used during cod
110a0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
110b0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
110c0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
110d0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
110e0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
110f0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ned */.  WhereTe
11100 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
11110 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11120 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
11130 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
11140 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
11150 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t;       /* The 
11160 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
11170 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
11180 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
11190 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
111a0 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64   clause is divid
111b0 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65  ed into these te
111c0 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
111d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
111e0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
111f0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
11200 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
11210 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
11220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11230 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
11240 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
11250 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
11260 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
11270 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11280 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
11290 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
112a0 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
112b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
112c0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
112d0 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e  n of all wc.a[].
112e0 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
112f0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
11300 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11310 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
11320 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
11330 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
11340 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
11350 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
11360 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
11370 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
11380 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
11390 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
113a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
113b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
113c0 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
113d0 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
113e0 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
113f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69  ;.  }..  /* Spli
11400 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
11410 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
11420 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
11430 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
11440 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
11450 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
11460 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
11470 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
11480 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(&maskSet);.  w
11490 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
114a0 77 63 2c 20 70 50 61 72 73 65 2c 20 26 6d 61 73  wc, pParse, &mas
114b0 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70  kSet);.  whereSp
114c0 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c  lit(&wc, pWhere,
114d0 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20   TK_AND);.    . 
114e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
114f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
11500 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
11510 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ure that will be
11520 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65  come the.  ** re
11530 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  turn value..  */
11540 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
11550 64 62 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73  db;.  pWInfo = s
11560 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11570 72 6f 28 64 62 2c 20 20 0a 20 20 20 20 20 20 20  ro(db,  .       
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11590 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
115a0 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   + pTabList->nSr
115b0 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65  c*sizeof(WhereLe
115c0 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  vel));.  if( db-
115d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
115e0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
115f0 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20  eginNoMem;.  }. 
11600 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
11610 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  = pTabList->nSrc
11620 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
11630 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
11640 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
11650 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
11660 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73  Info->iBreak = s
11670 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11680 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70  bel(v);..  /* Sp
11690 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
116a0 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
116b0 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
116c0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
116d0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
116e0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
116f0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
11700 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
11710 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
11720 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
11730 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  rc==0 || sqlite3
11740 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
11750 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29  tJoin(pWhere)) )
11760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
11770 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
11780 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d   pWhere, pWInfo-
11790 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20  >iBreak, 1);.   
117a0 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d   pWhere = 0;.  }
117b0 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61  ..  /* Analyze a
117c0 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70  ll of the subexp
117d0 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20  ressions.  Note 
117e0 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65  that exprAnalyze
117f0 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64  () might.  ** ad
11800 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65  d new virtual te
11810 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  rms onto the end
11820 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
11830 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ause.  We do not
11840 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e  .  ** want to an
11850 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74  alyze these virt
11860 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74  ual terms, so st
11870 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74  art analyzing at
11880 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e   the end.  ** an
11890 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73  d work forward s
118a0 6f 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64  o that the added
118b0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61   virtual terms a
118c0 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73  re never process
118d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
118e0 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
118f0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
11900 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b  createMask(&mask
11910 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
11920 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
11930 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  }.  exprAnalyzeA
11940 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 77 63  ll(pTabList, &wc
11950 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
11960 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11970 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
11980 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NoMem;.  }..  /*
11990 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
119a0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
119b0 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
119c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
119d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
119e0 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
119f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
11a00 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
11a10 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
11a20 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
11a30 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
11a40 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
11a50 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
11a60 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57  >a[].flags     W
11a70 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
11a80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
11a90 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
11aa0 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
11ab0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
11ac0 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
11ad0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
11ae0 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
11af0 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74    When term of t
11b00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
11b10 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
11b20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
11b30 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
11b40 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
11b50 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
11b60 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
11b70 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
11b80 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
11b90 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
11ba0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
11bb0 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
11bc0 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
11bd0 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
11be0 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
11bf0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  lause..  */.  no
11c00 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
11c10 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d  sk)0;.  pTabItem
11c20 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a   = pTabList->a;.
11c30 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66    pLevel = pWInf
11c40 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73  o->a;.  andFlags
11c50 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52   = ~0;.  WHERETR
11c60 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
11c70 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
11c80 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f  ));.  for(i=iFro
11c90 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  m=0, pLevel=pWIn
11ca0 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
11cb0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
11cc0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
11cd0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
11ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11cf0 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
11d00 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
11d10 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20      int flags;  
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69  /* Flags asssoci
11d40 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
11d50 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20  /.    int nEq;  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
11d80 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
11d90 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  nts */.    doubl
11da0 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20  e cost;         
11db0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
11dc0 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20  st for pIdx */. 
11dd0 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11df0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
11e00 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a  er FROM tables *
11e10 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65  /.    Index *pBe
11e20 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
11e30 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e    /* The best in
11e40 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20  dex seen so far 
11e50 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46  */.    int bestF
11e60 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
11e70 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f     /* Flags asso
11e80 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73  ciated with pBes
11e90 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73  t */.    int bes
11ea0 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20  tNEq = 0;       
11eb0 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f       /* nEq asso
11ec0 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73  ciated with pBes
11ed0 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  t */.    double 
11ee0 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20  lowestCost;     
11ef0 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
11f00 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20  the pBest */.   
11f10 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20   int bestJ = 0; 
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f30 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a  The value of j *
11f40 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b  /.    Bitmask m;
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c    /* Bitmask val
11f70 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74  ue for j or best
11f80 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63  J */.    int onc
11f90 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
11fa0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65       /* True whe
11fb0 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 73  n first table is
11fc0 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c   seen */.    sql
11fd0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
11fe0 2a 70 49 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72  *pIndex; /* Curr
11ff0 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e 64 65  ent virtual inde
12000 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74  x */..    lowest
12010 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
12020 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a  G_DBL;.    for(j
12030 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d  =iFrom, pTabItem
12040 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  =&pTabList->a[j]
12050 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
12060 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65  rc; j++, pTabIte
12070 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  m++){.      int 
12080 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f  doNotReorder;  /
12090 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74  * True if this t
120a0 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  able should not 
120b0 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  be reordered */.
120c0 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72  .      doNotReor
120d0 64 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d  der =  (pTabItem
120e0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ->jointype & (JT
120f0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
12100 21 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  !=0;.      if( o
12110 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72  nce && doNotReor
12120 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
12130 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26     m = getMask(&
12140 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  maskSet, pTabIte
12150 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
12160 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
12170 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
12180 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
12190 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
121a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
121b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
121c0 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  rt( pTabItem->pT
121d0 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ab );.#ifndef SQ
121e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
121f0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28  LTABLE.      if(
12200 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 49   IsVirtual(pTabI
12210 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
12220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
12230 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78  dex_info **ppIdx
12240 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Info = &pWInfo->
12250 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[j].pIdxInfo;. 
12260 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65         cost = be
12270 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
12280 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62  Parse, &wc, pTab
12290 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  Item, notReady,.
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 70 70 4f 72 64 65 72 42 79 20 3f 20 2a 70 70 4f  ppOrderBy ? *ppO
122d0 72 64 65 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30  rderBy : 0, i==0
122e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20    ppIdxInfo);.  
12310 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
12320 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
12330 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
12340 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20   = *ppIdxInfo;. 
12350 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
12360 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64  x && pIndex->ord
12370 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a  erByConsumed ){.
12380 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
12390 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
123a0 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 52 44  ABLE | WHERE_ORD
123b0 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERBY;.        }.
123c0 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
123d0 3b 0a 20 20 20 20 20 20 20 20 6e 45 71 20 3d 20  ;.        nEq = 
123e0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  0;.        if( (
123f0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32  SQLITE_BIG_DBL/2
12400 2e 30 29 3c 63 6f 73 74 20 29 7b 0a 20 20 20 20  .0)<cost ){.    
12410 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
12420 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
12430 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
12440 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
12450 4c 20 28 74 68 65 0a 20 20 20 20 20 20 20 20 20  L (the.         
12460 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65   ** inital value
12470 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69   of lowestCost i
12480 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20  n this loop. If 
12490 69 74 20 69 73 2c 20 74 68 65 6e 0a 20 20 20 20  it is, then.    
124a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 28 63 6f        ** the (co
124b0 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
124c0 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
124d0 65 76 65 72 20 62 65 20 74 72 75 65 20 61 6e 64  ever be true and
124e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 4c  .          ** pL
124f0 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 6e  evel->pBestIdx n
12500 65 76 65 72 20 73 65 74 2e 0a 20 20 20 20 20 20  ever set..      
12510 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
12520 20 20 63 6f 73 74 20 3d 20 28 53 51 4c 49 54 45    cost = (SQLITE
12530 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20  _BIG_DBL/2.0);. 
12540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12550 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
12560 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 73     {.        cos
12570 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50  t = bestIndex(pP
12580 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49  arse, &wc, pTabI
12590 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20  tem, notReady,. 
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26          (i==0 &&
125c0 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70   ppOrderBy) ? *p
125d0 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20  pOrderBy : 0,.  
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 20 20 20 20 26 70 49 64 78 2c 20 26 66         &pIdx, &f
12600 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20  lags, &nEq);.   
12610 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
12620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12630 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  f( cost<lowestCo
12640 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e  st ){.        on
12650 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
12660 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
12670 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  t;.        pBest
12680 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
12690 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
126a0 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  gs;.        best
126b0 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  NEq = nEq;.     
126c0 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
126d0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42        pLevel->pB
126e0 65 73 74 49 64 78 20 3d 20 70 49 6e 64 65 78 3b  estIdx = pIndex;
126f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12700 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  f( doNotReorder 
12710 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12720 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
12730 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68  *** Optimizer ch
12740 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f  oose table %d fo
12750 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
12760 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
12770 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
12780 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
12790 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  tFlags & WHERE_O
127a0 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
127b0 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
127c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
127d0 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c  dFlags &= bestFl
127e0 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
127f0 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61  >flags = bestFla
12800 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
12810 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20  pIdx = pBest;.  
12820 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20    pLevel->nEq = 
12830 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65  bestNEq;.    pLe
12840 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30  vel->aInLoop = 0
12850 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
12860 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
12870 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c  Best ){.      pL
12880 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
12890 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
128a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
128b0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
128c0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
128d0 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
128e0 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
128f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
12900 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
12910 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
12920 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48   bestJ;.  }.  WH
12930 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
12940 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
12950 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f  d ***\n"));..  /
12960 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
12970 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
12980 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
12990 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
129a0 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
129b0 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
129c0 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
129d0 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
129e0 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
129f0 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
12a00 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
12a10 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
12a20 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
12a30 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
12a40 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
12a50 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
12a60 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
12a70 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
12a80 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
12a90 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
12aa0 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
12ab0 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
12ac0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
12ad0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
12ae0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
12af0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
12b00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
12b10 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
12b20 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  pen */.    Index
12b30 20 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49   *pIx;      /* I
12b40 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63  ndex used to acc
12b50 65 73 73 20 70 54 61 62 20 28 69 66 20 61 6e 79  ess pTab (if any
12b60 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  ) */.    int iDb
12b70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
12b80 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
12b90 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
12ba0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
12bb0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
12bc0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66  l->iIdxCur;..#if
12bd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12be0 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
12bf0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
12c00 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==2 ){.      cha
12c10 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73  r *zMsg;.      s
12c20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
12c30 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
12c40 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
12c50 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a  >iFrom];.      z
12c60 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
12c70 69 6e 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20  intf(db, "TABLE 
12c80 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
12c90 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
12ca0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
12cb0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
12cc0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
12cd0 20 22 25 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%z AS %s", zMs
12ce0 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
12cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12d00 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76   if( (pIx = pLev
12d10 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a  el->pIdx)!=0 ){.
12d20 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
12d30 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
12d40 2c 20 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58  , "%z WITH INDEX
12d50 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d   %s", zMsg, pIx-
12d60 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
12d70 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
12d80 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  >flags & (WHERE_
12d90 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
12da0 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
12db0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
12dc0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
12dd0 20 22 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41   "%z USING PRIMA
12de0 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
12df0 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
12e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12e10 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65  UALTABLE.      e
12e20 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
12e30 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20  pBestIdx ){.    
12e40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
12e50 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64 78  x_info *pBestIdx
12e60 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74   = pLevel->pBest
12e70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Idx;.        zMs
12e80 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
12e90 74 66 28 64 62 2c 20 22 25 7a 20 56 49 52 54 55  tf(db, "%z VIRTU
12ea0 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
12eb0 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20  d:%s", zMsg,.   
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75   pBestIdx->idxNu
12ee0 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  m, pBestIdx->idx
12ef0 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Str);.      }.#e
12f00 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
12f10 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
12f20 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a  HERE_ORDERBY ){.
12f30 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
12f40 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
12f50 2c 20 22 25 7a 20 4f 52 44 45 52 20 42 59 22 2c  , "%z ORDER BY",
12f60 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
12f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12f80 65 4f 70 33 28 76 2c 20 4f 50 5f 45 78 70 6c 61  eOp3(v, OP_Expla
12f90 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  in, i, pLevel->i
12fa0 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 33 5f 44  From, zMsg, P3_D
12fb0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
12fc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12fd0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
12fe0 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
12ff0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
13000 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
13010 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
13020 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
13030 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13040 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13050 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13060 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
13070 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d  isEphem || pTab-
13080 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
13090 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
130a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
130b0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c  TABLE.    if( pL
130c0 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29  evel->pBestIdx )
130d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  {.      int iCur
130e0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
130f0 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
13100 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
13110 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c  _VOpen, iCur, 0,
13120 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54   (const char*)pT
13130 61 62 2d 3e 70 56 74 61 62 2c 20 50 33 5f 56 54  ab->pVtab, P3_VT
13140 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  AB);.    }else.#
13150 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70  endif.    if( (p
13160 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
13170 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
13180 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13190 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
131a0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
131b0 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
131c0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
131d0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
131e0 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74  nCol<(sizeof(Bit
131f0 6d 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20  mask)*8) ){.    
13200 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
13210 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
13220 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
13230 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
13240 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
13250 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
13260 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
13270 32 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  2(v, sqlite3Vdbe
13280 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
13290 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , n);.        as
132a0 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e  sert( n<=pTab->n
132b0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Col );.      }. 
132c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
132d0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
132e0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
132f0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
13300 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
13310 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
13320 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
13330 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
13340 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
13350 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
13360 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
13370 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
13380 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
13390 49 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ix);.      asser
133a0 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
133b0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
133c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
133d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
133e0 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b  nteger, iDb, 0);
133f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
13400 6e 74 28 28 76 2c 20 22 23 20 25 73 22 2c 20 70  nt((v, "# %s", p
13410 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  Ix->zName));.   
13420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
13430 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
13440 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
13450 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  tnum,.          
13460 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
13470 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e  *)pKey, P3_KEYIN
13480 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
13490 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76   }.    if( (pLev
134a0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
134b0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
134c0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 29  E_COLUMN_RANGE))
134d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
134e0 4f 6e 6c 79 20 63 61 6c 6c 20 4f 50 5f 53 65 74  Only call OP_Set
134f0 4e 75 6d 43 6f 6c 75 6d 6e 73 20 6f 6e 20 74 68  NumColumns on th
13500 65 20 69 6e 64 65 78 20 69 66 20 77 65 20 6d 69  e index if we mi
13510 67 68 74 20 6c 61 74 65 72 20 75 73 65 0a 20 20  ght later use.  
13520 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 6c 75 6d 6e      ** OP_Column
13530 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 2a   on the index. *
13540 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
13550 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
13560 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49  etNumColumns, iI
13570 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c  dxCur, pIx->nCol
13580 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  umn+1);.    }.  
13590 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
135a0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
135b0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
135c0 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
135d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
135e0 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65  ddr(v);..  /* Ge
135f0 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
13600 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68  to do the search
13610 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f  .  Each iteratio
13620 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a  n of the for.  *
13630 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e  * loop below gen
13640 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
13650 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20  a single nested 
13660 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20  loop of the VM. 
13670 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a   ** program..  *
13680 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
13690 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
136a0 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
136b0 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
136c0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
136d0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69  pLevel++){.    i
136e0 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43  nt j;.    int iC
136f0 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
13700 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20  Cursor;  /* The 
13710 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
13720 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  the table */.   
13730 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
13740 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
13750 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
13760 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 78 74  g */.    int nxt
13770 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;           /* W
13780 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20  here to jump to 
13790 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
137a0 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a  e next IN case *
137b0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
137c0 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
137d0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
137e0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
137f0 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
13800 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
13810 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
13820 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  only */.    int 
13830 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
13840 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
13850 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
13860 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20  erse order */.. 
13870 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
13880 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
13890 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69  l->iFrom];.    i
138a0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
138b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49 64  iCursor;.    pId
138c0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
138d0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
138e0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
138f0 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c 65  .    bRev = (pLe
13900 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13910 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a  RE_REVERSE)!=0;.
13920 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20      omitTable = 
13930 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
13940 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
13950 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  !=0;..    /* Cre
13960 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
13970 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
13980 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
13990 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f  ctions.    ** fo
139a0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
139b0 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b  op.  Jump to brk
139c0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
139d0 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20   a loop..    ** 
139e0 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
139f0 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
13a00 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
13a10 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20  tion of the.    
13a20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a  ** loop..    **.
13a30 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72      ** When ther
13a40 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61  e is an IN opera
13a50 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76  tor, we also hav
13a60 65 20 61 20 22 6e 78 74 22 20 6c 61 62 65 6c 20  e a "nxt" label 
13a70 74 68 61 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  that.    ** mean
13a80 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
13a90 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
13aa0 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
13ab0 2e 20 20 57 68 65 6e 0a 20 20 20 20 2a 2a 20 74  .  When.    ** t
13ac0 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f  here are no IN o
13ad0 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20  perators in the 
13ae0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
13af0 20 22 6e 78 74 22 20 6c 61 62 65 6c 0a 20 20 20   "nxt" label.   
13b00 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
13b10 61 73 20 22 62 72 6b 22 2e 0a 20 20 20 20 2a 2f  as "brk"..    */
13b20 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65  .    brk = pLeve
13b30 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  l->brk = pLevel-
13b40 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  >nxt = sqlite3Vd
13b50 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13b60 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65      cont = pLeve
13b70 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  l->cont = sqlite
13b80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13b90 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
13ba0 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
13bb0 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
13bc0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
13bd0 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  cate and.    ** 
13be0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d  initialize a mem
13bf0 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65  ory cell that re
13c00 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74 61  cords if this ta
13c10 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a  ble matches any.
13c20 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68      ** row of th
13c30 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
13c40 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f  the join..    */
13c50 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
13c60 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
13c70 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
13c80 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
13c90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  ){.      if( !pP
13ca0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
13cb0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
13cc0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
13cd0 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Join = pParse->n
13ce0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Mem++;.      sql
13cf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13d00 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 70   OP_MemInt, 0, p
13d10 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
13d20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13d30 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74  ment((v, "# init
13d40 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
13d50 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  tch flag"));.   
13d60 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13d70 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13d80 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65  ABLE.    if( pLe
13d90 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b  vel->pBestIdx ){
13da0 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 30  .      /* Case 0
13db0 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
13dc0 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
13dd0 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
13de0 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
13df0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f    **          to
13e00 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
13e10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13e20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
13e30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13e40 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65   *pBestIdx = pLe
13e50 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20  vel->pBestIdx;. 
13e60 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72       int nConstr
13e70 61 69 6e 74 20 3d 20 70 42 65 73 74 49 64 78 2d  aint = pBestIdx-
13e80 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
13e90 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
13ea0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
13eb0 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67  int_usage *aUsag
13ec0 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
13f00 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13f10 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74  ;.      const st
13f20 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13f30 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61  ex_constraint *a
13f40 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20  Constraint =.   
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 20 20 20 20 20                  
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13f80 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72  BestIdx->aConstr
13f90 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20 66 6f 72  aint;..      for
13fa0 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72  (j=1; j<=nConstr
13fb0 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
13fc0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
13fd0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43     for(k=0; k<nC
13fe0 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b  onstraint; k++){
13ff0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
14000 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64  Usage[k].argvInd
14010 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  ex==j ){.       
14020 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d       int iTerm =
14030 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e   aConstraint[k].
14040 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
14050 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14060 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14070 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e 70 45 78   wc.a[iTerm].pEx
14080 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
14090 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
140a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
140b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
140c0 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ( k==nConstraint
140d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
140e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
140f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
14100 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 30 29 3b  nteger, j-1, 0);
14110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14120 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
14130 74 65 67 65 72 2c 20 70 42 65 73 74 49 64 78 2d  teger, pBestIdx-
14140 3e 69 64 78 4e 75 6d 2c 20 30 29 3b 0a 20 20 20  >idxNum, 0);.   
14150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
14160 33 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  3(v, OP_VFilter,
14170 20 69 43 75 72 2c 20 62 72 6b 2c 20 70 42 65 73   iCur, brk, pBes
14180 74 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  tIdx->idxStr,.  
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e 65      pBestIdx->ne
141b0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3f  edToFreeIdxStr ?
141c0 20 50 33 5f 4d 50 52 49 4e 54 46 20 3a 20 50 33   P3_MPRINTF : P3
141d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
141e0 70 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f  pBestIdx->needTo
141f0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
14200 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
14210 3c 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73  <pBestIdx->nCons
14220 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
14230 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
14240 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20  [j].omit ){.    
14250 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
14260 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d  = aConstraint[j]
14270 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
14280 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
14290 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 77 63 2e  erm(pLevel, &wc.
142a0 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20  a[iTerm]);.     
142b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
142c0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
142d0 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 20 20  OP_VNext;.      
142e0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
142f0 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
14300 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  >p2 = sqlite3Vdb
14310 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
14320 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
14330 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14340 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
14350 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ..    if( pLevel
14360 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
14370 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
14380 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65    /* Case 1:  We
14390 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65   can directly re
143a0 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
143b0 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20   row using an.  
143c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
143d0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
143e0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
143f0 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72  ROWID field.  Or
14400 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
14410 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
14420 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
14430 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
14440 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20  (...)".      ** 
14450 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75           constru
14460 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
14470 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
14480 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d  erm(&wc, iCur, -
14490 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
144a0 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
144b0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
144c0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  m!=0 );.      as
144d0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
144e0 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pr!=0 );.      a
144f0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65  ssert( pTerm->le
14500 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
14510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14520 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
14530 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
14540 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
14550 54 65 72 6d 2c 20 70 4c 65 76 65 6c 29 3b 0a 20  Term, pLevel);. 
14560 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76 65       nxt = pLeve
14570 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20 73 71  l->nxt;.      sq
14580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14590 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
145a0 31 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 73  1, nxt);.      s
145b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
145c0 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
145d0 20 69 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20   iCur, nxt);.   
145e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
145f0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
14600 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
14610 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
14620 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
14630 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
14640 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
14650 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
14660 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
14670 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
14680 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
14690 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ield..      */. 
146a0 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20       int testOp 
146b0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
146c0 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
146d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
146e0 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
146f0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
14700 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
14710 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65   pStart = findTe
14720 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31  rm(&wc, iCur, -1
14730 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
14740 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20  T|WO_GE, 0);.   
14750 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
14760 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31  rm(&wc, iCur, -1
14770 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
14780 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
14790 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
147a0 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70         pTerm = p
147b0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70  Start;.        p
147c0 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
147d0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
147e0 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
147f0 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
14800 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
14810 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
14820 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20  Start->pExpr;.  
14830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
14840 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
14850 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
14860 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
14870 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14880 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14890 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
148a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
148b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
148c0 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d  orceInt, pX->op=
148d0 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LE || pX->op
148e0 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20  ==TK_GT, brk);. 
148f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14900 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20  beAddOp(v, bRev 
14910 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50  ? OP_MoveLt : OP
14920 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62  _MoveGe, iCur, b
14930 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rk);.        Vdb
14940 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
14950 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  "));.        dis
14960 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
14970 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   pStart);.      
14980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
14990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
149a0 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
149b0 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
149c0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
149d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e   }.      if( pEn
149e0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  d ){.        Exp
149f0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70  r *pX;.        p
14a00 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
14a10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14a20 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
14a30 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e    assert( pEnd->
14a40 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
14a50 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
14a60 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14a70 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
14a80 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
14a90 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
14aa0 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
14ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ac0 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
14ad0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31   pLevel->iMem, 1
14ae0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14af0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
14b00 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
14b10 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f  .          testO
14b20 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65  p = bRev ? OP_Le
14b30 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20   : OP_Ge;.      
14b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14b50 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
14b60 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
14b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14b80 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
14b90 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
14ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
14bb0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
14bc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
14bd0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
14be0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
14bf0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
14c00 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
14c10 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
14c20 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
14c30 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70        if( testOp
14c40 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
14c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14c60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
14c70 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20  d, iCur, 0);.   
14c80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14c90 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
14ca0 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
14cb0 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
14cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14cd0 76 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c 49 54  v, testOp, SQLIT
14ce0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 7c 30 78  E_AFF_NUMERIC|0x
14cf0 31 30 30 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  100, brk);.     
14d00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
14d10 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
14d20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
14d30 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  NGE ){.      /* 
14d40 43 61 73 65 20 33 3a 20 54 68 65 20 57 48 45 52  Case 3: The WHER
14d50 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
14d60 61 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65  at refers to the
14d70 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20   right-most.    
14d80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
14d90 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
14da0 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
14db0 79 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  y.  For example,
14dc0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   if.      **    
14dd0 20 20 20 20 20 74 68 65 20 69 6e 64 65 78 20 69       the index i
14de0 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64  s on (x,y,z) and
14df0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14e00 65 20 69 73 20 6f 66 20 74 68 65 0a 20 20 20 20  e is of the.    
14e10 20 20 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72    **         for
14e20 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c 31 30 22  m "x=5 AND y<10"
14e30 20 74 68 65 6e 20 74 68 69 73 20 63 61 73 65 20   then this case 
14e40 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74  is used.  Only t
14e50 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  he.      **     
14e60 20 20 20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63      right-most c
14e70 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20  olumn can be an 
14e80 69 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65  inequality - the
14e90 20 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20   rest must.     
14ea0 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20   **         use 
14eb0 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e  the "==" and "IN
14ec0 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20  " operators..   
14ed0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
14ee0 20 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65         This case
14ef0 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
14f00 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
14f10 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
14f20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
14f30 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e  nstraints but an
14f40 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74   index is select
14f50 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72  ed anyway, in or
14f60 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  der.      **    
14f70 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
14f80 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
14f90 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
14fa0 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20  ORDER BY..      
14fb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  */.      int sta
14fc0 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  rt;.      int nE
14fd0 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b  q = pLevel->nEq;
14fe0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 45 71  .      int topEq
14ff0 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  =0;        /* Tr
15000 75 65 20 69 66 20 74 6f 70 20 6c 69 6d 69 74 20  ue if top limit 
15010 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69  uses ==. False i
15020 73 20 73 74 72 69 63 74 6c 79 20 3c 20 2a 2f 0a  s strictly < */.
15030 20 20 20 20 20 20 69 6e 74 20 62 74 6d 45 71 3d        int btmEq=
15040 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  0;        /* Tru
15050 65 20 69 66 20 62 74 6d 20 6c 69 6d 69 74 20 75  e if btm limit u
15060 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 66  ses ==. False if
15070 20 73 74 72 69 63 74 6c 79 20 3e 20 2a 2f 0a 20   strictly > */. 
15080 20 20 20 20 20 69 6e 74 20 74 6f 70 4f 70 2c 20       int topOp, 
15090 62 74 6d 4f 70 3b 20 20 20 2f 2a 20 4f 70 65 72  btmOp;   /* Oper
150a0 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 74 6f  ators for the to
150b0 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 73 65 61  p and bottom sea
150c0 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20  rch bounds */.  
150d0 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a      int testOp;.
150e0 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d        int topLim
150f0 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  it = (pLevel->fl
15100 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
15110 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20  LIMIT)!=0;.     
15120 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20   int btmLimit = 
15130 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
15140 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
15150 29 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  )!=0;..      /* 
15160 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
15170 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
15180 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
15190 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
151a0 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c      ** and level
151b0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
151c0 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68  hose terms on th
151d0 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
151e0 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45  /.      codeAllE
151f0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
15200 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63  rse, pLevel, &wc
15210 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 0a 20 20  , notReady);..  
15220 20 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65      /* Duplicate
15230 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
15240 72 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75 73  rm values becaus
15250 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20  e they will all 
15260 62 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  be.      ** used
15270 20 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20   twice: once to 
15280 6d 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61  make the termina
15290 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63  tion key and onc
152a0 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20  e to make the.  
152b0 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
152c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
152d0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b   for(j=0; j<nEq;
152e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   j++){.        s
152f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15300 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 2d 31  v, OP_Dup, nEq-1
15310 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
15320 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
15330 75 74 20 77 68 61 74 20 63 6f 6d 70 61 72 69 73  ut what comparis
15340 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 20  on operators to 
15350 75 73 65 20 66 6f 72 20 74 6f 70 20 61 6e 64 20  use for top and 
15360 62 6f 74 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a  bottom .      **
15370 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73 2e 20   search bounds. 
15380 46 6f 72 20 61 6e 20 61 73 63 65 6e 64 69 6e 67  For an ascending
15390 20 69 6e 64 65 78 2c 20 74 68 65 20 62 6f 74 74   index, the bott
153a0 6f 6d 20 62 6f 75 6e 64 20 69 73 20 61 20 3e 20  om bound is a > 
153b0 6f 72 20 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f  or >=.      ** o
153c0 70 65 72 61 74 6f 72 20 61 6e 64 20 74 68 65 20  perator and the 
153d0 74 6f 70 20 62 6f 75 6e 64 20 69 73 20 61 20 3c  top bound is a <
153e0 20 6f 72 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e   or <= operator.
153f0 20 20 46 6f 72 20 61 20 64 65 73 63 65 6e 64 69    For a descendi
15400 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  ng.      ** inde
15410 78 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  x the operators 
15420 61 72 65 20 72 65 76 65 72 73 65 64 2e 0a 20 20  are reversed..  
15430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
15440 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
15450 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53  r[nEq]==SQLITE_S
15460 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20  O_ASC ){.       
15470 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57   topOp = WO_LT|W
15480 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 62 74  O_LE;.        bt
15490 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47  mOp = WO_GT|WO_G
154a0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
154b0 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20          topOp = 
154c0 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20  WO_GT|WO_GE;.   
154d0 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f       btmOp = WO_
154e0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20  LT|WO_LE;.      
154f0 20 20 53 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c    SWAP(int, topL
15500 69 6d 69 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b  imit, btmLimit);
15510 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15520 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
15530 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e  termination key.
15540 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65    This is the ke
15550 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20  y value that.   
15560 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74     ** will end t
15570 68 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72  he search.  Ther
15580 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74  e is no terminat
15590 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65  ion key if there
155a0 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f  .      ** are no
155b0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
155c0 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74  and no "X<..." t
155d0 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  erm..      **.  
155e0 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d      ** 2002-Dec-
155f0 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65  04: On a reverse
15600 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65  -order scan, the
15610 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d   so-called "term
15620 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a  ination".      *
15630 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68  * key computed h
15640 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20  ere really ends 
15650 75 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61  up being the sta
15660 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  rt key..      */
15670 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65  .      nxt = pLe
15680 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20  vel->nxt;.      
15690 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a  if( topLimit ){.
156a0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
156b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20  ;.        int k 
156c0 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
156d0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  [j];.        pTe
156e0 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  rm = findTerm(&w
156f0 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  c, iCur, k, notR
15700 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20 70 49 64  eady, topOp, pId
15710 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  x);.        asse
15720 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
15730 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65          pX = pTe
15740 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
15750 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
15760 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
15770 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20  CODED)==0 );.   
15780 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15790 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
157a0 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
157b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
157c0 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
157d0 20 2d 28 6e 45 71 2a 32 2b 31 29 2c 20 6e 78 74   -(nEq*2+1), nxt
157e0 29 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71  );.        topEq
157f0 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
15800 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
15810 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  GE);.        dis
15820 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
15830 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   pTerm);.       
15840 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78   testOp = OP_Idx
15850 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  GE;.      }else{
15860 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
15870 3d 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78  = nEq>0 ? OP_Idx
15880 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  GE : OP_Noop;.  
15890 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 31 3b        topEq = 1;
158a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
158b0 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
158c0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  op ){.        in
158d0 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 74  t nCol = nEq + t
158e0 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  opLimit;.       
158f0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20   pLevel->iMem = 
15900 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
15910 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64          buildInd
15920 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c  exProbe(v, nCol,
15930 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
15940 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
15950 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 74        int op = t
15960 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65  opEq ? OP_MoveLe
15970 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20   : OP_MoveLt;.  
15980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15990 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
159a0 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20  iIdxCur, nxt);. 
159b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
159c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
159d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
159e0 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d  emStore, pLevel-
159f0 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
15a00 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
15a10 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
15a20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15a30 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74  AddOp(v, OP_Last
15a40 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
15a50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15a60 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
15a70 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73  start key.  This
15a80 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74   is the key that
15a90 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77   defines the low
15aa0 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e  er.      ** boun
15ab0 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e  d on the search.
15ac0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74    There is no st
15ad0 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65  art key if there
15ae0 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a   are no.      **
15af0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
15b00 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20  and if there is 
15b10 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e  no "X>..." term.
15b20 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68    In.      ** th
15b30 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74  at case, generat
15b40 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73  e a "Rewind" ins
15b50 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63  truction in plac
15b60 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  e of the.      *
15b70 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72  * start key sear
15b80 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ch..      **.   
15b90 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
15ba0 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  4: In the case o
15bb0 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  f a reverse-orde
15bc0 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f  r search, the so
15bd0 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a  -called.      **
15be0 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61   "start" key rea
15bf0 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e  lly ends up bein
15c00 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65  g used as the te
15c10 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20  rmination key.. 
15c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15c30 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20  ( btmLimit ){.  
15c40 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
15c50 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
15c60 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
15c70 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
15c80 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
15c90 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
15ca0 64 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78 29  dy, btmOp, pIdx)
15cb0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15cc0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
15cd0 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
15ce0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
15cf0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
15d00 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
15d10 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DED)==0 );.     
15d20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15d30 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
15d40 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
15d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d60 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d  (v, OP_IsNull, -
15d70 28 6e 45 71 2b 31 29 2c 20 6e 78 74 29 3b 0a 20  (nEq+1), nxt);. 
15d80 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70         btmEq = p
15d90 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15da0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
15db0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
15dc0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65  Term(pLevel, pTe
15dd0 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
15de0 7b 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71 20  {.        btmEq 
15df0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15e00 20 20 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20     if( nEq>0 || 
15e10 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
15e20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e      int nCol = n
15e30 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20  Eq + btmLimit;. 
15e40 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65         buildInde
15e50 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20  xProbe(v, nCol, 
15e60 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
15e70 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
15e80 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
15e90 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
15ea0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
15eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15ec0 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
15ed0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
15ee0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f  .          testO
15ef0 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20  p = OP_IdxLT;.  
15f00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15f10 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
15f20 62 74 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47  btmEq ? OP_MoveG
15f30 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  e : OP_MoveGt;. 
15f40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15f50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
15f60 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a   iIdxCur, nxt);.
15f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15f80 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
15f90 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
15fa0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
15fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15fd0 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
15fe0 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
15ff0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16000 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 68   Generate the th
16010 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
16020 70 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  p.  If there is 
16030 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20  a termination.  
16040 20 20 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61      ** key we ha
16050 76 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74  ve to test for t
16060 68 61 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72  hat key and abor
16070 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  t at the top of 
16080 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  the.      ** loo
16090 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
160a0 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
160b0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
160c0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  (v);.      if( t
160d0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
160e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
160f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16100 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
16110 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
16120 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16130 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20  ddOp(v, testOp, 
16140 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20  iIdxCur, nxt);. 
16150 20 20 20 20 20 20 20 69 66 28 20 28 74 6f 70 45         if( (topE
16160 71 20 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28  q && !bRev) || (
16170 21 62 74 6d 45 71 20 26 26 20 62 52 65 76 29 20  !btmEq && bRev) 
16180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
16190 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
161a0 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f  (v, -1, "+", P3_
161b0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
161c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
161d0 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 7c 20   if( topLimit | 
161e0 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
161f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16200 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
16210 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 29  n, iIdxCur, nEq)
16220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16230 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16240 5f 49 73 4e 75 6c 6c 2c 20 31 2c 20 63 6f 6e 74  _IsNull, 1, cont
16250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16260 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
16270 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16280 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16290 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
162a0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
162b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
162c0 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
162d0 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
162e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f  }..      /* Reco
162f0 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
16300 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
16310 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  nate the loop.. 
16320 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c       */.      pL
16330 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
16340 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
16350 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
16360 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
16370 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
16380 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
16390 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
163a0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  >flags & WHERE_C
163b0 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20  OLUMN_EQ ){.    
163c0 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68    /* Case 4:  Th
163d0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
163e0 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  and all terms of
163f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
16400 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  e that.      ** 
16410 20 20 20 20 20 20 20 20 20 72 65 66 65 72 20 74           refer t
16420 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  o the index usin
16430 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49  g the "==" or "I
16440 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  N" operators..  
16450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
16460 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e   start;.      in
16470 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
16480 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nEq;..      /* G
16490 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
164a0 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
164b0 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
164c0 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
164d0 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20     ** and leave 
164e0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
164f0 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  ose terms on the
16500 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stack..      */
16510 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71  .      codeAllEq
16520 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
16530 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c  se, pLevel, &wc,
16540 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
16550 20 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e    nxt = pLevel->
16560 6e 78 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nxt;..      /* G
16570 65 6e 65 72 61 74 65 20 61 20 73 69 6e 67 6c 65  enerate a single
16580 20 6b 65 79 20 74 68 61 74 20 77 69 6c 6c 20 62   key that will b
16590 65 20 75 73 65 64 20 74 6f 20 62 6f 74 68 20 73  e used to both s
165a0 74 61 72 74 20 61 6e 64 20 74 65 72 6d 69 6e 61  tart and termina
165b0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
165c0 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a  search.      */.
165d0 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
165e0 50 72 6f 62 65 28 76 2c 20 6e 45 71 2c 20 70 49  Probe(v, nEq, pI
165f0 64 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dx);.      sqlit
16600 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16610 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76  P_MemStore, pLev
16620 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20  el->iMem, 0);.. 
16630 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
16640 20 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f 76   code (1) to mov
16650 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6d  e to the first m
16660 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20  atching element 
16670 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
16680 20 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65      ** Then gene
16690 72 61 74 65 20 63 6f 64 65 20 28 32 29 20 74 68  rate code (2) th
166a0 61 74 20 6a 75 6d 70 73 20 74 6f 20 22 6e 78 74  at jumps to "nxt
166b0 22 20 61 66 74 65 72 20 74 68 65 20 63 75 72 73  " after the curs
166c0 6f 72 20 69 73 20 70 61 73 74 0a 20 20 20 20 20  or is past.     
166d0 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61 74   ** the last mat
166e0 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66  ching element of
166f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
16700 20 63 6f 64 65 20 28 31 29 20 69 73 20 65 78 65   code (1) is exe
16710 63 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f  cuted.      ** o
16720 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
16730 65 20 74 68 65 20 73 65 61 72 63 68 2c 20 74 68  e the search, th
16740 65 20 63 6f 64 65 20 28 32 29 20 69 73 20 65 78  e code (2) is ex
16750 65 63 75 74 65 64 20 62 65 66 6f 72 65 20 65 61  ecuted before ea
16760 63 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65 72  ch.      ** iter
16770 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 61  ation of the sca
16780 6e 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  n to see if the 
16790 73 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65  scan has finishe
167a0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  d. */.      if( 
167b0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
167c0 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72  /* Scan in rever
167d0 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
167e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
167f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c  ddOp(v, OP_MoveL
16800 65 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29  e, iIdxCur, nxt)
16810 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20  ;.        start 
16820 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16830 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
16840 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
16850 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
16860 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16870 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43 75  OP_IdxLT, iIdxCu
16880 72 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20  r, nxt);.       
16890 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
168a0 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c  _Prev;.      }el
168b0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  se{.        /* S
168c0 63 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77 61  can in the forwa
168d0 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  rd order */.    
168e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
168f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
16900 65 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29  e, iIdxCur, nxt)
16910 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20  ;.        start 
16920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16930 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
16940 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
16950 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
16960 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
16970 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75 72 2c  _IdxGE, iIdxCur,
16980 20 6e 78 74 2c 20 22 2b 22 2c 20 50 33 5f 53 54   nxt, "+", P3_ST
16990 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 70  ATIC);.        p
169a0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
169b0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
169c0 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c     if( !omitTabl
169d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
169e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
169f0 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
16a00 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
16a10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16a20 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
16a30 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
16a40 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
16a50 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
16a60 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
16a70 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65   = start;.    }e
16a80 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  lse{.      /* Ca
16a90 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20  se 5:  There is 
16aa0 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
16ab0 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
16ac0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a  omplete.      **
16ad0 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
16ae0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
16af0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
16b00 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
16b10 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
16b20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
16b30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   );.      pLevel
16b40 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
16b50 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
16b60 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
16b70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
16b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b90 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
16ba0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d  Cur, brk);.    }
16bb0 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
16bc0 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53   ~getMask(&maskS
16bd0 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20  et, iCur);..    
16be0 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
16bf0 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
16c00 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
16c10 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
16c20 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  y.    ** compute
16c30 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  d using the curr
16c40 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65  ent set of table
16c50 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
16c60 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d  r(pTerm=wc.a, j=
16c70 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  wc.nTerm; j>0; j
16c80 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
16c90 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20      Expr *pE;.  
16ca0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
16cb0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
16cc0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
16cd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16ce0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
16cf0 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
16d00 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ady)!=0 ) contin
16d10 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
16d20 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
16d30 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d 30     assert( pE!=0
16d40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
16d50 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
16d60 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
16d70 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
16d80 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
16d90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16da0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
16db0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
16dc0 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b  e, pE, cont, 1);
16dd0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c  .      pTerm->fl
16de0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
16df0 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  D;.    }..    /*
16e00 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45   For a LEFT OUTE
16e10 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65  R JOIN, generate
16e20 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
16e30 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
16e40 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c  that.    ** at l
16e50 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  east one row of 
16e60 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
16e70 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65 20  has matched the 
16e80 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20  left table.  .  
16e90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
16ea0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
16eb0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
16ec0 74 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  top = sqlite3Vdb
16ed0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
16ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16ef0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16f00 6d 49 6e 74 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  mInt, 1, pLevel-
16f10 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
16f20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16f30 76 2c 20 22 23 20 72 65 63 6f 72 64 20 4c 45 46  v, "# record LEF
16f40 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20  T JOIN hit"));. 
16f50 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77       for(pTerm=w
16f60 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e  c.a, j=0; j<wc.n
16f70 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
16f80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16f90 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
16fa0 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
16fb0 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
16fc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
16fd0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
16fe0 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
16ff0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
17000 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17010 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
17020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17030 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
17040 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
17050 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  cont, 1);.      
17060 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
17070 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
17080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17090 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
170a0 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
170b0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
170c0 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
170d0 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
170e0 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
170f0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
17100 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
17110 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
17120 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
17130 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
17140 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
17150 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
17160 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
17170 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
17180 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
17190 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
171a0 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
171b0 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
171c0 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
171d0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
171e0 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
171f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
17200 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
17210 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
17220 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
17230 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
17240 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62  ->a[i];.    pTab
17250 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
17260 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
17270 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62  m];.    z = pTab
17280 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
17290 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
172a0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
172b0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20  >zName;.    n = 
172c0 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69  strlen(z);.    i
172d0 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
172e0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
172f0 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
17300 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
17310 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
17320 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
17330 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
17340 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17350 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
17360 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
17370 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
17380 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
17390 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
173a0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
173b0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
173c0 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
173d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
173e0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
173f0 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
17400 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
17410 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
17420 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
17430 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
17440 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
17450 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
17460 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
17470 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
17480 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
17490 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49  e if( pLevel->pI
174a0 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  dx==0 ){.      m
174b0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
174c0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
174d0 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20  ], "{} ", 3);.  
174e0 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b      nQPlan += 3;
174f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17500 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65    n = strlen(pLe
17510 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65  vel->pIdx->zName
17520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e  );.      if( n+n
17530 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
17540 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
17550 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n)-2 ){.        
17560 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
17570 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
17580 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  n], pLevel->pIdx
17590 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
175a0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
175b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
175c0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
175d0 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
175e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
175f0 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
17600 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
17610 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
17620 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
17630 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
17640 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
17650 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
17660 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
17670 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
17680 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
17690 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
176a0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
176b0 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
176c0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
176d0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
176e0 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
176f0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
17700 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
17710 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
17720 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e  .  */.  pWInfo->
17730 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74  iContinue = cont
17740 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  ;.  whereClauseC
17750 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74  lear(&wc);.  ret
17760 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f  urn pWInfo;..  /
17770 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d  * Jump here if m
17780 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77  alloc fails */.w
17790 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a  hereBeginNoMem:.
177a0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
177b0 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65  ar(&wc);.  where
177c0 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29  InfoFree(pWInfo)
177d0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
177e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
177f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
17800 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20  HERE loop.  See 
17810 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20  comments on .** 
17820 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
17830 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  n() for addition
17840 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
17850 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
17860 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66  hereEnd(WhereInf
17870 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64  o *pWInfo){.  Vd
17880 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e  be *v = pWInfo->
17890 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
178a0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
178b0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
178c0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
178d0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
178e0 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  List;..  /* Gene
178f0 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
17900 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
17910 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73  .  for(i=pTabLis
17920 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b  t->nSrc-1; i>=0;
17930 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
17940 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
17950 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
17960 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17970 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b  , pLevel->cont);
17980 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17990 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
179a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
179b0 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eAddOp(v, pLevel
179c0 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
179d0 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
179e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
179f0 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20  vel->nIn ){.    
17a00 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
17a10 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
17a20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
17a30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17a40 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29  (v, pLevel->nxt)
17a50 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
17a60 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26  evel->nIn, pIn=&
17a70 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b  pLevel->aInLoop[
17a80 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  j-1]; j>0; j--, 
17a90 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  pIn--){.        
17aa0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
17ab0 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41  ere(v, pIn->topA
17ac0 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ddr+1);.        
17ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17ae0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e  (v, OP_Next, pIn
17af0 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f 70  ->iCur, pIn->top
17b00 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Addr);.        s
17b10 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17b20 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64  re(v, pIn->topAd
17b30 64 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dr-1);.      }. 
17b40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17b50 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  e(pLevel->aInLoo
17b60 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
17b70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17b80 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
17b90 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  >brk);.    if( p
17ba0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
17bb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
17bc0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
17bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17be0 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
17bf0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
17c00 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  oin, 0);.      s
17c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
17c20 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
17c30 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
17c40 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  ursor, 0);.     
17c50 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
17c60 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
17c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17c80 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  dOp(v, OP_NullRo
17c90 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  w, pLevel->iIdxC
17ca0 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ur, 0);.      }.
17cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17cc0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
17cd0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f  o, 0, pLevel->to
17ce0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
17cf0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17d00 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
17d10 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
17d20 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
17d30 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
17d40 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
17d50 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
17d60 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
17d70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17d80 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
17d90 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
17da0 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
17db0 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
17dc0 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
17dd0 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
17de0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
17df0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
17e00 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
17e10 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
17e20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
17e30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
17e40 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
17e50 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
17e60 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
17e70 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
17e80 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
17e90 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
17ea0 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65  if( pTab->isEphe
17eb0 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  m || pTab->pSele
17ec0 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ct ) continue;. 
17ed0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
17ee0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
17ef0 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
17f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f10 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
17f20 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
17f30 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  sor, 0);.    }. 
17f40 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
17f50 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx!=0 ){.      
17f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c  (v, OP_Close, pL
17f80 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30  evel->iIdxCur, 0
17f90 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
17fa0 20 4d 61 6b 65 20 63 75 72 73 6f 72 20 73 75 62   Make cursor sub
17fb0 73 74 69 74 75 74 69 6f 6e 73 20 66 6f 72 20 63  stitutions for c
17fc0 61 73 65 73 20 77 68 65 72 65 20 77 65 20 77 61  ases where we wa
17fd0 6e 74 20 74 6f 20 75 73 65 0a 20 20 20 20 2a 2a  nt to use.    **
17fe0 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 20   just the index 
17ff0 61 6e 64 20 6e 65 76 65 72 20 72 65 66 65 72 65  and never refere
18000 6e 63 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 20  nce the table.. 
18010 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
18020 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
18030 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
18040 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
18050 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
18060 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
18070 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
18080 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
18090 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
180a0 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
180b0 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
180c0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
180d0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
180e0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
180f0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
18100 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
18110 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
18120 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
18130 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
18140 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
18150 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
18160 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
18170 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  ONLY ){.      in
18180 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20  t k, j, last;.  
18190 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
181a0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
181b0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
181c0 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  x;..      assert
181d0 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20  ( pIdx!=0 );.   
181e0 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
181f0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
18200 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
18210 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
18220 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18230 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
18240 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
18250 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
18260 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
18270 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
18280 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
18290 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
182a0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
182b0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
182c0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
182d0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
182e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
182f0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
18300 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
18310 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
18320 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
18330 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
18340 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a       pOp->p2 = j
18350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18360 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
18380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
18390 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
183a0 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  OP_Rowid ){.    
183b0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
183c0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
183d0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
183e0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52  opcode = OP_IdxR
183f0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  owid;.        }e
18400 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  lse if( pOp->opc
18410 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20  ode==OP_NullRow 
18420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
18430 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
18440 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
18450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18460 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61  .  /* Final clea
18470 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  nup.  */.  where
18480 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29  InfoFree(pWInfo)
18490 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.