/ Hex Artifact Content
Login

Artifact 49901aac9ad568c9c92f914150e91c1663f3978d:


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 37   where.c,v 1.267
0340: 20 32 30 30 38 2f 30 31 2f 30 32 20 30 30 3a 33   2008/01/02 00:3
0350: 34 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a 2a  4:37 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 70 57 43 2d      }.      pWC-
2500: 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20  >a = pOld;.     
2510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
2520: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d  .    memcpy(pWC-
2530: 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66  >a, pOld, sizeof
2540: 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d  (pWC->a[0])*pWC-
2550: 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  >nTerm);.    if(
2560: 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61   pOld!=pWC->aSta
2570: 74 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tic ){.      sql
2580: 69 74 65 33 5f 66 72 65 65 28 70 4f 6c 64 29 3b  ite3_free(pOld);
2590: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e  .    }.    pWC->
25a0: 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a  nSlot *= 2;.  }.
25b0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
25c0: 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65  a[idx = pWC->nTe
25d0: 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  rm];.  pWC->nTer
25e0: 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45  m++;.  pTerm->pE
25f0: 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d  xpr = p;.  pTerm
2600: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
2610: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
2620: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
2630: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
2640: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
2650: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2660: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
2670: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
2680: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
2690: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
26a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
26b0: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
26c0: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
26d0: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
26e0: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
26f0: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
2700: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
2710: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
2720: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
2730: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
2740: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
2750: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2760: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
2770: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
2780: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
2790: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
27a0: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
27b0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
27c0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
27d0: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
27e0: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
27f0: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
2800: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2820: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
2830: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
2840: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
2850: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
2860: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
2870: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
2880: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
2890: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
28a0: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
28b0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
28c0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
28d0: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
28e0: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
28f0: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
2900: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
2910: 61 72 72 61 79 2e 20 20 54 68 69 73 20 61 72 72  array.  This arr
2920: 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65 65 64  ay grows as need
2930: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a  ed to contain.**
2940: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
2950: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
2960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2970: 68 65 72 65 53 70 6c 69 74 28 57 68 65 72 65 43  hereSplit(WhereC
2980: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
2990: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f 70 29   *pExpr, int op)
29a0: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
29b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
29c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29   pExpr->op!=op )
29d0: 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73  {.    whereClaus
29e0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78  eInsert(pWC, pEx
29f0: 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  pr, 0);.  }else{
2a00: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
2a10: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  pWC, pExpr->pLef
2a20: 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68 65 72  t, op);.    wher
2a30: 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70  eSplit(pWC, pExp
2a40: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a  r->pRight, op);.
2a50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
2a60: 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72 65  tialize an expre
2a70: 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a  ssion mask set.*
2a80: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
2a90: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
2aa0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
2ab0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
2ac0: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
2ad0: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
2ae0: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
2af0: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
2b00: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
2b10: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
2b20: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 45  itmask getMask(E
2b30: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
2b40: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
2b50: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
2b60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53  or(i=0; i<pMaskS
2b70: 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  et->n; i++){.   
2b80: 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69   if( pMaskSet->i
2b90: 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b  x[i]==iCursor ){
2ba0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
2bb0: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20  Bitmask)1)<<i;. 
2bc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bd0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
2be0: 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20  eate a new mask 
2bf0: 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72 73  for cursor iCurs
2c00: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  or..**.** There 
2c10: 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65  is one cursor pe
2c20: 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  r table in the F
2c30: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
2c40: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61   number of.** ta
2c50: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
2c60: 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
2c70: 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61 72  ed by a test ear
2c80: 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ly in the.** sql
2c90: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2ca0: 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65   routine.  So we
2cb0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70   know that the p
2cc0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a  MaskSet->ix[].**
2cd0: 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65   array will neve
2ce0: 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73  r overflow..*/.s
2cf0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
2d00: 65 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65  eMask(ExprMaskSe
2d10: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74  t *pMaskSet, int
2d20: 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73   iCursor){.  ass
2d30: 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e  ert( pMaskSet->n
2d40: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61   < ArraySize(pMa
2d50: 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20  skSet->ix) );.  
2d60: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61  pMaskSet->ix[pMa
2d70: 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43  skSet->n++] = iC
2d80: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
2d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
2da0: 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29  ks (recursively)
2db0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2dc0: 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65  ree and generate
2dd0: 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69  s.** a bitmask i
2de0: 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20  ndicating which 
2df0: 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  tables are used 
2e00: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
2e10: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a  on.** tree..**.*
2e20: 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74  * In order for t
2e30: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77  his routine to w
2e40: 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ork, the calling
2e50: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68   function must h
2e60: 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  ave.** previousl
2e70: 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65  y invoked sqlite
2e80: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
2e90: 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65  s() on the expre
2ea0: 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74  ssion.  See.** t
2eb0: 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
2ec0: 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
2ed0: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
2ee0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
2ef0: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
2f00: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72  ResolveNames() r
2f10: 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f  outines looks fo
2f20: 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  r column names a
2f30: 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72  nd.** sets their
2f40: 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43   opcodes to TK_C
2f50: 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20  OLUMN and their 
2f60: 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c  Expr.iTable fiel
2f70: 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42  ds to.** the VDB
2f80: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
2f90: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
2fa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
2fb0: 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73   has to.** trans
2fc0: 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20  late the cursor 
2fd0: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
2fe0: 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20  mask values and 
2ff0: 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69  OR all.** the bi
3000: 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e  tmasks together.
3010: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
3020: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
3030: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
3040: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
3050: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
3060: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
3070: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a  age(ExprMaskSet*
3080: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
3090: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
30a0: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
30b0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
30c0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
30d0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
30e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
30f0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
3100: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
3110: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
3120: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
3130: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
3140: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
3150: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
3160: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
3170: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
3180: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
3190: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
31a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b  ->pLeft);.  mask
31b0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
31c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
31d0: 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61   p->pList);.  ma
31e0: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
31f0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3200: 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29  Set, p->pSelect)
3210: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  ;.  return mask;
3220: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
3230: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
3240: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
3250: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
3260: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
3270: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
3280: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
3290: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
32a0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
32b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
32c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
32d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
32e0: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
32f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
3300: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
3310: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
3320: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
3330: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
3340: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65  et *pMaskSet, Se
3350: 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69 74  lect *pS){.  Bit
3360: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
3370: 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20 20   while( pS ){.  
3380: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
3390: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
33a0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
33b0: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
33c0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
33d0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
33e0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
33f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
3400: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3410: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
3420: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
3430: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
3440: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
3450: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
3460: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3470: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
3480: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 53 20  Having);.    pS 
3490: 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  = pS->pPrior;.  
34a0: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
34b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34c0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
34d0: 65 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f  en operator is o
34e0: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
34f0: 6f 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  ors that is.** a
3500: 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e  llowed for an in
3510: 64 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c  dexable WHERE cl
3520: 61 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20  ause term.  The 
3530: 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72  allowed operator
3540: 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c  s are.** "=", "<
3550: 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e  ", ">", "<=", ">
3560: 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f  =", and "IN"..*/
3570: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
3580: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
3590: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
35a0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
35b0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
35c0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
35d0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
35e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
35f0: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
3600: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
3610: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
3620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
3630: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
3640: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
3650: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
3660: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  LL;.}../*.** Swa
3670: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
3680: 20 74 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66   type T..*/.#def
3690: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
36a0: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
36b0: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
36c0: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
36d0: 69 73 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  ision operator. 
36e0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
36f0: 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59  the form "X op Y
3700: 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74  ".** are convert
3710: 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22  ed into "Y op X"
3720: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f 6c  ..**.** If a col
3730: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
3740: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
3750: 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c 65  th either the le
3760: 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20 73  ft or right.** s
3770: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
3780: 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69 6e  rison, it remain
3790: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
37a0: 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65 20  h the same side 
37b0: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f 6d  after.** the com
37c0: 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59 20  mutation. So "Y 
37d0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
37e0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a 2a  p X" becomes .**
37f0: 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "X collate NOCA
3800: 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20 69  SE op Y". This i
3810: 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f  s because any co
3820: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
3830: 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20   on.** the left 
3840: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63  hand side of a c
3850: 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69  omparison overri
3860: 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  des any collatio
3870: 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61  n sequence .** a
3880: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 72  ttached to the r
3890: 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61  ight. For the sa
38a0: 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50  me reason the EP
38b0: 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61 67  _ExpCollate flag
38c0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d 75  .** is not commu
38d0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
38e0: 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65 28  oid exprCommute(
38f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
3900: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
3910: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
3920: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
3930: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
3940: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
3950: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
3960: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  _ExpCollate);.  
3970: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
3980: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
3990: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
39a0: 20 29 3b 0a 20 20 53 57 41 50 28 43 6f 6c 6c 53   );.  SWAP(CollS
39b0: 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68  eq*,pExpr->pRigh
39c0: 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e  t->pColl,pExpr->
39d0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20  pLeft->pColl);. 
39e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
39f0: 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e  flags = (pExpr->
3a00: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20  pRight->flags & 
3a10: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
3a20: 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20 70 45 78  | expLeft;.  pEx
3a30: 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73  pr->pLeft->flags
3a40: 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74   = (pExpr->pLeft
3a50: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
3a60: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 52  pCollate) | expR
3a70: 69 67 68 74 3b 0a 20 20 53 57 41 50 28 45 78 70  ight;.  SWAP(Exp
3a80: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
3a90: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
3aa0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
3ab0: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
3ac0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
3ad0: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
3ae0: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
3af0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
3b00: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
3b10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3b20: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
3b30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
3b40: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
3b50: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
3b60: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3b70: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
3b80: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
3b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
3ba0: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
3bb0: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
3bc0: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
3bd0: 74 69 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72  tic int operator
3be0: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
3bf0: 69 6e 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28  int c;.  assert(
3c00: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
3c10: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
3c20: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
3c30: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
3c40: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
3c50: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
3c60: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
3c70: 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d   c = WO_EQ<<(op-
3c80: 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73  TK_EQ);.  }.  as
3c90: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e  sert( op!=TK_ISN
3ca0: 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e  ULL || c==WO_ISN
3cb0: 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ULL );.  assert(
3cc0: 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d   op!=TK_IN || c=
3cd0: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65  =WO_IN );.  asse
3ce0: 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  rt( op!=TK_EQ ||
3cf0: 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61   c==WO_EQ );.  a
3d00: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54  ssert( op!=TK_LT
3d10: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a   || c==WO_LT );.
3d20: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3d30: 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20  _LE || c==WO_LE 
3d40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3d50: 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GT || c==WO_
3d60: 47 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GT );.  assert( 
3d70: 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d  op!=TK_GE || c==
3d80: 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72  WO_GE );.  retur
3d90: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n c;.}../*.** Se
3da0: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
3db0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
3dc0: 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74  use that is of t
3dd0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
3de0: 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65  <expr>".** where
3df0: 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63   X is a referenc
3e00: 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e  e to the iColumn
3e10: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61   of table iCur a
3e20: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
3e30: 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f  f.** the WO_xx o
3e40: 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70  perator codes sp
3e50: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f  ecified by the o
3e60: 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  p parameter..** 
3e70: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
3e80: 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52   to the term.  R
3e90: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66  eturn 0 if not f
3ea0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
3eb0: 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54  WhereTerm *findT
3ec0: 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75  erm(.  WhereClau
3ed0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
3ee0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3ef0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
3f00: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
3f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3f20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c  rsor number of L
3f30: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  HS */.  int iCol
3f40: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  umn,          /*
3f50: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3f60: 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61  f LHS */.  Bitma
3f70: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
3f80: 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74   /* RHS must not
3f90: 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68   overlap with th
3fa0: 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 31 36  is mask */.  u16
3fb0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
3fc0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f     /* Mask of WO
3fd0: 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72  _xx values descr
3fe0: 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a  ibing operator *
3ff0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
4010: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
4020: 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c  with this index,
4030: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
4040: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
4050: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a  pTerm;.  int k;.
4060: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
4070: 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d  >a, k=pWC->nTerm
4080: 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b  ; k; k--, pTerm+
4090: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
40a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
40b0: 43 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70  Cur.       && (p
40c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
40d0: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
40e0: 0a 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d  .       && pTerm
40f0: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  ->leftColumn==iC
4100: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20  olumn.       && 
4110: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
4120: 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29  r & op)!=0.    )
4130: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 75 72  {.      if( iCur
4140: 3e 3d 30 20 26 26 20 70 49 64 78 20 26 26 20 70  >=0 && pIdx && p
4150: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
4160: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =WO_ISNULL ){.  
4170: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
4180: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
4190: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
41a0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63  pColl;.        c
41b0: 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20 20 20  har idxaff;.    
41c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
41d0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
41e0: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
41f0: 0a 20 20 20 20 20 20 20 20 69 64 78 61 66 66 20  .        idxaff 
4200: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
4210: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
4220: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
4230: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
4240: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
4250: 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69 6e  idxaff) ) contin
4260: 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ue;..        /* 
4270: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 63  Figure out the c
4280: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4290: 65 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  e required from 
42a0: 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20 20 20  an index for.   
42b0: 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65       ** it to be
42c0: 20 75 73 65 66 75 6c 20 66 6f 72 20 6f 70 74 69   useful for opti
42d0: 6d 69 73 69 6e 67 20 65 78 70 72 65 73 73 69 6f  mising expressio
42e0: 6e 20 70 58 2e 20 53 74 6f 72 65 20 74 68 69 73  n pX. Store this
42f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
4300: 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20 70 43  e in variable pC
4310: 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  oll..        */.
4320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
4330: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
4340: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
4350: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
4360: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4370: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
4380: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69  ight);.        i
4390: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
43a0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
43b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
43c0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Coll;.        }.
43d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
43e0: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
43f0: 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  n && pIdx->aiCol
4400: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
4410: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
4420: 61 73 73 65 72 74 28 20 6a 3c 70 49 64 78 2d 3e  assert( j<pIdx->
4430: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
4440: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4450: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
4460: 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  me, pIdx->azColl
4470: 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  [j]) ) continue;
4480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
4490: 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20  eturn pTerm;.   
44a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
44b0: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
44c0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
44d0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
44e0: 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20  alyze(SrcList*, 
44f0: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
4500: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
4510: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
4520: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
4530: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
4540: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
4550: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
4560: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
4570: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
4580: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
4590: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
45a0: 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f  e *pWC         /
45b0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
45c0: 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  se to be analyze
45d0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
45e0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
45f0: 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  erm-1; i>=0; i--
4600: 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  ){.    exprAnaly
4610: 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43  ze(pTabList, pWC
4620: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
4630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4640: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4650: 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  ON./*.** Check t
4660: 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76  o see if the giv
4670: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
4680: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20   a LIKE or GLOB 
4690: 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a  operator that.**
46a0: 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65   can be optimize
46b0: 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69  d using inequali
46c0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ty constraints. 
46d0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
46e0: 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20  it is.** so and 
46f0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a  false if not..**
4700: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
4710: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
4720: 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c   be optimizible,
4730: 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65   the RHS must be
4740: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74   a string.** lit
4750: 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e  eral that does n
4760: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
4770: 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a 73  wildcard.  .*/.s
4780: 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b 65  tatic int isLike
4790: 4f 72 47 6c 6f 62 28 0a 20 20 73 71 6c 69 74 65  OrGlob(.  sqlite
47a0: 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 54  3 *db,      /* T
47b0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
47c0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
47d0: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
47e0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
47f0: 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20  int *pnPattern, 
4800: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
4810: 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66  on-wildcard pref
4820: 69 78 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ix characters */
4830: 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c  .  int *pisCompl
4840: 65 74 65 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ete  /* True if 
4850: 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72  the only wildcar
4860: 64 20 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61  d is % in the la
4870: 73 74 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  st character */.
4880: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
4890: 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  *z;.  Expr *pRig
48a0: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78  ht, *pLeft;.  Ex
48b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
48c0: 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 69   int c, cnt;.  i
48d0: 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20 63 68 61  nt noCase;.  cha
48e0: 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53  r wc[3];.  CollS
48f0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66  eq *pColl;..  if
4900: 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65  ( !sqlite3IsLike
4910: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78  Function(db, pEx
4920: 70 72 2c 20 26 6e 6f 43 61 73 65 2c 20 77 63 29  pr, &noCase, wc)
4930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4940: 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
4950: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
4960: 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d 3e  pRight = pList->
4970: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
4980: 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ( pRight->op!=TK
4990: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 72  _STRING ){.    r
49a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
49b0: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
49c0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
49d0: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
49e0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
49f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  rn 0;.  }.  pCol
4a00: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
4a10: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
4a20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   ){.    /* TODO:
4a30: 20 43 6f 76 65 72 61 67 65 20 74 65 73 74 69 6e   Coverage testin
4a40: 67 20 64 6f 65 73 6e 27 74 20 67 65 74 20 74 68  g doesn't get th
4a50: 69 73 20 63 61 73 65 2e 20 49 73 20 69 74 20 61  is case. Is it a
4a60: 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
4a70: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 20 65  .    ** for an e
4a80: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 79 70  xpression of typ
4a90: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 6f 20 6e  e TK_COLUMN to n
4aa0: 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  ot have an assig
4ab0: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ned collation . 
4ac0: 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 61     ** sequence a
4ad0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3f 0a 20 20  t this point?.  
4ae0: 20 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c 20 3d    */.    pColl =
4af0: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
4b00: 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c    }.  if( (pColl
4b10: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
4b20: 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 6e 6f  OLL_BINARY || no
4b30: 43 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28  Case) &&.      (
4b40: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
4b50: 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20  ITE_COLL_NOCASE 
4b60: 7c 7c 20 21 6e 6f 43 61 73 65 29 20 29 7b 0a 20  || !noCase) ){. 
4b70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4b80: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
4b90: 65 45 78 70 72 28 64 62 2c 20 70 52 69 67 68 74  eExpr(db, pRight
4ba0: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  );.  z = (char *
4bb0: 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  )pRight->token.z
4bc0: 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  ;.  cnt = 0;.  i
4bd0: 66 28 20 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c  f( z ){.    whil
4be0: 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30  e( (c=z[cnt])!=0
4bf0: 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20   && c!=wc[0] && 
4c00: 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77  c!=wc[1] && c!=w
4c10: 63 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d  c[2] ){ cnt++; }
4c20: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d  .  }.  if( cnt==
4c30: 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b  0 || 255==(u8)z[
4c40: 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75  cnt] ){.    retu
4c50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73  rn 0;.  }.  *pis
4c60: 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74  Complete = z[cnt
4c70: 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e  ]==wc[0] && z[cn
4c80: 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61  t+1]==0;.  *pnPa
4c90: 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72  ttern = cnt;.  r
4ca0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
4cb0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
4cc0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
4cd0: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
4ce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4cf0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
4d00: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
4d10: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
4d20: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
4d30: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
4d40: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
4d50: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
4d60: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
4d70: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
4d80: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
4d90: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
4da0: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
4db0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
4dc0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
4dd0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
4de0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
4df0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
4e00: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
4e10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4e20: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f  .  if( pExpr->to
4e30: 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20  ken.n!=5 ||.    
4e40: 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43     sqlite3StrNIC
4e50: 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  mp((const char*)
4e60: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
4e70: 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a  match",5)!=0 ){.
4e80: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4e90: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
4ea0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
4eb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20  pList->nExpr!=2 
4ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4ed0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
4ee0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[1].pExpr->op
4ef0: 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b   != TK_COLUMN ){
4f00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4f10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
4f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4f30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4f40: 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  BLE */../*.** If
4f50: 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65   the pBase expre
4f60: 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64  ssion originated
4f70: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
4f80: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a  ING clause of.**
4f90: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72   a join, then tr
4fa0: 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f  ansfer the appro
4fb0: 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20  priate markings 
4fc0: 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e  over to derived.
4fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4fe0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
4ff0: 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69  ings(Expr *pDeri
5000: 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65  ved, Expr *pBase
5010: 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66  ){.  pDerived->f
5020: 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66  lags |= pBase->f
5030: 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f  lags & EP_FromJo
5040: 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  in;.  pDerived->
5050: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
5060: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
5070: 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66  oinTable;.}..#if
5080: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5090: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
50a0: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
50b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
50c0: 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 52  UBQUERY)./*.** R
50d0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
50e0: 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f 66 20  e given term of 
50f0: 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63 61 6e  an OR clause can
5100: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a   be converted.**
5110: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 63 6c 61 75   into an IN clau
5120: 73 65 2e 20 20 54 68 65 20 69 43 75 72 73 6f 72  se.  The iCursor
5130: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 20 64 65 66   and iColumn def
5140: 69 6e 65 20 74 68 65 20 6c 65 66 74 2d 68 61 6e  ine the left-han
5150: 64 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65  d.** side of the
5160: 20 49 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   IN clause..**.*
5170: 2a 20 54 68 65 20 63 6f 6e 74 65 78 74 20 69 73  * The context is
5180: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6d 75   that we have mu
5190: 6c 74 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65 63  ltiple OR-connec
51a0: 74 65 64 20 65 71 75 61 6c 69 74 79 20 74 65 72  ted equality ter
51b0: 6d 73 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ms.** like this:
51c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
51d0: 20 61 3d 3c 65 78 70 72 31 3e 20 4f 52 20 20 61   a=<expr1> OR  a
51e0: 3d 3c 65 78 70 72 32 3e 20 4f 52 20 62 3d 3c 65  =<expr2> OR b=<e
51f0: 78 70 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a 2a  xpr3>  OR ....**
5200: 0a 2a 2a 20 54 68 65 20 70 4f 72 54 65 72 6d 20  .** The pOrTerm 
5210: 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
5220: 75 74 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64  utine correspond
5230: 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 74 65  s to a single te
5240: 72 6d 20 6f 66 0a 2a 2a 20 74 68 69 73 20 4f 52  rm of.** this OR
5250: 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64   clause.  In ord
5260: 65 72 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20  er for the term 
5270: 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 64 61 74  to be a condidat
5280: 65 20 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72 73  e for.** convers
5290: 69 6f 6e 20 74 6f 20 61 6e 20 49 4e 20 6f 70 65  ion to an IN ope
52a0: 72 61 74 6f 72 2c 20 74 68 65 20 66 6f 6c 6c 6f  rator, the follo
52b0: 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75  wing must be tru
52c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  e:.**.**     *  
52d0: 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
52e0: 64 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6d  de of the term m
52f0: 75 73 74 20 62 65 20 74 68 65 20 63 6f 6c 75 6d  ust be the colum
5300: 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 20 20 20  n which.**      
5310: 20 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20    is identified 
5320: 62 79 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69  by iCursor and i
5330: 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  Column..**.**   
5340: 20 20 2a 20 20 49 66 20 74 68 65 20 72 69 67 68    *  If the righ
5350: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
5360: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
5370: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
5380: 73 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 62  s.**        of b
5390: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
53a0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
53b0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
53c0: 70 65 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e  pe.**        con
53d0: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71  versions are req
53e0: 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67  uired on the rig
53f0: 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32  ht.  (Ticket #22
5400: 34 39 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74  49).**.** If bot
5410: 68 20 6f 66 20 74 68 65 73 65 20 63 6f 6e 64 69  h of these condi
5420: 74 69 6f 6e 73 20 61 72 65 20 74 72 75 65 2c 20  tions are true, 
5430: 74 68 65 6e 20 72 65 74 75 72 6e 20 74 72 75 65  then return true
5440: 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
5450: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f  return false..*/
5460: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 72 54 65  .static int orTe
5470: 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65  rmIsOptCandidate
5480: 28 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54  (WhereTerm *pOrT
5490: 65 72 6d 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  erm, int iCursor
54a0: 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b 0a  , int iColumn){.
54b0: 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61    int affLeft, a
54c0: 66 66 52 69 67 68 74 3b 0a 20 20 61 73 73 65 72  ffRight;.  asser
54d0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
54e0: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
54f0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
5500: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
5510: 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
5520: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f   0;.  }.  if( pO
5530: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  rTerm->leftColum
5540: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
5550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5560: 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c    affRight = sql
5570: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
5580: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
5590: 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20  >pRight);.  if( 
55a0: 61 66 66 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  affRight==0 ){. 
55b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
55c0: 0a 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c  .  affLeft = sql
55d0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
55e0: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
55f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 61  >pLeft);.  if( a
5600: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
5610: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
5630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5640: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
5650: 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f  ven term of an O
5660: 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20  R clause can be 
5670: 69 67 6e 6f 72 65 64 20 64 75 72 69 6e 67 0a 2a  ignored during.*
5680: 2a 20 61 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  * a check to mak
5690: 65 20 73 75 72 65 20 61 6c 6c 20 4f 52 20 74 65  e sure all OR te
56a0: 72 6d 73 20 61 72 65 20 63 61 6e 64 69 64 61 74  rms are candidat
56b0: 65 73 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74  es for optimizat
56c0: 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ion..** In other
56d0: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74   words, return t
56e0: 72 75 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  rue if a call to
56f0: 20 74 68 65 20 6f 72 54 65 72 6d 49 73 4f 70 74   the orTermIsOpt
5700: 43 61 6e 64 69 64 61 74 65 28 29 0a 2a 2a 20 61  Candidate().** a
5710: 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 66 61  bove returned fa
5720: 6c 73 65 20 62 75 74 20 69 74 20 69 73 20 6e 6f  lse but it is no
5730: 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  t necessary to d
5740: 69 73 71 75 61 6c 69 66 79 20 74 68 65 0a 2a 2a  isqualify the.**
5750: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
5760: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
5770: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 70 68 72   original OR phr
5780: 61 73 65 20 77 61 73 20 74 68 69 73 3a 0a 2a 2a  ase was this:.**
5790: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d  .**           a=
57a0: 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20  4  OR  a=11  OR 
57b0: 20 61 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e   a=b.**.** Durin
57c0: 67 20 61 6e 61 6c 79 73 69 73 2c 20 74 68 65 20  g analysis, the 
57d0: 74 68 69 72 64 20 74 65 72 6d 20 67 65 74 73 20  third term gets 
57e0: 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64 20 61  flipped around a
57f0: 6e 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20  nd duplicate.** 
5800: 73 6f 20 74 68 61 74 20 77 65 20 61 72 65 20 6c  so that we are l
5810: 65 66 74 20 77 69 74 68 20 74 68 69 73 3a 0a 2a  eft with this:.*
5820: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
5830: 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52  =4  OR  a=11  OR
5840: 20 20 61 3d 62 20 20 4f 52 20 20 62 3d 61 0a 2a    a=b  OR  b=a.*
5850: 2a 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  *.** Since the l
5860: 61 73 74 20 74 77 6f 20 74 65 72 6d 73 20 61 72  ast two terms ar
5870: 65 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f 6e  e duplicates, on
5880: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 2a  ly one of them.*
5890: 2a 20 68 61 73 20 74 6f 20 71 75 61 6c 69 66 79  * has to qualify
58a0: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   in order for th
58b0: 65 20 77 68 6f 6c 65 20 70 68 72 61 73 65 20 74  e whole phrase t
58c0: 6f 20 71 75 61 6c 69 66 79 2e 20 20 57 68 65 6e  o qualify.  When
58d0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
58e0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 6b   is called, we k
58f0: 6e 6f 77 20 74 68 61 74 20 70 4f 72 54 65 72 6d  now that pOrTerm
5900: 20 64 69 64 20 6e 6f 74 20 71 75 61 6c 69 66 79   did not qualify
5910: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5920: 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20  e merely checks 
5930: 74 6f 20 73 65 65 20 69 66 20 70 4f 72 54 65 72  to see if pOrTer
5940: 6d 20 68 61 73 20 61 20 64 75 70 6c 69 63 61 74  m has a duplicat
5950: 65 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  e that.** might 
5960: 71 75 61 6c 69 66 79 2e 20 20 49 66 20 74 68 65  qualify.  If the
5970: 72 65 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  re is a duplicat
5980: 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  e that has not y
5990: 65 74 20 62 65 65 6e 0a 2a 2a 20 64 69 73 71 75  et been.** disqu
59a0: 61 6c 69 66 69 65 64 2c 20 74 68 65 6e 20 72 65  alified, then re
59b0: 74 75 72 6e 20 74 72 75 65 2e 20 20 49 66 20 74  turn true.  If t
59c0: 68 65 72 65 20 61 72 65 20 6e 6f 20 64 75 70 6c  here are no dupl
59d0: 69 63 61 74 65 73 2c 20 6f 72 0a 2a 2a 20 74 68  icates, or.** th
59e0: 65 20 64 75 70 6c 69 63 61 74 65 20 68 61 73 20  e duplicate has 
59f0: 61 6c 73 6f 20 62 65 65 6e 20 64 69 73 71 75 61  also been disqua
5a00: 6c 69 66 65 64 2c 20 72 65 74 75 72 6e 20 66 61  lifed, return fa
5a10: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
5a20: 6e 74 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75  nt orTermHasOkDu
5a30: 70 6c 69 63 61 74 65 28 57 68 65 72 65 43 6c 61  plicate(WhereCla
5a40: 75 73 65 20 2a 70 4f 72 2c 20 57 68 65 72 65 54  use *pOr, WhereT
5a50: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a 20  erm *pOrTerm){. 
5a60: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66 6c   if( pOrTerm->fl
5a70: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
5a80: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  D ){.    /* This
5a90: 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
5aa0: 20 74 65 72 6d 2e 20 20 54 68 65 20 64 75 70 6c   term.  The dupl
5ab0: 69 63 61 74 65 20 69 73 20 74 6f 20 74 68 65 20  icate is to the 
5ac0: 6c 65 66 74 20 68 61 64 0a 20 20 20 20 2a 2a 20  left had.    ** 
5ad0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
5ae0: 20 61 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74 68   analyzed and th
5af0: 75 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  us has not yet b
5b00: 65 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64  een disqualified
5b10: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
5b20: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4f  1;.  }.  if( (pO
5b30: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
5b40: 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 0a  ERM_VIRTUAL)!=0.
5b50: 20 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61 5b       && (pOr->a[
5b60: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
5b70: 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  ].flags & TERM_O
5b80: 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20  R_OK)!=0 ){.    
5b90: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 64 75 70  /* This is a dup
5ba0: 6c 69 63 61 74 65 20 74 65 72 6d 2e 20 20 54 68  licate term.  Th
5bb0: 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c 69  e original quali
5bc0: 66 69 65 64 20 73 6f 20 74 68 69 73 20 6f 6e 65  fied so this one
5bd0: 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
5be0: 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20 20   have to. */.   
5bf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5c00: 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69 74 68   /* This is eith
5c10: 65 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20 74  er a singleton t
5c20: 65 72 6d 20 6f 72 20 65 6c 73 65 20 69 74 20 69  erm or else it i
5c30: 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 6f  s a duplicate fo
5c40: 72 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  r.  ** which the
5c50: 20 6f 72 69 67 69 6e 61 6c 20 64 69 64 20 6e 6f   original did no
5c60: 74 20 71 75 61 6c 69 66 79 2e 20 20 45 69 74 68  t qualify.  Eith
5c70: 65 72 20 77 61 79 20 77 65 20 61 72 65 20 64 6f  er way we are do
5c80: 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65 74  ne for. */.  ret
5c90: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
5ca0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
5cb0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
5cc0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
5cd0: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
5ce0: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
5cf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5d00: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
5d10: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
5d20: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
5d30: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
5d40: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
5d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
5d60: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
5d70: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
5d80: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
5d90: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
5da0: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
5db0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
5dc0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
5dd0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
5de0: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
5df0: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
5e00: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
5e10: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
5e20: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
5e30: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
5e40: 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74 68  sion is of.** th
5e50: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
5e60: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
5e70: 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e 73  nd Y are columns
5e80: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
5e90: 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  nal.** expressio
5ea0: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
5eb0: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
5ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
5ed0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
5ee0: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
5ef0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
5f00: 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64 20  se and analyzed 
5f10: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
5f20: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5f30: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
5f40: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
5f50: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
5f60: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
5f70: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
5f80: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
5f90: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
5fa0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
5fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5fc0: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
5fd0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
5fe0: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
5ff0: 70 54 65 72 6d 3b 0a 20 20 45 78 70 72 4d 61 73  pTerm;.  ExprMas
6000: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 0a  kSet *pMaskSet;.
6010: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
6020: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
6030: 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70  eft;.  Bitmask p
6040: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20  rereqAll;.  int 
6050: 6e 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20  nPattern;.  int 
6060: 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 69 6e  isComplete;.  in
6070: 74 20 6f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70  t op;.  Parse *p
6080: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
6090: 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
60a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
60b0: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
60c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
60d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
60e0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
60f0: 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53  xTerm];.  pMaskS
6100: 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53  et = pWC->pMaskS
6110: 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54  et;.  pExpr = pT
6120: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72  erm->pExpr;.  pr
6130: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
6140: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
6150: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
6160: 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  );.  op = pExpr-
6170: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
6180: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  K_IN ){.    asse
6190: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
61a0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 65 72  t==0 );.    pTer
61b0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
61c0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
61d0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
61e0: 78 70 72 2d 3e 70 4c 69 73 74 29 0a 20 20 20 20  xpr->pList).    
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 20 7c 20 65 78 70 72 53 65 6c 65        | exprSele
6210: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
6220: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 53  skSet, pExpr->pS
6230: 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73 65 20  elect);.  }else 
6240: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
6250: 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  L ){.    pTerm->
6260: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
6270: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
6280: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
6290: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
62a0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
62b0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  r->pRight);.  }.
62c0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78    prereqAll = ex
62d0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
62e0: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
62f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6300: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
6310: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
6320: 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67 65 74  prereqAll |= get
6330: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
6340: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
6350: 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 70 54  Table);.  }.  pT
6360: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
6370: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
6380: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
6390: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
63a0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
63b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
63c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
63d0: 65 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65  edOp(op) && (pTe
63e0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
63f0: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
6400: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
6410: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
6420: 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ft;.    Expr *pR
6430: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
6440: 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ight;.    if( pL
6450: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
6460: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
6470: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
6480: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
6490: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
64a0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
64b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
64c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
64d0: 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f  = operatorMask(o
64e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
64f0: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
6500: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
6510: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
6520: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
6530: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
6540: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
6550: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
6560: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
6570: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
6580: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
6590: 70 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  p(db, pExpr);.  
65a0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
65b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
65c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
65d0: 78 70 72 44 65 6c 65 74 65 28 70 44 75 70 29 3b  xprDelete(pDup);
65e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
65f0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
6600: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
6610: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6620: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
6630: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
6640: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
6650: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
6660: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
6670: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
6680: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
6690: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
66a0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
66b0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
66c0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
66d0: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
66e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
66f0: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
6700: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
6710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6720: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
6730: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
6740: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
6750: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 44 75   exprCommute(pDu
6760: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
6770: 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20  = pDup->pLeft;. 
6780: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
6790: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
67a0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65  Table;.      pNe
67b0: 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  w->leftColumn = 
67c0: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
67d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
67e0: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
67f0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
6800: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
6810: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
6820: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
6830: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44   operatorMask(pD
6840: 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  up->op);.    }. 
6850: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
6860: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
6870: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
6880: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74  * If a term is t
6890: 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61  he BETWEEN opera
68a0: 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20  tor, create two 
68b0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
68c0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69  s.  ** that defi
68d0: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61  ne the range tha
68e0: 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d  t the BETWEEN im
68f0: 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  plements..  */. 
6900: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
6910: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
6920: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
6930: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
6940: 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  pList;.    int i
6950: 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
6960: 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54  st u8 ops[] = {T
6970: 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20  K_GE, TK_LE};.  
6980: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
6990: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
69a0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
69b0: 32 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  2 );.    for(i=0
69c0: 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
69d0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
69e0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  r;.      int idx
69f0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  New;.      pNewE
6a00: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
6a10: 72 28 64 62 2c 20 6f 70 73 5b 69 5d 2c 20 73 71  r(db, ops[i], sq
6a20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
6a30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a   pExpr->pLeft),.
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6a60: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
6a70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
6a80: 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  r), 0);.      id
6a90: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
6aa0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
6ab0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
6ac0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
6ad0: 43 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  C);.      exprAn
6ae0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
6af0: 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20   idxNew);.      
6b00: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
6b10: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
6b20: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
6b30: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
6b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65 72  ;.    }.    pTer
6b50: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20  m->nChild = 2;. 
6b60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
6b70: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
6b80: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
6b90: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
6bb0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
6bc0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6bd0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
6be0: 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f  /* Attempt to co
6bf0: 6e 76 65 72 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  nvert OR-connect
6c00: 65 64 20 74 65 72 6d 73 20 69 6e 74 6f 20 61 6e  ed terms into an
6c10: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
6c20: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 63  that.  ** they c
6c30: 61 6e 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 69  an make use of i
6c40: 6e 64 69 63 65 73 2e 20 20 45 78 61 6d 70 6c 65  ndices.  Example
6c50: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
6c60: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
6c70: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
6c80: 20 3d 20 65 78 70 72 33 0a 20 20 2a 2a 0a 20 20   = expr3.  **.  
6c90: 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  ** is converted 
6ca0: 69 6e 74 6f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  into.  **.  **  
6cb0: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
6cc0: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 20 20 2a  expr2,expr3).  *
6cd0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 74 69  *.  ** This opti
6ce0: 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  mization must be
6cf0: 20 6f 6d 69 74 74 65 64 20 69 66 20 4f 4d 49 54   omitted if OMIT
6d00: 5f 53 55 42 51 55 45 52 59 20 69 73 20 64 65 66  _SUBQUERY is def
6d10: 69 6e 65 64 20 62 65 63 61 75 73 65 0a 20 20 2a  ined because.  *
6d20: 2a 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66  * the compiler f
6d30: 6f 72 20 74 68 65 20 74 68 65 20 49 4e 20 6f 70  or the the IN op
6d40: 65 72 61 74 6f 72 20 69 73 20 70 61 72 74 20 6f  erator is part o
6d50: 66 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a 20  f sub-queries.. 
6d60: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
6d70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
6d80: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 3b 0a 20  ){.    int ok;. 
6d90: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6da0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 43   int iColumn, iC
6db0: 75 72 73 6f 72 3b 0a 20 20 20 20 57 68 65 72 65  ursor;.    Where
6dc0: 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20 20 20 20  Clause sOr;.    
6dd0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
6de0: 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  rm;..    assert(
6df0: 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
6e00: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3d 3d   TERM_DYNAMIC)==
6e10: 30 20 29 3b 0a 20 20 20 20 77 68 65 72 65 43 6c  0 );.    whereCl
6e20: 61 75 73 65 49 6e 69 74 28 26 73 4f 72 2c 20 70  auseInit(&sOr, p
6e30: 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61 73  WC->pParse, pMas
6e40: 6b 53 65 74 29 3b 0a 20 20 20 20 77 68 65 72 65  kSet);.    where
6e50: 53 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78 70  Split(&sOr, pExp
6e60: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20 65  r, TK_OR);.    e
6e70: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53  xprAnalyzeAll(pS
6e80: 72 63 2c 20 26 73 4f 72 29 3b 0a 20 20 20 20 61  rc, &sOr);.    a
6e90: 73 73 65 72 74 28 20 73 4f 72 2e 6e 54 65 72 6d  ssert( sOr.nTerm
6ea0: 3e 3d 32 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30  >=2 );.    j = 0
6eb0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
6ec0: 61 73 73 65 72 74 28 20 6a 3c 73 4f 72 2e 6e 54  assert( j<sOr.nT
6ed0: 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 43 6f  erm );.      iCo
6ee0: 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e  lumn = sOr.a[j].
6ef0: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
6f00: 20 20 69 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e    iCursor = sOr.
6f10: 61 5b 6a 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b  a[j].leftCursor;
6f20: 0a 20 20 20 20 20 20 6f 6b 20 3d 20 69 43 75 72  .      ok = iCur
6f30: 73 6f 72 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f  sor>=0;.      fo
6f40: 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c  r(i=sOr.nTerm-1,
6f50: 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20   pOrTerm=sOr.a; 
6f60: 69 3e 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c  i>=0 && ok; i--,
6f70: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
6f80: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
6f90: 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f  ->eOperator!=WO_
6fa0: 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EQ ){.          
6fb0: 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73  goto or_not_poss
6fc0: 69 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ible;.        }.
6fd0: 20 20 20 20 20 20 20 20 69 66 28 20 6f 72 54 65          if( orTe
6fe0: 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65  rmIsOptCandidate
6ff0: 28 70 4f 72 54 65 72 6d 2c 20 69 43 75 72 73 6f  (pOrTerm, iCurso
7000: 72 2c 20 69 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20  r, iColumn) ){. 
7010: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
7020: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
7030: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
7040: 65 6c 73 65 20 69 66 28 20 6f 72 54 65 72 6d 48  else if( orTermH
7050: 61 73 4f 6b 44 75 70 6c 69 63 61 74 65 28 26 73  asOkDuplicate(&s
7060: 4f 72 2c 20 70 4f 72 54 65 72 6d 29 20 29 7b 0a  Or, pOrTerm) ){.
7070: 20 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72            pOrTer
7080: 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 45 52  m->flags &= ~TER
7090: 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  M_OR_OK;.       
70a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
70b0: 20 20 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20    ok = 0;.      
70c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
70d0: 7d 77 68 69 6c 65 28 20 21 6f 6b 20 26 26 20 28  }while( !ok && (
70e0: 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73  sOr.a[j++].flags
70f0: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 29 21   & TERM_COPIED)!
7100: 3d 30 20 26 26 20 6a 3c 32 20 29 3b 0a 20 20 20  =0 && j<2 );.   
7110: 20 69 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20   if( ok ){.     
7120: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7130: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
7140: 20 2a 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20   *pNew, *pDup;. 
7150: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
7160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
7170: 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70  i=sOr.nTerm-1, p
7180: 4f 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e  OrTerm=sOr.a; i>
7190: 3d 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70  =0 && ok; i--, p
71a0: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
71b0: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
71c0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  >flags & TERM_OR
71d0: 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  _OK)==0 ) contin
71e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ue;.        pDup
71f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7200: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
7210: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
7220: 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73         pList = s
7230: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7240: 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65  pend(pWC->pParse
7250: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30  , pList, pDup, 0
7260: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
7270: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
7280: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
7290: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
72a0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
72b0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
72c0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
72d0: 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  t);.      pNew =
72e0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
72f0: 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c   TK_IN, pDup, 0,
7300: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
7310: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
7320: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
7330: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
7340: 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45  arkings(pNew, pE
7350: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
7360: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
7370: 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65  t;.        idxNe
7380: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
7390: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c  nsert(pWC, pNew,
73a0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
73b0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
73c0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
73d0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
73e0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
73f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7400: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
7410: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
7420: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
7430: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
7440: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
7450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7460: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7470: 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
7480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f       }.    }.or_
7490: 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20 20  not_possible:.  
74a0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
74b0: 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23 65  ar(&sOr);.  }.#e
74c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
74d0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
74e0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
74f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
7500: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
7510: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
7520: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
7530: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
7540: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
7550: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
7560: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65   */.  if( isLike
7570: 4f 72 47 6c 6f 62 28 64 62 2c 20 70 45 78 70 72  OrGlob(db, pExpr
7580: 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73  , &nPattern, &is
7590: 43 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20  Complete) ){.   
75a0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
75b0: 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20  Right;.    Expr 
75c0: 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a  *pStr1, *pStr2;.
75d0: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
75e0: 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b  pr1, *pNewExpr2;
75f0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
7600: 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20  , idxNew2;..    
7610: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
7620: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7630: 3b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ;.    pRight = p
7640: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
7650: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
7660: 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  r1 = sqlite3PExp
7670: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52  r(pParse, TK_STR
7680: 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ING, 0, 0, 0);. 
7690: 20 20 20 69 66 28 20 70 53 74 72 31 20 29 7b 0a     if( pStr1 ){.
76a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
76b0: 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 53 74 72  enCopy(db, &pStr
76c0: 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68  1->token, &pRigh
76d0: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
76e0: 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20   pStr1->token.n 
76f0: 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 20 20  = nPattern;.    
7700: 20 20 70 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d    pStr1->flags =
7710: 20 45 50 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20   EP_Dequoted;.  
7720: 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20    }.    pStr2 = 
7730: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7740: 62 2c 20 70 53 74 72 31 29 3b 0a 20 20 20 20 69  b, pStr1);.    i
7750: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
7760: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 61 73  iled ){.      as
7770: 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b  sert( pStr2->tok
7780: 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20  en.dyn );.      
7790: 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e  ++*(u8*)&pStr2->
77a0: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
77b0: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
77c0: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
77d0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
77e0: 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78  TK_GE, sqlite3Ex
77f0: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c  prDup(db,pLeft),
7800: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
7810: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
7820: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
7830: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
7840: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
7850: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72  NAMIC);.    expr
7860: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
7870: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
7880: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
7890: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
78a0: 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33  , TK_LT, sqlite3
78b0: 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74  ExprDup(db,pLeft
78c0: 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20  ), pStr2, 0);.  
78d0: 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72    idxNew2 = wher
78e0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
78f0: 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45  C, pNewExpr2, TE
7900: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
7910: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78  DYNAMIC);.    ex
7920: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
7930: 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20  pWC, idxNew2);. 
7940: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
7950: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
7960: 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20   if( isComplete 
7970: 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  ){.      pWC->a[
7980: 69 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74  idxNew1].iParent
7990: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
79a0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32    pWC->a[idxNew2
79b0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
79c0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  erm;.      pTerm
79d0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20  ->nChild = 2;.  
79e0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
79f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
7a00: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
7a10: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7a20: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7a30: 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20  ABLE.  /* Add a 
7a40: 57 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61  WO_MATCH auxilia
7a50: 72 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63  ry term to the c
7a60: 6f 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66  onstraint set if
7a70: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
7a80: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
7a90: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f  of the form:  co
7aa0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e  lumn MATCH expr.
7ab0: 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  .  ** This infor
7ac0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  mation is used b
7ad0: 79 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  y the xBestIndex
7ae0: 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a   methods of.  **
7af0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
7b00: 20 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65    The native que
7b10: 72 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65  ry optimizer doe
7b20: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20  s not attempt.  
7b30: 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  ** to do anythin
7b40: 67 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e  g with MATCH fun
7b50: 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
7b60: 66 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75  f( isMatchOfColu
7b70: 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  mn(pExpr) ){.   
7b80: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
7b90: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
7ba0: 70 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65  pLeft;.    Where
7bb0: 54 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a  Term *pNewTerm;.
7bc0: 20 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72      Bitmask prer
7bd0: 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71  eqColumn, prereq
7be0: 45 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68  Expr;..    pRigh
7bf0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
7c00: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
7c10: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
7c20: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
7c30: 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78  pr;.    prereqEx
7c40: 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  pr = exprTableUs
7c50: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
7c60: 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65  ight);.    prere
7c70: 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61  qColumn = exprTa
7c80: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7c90: 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  t, pLeft);.    i
7ca0: 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26  f( (prereqExpr &
7cb0: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d   prereqColumn)==
7cc0: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7cd0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
7ce0: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
7cf0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d  te3Expr(db, TK_M
7d00: 41 54 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33  ATCH, 0, sqlite3
7d10: 45 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67  ExprDup(db, pRig
7d20: 68 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ht), 0);.      i
7d30: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
7d40: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
7d50: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
7d60: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
7d70: 49 43 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IC);.      pNewT
7d80: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
7d90: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65  xNew];.      pNe
7da0: 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  wTerm->prereqRig
7db0: 68 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b  ht = prereqExpr;
7dc0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
7dd0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
7de0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
7df0: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
7e00: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
7e10: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
7e20: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
7e30: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
7e40: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
7e50: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7e60: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
7e70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7e80: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
7e90: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
7ea0: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
7eb0: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
7ec0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
7ed0: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
7ee0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
7ef0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
7f00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7f10: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a  TUALTABLE */.}..
7f20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
7f30: 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  E if any of the 
7f40: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
7f50: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e  List->a[iFirst..
7f60: 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20  .] contain.** a 
7f70: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
7f80: 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61   table other tha
7f90: 6e 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c  n the iBase tabl
7fa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7fb0: 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72   referencesOther
7fc0: 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69  Tables(.  ExprLi
7fd0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
7fe0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78      /* Search ex
7ff0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73  pressions in ths
8000: 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d   list */.  ExprM
8010: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
8020: 2c 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  ,    /* Mapping 
8030: 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62  from tables to b
8040: 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20  itmaps */.  int 
8050: 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
8060: 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72        /* Be sear
8070: 63 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69  ching with the i
8080: 46 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73  First-th express
8090: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61  ion */.  int iBa
80a0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
80b0: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66     /* Ignore ref
80c0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
80d0: 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69  table */.){.  Bi
80e0: 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20  tmask allowed = 
80f0: 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  ~getMask(pMaskSe
8100: 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69  t, iBase);.  whi
8110: 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74  le( iFirst<pList
8120: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
8130: 66 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61  f( (exprTableUsa
8140: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69  ge(pMaskSet, pLi
8150: 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e  st->a[iFirst++].
8160: 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21  pExpr)&allowed)!
8170: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
8180: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
8190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
81a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
81b0: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
81c0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
81d0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
81e0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
81f0: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
8200: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
8210: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
8220: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
8230: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
8240: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
8250: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
8260: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
8270: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
8280: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8290: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
82a0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
82b0: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
82c0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
82d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
82e0: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
82f0: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
8300: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
8310: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
8320: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
8330: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
8340: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
8350: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
8360: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
8370: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
8380: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
8390: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
83a0: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
83b0: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
83c0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
83d0: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
83e0: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
83f0: 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** All terms of 
8400: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61  the ORDER BY tha
8410: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
8420: 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
8430: 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20  e either.** ASC 
8440: 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73  or DESC.  (Terms
8450: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
8460: 20 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65   clause past the
8470: 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45   end of a UNIQUE
8480: 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74  .** index do not
8490: 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79   need to satisfy
84a0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
84b0: 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76  .)  The *pbRev v
84c0: 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
84d0: 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52  o 1 if the ORDER
84e0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c   BY clause is al
84f0: 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73  l DESC and it is
8500: 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20   set to 0 if.** 
8510: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8520: 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a  use is all ASC..
8530: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
8540: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20  SortingIndex(.  
8550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8560: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8570: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8580: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
8590: 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69  skSet,  /* Mappi
85a0: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e  ng from table in
85b0: 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73  dices to bitmaps
85c0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
85d0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
85e0: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
85f0: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69  e testing */.  i
8600: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
8610: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
8620: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
8630: 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74  table to be sort
8640: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
8650: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
8660: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8670: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
8680: 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  nEqCol,         
8690: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
86a0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
86b0: 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ith == constrain
86c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52  ts */.  int *pbR
86d0: 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ev              
86e0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f  /* Set to 1 if O
86f0: 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20  RDER BY is DESC 
8700: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
8710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8730: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
8740: 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b  t sortOrder = 0;
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8760: 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e   XOR of index an
8770: 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20  d ORDER BY sort 
8780: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  direction */.  i
8790: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20  nt nTerm;       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45  * Number of ORDE
87c0: 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
87d0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
87e0: 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  item *pTerm;    
87f0: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
8800: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8810: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8820: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8830: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
8840: 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72  rBy!=0 );.  nTer
8850: 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  m = pOrderBy->nE
8860: 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  xpr;.  assert( n
8870: 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Term>0 );..  /* 
8880: 4d 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74  Match terms of t
8890: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
88a0: 73 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d  se against colum
88b0: 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69  ns of.  ** the i
88c0: 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
88d0: 4e 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65  Note that indice
88e0: 73 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f  s have pIdx->nCo
88f0: 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c  lumn regular col
8900: 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f  umns plus.  ** o
8910: 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  ne additional co
8920: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20  lumn containing 
8930: 74 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20  the rowid.  The 
8940: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a  rowid column.  *
8950: 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  * of the index i
8960: 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74  s also allowed t
8970: 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  o match against 
8980: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a  the ORDER BY.  *
8990: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
89a0: 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
89b0: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
89c0: 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64  <nTerm && i<=pId
89d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
89e0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
89f0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
8a00: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68  expression of th
8a10: 65 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d  e ORDER BY pTerm
8a20: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
8a30: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68  *pColl;    /* Th
8a40: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8a50: 65 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f  ence of pExpr */
8a60: 0a 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72  .    int termSor
8a70: 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20  tOrder; /* Sort 
8a80: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74  order for this t
8a90: 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  erm */.    int i
8aa0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a  Column;       /*
8ab0: 20 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   The i-th column
8ac0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
8ad0: 2d 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a  -1 for rowid */.
8ae0: 20 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64      int iSortOrd
8af0: 65 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20  er;    /* 1 for 
8b00: 44 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20  DESC, 0 for ASC 
8b10: 6f 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65  on the i-th inde
8b20: 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f  x term */.    co
8b30: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
8b40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8b50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8b60: 63 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65  ce for i-th inde
8b70: 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  x term */..    p
8b80: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
8b90: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
8ba0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
8bb0: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
8bc0: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
8bd0: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
8be0: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
8bf0: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
8c00: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
8c10: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
8c20: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
8c30: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
8c40: 73 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  se */.      brea
8c50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  k;.    }.    pCo
8c60: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
8c70: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8c80: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
8c90: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
8ca0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
8cb0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
8cc0: 20 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f   if( i<pIdx->nCo
8cd0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43  lumn ){.      iC
8ce0: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
8cf0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
8d00: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49   if( iColumn==pI
8d10: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  dx->pTable->iPKe
8d20: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  y ){.        iCo
8d30: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
8d40: 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72   }.      iSortOr
8d50: 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  der = pIdx->aSor
8d60: 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20  tOrder[i];.     
8d70: 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61   zColl = pIdx->a
8d80: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65  zColl[i];.    }e
8d90: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75  lse{.      iColu
8da0: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  mn = -1;.      i
8db0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20  SortOrder = 0;. 
8dc0: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f       zColl = pCo
8dd0: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d  ll->zName;.    }
8de0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
8df0: 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
8e00: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
8e10: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
8e20: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
8e30: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
8e40: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8e50: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
8e60: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
8e70: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
8e80: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
8e90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
8ea0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
8eb0: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
8ec0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
8ed0: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
8ee0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
8ef0: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
8f00: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
8f10: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
8f20: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
8f30: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
8f40: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
8f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
8f60: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
8f70: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
8f80: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
8f90: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
8fa0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
8fb0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
8fc0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
8fd0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
8fe0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
8ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
9000: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
9010: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
9020: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  der!=0 );.    as
9030: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
9040: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
9050: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
9060: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9070: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  iSortOrder==0 ||
9080: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29   iSortOrder==1 )
9090: 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72  ;.    termSortOr
90a0: 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72  der = iSortOrder
90b0: 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72   ^ pTerm->sortOr
90c0: 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e  der;.    if( i>n
90d0: 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  EqCol ){.      i
90e0: 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72  f( termSortOrder
90f0: 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20  !=sortOrder ){. 
9100: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65         /* Indice
9110: 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  s can only be us
9120: 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20  ed if all ORDER 
9130: 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68  BY terms past th
9140: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75  e.        ** equ
9150: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
9160: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
9170: 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f   DESC or ASC. */
9180: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9190: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
91a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74  else{.      sort
91b0: 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74  Order = termSort
91c0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Order;.    }.   
91d0: 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b   j++;.    pTerm+
91e0: 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75  +;.    if( iColu
91f0: 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e  mn<0 && !referen
9200: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
9210: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
9220: 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, j, base) ){. 
9230: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
9240: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73  ndexed column is
9250: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9260: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
9270: 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a  matches.      **
9280: 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65   so far and none
9290: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
92a0: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69   terms to the ri
92b0: 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74  ght reference ot
92c0: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  her.      ** tab
92d0: 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c  les in the join,
92e0: 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73   then we are ass
92f0: 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e  ured that the in
9300: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
9310: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72  .      ** to sor
9320: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72  t because the pr
9330: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69  imary key is uni
9340: 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20  que and so none 
9350: 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  of the other.   
9360: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69     ** columns wi
9370: 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66  ll make any diff
9380: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a  erence.      */.
9390: 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b        j = nTerm;
93a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
93b0: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
93c0: 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54  !=0;.  if( j>=nT
93d0: 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  erm ){.    /* Al
93e0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
93f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
9400: 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68  re covered by th
9410: 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20  is index so.    
9420: 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61  ** this index ca
9430: 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f  n be used for so
9440: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65  rting. */.    re
9450: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
9460: 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
9470: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70  =OE_None && i==p
9480: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  Idx->nColumn.   
9490: 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65     && !reference
94a0: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
94b0: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
94c0: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
94d0: 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66   /* All terms of
94e0: 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63   this index matc
94f0: 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66  h some prefix of
9500: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9510: 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ause.    ** and 
9520: 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49  the index is UNI
9530: 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73  QUE and no terms
9540: 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20   on the tail of 
9550: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
9560: 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72   ** clause refer
9570: 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65  ence other table
9580: 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66  s in a join.  If
9590: 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75   this is all tru
95a0: 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  e then.    ** th
95b0: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
95c0: 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  e is superfluous
95d0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
95e0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
95f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  0;.}../*.** Chec
9600: 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69  k table to see i
9610: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
9620: 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42  lause in pOrderB
9630: 79 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69  y can be satisfi
9640: 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67  ed.** by sorting
9650: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57   in order of ROW
9660: 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ID.  Return true
9670: 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a   if so and set *
9680: 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74  pbRev to be.** t
9690: 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20  rue for reverse 
96a0: 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20  ROWID and false 
96b0: 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49  for forward ROWI
96c0: 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  D order..*/.stat
96d0: 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42  ic int sortableB
96e0: 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61  yRowid(.  int ba
96f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
9700: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
9710: 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20  er for table to 
9720: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45  be sorted */.  E
9730: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9740: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
9750: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
9760: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
9770: 70 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61  pMaskSet,  /* Ma
9780: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
9790: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
97a0: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
97b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
97c0: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
97d0: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
97e0: 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73    Expr *p;..  as
97f0: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
9800: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9810: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30  OrderBy->nExpr>0
9820: 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72   );.  p = pOrder
9830: 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  By->a[0].pExpr;.
9840: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
9850: 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61  COLUMN && p->iTa
9860: 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e  ble==base && p->
9870: 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20  iColumn==-1.    
9880: 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74  && !referencesOt
9890: 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72  herTables(pOrder
98a0: 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c  By, pMaskSet, 1,
98b0: 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70   base) ){.    *p
98c0: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
98d0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
98e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
98f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9900: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
9910: 61 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65  a crude estimate
9920: 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68   of the logarith
9930: 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76  m of the input v
9940: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  alue..** The res
9950: 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65  ults need not be
9960: 20 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73   exact.  This is
9970: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65   only used for e
9980: 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65  stimating.** the
9990: 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70   total cost of p
99a0: 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74  erforming operat
99b0: 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e  ings with O(logN
99c0: 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a  ) or O(NlogN).**
99d0: 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65   complexity.  Be
99e0: 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20  cause N is just 
99f0: 61 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e  a guess, it is n
9a00: 6f 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20  o great tragedy 
9a10: 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20  if.** logN is a 
9a20: 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73  little off..*/.s
9a30: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74  tatic double est
9a40: 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20  Log(double N){. 
9a50: 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31   double logN = 1
9a60: 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31  ;.  double x = 1
9a70: 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20  0;.  while( N>x 
9a80: 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31  ){.    logN += 1
9a90: 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20  ;.    x *= 10;. 
9aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e   }.  return logN
9ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72  ;.}../*.** Two r
9ac0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e  outines for prin
9ad0: 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ting the content
9ae0: 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69   of an sqlite3_i
9af0: 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72  ndex_info.** str
9b00: 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f  ucture.  Used fo
9b10: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
9b20: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49  bugging only.  I
9b30: 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c  f neither.** SQL
9b40: 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49  ITE_TEST or SQLI
9b50: 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66  TE_DEBUG are def
9b60: 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65  ined, then these
9b70: 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65   routines.** are
9b80: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20   no-ops..*/.#if 
9b90: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9ba0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9bb0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
9bc0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
9bd0: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
9be0: 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33  X_INPUTS(sqlite3
9bf0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b  _index_info *p){
9c00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
9c10: 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65 5f 74  !sqlite3_where_t
9c20: 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  race ) return;. 
9c30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9c40: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
9c50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
9c60: 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73  ugPrintf("  cons
9c70: 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d  traint[%d]: col=
9c80: 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d  %d termid=%d op=
9c90: 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22  %d usabled=%d\n"
9ca0: 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20  ,.       i,.    
9cb0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
9cc0: 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20  t[i].iColumn,.  
9cd0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
9ce0: 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73  int[i].iTermOffs
9cf0: 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  et,.       p->aC
9d00: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c  onstraint[i].op,
9d10: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
9d20: 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
9d30: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
9d40: 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b  ; i<p->nOrderBy;
9d50: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9d60: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
9d70: 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f   orderby[%d]: co
9d80: 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c  l=%d desc=%d\n",
9d90: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
9da0: 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d    p->aOrderBy[i]
9db0: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
9dc0: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
9dd0: 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  desc);.  }.}.sta
9de0: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
9df0: 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74  DX_OUTPUTS(sqlit
9e00: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
9e10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
9e20: 28 20 21 73 71 6c 69 74 65 33 5f 77 68 65 72 65  ( !sqlite3_where
9e30: 5f 74 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  _trace ) return;
9e40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9e50: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
9e60: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
9e70: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
9e80: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
9e90: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
9ea0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
9eb0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
9ec0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
9ed0: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
9ee0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
9ef0: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
9f00: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
9f10: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
9f20: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
9f30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
9f40: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
9f50: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
9f60: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
9f70: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
9f80: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
9f90: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
9fa0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
9fb0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
9fc0: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
9fd0: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
9fe0: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
9ff0: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
a000: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
a010: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
a020: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  S(A).#endif..#if
a030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a040: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
a050: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a060: 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61  best index for a
a070: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
a080: 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69  **.** The best i
a090: 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64  ndex is computed
a0a0: 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
a0b0: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ex method of the
a0c0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
a0d0: 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20  e module.  This 
a0e0: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c  routine is reall
a0f0: 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72  y just a wrapper
a100: 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a   that sets up.**
a110: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a120: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a130: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  e that is used t
a140: 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69  o communicate wi
a150: 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  th.** xBestIndex
a160: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69  ..**.** In a joi
a170: 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
a180: 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20  might be called 
a190: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66  multiple times f
a1a0: 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76  or the.** same v
a1b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
a1c0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a1d0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
a1e0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
a1f0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e  d initialized on
a200: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
a210: 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ation and reused
a220: 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   on all subseque
a230: 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  nt.** invocation
a240: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
a250: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a260: 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65  ture is also use
a270: 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69  d when.** code i
a280: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61  s generated to a
a290: 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61  ccess the virtua
a2a0: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68  l table.  The wh
a2b0: 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20  ereInfoDelete() 
a2c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65  .** routine take
a2d0: 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e  s care of freein
a2e0: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  g the sqlite3_in
a2f0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
a300: 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72  re after.** ever
a310: 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68  ybody has finish
a320: 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73  ed with it..*/.s
a330: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73  tatic double bes
a340: 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
a350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
a380: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
a390: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a3b0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a3c0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
a3d0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
a3e0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
a3f0: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
a400: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
a410: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
a430: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
a440: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
a450: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
a460: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
a470: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
a480: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
a490: 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79 55 73  .  int orderByUs
a4a0: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
a4b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
a4c0: 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f  can potential so
a4d0: 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rt */.  sqlite3_
a4e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
a4f0: 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20  dxInfo /* Index 
a500: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
a510: 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
a520: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a530: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
a540: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
a550: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
a560: 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
a570: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
a580: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
a590: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
a5a0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
a5b0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
a5c0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
a5d0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
a5e0: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
a5f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
a600: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
a610: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
a620: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66  int rc;..  /* If
a630: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a640: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a650: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  e has not been p
a660: 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  reviously.  ** a
a670: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69  llocated and ini
a680: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69  tialized for thi
a690: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  s virtual table,
a6a0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20   then allocate. 
a6b0: 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69   ** and initiali
a6c0: 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20  ze it now.  */. 
a6d0: 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49   pIdxInfo = *ppI
a6e0: 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
a6f0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
a700: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
a710: 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  m;.    int nTerm
a720: 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
a730: 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69  (("Recomputing i
a740: 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73  ndex info for %s
a750: 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ...\n", pTab->zN
a760: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
a770: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
a780: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
a790: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
a7a0: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
a7b0: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69     ** to this vi
a7c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
a7d0: 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30     for(i=nTerm=0
a7e0: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
a7f0: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
a800: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
a810: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
a820: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
a830: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
a840: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
a850: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a860: 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e  ==WO_IN ) contin
a870: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
a880: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
a890: 57 4f 5f 49 53 4e 55 4c 4c 20 29 20 63 6f 6e 74  WO_ISNULL ) cont
a8a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72  inue;.      nTer
a8b0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
a8c0: 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
a8d0: 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
a8e0: 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
a8f0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
a900: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
a910: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
a920: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
a930: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
a940: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c  f.    ** the sql
a950: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a960: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
a970: 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  /.    nOrderBy =
a980: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
a990: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
a9a0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
a9b0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
a9c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
a9d0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
a9e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a9f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
aa00: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
aa10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
aa20: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
aa30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
aa40: 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
aa50: 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
aa60: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
aa70: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
aa80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aa90: 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
aaa0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
aab0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
aac0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  e.    */.    pId
aad0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
aae0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
aaf0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
ab00: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
ab30: 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
ab40: 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
ab50: 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
ab80: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
ab90: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  y );.    if( pId
aba0: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
abb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
abc0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
abd0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
abe0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
abf0: 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e    }.    *ppIdxIn
ac00: 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a  fo = pIdxInfo;..
ac10: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
ac20: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
ac30: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
ac40: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
ac50: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  re contains.    
ac60: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
ac70: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
ac80: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
ac90: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
aca0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67  rom.    ** chang
acb0: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
acc0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
acd0: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
ace0: 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69  rder to.    ** i
acf0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
ad00: 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  fields..    */. 
ad10: 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73     pIdxCons = (s
ad20: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
ad30: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
ad40: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
ad50: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
ad60: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
ad70: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
ad80: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
ad90: 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73  .    pUsage = (s
ada0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
adb0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
adc0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
add0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
ade0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
adf0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
ae00: 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69  = nTerm;.    *(i
ae10: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
ae20: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
ae30: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
ae40: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
ae50: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
ae60: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
ae70: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
ae80: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
ae90: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
aea0: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
aeb0: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
aec0: 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72  derBy;.    *(str
aed0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
aee0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
aef0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
af00: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
af10: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
af60: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  .    for(i=j=0, 
af70: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
af80: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
af90: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
afa0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
afb0: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
afc0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
afd0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
afe0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
aff0: 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65  WO_IN ) continue
b000: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
b010: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
b020: 5f 49 53 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e  _ISNULL ) contin
b030: 75 65 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f  ue;.      pIdxCo
b040: 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
b050: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d  pTerm->leftColum
b060: 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  n;.      pIdxCon
b070: 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
b080: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
b090: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65  Cons[j].op = pTe
b0a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20  rm->eOperator;. 
b0b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65       /* The dire
b0c0: 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e  ct assignment in
b0d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   the previous li
b0e0: 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f  ne is possible o
b0f0: 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20  nly because.    
b100: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
b110: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
b120: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
b130: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
b140: 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  The.      ** fol
b150: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76  lowing asserts v
b160: 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e  erify this fact.
b170: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
b180: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
b190: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b1a0: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _EQ );.      ass
b1b0: 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49  ert( WO_LT==SQLI
b1c0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b1d0: 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  INT_LT );.      
b1e0: 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
b1f0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b200: 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
b210: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
b220: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
b230: 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
b240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
b250: 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GE==SQLITE_INDE
b260: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20  X_CONSTRAINT_GE 
b270: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b280: 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54   WO_MATCH==SQLIT
b290: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b2a0: 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20  NT_MATCH );.    
b2b0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
b2c0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
b2d0: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
b2e0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
b2f0: 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a  ATCH) );.      j
b300: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
b310: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
b320: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  y; i++){.      E
b330: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
b340: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
b350: 72 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64  r;.      pIdxOrd
b360: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20  erBy[i].iColumn 
b370: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
b380: 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65  ;.      pIdxOrde
b390: 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f  rBy[i].desc = pO
b3a0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
b3b0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
b3c0: 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
b3d0: 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  point, the sqlit
b3e0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
b3f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64  ructure that pId
b400: 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a  xInfo points.  *
b410: 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62  * to will have b
b420: 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  een initialized,
b430: 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74   either during t
b440: 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63  he current invoc
b450: 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75  ation or.  ** du
b460: 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20  ring some prior 
b470: 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77  invocation.  Now
b480: 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f   we just have to
b490: 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20   customize the. 
b4a0: 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70   ** details of p
b4b0: 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20  IdxInfo for the 
b4c0: 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69  current invocati
b4d0: 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74  on and pass it t
b4e0: 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65  o.  ** xBestInde
b4f0: 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  x..  */..  /* Th
b500: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75  e module name mu
b510: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41  st be defined. A
b520: 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69  lso, by this poi
b530: 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20  nt there must.  
b540: 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  ** be a pointer 
b550: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  to an sqlite3_vt
b560: 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74  ab structure. Ot
b570: 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c  herwise.  ** sql
b580: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
b590: 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68  nNames() would h
b5a0: 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74 68  ave picked up th
b5b0: 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20  e error. .  */. 
b5c0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61   assert( pTab->a
b5d0: 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54  zModuleArg && pT
b5e0: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
b5f0: 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0] );.  assert( 
b600: 70 54 61 62 2d 3e 70 56 74 61 62 20 29 3b 0a 23  pTab->pVtab );.#
b610: 69 66 20 30 0a 20 20 69 66 28 20 70 54 61 62 2d  if 0.  if( pTab-
b620: 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20  >pVtab==0 ){.   
b630: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b640: 28 70 50 61 72 73 65 2c 20 22 75 6e 64 65 66 69  (pParse, "undefi
b650: 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f  ned module %s fo
b660: 72 20 74 61 62 6c 65 20 25 73 22 2c 0a 20 20 20  r table %s",.   
b670: 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64       pTab->azMod
b680: 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d  uleArg[0], pTab-
b690: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
b6a0: 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 23 65 6e  urn 0.0;.  }.#en
b6b0: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  dif..  /* Set th
b6c0: 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  e aConstraint[].
b6d0: 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e  usable fields an
b6e0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c  d initialize all
b6f0: 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61   .  ** output va
b700: 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e  riables to zero.
b710: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73  .  **.  ** aCons
b720: 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
b730: 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73  is true for cons
b740: 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68  traints where th
b750: 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a  e right-hand.  *
b760: 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20  * side contains 
b770: 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20  only references 
b780: 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  to tables to the
b790: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72   left of the cur
b7a0: 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  rent.  ** table.
b7b0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
b7c0: 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61  , if the constra
b7d0: 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  int is of the fo
b7e0: 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
b7f0: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
b800: 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20   expr.  **.  ** 
b810: 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75  and we are evalu
b820: 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68  ating a join, th
b830: 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
b840: 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a  t on column is .
b850: 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20    ** only valid 
b860: 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65  if all tables re
b870: 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72  ferenced in expr
b880: 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65   occur to the le
b890: 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  ft.  ** of the t
b8a0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
b8b0: 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  column..  **.  *
b8c0: 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  * The aConstrain
b8d0: 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ts[] array conta
b8e0: 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
b8f0: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
b900: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72    ** on the curr
b910: 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74  ent table.  That
b920: 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76   way we only hav
b930: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20  e to compute it 
b940: 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74  once.  ** even t
b950: 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
b960: 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
b970: 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
b980: 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46  le times..  ** F
b990: 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20  or each attempt 
b9a0: 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e  at picking an in
b9b0: 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f  dex, the order o
b9c0: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  f tables in the.
b9d0: 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20    ** join might 
b9e0: 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20  be different so 
b9f0: 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d  we have to recom
ba00: 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20  pute the usable 
ba10: 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74  flag.  ** each t
ba20: 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ime..  */.  pIdx
ba30: 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
ba40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
ba50: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
ba60: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
ba70: 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  t;.  pUsage = pI
ba80: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
ba90: 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28  intUsage;.  for(
baa0: 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
bab0: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
bac0: 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
bad0: 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
bae0: 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
baf0: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
bb00: 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43  >a[j];.    pIdxC
bb10: 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28  ons->usable =  (
bb20: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
bb30: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  ht & notReady)==
bb40: 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  0;.  }.  memset(
bb50: 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
bb60: 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
bb70: 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
bb80: 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nt);.  if( pIdxI
bb90: 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
bba0: 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  dxStr ){.    sql
bbb0: 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
bbc0: 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d  fo->idxStr);.  }
bbd0: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
bbe0: 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
bbf0: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
bc00: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  .  pIdxInfo->nee
bc10: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
bc20: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f  0;.  pIdxInfo->o
bc30: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d  rderByConsumed =
bc40: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
bc50: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
bc60: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
bc70: 20 32 2e 30 3b 0a 20 20 6e 4f 72 64 65 72 42 79   2.0;.  nOrderBy
bc80: 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72   = pIdxInfo->nOr
bc90: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 49 64  derBy;.  if( pId
bca0: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
bcb0: 26 26 20 21 6f 72 64 65 72 42 79 55 73 61 62 6c  && !orderByUsabl
bcc0: 65 20 29 7b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  e ){.    *(int*)
bcd0: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65  &pIdxInfo->nOrde
bce0: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
bcf0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
bd00: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
bd10: 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42 65  WHERETRACE(("xBe
bd20: 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e  stIndex for %s\n
bd30: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
bd40: 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ;.  TRACE_IDX_IN
bd50: 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a  PUTS(pIdxInfo);.
bd60: 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70 56 74    rc = pTab->pVt
bd70: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
bd80: 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e 70 56  stIndex(pTab->pV
bd90: 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  tab, pIdxInfo);.
bda0: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
bdb0: 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20  UTS(pIdxInfo);. 
bdc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bdd0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
bde0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
bdf0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
be00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
be10: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
be20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
be30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
be40: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
be50: 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 0a  Str(rc));.    }.
be60: 20 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74      sqlite3Safet
be70: 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  yOn(pParse->db);
be80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
be90: 20 3d 20 73 71 6c 69 74 65 33 53 61 66 65 74 79   = sqlite3Safety
bea0: 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  On(pParse->db);.
beb0: 20 20 7d 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49    }.  *(int*)&pI
bec0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
bed0: 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = nOrderBy;..  
bee0: 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d  return pIdxInfo-
bef0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a  >estimatedCost;.
bf00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bf10: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
bf20: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46  ABLE */../*.** F
bf30: 69 6e 64 20 74 68 65 20 62 65 73 74 20 69 6e 64  ind the best ind
bf40: 65 78 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  ex for accessing
bf50: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
bf60: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ble.  Return a p
bf70: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
bf80: 20 69 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68   index, flags th
bf90: 61 74 20 64 65 73 63 72 69 62 65 20 68 6f 77 20  at describe how 
bfa0: 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
bfb0: 20 62 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a   be used, the.**
bfc0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c   number of equal
bfd0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
bfe0: 20 61 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20   and the "cost" 
bff0: 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  for this index..
c000: 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74  **.** The lowest
c010: 20 63 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73   cost index wins
c020: 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61  .  The cost is a
c030: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
c040: 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43  e amount of.** C
c050: 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20  PU and disk I/O 
c060: 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  need to process 
c070: 74 68 65 20 72 65 71 75 65 73 74 20 75 73 69 6e  the request usin
c080: 67 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 69  g the selected i
c090: 6e 64 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73  ndex..** Factors
c0a0: 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20   that influence 
c0b0: 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a  cost include:.**
c0c0: 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73  .**    *  The es
c0d0: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
c0e0: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
c0f0: 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20 20   be retrieved.  
c100: 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65  (The.**       fe
c110: 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e 29  wer the better.)
c120: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
c130: 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74  ther or not sort
c140: 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a  ing must occur..
c150: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74  **.**    *  Whet
c160: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
c170: 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61 74   must be separat
c180: 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65  e lookups in the
c190: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20  .**       index 
c1a0: 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  and in the main 
c1b0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  table..**.*/.sta
c1c0: 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49  tic double bestI
c1d0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
c1e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c1f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
c200: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c210: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
c220: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
c230: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c240: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
c250: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
c260: 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
c270: 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72  use term to sear
c280: 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ch */.  Bitmask 
c290: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20  notReady,       
c2a0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
c2b0: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
c2c0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
c2d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
c2e0: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f  derBy,         /
c2f0: 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63  * The order by c
c300: 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  lause */.  Index
c310: 20 2a 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20   **ppIndex,     
c320: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a         /* Make *
c330: 70 70 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f  ppIndex point to
c340: 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
c350: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73  */.  int *pFlags
c360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c370: 20 2f 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65   /* Put flags de
c380: 73 63 72 69 62 69 6e 67 20 74 68 69 73 20 63 68  scribing this ch
c390: 6f 69 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20  oice in *pFlags 
c3a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20  */.  int *pnEq  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 2f 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62   /* Put the numb
c3d0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
c3e0: 6f 6e 73 74 72 61 69 6e 74 73 20 68 65 72 65 20  onstraints here 
c3f0: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
c400: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65  m *pTerm;.  Inde
c410: 78 20 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20  x *bestIdx = 0; 
c420: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c430: 20 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20   that gives the 
c440: 6c 6f 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20  lowest cost */. 
c450: 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f   double lowestCo
c460: 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
c470: 54 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  The cost of usin
c480: 67 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69  g bestIdx */.  i
c490: 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30  nt bestFlags = 0
c4a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
c4b0: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
c4c0: 69 74 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20  ith bestIdx */. 
c4d0: 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30   int bestNEq = 0
c4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c4f0: 42 65 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e  Best value for n
c500: 45 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  Eq */.  int iCur
c510: 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72   = pSrc->iCursor
c520: 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
c530: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  r of the table t
c540: 6f 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f  o be accessed */
c550: 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c570: 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
c580: 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
c590: 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20    int rev;      
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5b0: 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e   True to scan in
c5c0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
c5d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
c600: 74 65 64 20 77 69 74 68 20 70 50 72 6f 62 65 20  ted with pProbe 
c610: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20  */.  int nEq;   
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d   /* Number of ==
c640: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
c650: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65  ts */.  int eqTe
c660: 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
c670: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
c680: 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
c690: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 64 6f 75  erators */.  dou
c6a0: 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
c6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
c6c0: 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65   of using pProbe
c6d0: 20 2a 2f 0a 0a 20 20 57 48 45 52 45 54 52 41 43   */..  WHERETRAC
c6e0: 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20 74  E(("bestIndex: t
c6f0: 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d 25  bl=%s notReady=%
c700: 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62  x\n", pSrc->pTab
c710: 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64  ->zName, notRead
c720: 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73  y));.  lowestCos
c730: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
c740: 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20 70  BL;.  pProbe = p
c750: 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65  Src->pTab->pInde
c760: 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  x;..  /* If the 
c770: 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64  table has no ind
c780: 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
c790: 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74  re no terms in t
c7a0: 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c  he where.  ** cl
c7b0: 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72 20  ause that refer 
c7c0: 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20 74 68  to the ROWID, th
c7d0: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72  en we will never
c7e0: 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20   be able to do. 
c7f0: 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   ** anything oth
c800: 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74  er than a full t
c810: 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68 69  able scan on thi
c820: 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d 69 67  s table.  We mig
c830: 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20  ht as.  ** well 
c840: 70 75 74 20 69 74 20 66 69 72 73 74 20 69 6e 20  put it first in 
c850: 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20  the join order. 
c860: 20 54 68 61 74 20 77 61 79 2c 20 70 65 72 68 61   That way, perha
c870: 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20 20 2a  ps it can be.  *
c880: 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  * referenced by 
c890: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20  other tables in 
c8a0: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
c8b0: 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20 26   if( pProbe==0 &
c8c0: 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d 28  &.     findTerm(
c8d0: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30  pWC, iCur, -1, 0
c8e0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  , WO_EQ|WO_IN|WO
c8f0: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
c900: 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20  WO_GE,0)==0 &&. 
c910: 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d 30      (pOrderBy==0
c920: 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79 52   || !sortableByR
c930: 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64 65  owid(iCur, pOrde
c940: 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53  rBy, pWC->pMaskS
c950: 65 74 2c 20 26 72 65 76 29 29 20 29 7b 0a 20 20  et, &rev)) ){.  
c960: 20 20 2a 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20    *pFlags = 0;. 
c970: 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b     *ppIndex = 0;
c980: 0a 20 20 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a  .    *pnEq = 0;.
c990: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
c9a0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
c9b0: 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58 50 52  for a rowid=EXPR
c9c0: 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e   or rowid IN (..
c9d0: 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  .) constraints. 
c9e0: 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69   */.  pTerm = fi
c9f0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
ca00: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
ca10: 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
ca20: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
ca30: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
ca40: 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20  .    *ppIndex = 
ca50: 30 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73  0;.    bestFlags
ca60: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   = WHERE_ROWID_E
ca70: 51 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  Q;.    if( pTerm
ca80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ca90: 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
caa0: 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79  Rowid== is alway
cab0: 73 20 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e  s the best pick.
cac0: 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65    Look no furthe
cad0: 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79  r.  Because only
cae0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  .      ** a sing
caf0: 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72 61  le row is genera
cb00: 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20 61  ted, output is a
cb10: 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64 20  lways in sorted 
cb20: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a  order */.      *
cb30: 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52  pFlags = WHERE_R
cb40: 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52 45 5f  OWID_EQ | WHERE_
cb50: 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 2a 70  UNIQUE;.      *p
cb60: 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 57  nEq = 1;.      W
cb70: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
cb80: 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22  best is rowid\n"
cb90: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
cba0: 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   0.0;.    }else 
cbb0: 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65  if( (pExpr = pTe
cbc0: 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73  rm->pExpr)->pLis
cbd0: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t!=0 ){.      /*
cbe0: 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29   Rowid IN (LIST)
cbf0: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
cc00: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
cc10: 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20  umber of list.  
cc20: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
cc30: 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73    */.      lowes
cc40: 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  tCost = pExpr->p
cc50: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
cc60: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d     lowestCost *=
cc70: 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f   estLog(lowestCo
cc80: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
cc90: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
cca0: 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74  N (SELECT): cost
ccb0: 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
ccc0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
ccd0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
cce0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f   in the result o
ccf0: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65  f the inner sele
cd00: 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20  ct.  We have no 
cd10: 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a  way to estimate.
cd20: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61        ** that va
cd30: 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69  lue so make a wi
cd40: 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20  ld guess. */.   
cd50: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
cd60: 32 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  200;.    }.    W
cd70: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
cd80: 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25  rowid IN cost: %
cd90: 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f  .9g\n", lowestCo
cda0: 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
cdb0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73  Estimate the cos
cdc0: 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61  t of a table sca
cdd0: 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  n.  If we do not
cde0: 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20   know how many. 
cdf0: 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20   ** entries are 
ce00: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73  in the table, us
ce10: 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61  e 1 million as a
ce20: 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63   guess..  */.  c
ce30: 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70  ost = pProbe ? p
ce40: 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
ce50: 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20  0] : 1000000;.  
ce60: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
ce70: 20 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65   table scan base
ce80: 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
ce90: 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61 67 73 20  cost));.  flags 
cea0: 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
ceb0: 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  NGE;..  /* Check
cec0: 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73   for constraints
ced0: 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f 66 20 72   on a range of r
cee0: 6f 77 69 64 73 20 69 6e 20 61 20 74 61 62 6c 65  owids in a table
cef0: 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   scan..  */.  pT
cf00: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
cf10: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
cf20: 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
cf30: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
cf40: 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
cf50: 20 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6e 64   ){.    if( find
cf60: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
cf70: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
cf80: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b  _LT|WO_LE, 0) ){
cf90: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
cfa0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
cfb0: 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33  .      cost /= 3
cfc0: 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74  ;  /* Guess that
cfd0: 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69 6d   rowid<EXPR elim
cfe0: 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64  inates two-third
cff0: 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s or rows */.   
d000: 20 7d 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54   }.    if( findT
d010: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
d020: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
d030: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a  GT|WO_GE, 0) ){.
d040: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
d050: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
d060: 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b        cost /= 3;
d070: 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20    /* Guess that 
d080: 72 6f 77 69 64 3e 45 58 50 52 20 65 6c 69 6d 69  rowid>EXPR elimi
d090: 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73  nates two-thirds
d0a0: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20   of rows */.    
d0b0: 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  }.    WHERETRACE
d0c0: 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e  (("... rowid ran
d0d0: 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20  ge reduces cost 
d0e0: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
d0f0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
d100: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a   flags = 0;.  }.
d110: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
d120: 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74  le scan does not
d130: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
d140: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e  ER BY clause, in
d150: 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20  crease.  ** the 
d160: 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f  cost by NlogN to
d170: 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e   cover the expen
d180: 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a  se of sorting. *
d190: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
d1a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74   ){.    if( sort
d1b0: 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72  ableByRowid(iCur
d1c0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 57 43 2d  , pOrderBy, pWC-
d1d0: 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72 65 76 29  >pMaskSet, &rev)
d1e0: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
d1f0: 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
d200: 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
d210: 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  GE;.      if( re
d220: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  v ){.        fla
d230: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
d240: 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
d250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d260: 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
d270: 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 57  g(cost);.      W
d280: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
d290: 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
d2a0: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
d2b0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d  ", cost));.    }
d2c0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c  .  }.  if( cost<
d2d0: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
d2e0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
d2f0: 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  ost;.    bestFla
d300: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a  gs = flags;.  }.
d310: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72  .  /* If the pSr
d320: 63 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 72  c table is the r
d330: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
d340: 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77  LEFT JOIN then w
d350: 65 20 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75  e may not.  ** u
d360: 73 65 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73  se an index to s
d370: 61 74 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63  atisfy IS NULL c
d380: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68  onstraints on th
d390: 61 74 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  at table.  This 
d3a0: 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  is.  ** because 
d3b0: 63 6f 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e  columns might en
d3c0: 64 20 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20  d up being NULL 
d3d0: 69 66 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65  if the table doe
d3e0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20  s not match -.  
d3f0: 2a 2a 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63  ** a circumstanc
d400: 65 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  e which the inde
d410: 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73  x cannot help us
d420: 20 64 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b   discover.  Tick
d430: 65 74 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20  et #2177..  */. 
d440: 20 69 66 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e   if( (pSrc->join
d450: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
d460: 3d 30 20 29 7b 0a 20 20 20 20 65 71 54 65 72 6d  =0 ){.    eqTerm
d470: 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
d480: 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  IN;.  }else{.   
d490: 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
d4a0: 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e  _EQ|WO_IN|WO_ISN
d4b0: 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ULL;.  }..  /* L
d4c0: 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64 65  ook at each inde
d4d0: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  x..  */.  for(; 
d4e0: 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70  pProbe; pProbe=p
d4f0: 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  Probe->pNext){. 
d500: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d530: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69 6e  */.    double in
d540: 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a  Multiplier = 1;.
d550: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
d560: 28 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c  ("... index %s:\
d570: 6e 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d  n", pProbe->zNam
d580: 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75  e));..    /* Cou
d590: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
d5a0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d5b0: 69 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 73  index that are s
d5c0: 61 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a 20  atisfied.    ** 
d5d0: 62 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74 72  by x=EXPR constr
d5e0: 61 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e  aints or x IN (.
d5f0: 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ..) constraints.
d600: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  .    */.    flag
d610: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
d620: 3d 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; i<pProbe->nC
d630: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
d640: 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62     int j = pProb
d650: 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  e->aiColumn[i];.
d660: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
d670: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
d680: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65  , j, notReady, e
d690: 71 54 65 72 6d 4d 61 73 6b 2c 20 70 50 72 6f 62  qTermMask, pProb
d6a0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
d6b0: 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
d6c0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
d6d0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
d6e0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
d6f0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
d700: 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  IN ){.        Ex
d710: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
d720: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
d730: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
d740: 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
d750: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
d760: 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20  Select!=0 ){.   
d770: 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
d780: 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  ier *= 25;.     
d790: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
d7a0: 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  pr->pList!=0 ){.
d7b0: 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
d7c0: 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d  iplier *= pExpr-
d7d0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20  >pList->nExpr + 
d7e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
d7f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
d800: 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ost = pProbe->ai
d810: 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75  RowEst[i] * inMu
d820: 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f  ltiplier * estLo
d830: 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b  g(inMultiplier);
d840: 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20  .    nEq = i;.  
d850: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e    if( pProbe->on
d860: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
d870: 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
d880: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20  _COLUMN_IN)==0. 
d890: 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d          && nEq==
d8a0: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
d8b0: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
d8c0: 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
d8d0: 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54      }.    WHERET
d8e0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45  RACE(("...... nE
d8f0: 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67  q=%d inMult=%.9g
d900: 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e 45   cost=%.9g\n",nE
d910: 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 63  q,inMultiplier,c
d920: 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ost));..    /* L
d930: 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f  ook for range co
d940: 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f  nstraints.    */
d950: 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
d960: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
d970: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
d980: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
d990: 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
d9a0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
d9b0: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
d9c0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
d9d0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72  WO_GT|WO_GE, pPr
d9e0: 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  obe);.      if( 
d9f0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  pTerm ){.       
da00: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
da10: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20  COLUMN_RANGE;.  
da20: 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
da30: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
da40: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
da50: 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20  |WO_LE, pProbe) 
da60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
da70: 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
da80: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20  LIMIT;.         
da90: 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20   cost /= 3;.    
daa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
dab0: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
dac0: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
dad0: 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
dae0: 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
daf0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
db00: 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
db10: 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d           cost /=
db20: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
db30: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
db40: 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20  (("...... range 
db50: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
db60: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
db70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
db80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61      /* Add the a
db90: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f  dditional cost o
dba0: 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61  f sorting if tha
dbb0: 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20  t is a factor.. 
dbc0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f     */.    if( pO
dbd0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
dbe0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
dbf0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
dc00: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 69   &&.           i
dc10: 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  sSortingIndex(pP
dc20: 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b 53  arse,pWC->pMaskS
dc30: 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70  et,pProbe,iCur,p
dc40: 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76  OrderBy,nEq,&rev
dc50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
dc60: 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20   flags==0 ){.   
dc70: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
dc80: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
dc90: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
dca0: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
dcb0: 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
dcc0: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
dcd0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
dce0: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
dcf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dd00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dd10: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
dd20: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
dd30: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
dd40: 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79 20  "...... orderby 
dd50: 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20 74  increases cost t
dd60: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
dd70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dd80: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
dd90: 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e 20  o see if we can 
dda0: 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75 73  get away with us
ddb0: 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64  ing just the ind
ddc0: 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  ex without.    *
ddd0: 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74  * ever reading t
dde0: 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  he table.  If th
ddf0: 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
de00: 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a 20  then halve the. 
de10: 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74 68     ** cost of th
de20: 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  is index..    */
de30: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
de40: 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  & pSrc->colUsed 
de50: 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  < (((Bitmask)1)<
de60: 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20  <(BMS-1)) ){.   
de70: 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
de80: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  Src->colUsed;.  
de90: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
dea0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72 6f   for(j=0; j<pPro
deb0: 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  be->nColumn; j++
dec0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
ded0: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
dee0: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
def0: 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20  if( x<BMS-1 ){. 
df00: 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28           m &= ~(
df10: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29  ((Bitmask)1)<<x)
df20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d    }.      if( m=
df40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  =0 ){.        fl
df50: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
df60: 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 63  _ONLY;.        c
df70: 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  ost /= 2;.      
df80: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
df90: 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72  ..... idx-only r
dfa0: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
dfb0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
dfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
dfd0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e     /* If this in
dfe0: 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64  dex has achieved
dff0: 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
e000: 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73   so far, then us
e010: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
e020: 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 63 6f   if( flags && co
e030: 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20  st < lowestCost 
e040: 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64 78  ){.      bestIdx
e050: 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 20   = pProbe;.     
e060: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f   lowestCost = co
e070: 73 74 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c  st;.      bestFl
e080: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
e090: 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71     bestNEq = nEq
e0a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e0b0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73  * Report the bes
e0c0: 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20  t result.  */.  
e0d0: 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49  *ppIndex = bestI
e0e0: 64 78 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  dx;.  WHERETRACE
e0f0: 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69 73  (("best index is
e100: 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20   %s, cost=%.9g, 
e110: 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64  flags=%x, nEq=%d
e120: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65 73  \n",.        bes
e130: 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d 3e  tIdx ? bestIdx->
e140: 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22  zName : "(none)"
e150: 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62 65  , lowestCost, be
e160: 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e 45 71  stFlags, bestNEq
e170: 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20  ));.  *pFlags = 
e180: 62 65 73 74 46 6c 61 67 73 20 7c 20 65 71 54 65  bestFlags | eqTe
e190: 72 6d 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45 71 20  rmMask;.  *pnEq 
e1a0: 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74  = bestNEq;.  ret
e1b0: 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a  urn lowestCost;.
e1c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  }.../*.** Disabl
e1d0: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
e1e0: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
e1f0: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
e200: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
e210: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
e220: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
e230: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
e240: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
e250: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
e260: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
e270: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
e280: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
e290: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
e2a0: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
e2b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
e2c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
e2d0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
e2e0: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
e2f0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
e300: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
e310: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
e320: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
e330: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
e340: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
e350: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
e360: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
e370: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
e380: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
e390: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
e3a0: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
e3b0: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
e3c0: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
e3d0: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
e3e0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
e3f0: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
e400: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
e410: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
e420: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
e430: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
e440: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
e450: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
e460: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
e470: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
e480: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
e490: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
e4a0: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
e4b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
e4c0: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
e4d0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
e4e0: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
e4f0: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
e500: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
e510: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
e520: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
e530: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
e540: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
e550: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
e560: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
e570: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
e580: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
e590: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
e5a0: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
e5b0: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
e5c0: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
e5d0: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
e5e0: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
e5f0: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
e600: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
e610: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
e620: 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
e630: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
e640: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
e650: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
e660: 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
e670: 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
e680: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
e690: 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
e6a0: 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
e6b0: 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
e6c0: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
e6d0: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
e6e0: 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
e6f0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
e700: 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
e710: 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
e720: 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
e730: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
e740: 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
e750: 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
e760: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
e770: 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
e780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
e790: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
e7a0: 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
e7c0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e7d0: 6f 64 65 20 74 68 61 74 20 62 75 69 6c 64 73 20  ode that builds 
e7e0: 61 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69  a probe for an i
e7f0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ndex..**.** Ther
e800: 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 43 6f 6c  e should be nCol
e810: 75 6d 6e 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  umn values on th
e820: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 69 6e  e stack.  The in
e830: 64 65 78 0a 2a 2a 20 74 6f 20 62 65 20 70 72 6f  dex.** to be pro
e840: 62 65 64 20 69 73 20 70 49 64 78 2e 20 20 50 6f  bed is pIdx.  Po
e850: 70 20 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f  p the values fro
e860: 6d 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 0a  m the stack and.
e870: 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 6d 20  ** replace them 
e880: 61 6c 6c 20 77 69 74 68 20 61 20 73 69 6e 67 6c  all with a singl
e890: 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 69 73  e record that is
e8a0: 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 70 72   the index.** pr
e8b0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
e8c0: 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65 78   void buildIndex
e8d0: 50 72 6f 62 65 28 0a 20 20 56 64 62 65 20 2a 76  Probe(.  Vdbe *v
e8e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ,        /* Gene
e8f0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
e900: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
e910: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 2f 2a 20 54  nColumn,    /* T
e920: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
e930: 75 6d 6e 73 20 74 6f 20 63 68 65 63 6b 20 66 6f  umns to check fo
e940: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 49 6e 64 65  r NULL */.  Inde
e950: 78 20 2a 70 49 64 78 20 20 20 20 20 2f 2a 20 49  x *pIdx     /* I
e960: 6e 64 65 78 20 74 68 61 74 20 77 65 20 77 69 6c  ndex that we wil
e970: 6c 20 62 65 20 73 65 61 72 63 68 69 6e 67 20 2a  l be searching *
e980: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  /.){.  sqlite3Vd
e990: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
e9a0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
e9b0: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
e9c0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
e9d0: 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f  (v, pIdx);.}.../
e9e0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
e9f0: 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
ea00: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
ea10: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ea20: 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
ea30: 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
ea40: 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
ea50: 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
ea60: 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
ea70: 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
ea80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
ea90: 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
eaa0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
eab0: 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  eft on the top o
eac0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
ead0: 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
eae0: 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
eaf0: 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
eb00: 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
eb10: 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
eb20: 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
eb30: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
eb40: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
eb50: 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
eb60: 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
eb70: 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
eb80: 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
eb90: 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
eba0: 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
ebb0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71  atic void codeEq
ebc0: 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
ebd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ebe0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
ebf0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
ec00: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
ec10: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
ec20: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ec30: 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
ec40: 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
ec50: 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c  Level  /* When l
ec60: 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
ec70: 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
ec80: 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a  orking on */.){.
ec90: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
eca0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62  rm->pExpr;.  Vdb
ecb0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ecc0: 56 64 62 65 3b 0a 20 20 69 66 28 20 70 58 2d 3e  Vdbe;.  if( pX->
ecd0: 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
ece0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ecf0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
ed00: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ght);.  }else if
ed10: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  ( pX->op==TK_ISN
ed20: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
ed30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ed40: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 23  P_Null, 0, 0);.#
ed50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ed60: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
ed70: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
ed80: 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
ed90: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
eda0: 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61  oop *pIn;..    a
edb0: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
edc0: 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 65 54 79 70  K_IN );.    eTyp
edd0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
ede0: 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
edf0: 58 2c 20 31 29 3b 0a 20 20 20 20 69 54 61 62 20  X, 1);.    iTab 
ee00: 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
ee10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee20: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
ee30: 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56   iTab, 0);.    V
ee40: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ee50: 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e  %.*s", pX->span.
ee60: 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b  n, pX->span.z));
ee70: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
ee80: 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >nIn==0 ){.     
ee90: 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20 73   pLevel->nxt = s
eea0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
eeb0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  bel(v);.    }.  
eec0: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b    pLevel->nIn++;
eed0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  .    pLevel->aIn
eee0: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 44 62  Loop = sqlite3Db
eef0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
ef00: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
ef10: 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20  ->aInLoop,.     
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ef40: 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49  izeof(pLevel->aI
ef50: 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c  nLoop[0])*pLevel
ef60: 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20  ->nIn);.    pIn 
ef70: 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  = pLevel->aInLoo
ef80: 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29  p;.    if( pIn )
ef90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d  {.      int op =
efa0: 20 28 28 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44   ((eType==IN_IND
efb0: 45 58 5f 52 4f 57 49 44 29 3f 4f 50 5f 52 6f 77  EX_ROWID)?OP_Row
efc0: 69 64 3a 4f 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20  id:OP_Column);. 
efd0: 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76       pIn += pLev
efe0: 65 6c 2d 3e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  el->nIn - 1;.   
eff0: 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
f000: 54 61 62 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e  Tab;.      pIn->
f010: 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
f020: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
f030: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
f040: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f050: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
f060: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c   -1, 0);.    }el
f070: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
f080: 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->nIn = 0;.    }
f090: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
f0a0: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
f0b0: 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  , pTerm);.}../*.
f0c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f0d0: 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
f0e0: 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
f0f0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
f100: 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  r an.** index.  
f110: 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  The values for a
f120: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ll constraints a
f130: 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  re left on the s
f140: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
f150: 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
f160: 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
f170: 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
f180: 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
f190: 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
f1a0: 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
f1b0: 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
f1c0: 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
f1d0: 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
f1e0: 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
f1f0: 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
f200: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
f210: 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
f220: 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
f230: 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
f240: 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
f250: 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
f260: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
f270: 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
f280: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
f290: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
f2a0: 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
f2b0: 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
f2c0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
f2d0: 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
f2e0: 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20  will be left.** 
f2f0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61  on the stack - a
f300: 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74 20   is the deepest 
f310: 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f  and b the shallo
f320: 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  west..**.** In t
f330: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
f340: 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
f350: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
f360: 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
f370: 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
f380: 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
f390: 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
f3a0: 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
f3b0: 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
f3c0: 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
f3d0: 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
f3e0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
f3f0: 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ry cell..**.** T
f400: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
f410: 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
f420: 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
f430: 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a   cell and puts.*
f440: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
f450: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
f460: 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  l in pLevel->iMe
f470: 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68 61  m.  The code tha
f480: 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
f490: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
f4a0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f   pLevel->iMem to
f4b0: 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
f4c0: 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
f4d0: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
f4e0: 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
f4f0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
f500: 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
f510: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
f520: 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
f530: 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
f540: 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
f550: 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  .** use..*/.stat
f560: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45  ic void codeAllE
f570: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
f580: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f590: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
f5a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
f5b0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
f5c0: 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
f5d0: 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
f5e0: 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
f5f0: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
f600: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
f610: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
f620: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
f630: 6f 74 52 65 61 64 79 20 20 20 20 20 20 2f 2a 20  otReady      /* 
f640: 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
f650: 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
f660: 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 29   been coded */.)
f670: 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
f680: 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20  evel->nEq;      
f690: 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
f6a0: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
f6b0: 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
f6c0: 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e  */.  int termsIn
f6d0: 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Mem = 0;        
f6e0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
f6f0: 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65  tore value in me
f700: 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56  m[] cells */.  V
f710: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f720: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
f730: 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
f740: 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
f750: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
f760: 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  x *pIdx = pLevel
f770: 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65  ->pIdx;   /* The
f780: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
f790: 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
f7a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
f7b0: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
f7c0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
f7d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
f7e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f7f0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
f800: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e   /* A single con
f810: 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a  straint term */.
f820: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f850: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
f860: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d  out how many mem
f870: 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c  ory cells we wil
f880: 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f  l need then allo
f890: 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20  cate them..  ** 
f8a0: 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61  We always need a
f8b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64  t least one used
f8c0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f   to store the lo
f8d0: 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20  op terminator.  
f8e0: 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  ** value.  If th
f8f0: 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61  ere are IN opera
f900: 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20  tors we'll need 
f910: 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20  one for each == 
f920: 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74  or.  ** IN const
f930: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c  raint..  */.  pL
f940: 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
f950: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69  rse->nMem++;.  i
f960: 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
f970: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
f980: 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  IN ){.    pParse
f990: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c  ->nMem += pLevel
f9a0: 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73  ->nEq;.    terms
f9b0: 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a  InMem = 1;.  }..
f9c0: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
f9d0: 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
f9e0: 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  raints.  */.  as
f9f0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
fa00: 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f  umn>=nEq );.  fo
fa10: 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b  r(j=0; j<nEq; j+
fa20: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20  +){.    int k = 
fa30: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
fa40: 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  ];.    pTerm = f
fa50: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
fa60: 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
fa70: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70  pLevel->flags, p
fa80: 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54  Idx);.    if( pT
fa90: 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
faa0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
fab0: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
fac0: 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20  _CODED)==0 );.  
fad0: 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
fae0: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
faf0: 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69  , pLevel);.    i
fb00: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
fb10: 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
fb20: 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a  L|WO_IN))==0 ){.
fb30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fb40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e  eAddOp(v, OP_IsN
fb50: 75 6c 6c 2c 20 74 65 72 6d 73 49 6e 4d 65 6d 20  ull, termsInMem 
fb60: 3f 20 2d 31 20 3a 20 2d 28 6a 2b 31 29 2c 20 70  ? -1 : -(j+1), p
fb70: 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20  Level->brk);.   
fb80: 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73   }.    if( terms
fb90: 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73  InMem ){.      s
fba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fbb0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
fbc0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31  pLevel->iMem+j+1
fbd0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
fbe0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
fbf0: 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  all the constrai
fc00: 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e  nt values are on
fc10: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
fc20: 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28  stack.  */.  if(
fc30: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20   termsInMem ){. 
fc40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
fc50: 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  q; j++){.      s
fc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fc70: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
fc80: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c  Level->iMem+j+1,
fc90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   0);.    }.  }.}
fca0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
fcb0: 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
fcc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
fcd0: 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20  ariable holds a 
fce0: 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e  text description
fcf0: 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67   of query plan g
fd00: 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74  enerated.** by t
fd10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
fd20: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
fd30: 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63  ereBegin().  Eac
fd40: 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42  h call to WhereB
fd50: 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74  egin.** overwrit
fd60: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e  es the previous.
fd70: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
fd80: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  on is used for t
fd90: 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e  esting and.** an
fda0: 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
fdb0: 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65  char sqlite3_que
fdc0: 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30  ry_plan[BMS*2*40
fdd0: 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74  ];  /* Text of t
fde0: 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69  he join */.stati
fdf0: 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30  c int nQPlan = 0
fe00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
fe10: 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77  * Next free slow
fe20: 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b   in _query_plan[
fe30: 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ] */..#endif /* 
fe40: 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
fe50: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68  ./*.** Free a Wh
fe60: 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
fe70: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
fe80: 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 57   whereInfoFree(W
fe90: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
fea0: 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20  ){.  if( pWInfo 
feb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
fec0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49    for(i=0; i<pWI
fed0: 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
fee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fef0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
ff00: 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69  fo = pWInfo->a[i
ff10: 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
ff20: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
ff30: 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f         if( pInfo
ff40: 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
ff50: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  tr ){.          
ff60: 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 44 6f 6e  /* Coverage: Don
ff70: 27 74 20 74 68 69 6e 6b 20 74 68 69 73 20 63 61  't think this ca
ff80: 6e 20 62 65 20 72 65 61 63 68 65 64 2e 20 42 79  n be reached. By
ff90: 20 74 68 65 20 74 69 6d 65 20 74 68 69 73 0a 20   the time this. 
ffa0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
ffb0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
ffc0: 74 68 65 20 69 6e 64 65 78 2d 73 74 72 69 6e 67  the index-string
ffd0: 73 20 68 61 76 65 20 62 65 65 6e 20 70 61 73 73  s have been pass
ffe0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
fff0: 74 6f 20 74 68 65 20 76 64 62 65 20 6c 61 79 65  to the vdbe laye
10000 72 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e 2e 0a  r for deletion..
10010 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10030 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74  ree(pInfo->idxSt
10040 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
10050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10060 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ee(pInfo);.     
10070 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
10080 69 74 65 33 5f 66 72 65 65 28 70 57 49 6e 66 6f  ite3_free(pWInfo
10090 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
100a0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
100b0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
100c0 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
100d0 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
100e0 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
100f0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
10100 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
10110 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
10120 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
10130 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
10140 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
10150 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
10160 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
10170 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
10180 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
10190 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
101a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
101b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
101c0 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
101d0 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
101e0 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
101f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
10200 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10210 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10220 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
10230 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
10240 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
10250 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
10260 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
10270 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
10280 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
10290 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
102a0 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
102b0 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
102c0 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
102d0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
102e0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
102f0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
10300 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
10310 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
10320 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
10330 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
10340 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
10350 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
10360 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
10370 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
10380 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
10390 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
103a0 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
103b0 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
103c0 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
103d0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
103e0 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
103f0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
10400 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
10410 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10420 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
10430 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
10440 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
10450 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
10460 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
10470 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
10480 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
104b0 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
104c0 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
104e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
104f0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
10500 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
10510 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
10520 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
10530 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
10540 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
10550 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
10560 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
10570 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
10580 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
10590 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
105a0 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
105b0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
105c0 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
105d0 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
105e0 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
105f0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
10600 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
10610 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
10620 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
10630 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
10640 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
10650 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
10660 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
10670 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
10680 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
10690 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
106a0 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
106b0 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
106c0 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
106d0 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
106e0 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
106f0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
10700 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
10710 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
10720 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
10730 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
10740 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
10750 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
10760 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
10770 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
10780 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
10790 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
107a0 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
107b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
107c0 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
107d0 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
107e0 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
107f0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
10800 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
10810 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
10820 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
10830 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
10840 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
10850 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
10860 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
10870 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
10880 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
10890 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
108a0 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
108b0 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
108c0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
108d0 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
108e0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
108f0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
10900 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
10910 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
10920 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10930 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
10940 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
10950 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
10960 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
10970 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
10980 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
10990 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
109a0 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
109b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
109c0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
109d0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
109e0 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
109f0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
10a00 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
10a10 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
10a20 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10a30 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
10a40 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
10a50 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
10a60 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
10a70 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
10a80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
10a90 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
10aa0 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
10ab0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10ac0 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
10ad0 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
10ae0 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
10af0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
10b00 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
10b10 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
10b20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
10b30 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
10b40 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
10b50 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
10b60 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
10b70 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
10b80 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
10b90 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
10ba0 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
10bb0 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
10bc0 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
10bd0 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
10be0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
10bf0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
10c00 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
10c10 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
10c20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
10c30 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
10c40 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
10c50 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
10c60 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
10c70 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
10c80 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
10c90 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
10ca0 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
10cb0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
10cc0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
10cd0 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
10ce0 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
10cf0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
10d00 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70  CESSING.**.** *p
10d10 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
10d20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
10d30 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  ER BY clause of 
10d40 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10d50 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nt,.** if there 
10d60 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
10d70 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
10d80 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
10d90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
10da0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
10db0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
10dc0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
10dd0 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55   ppOrderBy is NU
10de0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
10df0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
10e00 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61  d so that the na
10e10 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64  tural output ord
10e20 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  er of the table.
10e30 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65  ** scan is corre
10e40 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ct for the ORDER
10e50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
10e60 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75   that index is u
10e70 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72  sed and.** *ppOr
10e80 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f 20  derBy is set to 
10e90 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61  NULL.  This is a
10ea0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  n optimization t
10eb0 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a  hat prevents an.
10ec0 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  ** unnecessary s
10ed0 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ort of the resul
10ee0 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65  t set if an inde
10ef0 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  x appropriate fo
10f00 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  r the.** ORDER B
10f10 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  Y clause already
10f20 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49   exists..**.** I
10f30 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  f the where clau
10f40 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20  se loops cannot 
10f50 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70  be arranged to p
10f60 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65  rovide the corre
10f70 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64  ct.** output ord
10f80 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70  er, then the *pp
10f90 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68 61  OrderBy is uncha
10fa0 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  nged..*/.WhereIn
10fb0 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
10fc0 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
10fd0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10fe0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
10ff0 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
11000 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
11010 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
11020 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
11030 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
11040 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
11050 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
11060 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
11070 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 20  st **ppOrderBy  
11080 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63  /* An ORDER BY c
11090 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
110a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
110d0 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  r */.  WhereInfo
110e0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
110f0 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
11100 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11110 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
11120 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
11130 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11140 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
11150 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
11160 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20  e */.  int brk, 
11170 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  cont = 0;       
11180 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75    /* Addresses u
11190 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20  sed during code 
111a0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
111b0 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
111c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
111d0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
111e0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
111f0 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  d */.  WhereTerm
11200 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
11210 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
11220 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
11230 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11240 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b  MaskSet maskSet;
11250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
11260 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
11270 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
11280 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
11290 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
112a0 6c 61 75 73 65 20 69 73 20 64 69 76 69 64 65 64  lause is divided
112b0 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d   into these term
112c0 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
112d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
112e0 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67  Item;  /* A sing
112f0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54  le entry from pT
11300 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72  abList */.  Wher
11310 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
11320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11330 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e   single level in
11340 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74   the pWInfo list
11350 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b   */.  int iFrom;
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
11380 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73  nused FROM claus
11390 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  e element */.  i
113a0 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20  nt andFlags;    
113b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44            /* AND
113c0 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  -ed combination 
113d0 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c  of all wc.a[].fl
113e0 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
113f0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
11400 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11410 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
11420 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
11430 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
11440 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
11450 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75  imited by the nu
11460 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74  mber of.  ** bit
11470 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a  s in a Bitmask .
11480 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c    */.  if( pTabL
11490 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
114a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
114b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
114c0 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
114d0 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
114e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
114f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20    }..  /* Split 
11500 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11510 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
11520 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
11530 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
11540 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
11550 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
11560 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
11570 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
11580 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  &maskSet);.  whe
11590 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63  reClauseInit(&wc
115a0 2c 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53  , pParse, &maskS
115b0 65 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  et);.  whereSpli
115c0 74 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20 54  t(&wc, pWhere, T
115d0 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
115e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
115f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
11600 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
11610 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
11620 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
11630 72 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  rn value..  */. 
11640 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
11650 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
11660 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11670 28 64 62 2c 20 20 0a 20 20 20 20 20 20 20 20 20  (db,  .         
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
11690 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b  eof(WhereInfo) +
116a0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a   pTabList->nSrc*
116b0 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
116c0 6c 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  l));.  if( db->m
116d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
116e0 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
116f0 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70  inNoMem;.  }.  p
11700 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
11710 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
11720 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
11730 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
11740 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
11750 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
11760 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
11770 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11780 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  l(v);..  /* Spec
11790 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52  ial case: a WHER
117a0 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73  E clause that is
117b0 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c   constant.  Eval
117c0 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78  uate the.  ** ex
117d0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74  pression and eit
117e0 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c  her jump over al
117f0 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72  l of the code or
11800 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f   fall thru..  */
11810 0a 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26  .  if( pWhere &&
11820 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
11830 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78  ==0 || sqlite3Ex
11840 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
11850 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a  oin(pWhere)) ){.
11860 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
11870 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
11880 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69  Where, pWInfo->i
11890 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70  Break, 1);.    p
118a0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Where = 0;.  }..
118b0 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c    /* Analyze all
118c0 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65   of the subexpre
118d0 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68  ssions.  Note th
118e0 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29  at exprAnalyze()
118f0 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20   might.  ** add 
11900 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
11910 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  s onto the end o
11920 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
11930 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20  se.  We do not. 
11940 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c   ** want to anal
11950 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61  yze these virtua
11960 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72  l terms, so star
11970 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74  t analyzing at t
11980 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20  he end.  ** and 
11990 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20  work forward so 
119a0 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76  that the added v
119b0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65  irtual terms are
119c0 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64   never processed
119d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
119e0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
119f0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72  rc; i++){.    cr
11a00 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65  eateMask(&maskSe
11a10 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
11a20 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
11a30 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
11a40 28 70 54 61 62 4c 69 73 74 2c 20 26 77 63 29 3b  (pTabList, &wc);
11a50 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11a60 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11a70 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
11a80 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  Mem;.  }..  /* C
11a90 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
11aa0 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
11ab0 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
11ac0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
11ad0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
11ae0 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
11af0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
11b00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
11b10 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
11b20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
11b30 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
11b40 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
11b50 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
11b60 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45  [].flags     WHE
11b70 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
11b80 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
11b90 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
11ba0 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
11bb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
11bc0 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
11bd0 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
11be0 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
11bf0 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65  When term of the
11c00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
11c10 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a  being coded.  **
11c20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
11c30 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42  TabCur   The VDB
11c40 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
11c50 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a   database table.
11c60 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
11c70 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65  [].iIdxCur   The
11c80 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
11c90 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a   the index.  **.
11ca0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
11cb0 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20  lso figures out 
11cc0 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65  the nesting orde
11cd0 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
11ce0 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61  he FROM.  ** cla
11cf0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  use..  */.  notR
11d00 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
11d10 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  )0;.  pTabItem =
11d20 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20   pTabList->a;.  
11d30 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
11d40 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d  >a;.  andFlags =
11d50 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43   ~0;.  WHERETRAC
11d60 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
11d70 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
11d80 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d  ;.  for(i=iFrom=
11d90 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
11da0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
11db0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
11dc0 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
11dd0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
11de0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11df0 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61  for FROM table a
11e00 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20  t pTabItem */.  
11e10 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e30 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74   Flags asssociat
11e40 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
11e50 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20      int nEq;    
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
11e80 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
11e90 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  s */.    double 
11ea0 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
11eb0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
11ec0 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20   for pIdx */.   
11ed0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ef0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
11f00 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a   FROM tables */.
11f10 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
11f20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11f30 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  /* The best inde
11f40 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  x seen so far */
11f50 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61  .    int bestFla
11f60 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
11f70 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69   /* Flags associ
11f80 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20  ated with pBest 
11f90 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e  */.    int bestN
11fa0 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Eq = 0;         
11fb0 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69     /* nEq associ
11fc0 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20  ated with pBest 
11fd0 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  */.    double lo
11fe0 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20  westCost;       
11ff0 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68     /* Cost of th
12000 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69  e pBest */.    i
12010 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20  nt bestJ = 0;   
12020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12030 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a  e value of j */.
12040 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20      Bitmask m;  
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65  /* Bitmask value
12070 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20   for j or bestJ 
12080 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  */.    int once 
12090 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
120a0 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20     /* True when 
120b0 66 69 72 73 74 20 74 61 62 6c 65 20 69 73 20 73  first table is s
120c0 65 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  een */.    sqlit
120d0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
120e0 49 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e  Index; /* Curren
120f0 74 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  t virtual index 
12100 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f  */..    lowestCo
12110 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
12120 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  DBL;.    for(j=i
12130 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26  From, pTabItem=&
12140 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
12150 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
12160 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
12170 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f  +){.      int do
12180 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20  NotReorder;  /* 
12190 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62  True if this tab
121a0 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  le should not be
121b0 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20   reordered */.. 
121c0 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65       doNotReorde
121d0 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e  r =  (pTabItem->
121e0 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
121f0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
12200 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  0;.      if( onc
12210 65 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  e && doNotReorde
12220 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
12230 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61   m = getMask(&ma
12240 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d  skSet, pTabItem-
12250 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
12260 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61   if( (m & notRea
12270 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)==0 ){.      
12280 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29    if( j==iFrom )
12290 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20   iFrom++;.      
122a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
122b0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
122c0 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  ( pTabItem->pTab
122d0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
122e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
122f0 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49  ABLE.      if( I
12300 73 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65  sVirtual(pTabIte
12310 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
12320 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
12330 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e  x_info **ppIdxIn
12340 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  fo = &pWInfo->a[
12350 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  j].pIdxInfo;.   
12360 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74       cost = best
12370 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
12380 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74  rse, &wc, pTabIt
12390 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20  em, notReady,.  
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
123c0 4f 72 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64  OrderBy ? *ppOrd
123d0 65 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a  erBy : 0, i==0,.
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20  ppIdxInfo);.    
12410 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
12420 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
12430 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
12440 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20   *ppIdxInfo;.   
12450 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20       if( pIndex 
12460 26 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72  && pIndex->order
12470 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20  ByConsumed ){.  
12480 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
12490 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
124a0 4c 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52  LE | WHERE_ORDER
124b0 42 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  BY;.        }.  
124c0 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a        pIdx = 0;.
124d0 20 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b          nEq = 0;
124e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 53 51  .        if( (SQ
124f0 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30  LITE_BIG_DBL/2.0
12500 29 3c 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  )<cost ){.      
12510 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
12520 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
12530 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  o be larger than
12540 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20   SQLITE_BIG_DBL 
12550 28 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a  (the.          *
12560 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f  * inital value o
12570 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20  f lowestCost in 
12580 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74  this loop. If it
12590 20 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20   is, then.      
125a0 20 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74      ** the (cost
125b0 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73  <lowestCost) tes
125c0 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76  t below will nev
125d0 65 72 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20  er be true and. 
125e0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76           ** pLev
125f0 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76  el->pBestIdx nev
12600 65 72 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20  er set..        
12610 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
12620 63 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42  cost = (SQLITE_B
12630 49 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20  IG_DBL/2.0);.   
12640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12650 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
12660 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20   {.        cost 
12670 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72  = bestIndex(pPar
12680 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65  se, &wc, pTabIte
12690 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  m, notReady,.   
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70        (i==0 && p
126c0 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f  pOrderBy) ? *ppO
126d0 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20  rderBy : 0,.    
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61       &pIdx, &fla
12700 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20  gs, &nEq);.     
12710 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
12720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12730 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74   cost<lowestCost
12740 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   ){.        once
12750 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f   = 1;.        lo
12760 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
12770 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d  .        pBest =
12780 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62   pIdx;.        b
12790 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  estFlags = flags
127a0 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e 45  ;.        bestNE
127b0 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20  q = nEq;.       
127c0 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20   bestJ = j;.    
127d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73      pLevel->pBes
127e0 74 49 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  tIdx = pIndex;. 
127f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12800 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
12810 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12820 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
12830 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f  * Optimizer choo
12840 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20  se table %d for 
12850 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74  loop %d\n", best
12860 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c  J,.           pL
12870 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29  evel-pWInfo->a))
12880 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46  ;.    if( (bestF
12890 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
128a0 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
128b0 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
128c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
128d0 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67  lags &= bestFlag
128e0 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66  s;.    pLevel->f
128f0 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73  lags = bestFlags
12900 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49  ;.    pLevel->pI
12910 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20  dx = pBest;.    
12920 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65  pLevel->nEq = be
12930 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65  stNEq;.    pLeve
12940 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a  l->aInLoop = 0;.
12950 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20      pLevel->nIn 
12960 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65  = 0;.    if( pBe
12970 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  st ){.      pLev
12980 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
12990 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
129a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
129b0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
129c0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   -1;.    }.    n
129d0 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
129e0 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
129f0 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
12a00 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
12a10 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62  Level->iFrom = b
12a20 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45 52  estJ;.  }.  WHER
12a30 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
12a40 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
12a50 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ***\n"));..  /* 
12a60 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
12a70 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
12a80 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
12a90 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
12aa0 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
12ab0 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
12ac0 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
12ad0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
12ae0 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
12af0 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
12b00 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
12b10 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
12b20 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
12b30 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
12b40 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
12b50 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
12b60 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
12b70 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
12b80 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
12b90 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
12ba0 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
12bb0 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66  fier Goto */.  f
12bc0 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
12bd0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
12be0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
12bf0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
12c00 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
12c10 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
12c20 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
12c30 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  pIx;      /* Ind
12c40 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
12c50 73 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20  s pTab (if any) 
12c60 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
12c70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12c80 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
12c90 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
12ca0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
12cb0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
12cc0 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64  >iIdxCur;..#ifnd
12cd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
12ce0 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
12cf0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
12d00 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  2 ){.      char 
12d10 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72  *zMsg;.      str
12d20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
12d30 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
12d40 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
12d50 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73  From];.      zMs
12d60 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
12d70 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73  tf(db, "TABLE %s
12d80 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
12d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
12da0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
12db0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
12dc0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
12dd0 25 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %z AS %s", zMsg,
12de0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
12df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12e00 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c  f( (pIx = pLevel
12e10 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20  ->pIdx)!=0 ){.  
12e20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
12e30 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
12e40 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58 20 25  "%z WITH INDEX %
12e50 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a  s", zMsg, pIx->z
12e60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
12e70 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66  se if( pLevel->f
12e80 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
12e90 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
12ea0 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
12eb0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
12ec0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
12ed0 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59  %z USING PRIMARY
12ee0 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   KEY", zMsg);.  
12ef0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
12f00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12f10 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73  LTABLE.      els
12f20 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42  e if( pLevel->pB
12f30 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  estIdx ){.      
12f40 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
12f50 69 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d  info *pBestIdx =
12f60 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64   pLevel->pBestId
12f70 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  x;.        zMsg 
12f80 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
12f90 28 64 62 2c 20 22 25 7a 20 56 49 52 54 55 41 4c  (db, "%z VIRTUAL
12fa0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
12fb0 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12fd0 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  BestIdx->idxNum,
12fe0 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74   pBestIdx->idxSt
12ff0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
13000 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  if.      if( pLe
13010 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13020 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20  RE_ORDERBY ){.  
13030 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
13040 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
13050 22 25 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a  "%z ORDER BY", z
13060 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Msg);.      }.  
13070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13080 70 33 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p3(v, OP_Explain
13090 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72  , i, pLevel->iFr
130a0 6f 6d 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e  om, zMsg, P3_DYN
130b0 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  AMIC);.    }.#en
130c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
130d0 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20  IT_EXPLAIN */.  
130e0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54    pTabItem = &pT
130f0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
13100 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54  ->iFrom];.    pT
13110 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
13120 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  Tab;.    iDb = s
13130 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
13140 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
13150 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13160 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
13170 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70  Ephem || pTab->p
13180 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
13190 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
131a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
131b0 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76  BLE.    if( pLev
131c0 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a  el->pBestIdx ){.
131d0 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d        int iCur =
131e0 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
131f0 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
13200 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56  3VdbeOp3(v, OP_V
13210 4f 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 28  Open, iCur, 0, (
13220 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62  const char*)pTab
13230 2d 3e 70 56 74 61 62 2c 20 50 33 5f 56 54 41 42  ->pVtab, P3_VTAB
13240 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
13250 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
13260 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13270 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
13280 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13290 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
132a0 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
132b0 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
132c0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
132d0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
132e0 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61  ol<(sizeof(Bitma
132f0 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20  sk)*8) ){.      
13300 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
13310 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
13320 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
13330 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
13340 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
13350 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
13360 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
13370 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
13380 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
13390 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
133a0 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
133b0 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
133c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
133d0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
133e0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
133f0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
13400 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
13410 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
13420 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
13430 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
13440 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  (pIx = pLevel->p
13450 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Idx)!=0 ){.     
13460 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
13470 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
13480 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
13490 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
134a0 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
134b0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
134c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
134d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
134e0 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
134f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13500 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
13510 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
13520 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13530 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
13540 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
13550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13560 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
13570 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P3_KEYINFO_H
13580 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 73  ANDOFF);.      s
13590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
135a0 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
135b0 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c 20 70 49  mns, iIdxCur, pI
135c0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20  x->nColumn+1);. 
135d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
135e0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
135f0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
13600 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
13610 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
13620 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
13630 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
13640 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
13650 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
13660 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
13670 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
13680 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
13690 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
136a0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
136b0 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
136c0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
136d0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
136e0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  0;.  for(i=0, pL
136f0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
13700 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
13710 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
13720 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
13730 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
13740 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20  Item->iCursor;  
13750 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
13760 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
13770 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13780 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Idx;       /* Th
13790 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
137a0 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
137b0 69 6e 74 20 6e 78 74 3b 20 20 20 20 20 20 20 20  int nxt;        
137c0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
137d0 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
137e0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
137f0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74   case */.    int
13800 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
13810 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
13820 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
13830 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74   */.    int omit
13840 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72  Table;     /* Tr
13850 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
13860 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
13870 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20     int bRev;    
13880 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
13890 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
138a0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
138b0 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  r */..    pTabIt
138c0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
138d0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
138e0 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61  ;.    iCur = pTa
138f0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
13900 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
13910 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  l->pIdx;.    iId
13920 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
13930 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76  IdxCur;.    bRev
13940 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
13950 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
13960 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54  E)!=0;.    omitT
13970 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
13980 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
13990 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20  X_ONLY)!=0;..   
139a0 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
139b0 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
139c0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
139d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
139e0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
139f0 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
13a00 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b   to brk to break
13a10 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
13a20 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63      ** Jump to c
13a30 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
13a40 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
13a50 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
13a60 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a  he.    ** loop..
13a70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68      **.    ** Wh
13a80 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
13a90 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
13aa0 6c 73 6f 20 68 61 76 65 20 61 20 22 6e 78 74 22  lso have a "nxt"
13ab0 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 20 20   label that.    
13ac0 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74  ** means to cont
13ad0 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
13ae0 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62  xt IN value comb
13af0 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20  ination.  When. 
13b00 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20     ** there are 
13b10 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
13b20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
13b30 74 73 2c 20 74 68 65 20 22 6e 78 74 22 20 6c 61  ts, the "nxt" la
13b40 62 65 6c 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  bel.    ** is th
13b50 65 20 73 61 6d 65 20 61 73 20 22 62 72 6b 22 2e  e same as "brk".
13b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20  .    */.    brk 
13b70 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20  = pLevel->brk = 
13b80 70 4c 65 76 65 6c 2d 3e 6e 78 74 20 3d 20 73 71  pLevel->nxt = sq
13b90 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13ba0 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20  el(v);.    cont 
13bb0 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
13bc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13bd0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
13be0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
13bf0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
13c00 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
13c10 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
13c20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
13c30 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
13c40 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
13c50 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
13c60 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
13c70 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
13c80 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
13c90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13ca0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
13cb0 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
13cc0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
13cd0 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  FT)!=0 ){.      
13ce0 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65  if( !pParse->nMe
13cf0 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
13d00 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ++;.      pLevel
13d10 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50  ->iLeftJoin = pP
13d20 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
13d30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13d40 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
13d50 74 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  t, 0, pLevel->iL
13d60 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
13d70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
13d80 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20  "init LEFT JOIN 
13d90 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29  no-match flag"))
13da0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
13db0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
13dc0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
13dd0 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  ( pLevel->pBestI
13de0 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  dx ){.      /* C
13df0 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c  ase 0:  The tabl
13e00 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74  e is a virtual-t
13e10 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56  able.  Use the V
13e20 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74  Filter and VNext
13e30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
13e40 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
13e50 20 64 61 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a   data..      */.
13e60 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
13e70 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
13e80 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20  _info *pBestIdx 
13e90 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  = pLevel->pBestI
13ea0 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  dx;.      int nC
13eb0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 42 65 73  onstraint = pBes
13ec0 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  tIdx->nConstrain
13ed0 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
13ee0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
13ef0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
13f00 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20  aUsage =.       
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13f40 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
13f50 55 73 61 67 65 3b 0a 20 20 20 20 20 20 63 6f 6e  Usage;.      con
13f60 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  st struct sqlite
13f70 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13f80 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20  nt *aConstraint 
13f90 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 61 43      pBestIdx->aC
13fd0 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20  onstraint;..    
13fe0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43    for(j=1; j<=nC
13ff0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
14000 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
14010 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
14020 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   k<nConstraint; 
14030 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
14040 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72  if( aUsage[k].ar
14050 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20  gvIndex==j ){.  
14060 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54            int iT
14070 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
14080 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[k].iTermOffset
14090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
140a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
140b0 61 72 73 65 2c 20 77 63 2e 61 5b 69 54 65 72 6d  arse, wc.a[iTerm
140c0 5d 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ].pExpr->pRight)
140d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
140e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
140f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14100 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74     if( k==nConst
14110 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  raint ) break;. 
14120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14130 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14140 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31   OP_Integer, j-1
14150 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
14160 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14170 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42 65 73  OP_Integer, pBes
14180 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 30 29  tIdx->idxNum, 0)
14190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
141a0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 46 69  dbeOp3(v, OP_VFi
141b0 6c 74 65 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c  lter, iCur, brk,
141c0 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74   pBestIdx->idxSt
141d0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
141e0 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
141f0 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
14200 53 74 72 20 3f 20 50 33 5f 4d 50 52 49 4e 54 46  Str ? P3_MPRINTF
14210 20 3a 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20   : P3_STATIC);. 
14220 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e       pBestIdx->n
14230 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
14240 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
14250 3d 30 3b 20 6a 3c 70 42 65 73 74 49 64 78 2d 3e  =0; j<pBestIdx->
14260 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b  nConstraint; j++
14270 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
14280 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b  Usage[j].omit ){
14290 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
142a0 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69  Term = aConstrai
142b0 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[j].iTermOffse
142c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  t;.          dis
142d0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
142e0 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29 3b 0a   &wc.a[iTerm]);.
142f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14300 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
14310 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
14320 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
14330 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  = iCur;.      pL
14340 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
14350 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14360 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  r(v);.    }else.
14370 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14380 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
14390 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  LE */..    if( p
143a0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
143b0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b  HERE_ROWID_EQ ){
143c0 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
143d0 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
143e0 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
143f0 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
14400 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
14410 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
14420 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
14430 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
14440 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
14450 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
14460 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
14470 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
14480 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
14490 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
144a0 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
144b0 2f 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  /.      pTerm = 
144c0 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
144d0 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
144e0 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
144f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14500 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
14510 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
14520 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
14530 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
14540 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
14550 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
14560 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
14570 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  0 );.      codeE
14580 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
14590 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65  se, pTerm, pLeve
145a0 6c 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20  l);.      nxt = 
145b0 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20  pLevel->nxt;.   
145c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
145d0 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  dOp(v, OP_MustBe
145e0 49 6e 74 2c 20 31 2c 20 6e 78 74 29 3b 0a 20 20  Int, 1, nxt);.  
145f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14600 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  ddOp(v, OP_NotEx
14610 69 73 74 73 2c 20 69 43 75 72 2c 20 6e 78 74 29  ists, iCur, nxt)
14620 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
14630 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
14640 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
14650 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
14660 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
14670 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
14680 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20  ROWID_RANGE ){. 
14690 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
146a0 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71   We have an ineq
146b0 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
146c0 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
146d0 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20  WID field..     
146e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65   */.      int te
146f0 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  stOp = OP_Noop;.
14700 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
14710 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
14720 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
14730 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
14740 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
14750 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 66        pStart = f
14760 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
14770 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
14780 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
14790 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66  ;.      pEnd = f
147a0 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
147b0 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
147c0 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
147d0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76  ;.      if( bRev
147e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72   ){.        pTer
147f0 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20  m = pStart;.    
14800 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
14810 64 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20  d;.        pEnd 
14820 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
14830 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72  .      if( pStar
14840 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  t ){.        Exp
14850 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70  r *pX;.        p
14860 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70  X = pStart->pExp
14870 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
14880 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
14890 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
148a0 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
148b0 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iCur );.        
148c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
148d0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
148e0 68 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ht);.        sql
148f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14900 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20 70 58   OP_ForceInt, pX
14910 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 20 70  ->op==TK_LE || p
14920 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c 20 62 72  X->op==TK_GT, br
14930 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14950 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74  bRev ? OP_MoveLt
14960 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43   : OP_MoveGe, iC
14970 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
14980 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14990 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
149a0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
149b0 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20  evel, pStart);. 
149c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
149d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
149e0 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f  ddOp(v, bRev ? O
149f0 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
14a00 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a  nd, iCur, brk);.
14a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14a20 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
14a30 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20    Expr *pX;.    
14a40 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
14a50 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73  Expr;.        as
14a60 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20  sert( pX!=0 );. 
14a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14a80 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  End->leftCursor=
14a90 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  =iCur );.       
14aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14ab0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
14ac0 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ght);.        pL
14ad0 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
14ae0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
14af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
14b10 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  tore, pLevel->iM
14b20 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  em, 1);.        
14b30 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c  if( pX->op==TK_L
14b40 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  T || pX->op==TK_
14b50 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GT ){.          
14b60 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
14b70 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
14b80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14b90 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
14ba0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20   bRev ? OP_Lt : 
14bb0 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Gt;.        }
14bc0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
14bd0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
14be0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
14bf0 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
14c00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14c10 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  (v);.      pLeve
14c20 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f  l->op = bRev ? O
14c30 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74  P_Prev : OP_Next
14c40 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
14c50 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
14c60 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
14c70 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74  art;.      if( t
14c80 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
14c90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14ca0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14cb0 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30 29  _Rowid, iCur, 0)
14cc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14cd0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14ce0 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
14cf0 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
14d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14d10 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20  ddOp(v, testOp, 
14d20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
14d30 49 43 7c 30 78 31 30 30 2c 20 62 72 6b 29 3b 0a  IC|0x100, brk);.
14d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14d50 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
14d60 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
14d70 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  MN_RANGE ){.    
14d80 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 54 68 65    /* Case 3: The
14d90 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
14da0 72 6d 20 74 68 61 74 20 72 65 66 65 72 73 20 74  rm that refers t
14db0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
14dc0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
14dd0 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20    column of the 
14de0 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6e 65 71  index is an ineq
14df0 75 61 6c 69 74 79 2e 20 20 46 6f 72 20 65 78 61  uality.  For exa
14e00 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20 20 20 2a  mple, if.      *
14e10 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 69 6e  *         the in
14e20 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
14e30 29 20 61 6e 64 20 74 68 65 20 57 48 45 52 45 20  ) and the WHERE 
14e40 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65  clause is of the
14e50 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
14e60 20 20 66 6f 72 6d 20 22 78 3d 35 20 41 4e 44 20    form "x=5 AND 
14e70 79 3c 31 30 22 20 74 68 65 6e 20 74 68 69 73 20  y<10" then this 
14e80 63 61 73 65 20 69 73 20 75 73 65 64 2e 20 20 4f  case is used.  O
14e90 6e 6c 79 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nly the.      **
14ea0 20 20 20 20 20 20 20 20 20 72 69 67 68 74 2d 6d           right-m
14eb0 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
14ec0 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
14ed0 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
14ee0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
14ef0 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
14f00 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
14f10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
14f20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
14f30 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
14f40 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
14f50 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
14f60 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
14f70 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
14f80 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
14f90 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
14fa0 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  in order.      *
14fb0 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
14fc0 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
14fd0 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
14fe0 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
14ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
15000 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
15010 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
15020 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e 74 20  >nEq;.      int 
15030 74 6f 70 45 71 3d 30 3b 20 20 20 20 20 20 20 20  topEq=0;        
15040 2f 2a 20 54 72 75 65 20 69 66 20 74 6f 70 20 6c  /* True if top l
15050 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61  imit uses ==. Fa
15060 6c 73 65 20 69 73 20 73 74 72 69 63 74 6c 79 20  lse is strictly 
15070 3c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  < */.      int b
15080 74 6d 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f  tmEq=0;        /
15090 2a 20 54 72 75 65 20 69 66 20 62 74 6d 20 6c 69  * True if btm li
150a0 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c  mit uses ==. Fal
150b0 73 65 20 69 66 20 73 74 72 69 63 74 6c 79 20 3e  se if strictly >
150c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
150d0 70 4f 70 2c 20 62 74 6d 4f 70 3b 20 20 20 2f 2a  pOp, btmOp;   /*
150e0 20 4f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   Operators for t
150f0 68 65 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f  he top and botto
15100 6d 20 73 65 61 72 63 68 20 62 6f 75 6e 64 73 20  m search bounds 
15110 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  */.      int tes
15120 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  tOp;.      int t
15130 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65  opLimit = (pLeve
15140 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
15150 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a  _TOP_LIMIT)!=0;.
15160 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d        int btmLim
15170 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  it = (pLevel->fl
15180 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
15190 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20 20 20  LIMIT)!=0;..    
151a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
151b0 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
151c0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
151d0 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
151e0 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  IN.      ** and 
151f0 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65 73  level the values
15200 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20   of those terms 
15210 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
15220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64      */.      cod
15230 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
15240 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c  s(pParse, pLevel
15250 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 29  , &wc, notReady)
15260 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75 70 6c  ;..      /* Dupl
15270 69 63 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  icate the equali
15280 74 79 20 74 65 72 6d 20 76 61 6c 75 65 73 20 62  ty term values b
15290 65 63 61 75 73 65 20 74 68 65 79 20 77 69 6c 6c  ecause they will
152a0 20 61 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a   all be.      **
152b0 20 75 73 65 64 20 74 77 69 63 65 3a 20 6f 6e 63   used twice: onc
152c0 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 65  e to make the te
152d0 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61 6e  rmination key an
152e0 64 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74  d once to make t
152f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72  he.      ** star
15300 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  t key..      */.
15310 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
15320 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
15330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15340 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
15350 6e 45 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  nEq-1, 0);.     
15360 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67   }..      /* Fig
15370 75 72 65 20 6f 75 74 20 77 68 61 74 20 63 6f 6d  ure out what com
15380 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
15390 73 20 74 6f 20 75 73 65 20 66 6f 72 20 74 6f 70  s to use for top
153a0 20 61 6e 64 20 62 6f 74 74 6f 6d 20 0a 20 20 20   and bottom .   
153b0 20 20 20 2a 2a 20 73 65 61 72 63 68 20 62 6f 75     ** search bou
153c0 6e 64 73 2e 20 46 6f 72 20 61 6e 20 61 73 63 65  nds. For an asce
153d0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  nding index, the
153e0 20 62 6f 74 74 6f 6d 20 62 6f 75 6e 64 20 69 73   bottom bound is
153f0 20 61 20 3e 20 6f 72 20 3e 3d 0a 20 20 20 20 20   a > or >=.     
15400 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61 6e 64   ** operator and
15410 20 74 68 65 20 74 6f 70 20 62 6f 75 6e 64 20 69   the top bound i
15420 73 20 61 20 3c 20 6f 72 20 3c 3d 20 6f 70 65 72  s a < or <= oper
15430 61 74 6f 72 2e 20 20 46 6f 72 20 61 20 64 65 73  ator.  For a des
15440 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cending.      **
15450 20 69 6e 64 65 78 20 74 68 65 20 6f 70 65 72 61   index the opera
15460 74 6f 72 73 20 61 72 65 20 72 65 76 65 72 73 65  tors are reverse
15470 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
15480 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
15490 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c  tOrder[nEq]==SQL
154a0 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
154b0 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f        topOp = WO
154c0 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  _LT|WO_LE;.     
154d0 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 47 54     btmOp = WO_GT
154e0 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 65  |WO_GE;.      }e
154f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 6f 70  lse{.        top
15500 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  Op = WO_GT|WO_GE
15510 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20  ;.        btmOp 
15520 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
15530 20 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c         SWAP(int,
15540 20 74 6f 70 4c 69 6d 69 74 2c 20 62 74 6d 4c 69   topLimit, btmLi
15550 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  mit);.      }.. 
15560 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15570 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
15580 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20 74   key.  This is t
15590 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68 61  he key value tha
155a0 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
155b0 65 6e 64 20 74 68 65 20 73 65 61 72 63 68 2e 20  end the search. 
155c0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74 65 72   There is no ter
155d0 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69 66 20  mination key if 
155e0 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  there.      ** a
155f0 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79 20 74  re no equality t
15600 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e  erms and no "X<.
15610 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20 20 20  .." term..      
15620 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32  **.      ** 2002
15630 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65  -Dec-04: On a re
15640 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e  verse-order scan
15650 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20  , the so-called 
15660 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20  "termination".  
15670 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75      ** key compu
15680 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c 79 20  ted here really 
15690 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 68  ends up being th
156a0 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20  e start key..   
156b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 78 74 20     */.      nxt 
156c0 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20  = pLevel->nxt;. 
156d0 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69       if( topLimi
156e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  t ){.        Exp
156f0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69  r *pX;.        i
15700 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
15710 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
15720 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
15730 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c  rm(&wc, iCur, k,
15740 20 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f 70   notReady, topOp
15750 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
15760 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
15770 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20  0 );.        pX 
15780 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
15790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
157a0 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  (pTerm->flags & 
157b0 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29  TERM_CODED)==0 )
157c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
157d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
157e0 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
157f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15800 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73  beAddOp(v, OP_Is
15810 4e 75 6c 6c 2c 20 2d 28 6e 45 71 2a 32 2b 31 29  Null, -(nEq*2+1)
15820 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  , nxt);.        
15830 74 6f 70 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65  topEq = pTerm->e
15840 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
15850 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20  E|WO_GE);.      
15860 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
15870 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
15880 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
15890 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20 20 7d  P_IdxGE;.      }
158a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
158b0 73 74 4f 70 20 3d 20 6e 45 71 3e 30 20 3f 20 4f  stOp = nEq>0 ? O
158c0 50 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f  P_IdxGE : OP_Noo
158d0 70 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71  p;.        topEq
158e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
158f0 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
15900 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
15910 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
15920 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20  q + topLimit;.  
15930 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
15940 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
15950 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 75 69  m++;.        bui
15960 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
15970 6e 43 6f 6c 2c 20 70 49 64 78 29 3b 0a 20 20 20  nCol, pIdx);.   
15980 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
15990 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
159a0 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d  p = topEq ? OP_M
159b0 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c  oveLe : OP_MoveL
159c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
159d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
159e0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78   op, iIdxCur, nx
159f0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
15a00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
15a10 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
15a20 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
15a30 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
15a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15a50 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
15a60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15a70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15a80 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20  _Last, iIdxCur, 
15a90 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  brk);.      }.. 
15aa0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15ab0 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20   the start key. 
15ac0 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
15ad0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
15ae0 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a  e lower.      **
15af0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65   bound on the se
15b00 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
15b10 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20  no start key if 
15b20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20  there are no.   
15b30 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74     ** equality t
15b40 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72  erms and if ther
15b50 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20  e is no "X>..." 
15b60 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20  term.  In.      
15b70 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65  ** that case, ge
15b80 6e 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64  nerate a "Rewind
15b90 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  " instruction in
15ba0 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20   place of the.  
15bb0 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
15bc0 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a   search..      *
15bd0 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d  *.      ** 2002-
15be0 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63  Dec-04: In the c
15bf0 61 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65  ase of a reverse
15c00 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74  -order search, t
15c10 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20  he so-called.   
15c20 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65     ** "start" ke
15c30 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70  y really ends up
15c40 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74   being used as t
15c50 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
15c60 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
15c70 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20     if( btmLimit 
15c80 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
15c90 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
15ca0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
15cb0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
15cc0 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
15cd0 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
15ce0 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20  otReady, btmOp, 
15cf0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61  pIdx);.        a
15d00 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
15d10 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  );.        pX = 
15d20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
15d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
15d40 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
15d50 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
15d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15d70 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15d80 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
15d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15da0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
15db0 6c 6c 2c 20 2d 28 6e 45 71 2b 31 29 2c 20 6e 78  ll, -(nEq+1), nx
15dc0 74 29 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 45  t);.        btmE
15dd0 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  q = pTerm->eOper
15de0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
15df0 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69  _GE);.        di
15e00 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
15e10 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
15e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
15e30 74 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  tmEq = 1;.      
15e40 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3e  }.      if( nEq>
15e50 30 20 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b  0 || btmLimit ){
15e60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
15e70 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69 6d  l = nEq + btmLim
15e80 69 74 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c  it;.        buil
15e90 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e  dIndexProbe(v, n
15ea0 43 6f 6c 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  Col, pIdx);.    
15eb0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
15ec0 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
15ed0 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
15ee0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
15ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15f00 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
15f10 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
15f20 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
15f30 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c  testOp = OP_IdxL
15f40 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
15f50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
15f60 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50 5f  op = btmEq ? OP_
15f70 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
15f80 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
15f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15fa0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e  , op, iIdxCur, n
15fb0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
15fc0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
15fd0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
15fe0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
15ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16010 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
16020 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ind, iIdxCur, br
16030 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
16040 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
16050 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  he the top of th
16060 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72  e loop.  If ther
16070 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69  e is a terminati
16080 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  on.      ** key 
16090 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20  we have to test 
160a0 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64  for that key and
160b0 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f   abort at the to
160c0 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  p of the.      *
160d0 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  * loop..      */
160e0 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
160f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16100 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
16110 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
16120 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
16130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16140 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
16150 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
16160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16170 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
16180 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78  tOp, iIdxCur, nx
16190 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
161a0 28 74 6f 70 45 71 20 26 26 20 21 62 52 65 76 29  (topEq && !bRev)
161b0 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20 62   || (!btmEq && b
161c0 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Rev) ){.        
161d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
161e0 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b 22  ngeP3(v, -1, "+"
161f0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
16200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16210 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d        if( topLim
16220 69 74 20 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b  it | btmLimit ){
16230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16240 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16250 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
16260 20 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 73   nEq);.        s
16270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16280 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 31 2c  v, OP_IsNull, 1,
16290 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a   cont);.      }.
162a0 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
162b0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
162c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
162d0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
162e0 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
162f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16300 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
16310 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  eGe, iCur, 0);. 
16320 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16330 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
16340 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
16350 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
16360 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
16370 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
16380 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
16390 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
163a0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64  pLevel->p1 = iId
163b0 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  xCur;.      pLev
163c0 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
163d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
163e0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
163f0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b  ERE_COLUMN_EQ ){
16400 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34  .      /* Case 4
16410 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 69  :  There is an i
16420 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74 65 72  ndex and all ter
16430 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
16440 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20 20  clause that.    
16450 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 72 65    **          re
16460 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64 65 78  fer to the index
16470 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d 22 20   using the "==" 
16480 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
16490 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
164a0 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
164b0 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
164c0 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20 20 20  vel->nEq;..     
164d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
164e0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
164f0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
16500 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
16510 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c  N.      ** and l
16520 65 61 76 65 20 74 68 65 20 76 61 6c 75 65 73 20  eave the values 
16530 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 6f  of those terms o
16540 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  n the stack..   
16550 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65     */.      code
16560 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
16570 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c  (pParse, pLevel,
16580 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 29 3b   &wc, notReady);
16590 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65  .      nxt = pLe
165a0 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20 20 20  vel->nxt;..     
165b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
165c0 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20 77  ingle key that w
165d0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 62  ill be used to b
165e0 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20 74 65  oth start and te
165f0 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20 2a 2a  rminate.      **
16600 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
16610 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69 6c 64    */.      build
16620 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 45  IndexProbe(v, nE
16630 71 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  q, pIdx);.      
16640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16650 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
16660 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
16670 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
16680 65 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74  erate code (1) t
16690 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69  o move to the fi
166a0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65  rst matching ele
166b0 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
166c0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  e..      ** Then
166d0 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   generate code (
166e0 32 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  2) that jumps to
166f0 20 22 6e 78 74 22 20 61 66 74 65 72 20 74 68 65   "nxt" after the
16700 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a   cursor is past.
16710 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
16720 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65  t matching eleme
16730 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  nt of the table.
16740 20 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69    The code (1) i
16750 73 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20  s executed.     
16760 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74   ** once to init
16770 69 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63  ialize the searc
16780 68 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20  h, the code (2) 
16790 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f  is executed befo
167a0 72 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a  re each.      **
167b0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
167c0 65 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66  e scan to see if
167d0 20 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69   the scan has fi
167e0 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20  nished. */.     
167f0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
16800 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
16810 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
16820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16830 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16840 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c  MoveLe, iIdxCur,
16850 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73   nxt);.        s
16860 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16870 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16880 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
16890 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
168a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
168b0 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69  p(v, OP_IdxLT, i
168c0 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
168d0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
168e0 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
168f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16900 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20   /* Scan in the 
16910 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f  forward order */
16920 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16930 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
16940 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c  MoveGe, iIdxCur,
16950 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73   nxt);.        s
16960 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16970 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
16980 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
16990 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
169a0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
169b0 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64  v, OP_IdxGE, iId
169c0 78 43 75 72 2c 20 6e 78 74 2c 20 22 2b 22 2c 20  xCur, nxt, "+", 
169d0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
169e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
169f0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
16a00 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69  }.      if( !omi
16a10 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
16a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16a30 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  Op(v, OP_IdxRowi
16a40 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  d, iIdxCur, 0);.
16a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16a60 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
16a70 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b  oveGe, iCur, 0);
16a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
16a90 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
16aa0 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
16ab0 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
16ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16ad0 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
16ae0 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
16af0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
16b00 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
16b10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
16b20 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
16b30 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  e table..      *
16b40 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
16b50 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
16b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 52        assert( bR
16b70 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ev==0 );.      p
16b80 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
16b90 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
16ba0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
16bb0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
16bc0 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
16bd0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
16be0 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a  nd, iCur, brk);.
16bf0 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61      }.    notRea
16c00 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
16c10 6d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  maskSet, iCur);.
16c20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16c30 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 63 6b  ddOp(v, OP_Stack
16c40 44 65 70 74 68 2c 20 2d 31 2c 20 30 29 3b 0a 0a  Depth, -1, 0);..
16c50 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f      /* Insert co
16c60 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
16c70 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
16c80 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
16c90 65 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d  etely.    ** com
16ca0 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  puted using the 
16cb0 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74  current set of t
16cc0 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ables..    */.  
16cd0 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61    for(pTerm=wc.a
16ce0 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e  , j=wc.nTerm; j>
16cf0 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
16d00 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
16d10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
16d20 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
16d30 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
16d40 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
16d50 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
16d60 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
16d70 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
16d80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
16d90 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
16da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16db0 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  E!=0 );.      if
16dc0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
16dd0 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
16de0 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
16df0 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
16e00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16e10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
16e20 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
16e30 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c  Parse, pE, cont,
16e40 20 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d   1);.      pTerm
16e50 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
16e60 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20  CODED;.    }..  
16e70 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
16e80 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
16e90 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
16ea0 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
16eb0 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
16ec0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
16ed0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
16ee0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
16ef0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
16f00 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
16f10 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
16f20 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  in ){.      pLev
16f30 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65  el->top = sqlite
16f40 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16f50 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
16f60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
16f70 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70 4c 65  P_MemInt, 1, pLe
16f80 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b  vel->iLeftJoin);
16f90 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
16fa0 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
16fb0 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
16fc0 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d  .      for(pTerm
16fd0 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63  =wc.a, j=0; j<wc
16fe0 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65  .nTerm; j++, pTe
16ff0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
17000 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
17010 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
17020 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
17030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
17040 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
17050 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
17060 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
17070 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17080 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
17090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
170a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
170b0 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
170c0 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20  , cont, 1);.    
170d0 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
170e0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
170f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17100 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17110 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65  _TEST  /* For te
17120 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
17130 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
17140 20 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74    /* Record in t
17150 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e  he query plan in
17160 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
17170 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
17180 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69  e.  ** and the i
17190 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63  ndex used to acc
171a0 65 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e  ess it (if any).
171b0 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69    If the table i
171c0 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f  tself.  ** is no
171d0 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65  t used, its name
171e0 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20   is just '{}'.  
171f0 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75  If no index is u
17200 73 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64  sed.  ** the ind
17210 65 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20  ex is listed as 
17220 22 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72  "{}".  If the pr
17230 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
17240 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  d the.  ** index
17250 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20   name is '*'..  
17260 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
17270 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
17280 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
17290 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  z;.    int n;.  
172a0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
172b0 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54  fo->a[i];.    pT
172c0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
172d0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
172e0 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54  rom];.    z = pT
172f0 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a  abItem->zAlias;.
17300 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
17310 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
17320 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20  b->zName;.    n 
17330 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
17340 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20   if( n+nQPlan < 
17350 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71  sizeof(sqlite3_q
17360 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b  uery_plan)-10 ){
17370 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
17380 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
17390 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
173a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
173b0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
173c0 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32  nQPlan], "{}", 2
173d0 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
173e0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  n += 2;.      }e
173f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
17400 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
17410 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
17420 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   z, n);.        
17430 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
17440 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17450 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17460 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
17470 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
17480 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48  vel->flags & (WH
17490 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
174a0 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
174b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
174c0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
174d0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20  lan[nQPlan], "* 
174e0 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 2);.      nQP
174f0 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
17500 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
17510 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
17520 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
17530 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
17540 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a  an], "{} ", 3);.
17550 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
17560 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
17570 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70      n = strlen(p
17580 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61  Level->pIdx->zNa
17590 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
175a0 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
175b0 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
175c0 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
175d0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
175e0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
175f0 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49  lan], pLevel->pI
17600 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  dx->zName, n);. 
17610 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
17620 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   n;.        sqli
17630 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
17640 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
17650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17660 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61  }.  while( nQPla
17670 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71  n>0 && sqlite3_q
17680 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
17690 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]==' ' ){.    
176a0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
176b0 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30  an[--nQPlan] = 0
176c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
176d0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
176e0 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e  n] = 0;.  nQPlan
176f0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20   = 0;.#endif /* 
17700 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54  SQLITE_TEST // T
17710 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
17720 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
17730 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
17740 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61  e continuation a
17750 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68  ddress in the Wh
17760 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
17770 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c  e.  Then.  ** cl
17780 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
17790 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  n..  */.  pWInfo
177a0 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f  ->iContinue = co
177b0 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  nt;.  whereClaus
177c0 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72  eClear(&wc);.  r
177d0 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
177e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
177f0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
17800 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d  .whereBeginNoMem
17810 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  :.  whereClauseC
17820 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65  lear(&wc);.  whe
17830 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66  reInfoFree(pWInf
17840 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  o);.  return 0;.
17850 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
17860 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
17870 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
17880 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
17890 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
178a0 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
178b0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
178c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
178d0 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
178e0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
178f0 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f  Vdbe *v = pWInfo
17900 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  ->pParse->pVdbe;
17910 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
17920 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
17930 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
17940 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  ist = pWInfo->pT
17950 61 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65  abList;..  /* Ge
17960 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
17970 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
17980 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c  */.  for(i=pTabL
17990 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  ist->nSrc-1; i>=
179a0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65  0; i--){.    pLe
179b0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
179c0 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [i];.    sqlite3
179d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
179e0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74  (v, pLevel->cont
179f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
17a00 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
17a10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
17a20 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76  dbeAddOp(v, pLev
17a30 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
17a40 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
17a50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17a60 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20  Level->nIn ){.  
17a70 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
17a80 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
17a90 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
17aa0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17ab0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78  el(v, pLevel->nx
17ac0 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
17ad0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e  pLevel->nIn, pIn
17ae0 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  =&pLevel->aInLoo
17af0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
17b00 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
17b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17b20 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f  pHere(v, pIn->to
17b30 70 41 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20  pAddr+1);.      
17b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17b50 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  Op(v, OP_Next, p
17b60 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74  In->iCur, pIn->t
17b70 6f 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20  opAddr);.       
17b80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17b90 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70  Here(v, pIn->top
17ba0 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Addr-1);.      }
17bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
17bc0 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  ree(pLevel->aInL
17bd0 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oop);.    }.    
17be0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17bf0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
17c00 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  l->brk);.    if(
17c10 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
17c20 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
17c30 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
17c40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17c50 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
17c60 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
17c70 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  tJoin, 0);.     
17c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17c90 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  p(v, OP_NullRow,
17ca0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
17cb0 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  iCursor, 0);.   
17cc0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
17cd0 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20  IdxCur>=0 ){.   
17ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17cf0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
17d00 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
17d10 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
17d20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
17d30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
17d40 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 0, pLevel->
17d50 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  top);.      sqli
17d60 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17d70 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a  v, addr);.    }.
17d80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62    }..  /* The "b
17d90 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68  reak" point is h
17da0 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74  ere, just past t
17db0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75  he end of the ou
17dc0 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53  ter loop..  ** S
17dd0 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  et it..  */.  sq
17de0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17df0 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d  Label(v, pWInfo-
17e00 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20  >iBreak);..  /* 
17e10 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  Close all of the
17e20 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65   cursors that we
17e30 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c  re opened by sql
17e40 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a  ite3WhereBegin..
17e50 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
17e60 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
17e70 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
17e80 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b  rc; i++, pLevel+
17e90 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
17ea0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
17eb0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
17ec0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
17ed0 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
17ee0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
17ef0 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
17f00 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
17f10 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70    if( pTab->isEp
17f20 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  hem || pTab->pSe
17f30 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
17f40 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
17f50 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
17f60 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
17f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17f80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
17f90 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
17fa0 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 7d  ursor, 0);.    }
17fb0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17fc0 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20  >pIdx!=0 ){.    
17fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17fe0 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
17ff0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
18000 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
18010 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
18020 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
18030 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
18040 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
18050 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
18060 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
18070 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
18080 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
18090 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
180a0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
180b0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
180c0 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
180d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
180e0 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
180f0 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
18100 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
18110 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
18120 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
18130 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
18140 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
18150 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
18160 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
18170 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
18180 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
18190 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
181a0 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
181b0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
181c0 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
181d0 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
181e0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
181f0 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
18200 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
18210 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
18220 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
18230 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
18240 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
18250 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
18260 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
18270 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
18280 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
18290 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
182a0 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
182b0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
182c0 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
182d0 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
182e0 2d 3e 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ->pIdx ){.      
182f0 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
18300 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
18310 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  p;.      Index *
18320 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
18330 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75  Idx;.      int u
18340 73 65 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c  seIndexOnly = pL
18350 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
18360 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
18370 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
18380 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f  x!=0 );.      pO
18390 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
183a0 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
183b0 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
183c0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
183d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
183e0 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
183f0 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
18400 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
18410 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
18420 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
18430 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
18440 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
18450 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
18460 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
18470 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
18480 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
18490 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
184a0 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
184b0 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
184c0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
184d0 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
184e0 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
184f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
18500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
18510 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
18520 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
18530 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18540 28 21 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c  (!useIndexOnly |
18550 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
18560 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
18570 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
18580 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
18590 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
185a0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
185b0 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
185c0 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
185d0 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
185e0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
185f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52  opcode==OP_NullR
18600 6f 77 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e  ow && useIndexOn
18610 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
18620 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
18630 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  _Noop;.        }
18640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18650 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
18660 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68  leanup.  */.  wh
18670 65 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e  ereInfoFree(pWIn
18680 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
18690 0a                                               .