/ Hex Artifact Content
Login

Artifact 8c2bedcc61961a470c358b8c1466c7d8915bc722:


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 37 39   where.c,v 1.279
0340: 20 32 30 30 38 2f 30 31 2f 30 39 20 30 32 3a 31   2008/01/09 02:1
0350: 35 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a 2a  5:42 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 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
e9a0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
e9b0: 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mn, 0);.  sqlite
e9c0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
e9d0: 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a  r(v, pIdx);.}...
e9e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e9f0: 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
ea00: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
ea10: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
ea20: 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
ea30: 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
ea40: 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
ea50: 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
ea60: 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
ea70: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
ea80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
ea90: 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
eaa0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
eab0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  left on the top 
eac0: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
ead0: 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
eae0: 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
eaf0: 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
eb00: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
eb10: 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
eb20: 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
eb30: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
eb40: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
eb50: 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
eb60: 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
eb70: 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
eb80: 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
eb90: 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
eba0: 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
ebb0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45  tatic void codeE
ebc0: 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50  qualityTerm(.  P
ebd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ebe0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
ebf0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
ec00: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
ec10: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f     /* The term o
ec20: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
ec30: 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  se to be coded *
ec40: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
ec50: 70 4c 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20  pLevel  /* When 
ec60: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f  level of the FRO
ec70: 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20  M clause we are 
ec80: 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b  working on */.){
ec90: 0a 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54  .  Expr *pX = pT
eca0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64  erm->pExpr;.  Vd
ecb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ecc0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 58 2d  pVdbe;.  if( pX-
ecd0: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
ece0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ecf0: 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
ed00: 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  ight, 0);.  }els
ed10: 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
ed20: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  _ISNULL ){.    s
ed30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ed40: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ed50: 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
ed60: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ed70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
ed80: 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74  t eType;.    int
ed90: 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63   iTab;.    struc
eda0: 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a  t InLoop *pIn;..
edb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
edc0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
edd0: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
ede0: 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
edf0: 73 65 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20 20  se, pX, 1);.    
ee00: 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c  iTab = pX->iTabl
ee10: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e;.    sqlite3Vd
ee20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
ee30: 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
ee40: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ee50: 28 28 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d  ((v, "%.*s", pX-
ee60: 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61  >span.n, pX->spa
ee70: 6e 2e 7a 29 29 3b 0a 20 20 20 20 69 66 28 20 70  n.z));.    if( p
ee80: 4c 65 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b  Level->nIn==0 ){
ee90: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  .      pLevel->n
eea0: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
eeb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eec0: 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
eed0: 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65  nIn++;.    pLeve
eee0: 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c  l->aInLoop = sql
eef0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
ef00: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
ef10: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c  pLevel->aInLoop,
ef20: 0a 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 20                  
ef40: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76       sizeof(pLev
ef50: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a  el->aInLoop[0])*
ef60: 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20  pLevel->nIn);.  
ef70: 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
ef80: 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
ef90: 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e   pIn ){.      in
efa0: 74 20 6f 70 20 3d 20 28 28 65 54 79 70 65 3d 3d  t op = ((eType==
efb0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3f  IN_INDEX_ROWID)?
efc0: 4f 50 5f 52 6f 77 69 64 3a 4f 50 5f 43 6f 6c 75  OP_Rowid:OP_Colu
efd0: 6d 6e 29 3b 0a 20 20 20 20 20 20 70 49 6e 20 2b  mn);.      pIn +
efe0: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20  = pLevel->nIn - 
eff0: 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
f000: 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
f010: 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20   pIn->topAddr = 
f020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f030: 32 28 76 2c 20 6f 70 2c 20 69 54 61 62 2c 20 30  2(v, op, iTab, 0
f040: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f050: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f060: 5f 53 74 61 63 6b 49 73 4e 75 6c 6c 2c 20 2d 31  _StackIsNull, -1
f070: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
f080: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  .      pLevel->n
f090: 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
f0a0: 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
f0b0: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
f0c0: 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Term);.}../*.** 
f0d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
f0e0: 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65  at will evaluate
f0f0: 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63   all == and IN c
f100: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61  onstraints for a
f110: 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68 65  n.** index.  The
f120: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
f130: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
f140: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
f150: 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  k..**.** For exa
f160: 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
f170: 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
f180: 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
f190: 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
f1a0: 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
f1b0: 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
f1c0: 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
f1d0: 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
f1e0: 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
f1f0: 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
f200: 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
f210: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
f220: 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
f230: 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
f240: 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
f250: 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
f260: 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
f270: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
f280: 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
f290: 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
f2a0: 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
f2b0: 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
f2c0: 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
f2d0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
f2e0: 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
f2f0: 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20 6f 6e 20  l be left.** on 
f300: 74 68 65 20 73 74 61 63 6b 20 2d 20 61 20 69 73  the stack - a is
f310: 20 74 68 65 20 64 65 65 70 65 73 74 20 61 6e 64   the deepest and
f320: 20 62 20 74 68 65 20 73 68 61 6c 6c 6f 77 65 73   b the shallowes
f330: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  t..**.** In the 
f340: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45  example above nE
f350: 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20  q==2.  But this 
f360: 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  subroutine works
f370: 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a   for any value.*
f380: 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69  * of nEq includi
f390: 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30  ng 0.  If nEq==0
f3a0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
f3b0: 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70  s nearly a no-op
f3c0: 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  ..** The only th
f3d0: 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61  ing it does is a
f3e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76  llocate the pLev
f3f0: 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20  el->iMem memory 
f400: 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cell..**.** This
f410: 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
f420: 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61  allocates at lea
f430: 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65  st one memory ce
f440: 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a 2a 20 74  ll and puts.** t
f450: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
f460: 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
f470: 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2e 20  n pLevel->iMem. 
f480: 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
f490: 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
f4a0: 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 70 4c  tine will use pL
f4b0: 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f 20 73 74  evel->iMem to st
f4c0: 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
f4d0: 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
f4e0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
f4f0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
f500: 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
f510: 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
f520: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
f530: 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
f540: 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
f550: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
f560: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
f570: 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45 71 75 61  void codeAllEqua
f580: 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61 72  lityTerms(.  Par
f590: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f5a0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f5b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
f5c0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
f5d0: 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65 64   /* Which nested
f5e0: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52 4f   loop of the FRO
f5f0: 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67 20  M we are coding 
f600: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
f610: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
f620: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
f630: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
f640: 65 61 64 79 20 20 20 20 20 20 2f 2a 20 57 68 69  eady      /* Whi
f650: 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f 4d  ch parts of FROM
f660: 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
f670: 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  en coded */.){. 
f680: 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
f690: 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f  l->nEq;        /
f6a0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
f6b0: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
f6c0: 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
f6d0: 20 20 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d    int termsInMem
f6e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f6f0: 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72  /* If true, stor
f700: 65 20 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d  e value in mem[]
f710: 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65   cells */.  Vdbe
f720: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f730: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
f740: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f750: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f760: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
f770: 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
f780: 49 64 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  Idx;   /* The in
f790: 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20 66  dex being used f
f7a0: 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  or this loop */.
f7b0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65    int iCur = pLe
f7c0: 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20  vel->iTabCur;   
f7d0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
f7e0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
f7f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
f800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f810: 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72   A single constr
f820: 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  aint term */.  i
f830: 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f850: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f860: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
f870: 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
f880: 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
f890: 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
f8a0: 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20  e them..  ** We 
f8b0: 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c  always need at l
f8c0: 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f  east one used to
f8d0: 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20   store the loop 
f8e0: 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20  terminator.  ** 
f8f0: 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65  value.  If there
f900: 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   are IN operator
f910: 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65  s we'll need one
f920: 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a   for each == or.
f930: 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69    ** IN constrai
f940: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65  nt..  */.  pLeve
f950: 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  l->iMem = ++pPar
f960: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20  se->nMem;.  if( 
f970: 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
f980: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
f990: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
f9a0: 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e  Mem += pLevel->n
f9b0: 45 71 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d  Eq;.    termsInM
f9c0: 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  em = 1;.  }..  /
f9d0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
f9e0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f9f0: 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nts.  */.  asser
fa00: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
fa10: 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a  >=nEq );.  for(j
fa20: 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b  =0; j<nEq; j++){
fa30: 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64  .    int k = pId
fa40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
fa50: 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
fa60: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
fa70: 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  k, notReady, pLe
fa80: 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64 78  vel->flags, pIdx
fa90: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
faa0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
fab0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
fac0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
fad0: 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63  DED)==0 );.    c
fae0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
faf0: 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
fb00: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  Level);.    if( 
fb10: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
fb20: 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57  r & (WO_ISNULL|W
fb30: 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20  O_IN))==0 ){.   
fb40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb50: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 74 61 63 6b  dOp2(v, OP_Stack
fb60: 49 73 4e 75 6c 6c 2c 20 74 65 72 6d 73 49 6e 4d  IsNull, termsInM
fb70: 65 6d 20 3f 20 2d 31 20 3a 20 2d 28 6a 2b 31 29  em ? -1 : -(j+1)
fb80: 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a  , pLevel->brk);.
fb90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65      }.    if( te
fba0: 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  rmsInMem ){.    
fbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fbc0: 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
fbd0: 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b  0, pLevel->iMem+
fbe0: 6a 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  j+1);.    }.  }.
fbf0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
fc00: 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72 61 69  all the constrai
fc10: 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20 6f 6e  nt values are on
fc20: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
fc30: 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28  stack.  */.  if(
fc40: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20   termsInMem ){. 
fc50: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
fc60: 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  q; j++){.      s
fc70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc80: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 70 4c  (v, OP_SCopy, pL
fc90: 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20  evel->iMem+j+1, 
fca0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  0);.    }.  }.}.
fcb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
fcc0: 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
fcd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
fce0: 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74  riable holds a t
fcf0: 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ext description 
fd00: 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65  of query plan ge
fd10: 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  nerated.** by th
fd20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
fd30: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
fd40: 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68  reBegin().  Each
fd50: 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65   call to WhereBe
fd60: 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  gin.** overwrite
fd70: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20  s the previous. 
fd80: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
fd90: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  n is used for te
fda0: 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61  sting and.** ana
fdb0: 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63  lysis only..*/.c
fdc0: 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72  har sqlite3_quer
fdd0: 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d  y_plan[BMS*2*40]
fde0: 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68  ;  /* Text of th
fdf0: 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63  e join */.static
fe00: 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b   int nQPlan = 0;
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20   Next free slow 
fe30: 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d  in _query_plan[]
fe40: 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
fe50: 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
fe60: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65  /*.** Free a Whe
fe70: 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
fe80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe90: 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 57 68  whereInfoFree(Wh
fea0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
feb0: 7b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  {.  if( pWInfo )
fec0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fed0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
fee0: 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
fef0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ff00: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
ff10: 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
ff20: 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
ff30: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
ff40: 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d        if( pInfo-
ff50: 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
ff60: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
ff70: 2a 20 43 6f 76 65 72 61 67 65 3a 20 44 6f 6e 27  * Coverage: Don'
ff80: 74 20 74 68 69 6e 6b 20 74 68 69 73 20 63 61 6e  t think this can
ff90: 20 62 65 20 72 65 61 63 68 65 64 2e 20 42 79 20   be reached. By 
ffa0: 74 68 65 20 74 69 6d 65 20 74 68 69 73 0a 20 20  the time this.  
ffb0: 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
ffc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
ffd0: 68 65 20 69 6e 64 65 78 2d 73 74 72 69 6e 67 73  he index-strings
ffe0: 20 68 61 76 65 20 62 65 65 6e 20 70 61 73 73 65   have been passe
fff0: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  d.          ** t
10000 6f 20 74 68 65 20 76 64 62 65 20 6c 61 79 65 72  o the vdbe layer
10010 20 66 6f 72 20 64 65 6c 65 74 69 6f 6e 2e 0a 20   for deletion.. 
10020 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
10030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10040 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72  ee(pInfo->idxStr
10050 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10070 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  e(pInfo);.      
10080 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10090 74 65 33 5f 66 72 65 65 28 70 57 49 6e 66 6f 29  te3_free(pWInfo)
100a0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
100b0 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67  Generate the beg
100c0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f  inning of the lo
100d0 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52  op used for WHER
100e0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
100f0 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ing..** The retu
10100 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f  rn value is a po
10110 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71  inter to an opaq
10120 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ue structure tha
10130 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e  t contains.** in
10140 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64  formation needed
10150 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
10160 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20  e loop.  Later, 
10170 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
10180 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e  ine.** should in
10190 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72  voke sqlite3Wher
101a0 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20  eEnd() with the 
101b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
101c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
101d0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
101e0 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20  plete the WHERE 
101f0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
10200 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
10210 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
10220 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
10230 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
10240 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20  e basic idea is 
10250 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c  to do a nested l
10260 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f  oop, one loop fo
10270 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a  r each table in.
10280 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
10290 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20  se of a select. 
102a0 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44   (INSERT and UPD
102b0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ATE statements a
102c0 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  re the.** same a
102d0 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20  s a SELECT with 
102e0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
102f0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
10300 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a  clause.)  For.**
10310 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
10320 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a   SQL is this:.**
10330 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54  .**       SELECT
10340 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
10350 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a  t3 WHERE ...;.**
10360 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64  .** Then the cod
10370 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63  e generated is c
10380 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65  onceptually like
10390 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
103a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61  **.**      forea
103b0 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f  ch row1 in t1 do
103c0 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
103d0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
103e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
103f0 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20  2 in t2 do      
10400 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
10410 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20  ereBegin().**   
10420 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
10430 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f  ow3 in t3 do   /
10440 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e  .**            .
10450 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65  ...**          e
10460 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
10470 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65         \    Code
10480 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
10490 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68  |-- by sqlite3Wh
104c0 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20  ereEnd().**     
104d0 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
104f0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
10500 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e  he loops might n
10510 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20  ot be nested in 
10520 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69  the order in whi
10530 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61  ch they.** appea
10540 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
10550 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72  ause if a differ
10560 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74  ent order is bet
10570 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65  ter able to make
10580 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63  .** use of indic
10590 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  es.  Note also t
105a0 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20  hat when the IN 
105b0 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73  operator appears
105c0 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45   in.** the WHERE
105d0 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68   clause, it migh
105e0 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69  t result in addi
105f0 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f  tional nested lo
10600 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e  ops for.** scann
10610 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
10620 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69  values on the ri
10630 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
10640 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54   the IN..**.** T
10650 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63  here are Btree c
10660 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65  ursors associate
10670 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c  d with each tabl
10680 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73  e.  t1 uses curs
10690 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61  or.** number pTa
106a0 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
106b0 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68  sor.  t2 uses th
106c0 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73  e cursor pTabLis
106d0 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e  t->a[1].iCursor.
106e0 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  .** And so forth
106f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10700 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
10710 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42  o open those VDB
10720 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64  E cursors.** and
10730 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
10740 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  () generates the
10750 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74   code to close t
10760 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  hem..**.** The c
10770 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ode that sqlite3
10780 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e  WhereBegin() gen
10790 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68  erates leaves th
107a0 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a  e cursors named.
107b0 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70  ** in pTabList p
107c0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72  ointing at their
107d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
107e0 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d  ries.  The [...]
107f0 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65   code.** can use
10800 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f   OP_Column and O
10810 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20  P_Rowid opcodes 
10820 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73  on these cursors
10830 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64   to extract.** d
10840 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72  ata from the var
10850 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74  ious tables of t
10860 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  he loop..**.** I
10870 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
10880 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  se is empty, the
10890 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d   foreach loops m
108a0 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68  ust each scan th
108b0 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61  eir.** entire ta
108c0 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68  bles.  Thus a th
108d0 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20  ree-way join is 
108e0 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74  an O(N^3) operat
108f0 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20  ion.  But if.** 
10900 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20  the tables have 
10910 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72  indices and ther
10920 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74  e are terms in t
10930 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
10940 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f  that.** refer to
10950 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20   those indices, 
10960 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65  a complete table
10970 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f   scan can be avo
10980 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ided and the.** 
10990 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75  code will run mu
109a0 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74  ch faster.  Most
109b0 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   of the work of 
109c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
109d0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73  checking.** to s
109e0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
109f0 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e  indices that can
10a00 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65   be used to spee
10a10 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  d up the loop..*
10a20 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68  *.** Terms of th
10a30 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
10a40 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20  re also used to 
10a50 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73  limit which rows
10a60 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b   actually.** mak
10a70 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e  e it to the "...
10a80 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  " in the middle 
10a90 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66  of the loop.  Af
10aa0 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63  ter each "foreac
10ab0 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20  h",.** terms of 
10ac0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
10ad0 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74   that use only t
10ae0 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f  erms in that loo
10af0 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c  p and outer.** l
10b00 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74  oops are evaluat
10b10 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20  ed and if false 
10b20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61  a jump is made a
10b30 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  round all subseq
10b40 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f  uent.** inner lo
10b50 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74  ops (or around t
10b60 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20  he "..." if the 
10b70 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68  test occurs with
10b80 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a  in the inner-.**
10b90 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a   most loop).**.*
10ba0 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a  * OUTER JOINS.**
10bb0 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69  .** An outer joi
10bc0 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61  n of tables t1 a
10bd0 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74  nd t2 is concept
10be0 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f  ally coded as fo
10bf0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
10c00 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
10c10 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c  t1 do.**      fl
10c20 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66  ag = 0.**      f
10c30 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
10c40 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  2 do.**        s
10c50 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20  tart:.**        
10c60 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
10c70 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20    flag = 1.**   
10c80 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69     end.**      i
10c90 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a  f flag==0 then.*
10ca0 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68  *        move th
10cb0 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f  e row2 cursor to
10cc0 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20   a null row.**  
10cd0 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74        goto start
10ce0 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20  .**      fi.**  
10cf0 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45    end.**.** ORDE
10d00 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43  R BY CLAUSE PROC
10d10 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70  ESSING.**.** *pp
10d20 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
10d30 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
10d40 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61  R BY clause of a
10d50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10d60 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  t,.** if there i
10d70 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
10d80 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
10d90 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
10da0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
10db0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
10dc0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
10dd0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
10de0 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c  ppOrderBy is NUL
10df0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  L..**.** If an i
10e00 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
10e10 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74   so that the nat
10e20 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65  ural output orde
10e30 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  r of the table.*
10e40 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63  * scan is correc
10e50 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20  t for the ORDER 
10e60 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
10e70 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73  that index is us
10e80 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64  ed and.** *ppOrd
10e90 65 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e  erBy is set to N
10ea0 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e  ULL.  This is an
10eb0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68   optimization th
10ec0 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a  at prevents an.*
10ed0 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f  * unnecessary so
10ee0 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
10ef0 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78   set if an index
10f00 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
10f10 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
10f20 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
10f30 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  exists..**.** If
10f40 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
10f50 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62  e loops cannot b
10f60 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72  e arranged to pr
10f70 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63  ovide the correc
10f80 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65  t.** output orde
10f90 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f  r, then the *ppO
10fa0 72 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e  rderBy is unchan
10fb0 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  ged..*/.WhereInf
10fc0 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
10fd0 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
10fe0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
10ff0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
11000 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
11010 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f   *pTabList,    /
11020 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
11030 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61  tables to be sca
11040 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nned */.  Expr *
11050 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
11060 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
11070 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
11080 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f  t **ppOrderBy, /
11090 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  * An ORDER BY cl
110a0 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
110b0 0a 20 20 75 38 20 6f 62 66 6c 61 67 20 20 20 20  .  u8 obflag    
110c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
110d0 6f 66 20 4f 52 44 45 52 42 59 5f 4d 49 4e 2c 20  of ORDERBY_MIN, 
110e0 4f 52 44 45 52 42 59 5f 4d 41 58 20 6f 72 20 4f  ORDERBY_MAX or O
110f0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 2a 2f  RDERBY_NORMAL */
11100 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11130 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
11140 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
11150 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20   /* Will become 
11160 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11170 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
11180 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  n */.  Vdbe *v =
11190 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
111a0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
111b0 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
111c0 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63   */.  int brk, c
111d0 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ont = 0;        
111e0 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73   /* Addresses us
111f0 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67  ed during code g
11200 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42  eneration */.  B
11210 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
11220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11230 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
11240 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
11250 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
11260 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
11270 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11280 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
11290 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d  lause */.  ExprM
112a0 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20  askSet maskSet; 
112b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
112c0 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
112d0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
112e0 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20  e wc;           
112f0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
11300 61 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20  ause is divided 
11310 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73  into these terms
11320 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
11330 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
11340 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
11350 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
11360 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
11370 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
11380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11390 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
113a0 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
113b0 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
113e0 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
113f0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
11400 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
11410 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
11420 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
11430 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61  f all wc.a[].fla
11440 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  gs */.  sqlite3 
11450 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
11460 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
11470 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
11480 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11490 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  y = 0;..  /* The
114a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
114b0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
114c0 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
114d0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
114e0 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20  .  ** bits in a 
114f0 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20  Bitmask .  */.  
11500 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
11510 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
11520 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11530 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
11540 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
11550 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
11560 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
11570 69 66 28 20 70 70 4f 72 64 65 72 42 79 20 29 7b  if( ppOrderBy ){
11580 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
11590 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a  *ppOrderBy;.  }.
115a0 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
115b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
115c0 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
115d0 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
115e0 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
115f0 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
11600 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
11610 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
11620 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73  initMaskSet(&mas
11630 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
11640 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20 70 50  auseInit(&wc, pP
11650 61 72 73 65 2c 20 26 6d 61 73 6b 53 65 74 29 3b  arse, &maskSet);
11660 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77  .  whereSplit(&w
11670 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  c, pWhere, TK_AN
11680 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c  D);.    .  /* Al
11690 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
116a0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
116b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
116c0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
116d0 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
116e0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  alue..  */.  db 
116f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11700 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
11710 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11720 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
11730 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11740 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
11750 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
11760 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
11770 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11780 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11790 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
117a0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Mem;.  }.  pWInf
117b0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
117c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
117d0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
117e0 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
117f0 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
11800 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
11810 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11820 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11830 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
11840 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
11850 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
11860 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
11870 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
11880 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
11890 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
118a0 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
118b0 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
118c0 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54  f( pWhere && (pT
118d0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20  abList->nSrc==0 
118e0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
118f0 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
11900 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
11910 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11920 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
11930 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
11940 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
11950 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
11960 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11970 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20   Analyze all of 
11980 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
11990 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65  ns.  Note that e
119a0 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67  xprAnalyze() mig
119b0 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20  ht.  ** add new 
119c0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e  virtual terms on
119d0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
119e0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
119f0 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   We do not.  ** 
11a00 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20  want to analyze 
11a10 74 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65  these virtual te
11a20 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e  rms, so start an
11a30 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65  alyzing at the e
11a40 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b  nd.  ** and work
11a50 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74   forward so that
11a60 20 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75   the added virtu
11a70 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76  al terms are nev
11a80 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20  er processed..  
11a90 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
11aa0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
11ab0 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
11ac0 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
11ad0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
11ae0 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78  ursor);.  }.  ex
11af0 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
11b00 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20 20 69  bList, &wc);.  i
11b10 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11b20 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
11b30 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
11b40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65  .  }..  /* Chose
11b50 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
11b60 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20  to use for each 
11b70 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11b80 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  M clause..  **. 
11b90 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69   ** This loop fi
11ba0 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lls in the follo
11bb0 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a  wing fields:.  *
11bc0 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  *.  **   pWInfo-
11bd0 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54  >a[].pIdx      T
11be0 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  he index to use 
11bf0 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f  for this level o
11c00 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  f the loop..  **
11c10 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66     pWInfo->a[].f
11c20 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f 78  lags     WHERE_x
11c30 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61  xx flags associa
11c40 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20  ted with pIdx.  
11c50 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
11c60 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e  .nEq       The n
11c70 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20  umber of == and 
11c80 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  IN constraints. 
11c90 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
11ca0 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e  ].iFrom     When
11cb0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
11cc0 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
11cd0 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
11ce0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
11cf0 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
11d00 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
11d10 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
11d20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
11d30 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
11d40 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
11d50 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a   index.  **.  **
11d60 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
11d70 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
11d80 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
11d90 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
11da0 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
11db0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
11dc0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
11dd0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
11de0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
11df0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
11e00 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
11e10 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
11e20 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
11e30 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
11e40 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
11e50 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
11e60 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
11e70 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
11e80 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
11e90 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
11ea0 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20     /* Index for 
11eb0 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54  FROM table at pT
11ec0 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e  abItem */.    in
11ed0 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
11ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
11ef0 67 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77  gs asssociated w
11f00 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  ith pIdx */.    
11f10 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
11f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11f30 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
11f40 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
11f50 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  .    double cost
11f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f70 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72   /* The cost for
11f80 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
11f90 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
11fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11fb0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
11fc0 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
11fd0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
11fe0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11ff0 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65  he best index se
12000 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  en so far */.   
12010 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d   int bestFlags =
12020 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
12030 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64  Flags associated
12040 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
12050 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d     int bestNEq =
12060 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
12070 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64  * nEq associated
12080 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20   with pBest */. 
12090 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74     double lowest
120a0 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  Cost;          /
120b0 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42  * Cost of the pB
120c0 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  est */.    int b
120d0 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20  estJ = 0;       
120e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61         /* The va
120f0 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20  lue of j */.    
12100 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20  Bitmask m;      
12110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12120 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72  itmask value for
12130 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20   j or bestJ */. 
12140 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b     int once = 0;
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12160 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73  * True when firs
12170 74 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20  t table is seen 
12180 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
12190 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 64 65  ndex_info *pInde
121a0 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 69  x; /* Current vi
121b0 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a  rtual index */..
121c0 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
121d0 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
121e0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d  .    for(j=iFrom
121f0 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
12200 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
12210 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
12220 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
12230 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52        int doNotR
12240 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72 75 65  eorder;  /* True
12250 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 73   if this table s
12260 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f  hould not be reo
12270 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20 20 20  rdered */..     
12280 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20   doNotReorder = 
12290 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e   (pTabItem->join
122a0 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
122b0 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20  JT_CROSS))!=0;. 
122c0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 26 26       if( once &&
122d0 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20   doNotReorder ) 
122e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d 20 3d  break;.      m =
122f0 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
12300 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t, pTabItem->iCu
12310 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
12320 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29 3d   (m & notReady)=
12330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
12340 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72  ( j==iFrom ) iFr
12350 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  om++;.        co
12360 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
12370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
12380 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29 3b 0a  abItem->pTab );.
12390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
123a0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
123b0 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
123c0 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70  tual(pTabItem->p
123d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
123e0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
123f0 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 3d  fo **ppIdxInfo =
12400 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70   &pWInfo->a[j].p
12410 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
12420 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69 72 74   cost = bestVirt
12430 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
12440 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20   &wc, pTabItem, 
12450 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20  notReady,.      
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 20 20 20 20 20 20 20 20 20 20 70 70 4f 72 64 65            ppOrde
12480 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42 79  rBy ? *ppOrderBy
12490 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20 20   : 0, i==0,.    
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 20 20 20 20 20 20 20 20 20 70 70 49 64              ppId
124c0 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  xInfo);.        
124d0 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  flags = WHERE_VI
124e0 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20  RTUALTABLE;.    
124f0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a 70 70      pIndex = *pp
12500 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  IdxInfo;.       
12510 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20 70   if( pIndex && p
12520 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79 43 6f  Index->orderByCo
12530 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20  nsumed ){.      
12540 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
12550 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c  E_VIRTUALTABLE |
12560 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
12570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12580 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
12590 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20 20 20      nEq = 0;.   
125a0 20 20 20 20 20 69 66 28 20 28 53 51 4c 49 54 45       if( (SQLITE
125b0 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c 63 6f  _BIG_DBL/2.0)<co
125c0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
125d0 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20 6e  /* The cost is n
125e0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
125f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
12600 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68 65  ITE_BIG_DBL (the
12610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
12620 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
12630 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
12640 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
12650 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20   then.          
12660 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c 6f 77  ** the (cost<low
12670 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62 65  estCost) test be
12680 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  low will never b
12690 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 20  e true and.     
126a0 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c 2d 3e       ** pLevel->
126b0 70 42 65 73 74 49 64 78 20 6e 65 76 65 72 20 73  pBestIdx never s
126c0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  et..          */
126d0 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74   .          cost
126e0 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44   = (SQLITE_BIG_D
126f0 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20 20 20  BL/2.0);.       
12700 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a   }.      }else .
12710 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
12720 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65         cost = be
12730 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
12740 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e  &wc, pTabItem, n
12750 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20  otReady,.       
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64    (i==0 && ppOrd
12780 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72  erBy) ? *ppOrder
12790 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  By : 0,.        
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20   &pIdx, &flags, 
127c0 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70  &nEq);.        p
127d0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
127e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6f 73   }.      if( cos
127f0 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  t<lowestCost ){.
12800 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 31          once = 1
12810 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65 73 74  ;.        lowest
12820 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20  Cost = cost;.   
12830 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
12840 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 46  x;.        bestF
12850 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
12860 20 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20        bestNEq = 
12870 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62 65 73  nEq;.        bes
12880 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  tJ = j;.        
12890 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
128a0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20   = pIndex;.     
128b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 4e   }.      if( doN
128c0 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61  otReorder ) brea
128d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45  k;.    }.    WHE
128e0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70  RETRACE(("*** Op
128f0 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74  timizer choose t
12900 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70  able %d for loop
12910 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20   %d\n", bestJ,. 
12920 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
12930 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20  -pWInfo->a));.  
12940 20 20 69 66 28 20 28 62 65 73 74 46 6c 61 67 73    if( (bestFlags
12950 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
12960 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  )!=0 ){.      *p
12970 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
12980 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73    }.    andFlags
12990 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20   &= bestFlags;. 
129a0 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73     pLevel->flags
129b0 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20   = bestFlags;.  
129c0 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d    pLevel->pIdx =
129d0 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76   pBest;.    pLev
129e0 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45  el->nEq = bestNE
129f0 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  q;.    pLevel->a
12a00 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  InLoop = 0;.    
12a10 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
12a20 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29  .    if( pBest )
12a30 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
12a40 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
12a50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
12a60 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
12a70 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
12a80 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
12a90 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
12aa0 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
12ab0 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
12ac0 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
12ad0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a  l->iFrom = bestJ
12ae0 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  ;.  }.  WHERETRA
12af0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
12b00 65 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c  er Finished ***\
12b10 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  n"));..  /* If t
12b20 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f  he total query o
12b30 6e 6c 79 20 73 65 6c 65 63 74 73 20 61 20 73 69  nly selects a si
12b40 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74  ngle row, then t
12b50 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
12b60 20 63 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c   clause is irrel
12b70 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  evant..  */.  if
12b80 28 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48  ( (andFlags & WH
12b90 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26  ERE_UNIQUE)!=0 &
12ba0 26 20 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  & ppOrderBy ){. 
12bb0 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
12bc0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  0;.  }..  /* Ope
12bd0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  n all tables in 
12be0 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64  the pTabList and
12bf0 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c   any indices sel
12c00 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73  ected for.  ** s
12c10 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74  earching those t
12c20 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ables..  */.  sq
12c30 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
12c40 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
12c50 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
12c60 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
12c70 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69   Goto */.  for(i
12c80 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
12c90 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
12ca0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
12cb0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
12cc0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
12cd0 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
12ce0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b  .    Index *pIx;
12cf0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
12d00 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 54  sed to access pT
12d10 61 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  ab (if any) */. 
12d20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20     int iDb;     
12d30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12d40 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
12d50 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  ing table/index 
12d60 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
12d70 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
12d80 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53  xCur;..#ifndef S
12d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
12da0 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  IN.    if( pPars
12db0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
12dc0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  .      char *zMs
12dd0 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  g;.      struct 
12de0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
12df0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
12e00 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
12e10 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ];.      zMsg = 
12e20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
12e30 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20 70  b, "TABLE %s", p
12e40 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
12e50 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
12e60 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
12e70 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
12e80 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 41  Printf(db, "%z A
12e90 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74  S %s", zMsg, pIt
12ea0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
12eb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
12ec0 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
12ed0 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
12ee0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
12ef0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  MPrintf(db, "%z 
12f00 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20  WITH INDEX %s", 
12f10 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  zMsg, pIx->zName
12f20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
12f30 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
12f40 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
12f50 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
12f60 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ANGE) ){.       
12f70 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
12f80 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 55  Printf(db, "%z U
12f90 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59  SING PRIMARY KEY
12fa0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
12fb0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12fc0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12fd0 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  LE.      else if
12fe0 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49  ( pLevel->pBestI
12ff0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
13000 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13010 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70 4c 65   *pBestIdx = pLe
13020 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b 0a 20  vel->pBestIdx;. 
13030 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
13040 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13050 20 22 25 7a 20 56 49 52 54 55 41 4c 20 54 41 42   "%z VIRTUAL TAB
13060 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
13070 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
13080 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13090 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65  Idx->idxNum, pBe
130a0 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  stIdx->idxStr);.
130b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
130c0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
130d0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  >flags & WHERE_O
130e0 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20  RDERBY ){.      
130f0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
13100 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20  MPrintf(db, "%z 
13110 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29  ORDER BY", zMsg)
13120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13140 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
13150 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
13160 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  m, 0, zMsg, P4_D
13170 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
13180 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13190 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
131a0 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
131b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
131c0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
131d0 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
131e0 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
131f0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13200 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
13210 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
13220 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
13230 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d  isEphem || pTab-
13240 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
13250 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nue;.#ifndef SQL
13260 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13270 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4c  TABLE.    if( pL
13280 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29  evel->pBestIdx )
13290 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  {.      int iCur
132a0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
132b0 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
132c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
132d0 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
132e0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13300 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62  const char*)pTab
13310 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56 54 41 42  ->pVtab, P4_VTAB
13320 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
13330 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65  dif.    if( (pLe
13340 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
13350 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
13360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13370 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
13380 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
13390 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
133a0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
133b0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43      if( pTab->nC
133c0 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61  ol<(sizeof(Bitma
133d0 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20  sk)*8) ){.      
133e0 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54    Bitmask b = pT
133f0 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  abItem->colUsed;
13400 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
13410 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   0;.        for(
13420 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b  ; b; b=b>>1, n++
13430 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ){}.        sqli
13440 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
13450 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
13460 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
13470 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
13480 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f  rt( n<=pTab->nCo
13490 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l );.      }.   
134a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
134b0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
134c0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
134d0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
134e0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
134f0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
13500 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
13510 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20  Cursor;.    if( 
13520 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  (pIx = pLevel->p
13530 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Idx)!=0 ){.     
13540 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
13550 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
13560 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  info(pParse, pIx
13570 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13580 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70   pIx->pSchema==p
13590 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
135a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
135b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
135c0 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
135d0 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
135e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
135f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
13600 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
13610 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
13620 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13630 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
13640 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
13650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13660 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
13670 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
13680 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20  nColumn+1);.    
13690 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
136a0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
136b0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
136c0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
136d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
136e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
136f0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
13700 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
13710 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
13720 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
13730 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
13740 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
13750 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
13760 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
13770 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
13780 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
13790 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
137a0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
137b0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
137c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
137d0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
137e0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
137f0 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
13800 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20  m->iCursor;  /* 
13810 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
13820 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
13830 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
13840 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
13850 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
13860 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
13870 20 6e 78 74 3b 20 20 20 20 20 20 20 20 20 20 20   nxt;           
13880 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
13890 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
138a0 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
138b0 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  se */.    int iI
138c0 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20  dxCur;       /* 
138d0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
138e0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
138f0 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  .    int omitTab
13900 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  le;     /* True 
13910 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
13920 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20  dex only */.    
13930 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
13940 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
13950 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
13960 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
13970 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  /..    pTabItem 
13980 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
13990 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
139a0 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74     iCur = pTabIt
139b0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
139c0 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
139d0 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75  pIdx;.    iIdxCu
139e0 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
139f0 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  Cur;.    bRev = 
13a00 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
13a10 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
13a20 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c  =0;.    omitTabl
13a30 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  e = (pLevel->fla
13a40 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
13a50 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  NLY)!=0;..    /*
13a60 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
13a70 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
13a80 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
13a90 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a  structions.    *
13aa0 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
13ab0 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
13ac0 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75   brk to break ou
13ad0 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20  t of a loop..   
13ae0 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
13af0 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
13b00 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
13b10 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
13b20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20      ** loop..   
13b30 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20   **.    ** When 
13b40 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
13b50 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
13b60 20 68 61 76 65 20 61 20 22 6e 78 74 22 20 6c 61   have a "nxt" la
13b70 62 65 6c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  bel that.    ** 
13b80 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
13b90 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
13ba0 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
13bb0 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20  tion.  When.    
13bc0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
13bd0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
13be0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
13bf0 20 74 68 65 20 22 6e 78 74 22 20 6c 61 62 65 6c   the "nxt" label
13c00 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
13c10 61 6d 65 20 61 73 20 22 62 72 6b 22 2e 0a 20 20  ame as "brk"..  
13c20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70    */.    brk = p
13c30 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65  Level->brk = pLe
13c40 76 65 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74  vel->nxt = sqlit
13c50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13c60 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70  v);.    cont = p
13c70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71  Level->cont = sq
13c80 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13c90 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  el(v);..    /* I
13ca0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
13cb0 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
13cc0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
13cd0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20  allocate and.   
13ce0 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
13cf0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
13d00 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
13d10 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
13d20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f  any.    ** row o
13d30 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
13d40 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
13d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
13d60 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
13d70 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69  (pTabItem[0].joi
13d80 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
13d90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  !=0 ){.      pLe
13da0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
13db0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13dc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13dd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13de0 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
13df0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
13e00 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13e10 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
13e20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
13e30 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  ag"));.    }..#i
13e40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13e50 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13e60 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
13e70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20  BestIdx ){.     
13e80 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65   /* Case 0:  The
13e90 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
13ea0 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
13eb0 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
13ec0 56 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20  VNext.      **  
13ed0 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
13ee0 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
13ef0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
13f00 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67  ;.      int iReg
13f10 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
13f20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
13f30 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
13f40 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73  index_info *pBes
13f50 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  tIdx = pLevel->p
13f60 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69  BestIdx;.      i
13f70 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
13f80 20 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73   pBestIdx->nCons
13f90 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74  traint;.      st
13fa0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
13fb0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
13fc0 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74  pBestIdx->aConst
14010 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20  raintUsage;.    
14020 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
14030 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14040 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72  straint *aConstr
14050 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20  aint =.         
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14090 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->aConstraint;.
140a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
140b0 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  j<=nConstraint; 
140c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
140d0 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t k;.        for
140e0 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61  (k=0; k<nConstra
140f0 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  int; k++){.     
14100 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b       if( aUsage[
14110 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a 20  k].argvIndex==j 
14120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
14130 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
14140 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f  traint[k].iTermO
14150 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
14160 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14170 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e 61 5b  de(pParse, wc.a[
14180 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52  iTerm].pExpr->pR
14190 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
141a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
141b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
141c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
141d0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20  ==nConstraint ) 
141e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
141f0 20 20 20 20 20 69 52 65 67 20 3d 20 2b 2b 70 50       iReg = ++pP
14200 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
14210 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b    pParse->nMem++
14220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
14230 74 61 63 6b 54 6f 52 65 67 28 70 50 61 72 73 65  tackToReg(pParse
14240 2c 20 6a 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  , j-1);.      sq
14250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14260 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
14270 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  BestIdx->idxNum,
14280 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71   iReg);.      sq
14290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
142a0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
142b0 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  -1, iReg+1);.   
142c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
142d0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
142e0 65 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69  er, iCur, brk, i
142f0 52 65 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69  Reg, pBestIdx->i
14300 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14320 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46  BestIdx->needToF
14330 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d  reeIdxStr ? P4_M
14340 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
14350 49 43 29 3b 0a 20 20 20 20 20 20 70 42 65 73 74  IC);.      pBest
14360 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
14370 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
14380 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 42 65 73   for(j=0; j<pBes
14390 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  tIdx->nConstrain
143a0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
143b0 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f   if( aUsage[j].o
143c0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
143d0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
143e0 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
143f0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
14400 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
14410 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54 65  Level, &wc.a[iTe
14420 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rm]);.        }.
14430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
14440 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
14450 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
14460 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
14470 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
14480 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14490 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
144a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
144b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
144c0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 20  UALTABLE */..   
144d0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
144e0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
144f0 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
14500 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
14510 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
14520 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
14530 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a  using an.      *
14540 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
14550 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
14560 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
14570 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
14580 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
14590 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
145a0 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
145b0 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
145c0 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ".      **      
145d0 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
145e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 54       */.      pT
145f0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
14600 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  wc, iCur, -1, no
14610 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f  tReady, WO_EQ|WO
14620 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  _IN, 0);.      a
14630 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
14640 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14650 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
14660 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14670 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
14680 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
14690 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
146a0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
146b0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
146c0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
146d0 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20   pLevel);.      
146e0 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78  nxt = pLevel->nx
146f0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
14700 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14710 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 6e  _MustBeInt, 0, n
14720 78 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  xt, 1);.      sq
14730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14740 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
14750 20 69 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20 20   iCur, nxt);.   
14760 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
14770 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
14780 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
14790 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
147a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
147b0 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
147c0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
147d0 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68  /* Case 2:  We h
147e0 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74  ave an inequalit
147f0 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61  y comparison aga
14800 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66  inst the ROWID f
14810 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ield..      */. 
14820 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20       int testOp 
14830 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
14840 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
14850 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74    WhereTerm *pSt
14860 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  art, *pEnd;..   
14870 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
14880 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
14890 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65   pStart = findTe
148a0 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31  rm(&wc, iCur, -1
148b0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
148c0 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20  T|WO_GE, 0);.   
148d0 20 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65     pEnd = findTe
148e0 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31  rm(&wc, iCur, -1
148f0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
14900 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20  T|WO_LE, 0);.   
14910 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
14920 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70         pTerm = p
14930 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70  Start;.        p
14940 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20  Start = pEnd;.  
14950 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
14960 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
14970 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
14980 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
14990 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
149a0 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20  Start->pExpr;.  
149b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
149c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
149d0 73 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c  ssert( pStart->l
149e0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
149f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14a00 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14a10 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 30  e, pX->pRight, 0
14a20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14a30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14a40 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20 30 2c 20  OP_ForceInt, 0, 
14a50 62 72 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  brk, .          
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45     pX->op==TK_LE
14a80 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
14a90 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
14aa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ab0 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c   bRev ? OP_MoveL
14ac0 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  t : OP_MoveGe, i
14ad0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
14ae0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
14af0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
14b00 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
14b10 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
14b20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14b30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14b40 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
14b50 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
14b60 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29  wind, iCur, brk)
14b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14b80 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20  if( pEnd ){.    
14b90 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
14ba0 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d        pX = pEnd-
14bb0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
14bc0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
14bd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14be0 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
14bf0 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
14c00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14c10 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
14c20 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
14c30 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
14c40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14c50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14c60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14c70 50 5f 4d 6f 76 65 2c 20 30 2c 20 70 4c 65 76 65  P_Move, 0, pLeve
14c80 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  l->iMem);.      
14c90 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
14ca0 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
14cb0 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
14cc0 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
14cd0 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b  ? OP_Le : OP_Ge;
14ce0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14cf0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
14d00 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
14d10 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 20  : OP_Gt;.       
14d20 20 7d 0a 20 20 20 20 20 20 20 20 64 69 73 61 62   }.        disab
14d30 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
14d40 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  End);.      }.  
14d50 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
14d60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14d70 64 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65  dr(v);.      pLe
14d80 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
14d90 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
14da0 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  xt;.      pLevel
14db0 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
14dc0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
14dd0 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28  start;.      if(
14de0 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
14df0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14e00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14e10 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
14e20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
14e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e40 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76  , OP_SCopy, pLev
14e50 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
14e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14e70 65 41 64 64 4f 70 32 28 76 2c 20 74 65 73 74 4f  eAddOp2(v, testO
14e80 70 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20 20 20  p, 0, brk);.    
14e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
14ea0 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
14eb0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20  E_AFF_NUMERIC | 
14ec0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
14ed0 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
14ee0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
14ef0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
14f00 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
14f10 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
14f20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
14f30 65 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65  e term that refe
14f40 72 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  rs to the right-
14f50 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  most.      **   
14f60 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20        column of 
14f70 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20  the index is an 
14f80 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72  inequality.  For
14f90 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20   example, if.   
14fa0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
14fb0 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78  e index is on (x
14fc0 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48  ,y,z) and the WH
14fd0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66  ERE clause is of
14fe0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20   the.      **   
14ff0 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20        form "x=5 
15000 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74  AND y<10" then t
15010 68 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64  his case is used
15020 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20  .  Only the.    
15030 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67    **         rig
15040 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
15050 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
15060 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
15070 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ust.      **    
15080 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
15090 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
150a0 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tors..      **. 
150b0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
150c0 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
150d0 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
150e0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
150f0 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20  lause.      **  
15100 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
15110 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
15120 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
15130 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
15140 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
15150 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
15160 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
15170 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
15180 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  Y..      */.    
15190 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
151a0 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
151b0 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20  vel->nEq;.      
151c0 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20  int topEq=0;    
151d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
151e0 6f 70 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d  op limit uses ==
151f0 2e 20 46 61 6c 73 65 20 69 73 20 73 74 72 69 63  . False is stric
15200 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69  tly < */.      i
15210 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20  nt btmEq=0;     
15220 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74     /* True if bt
15230 6d 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e  m limit uses ==.
15240 20 46 61 6c 73 65 20 69 66 20 73 74 72 69 63 74   False if strict
15250 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ly > */.      in
15260 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20  t topOp, btmOp; 
15270 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66    /* Operators f
15280 6f 72 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62  or the top and b
15290 6f 74 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75  ottom search bou
152a0 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nds */.      int
152b0 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69   testOp;.      i
152c0 6e 74 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70  nt topLimit = (p
152d0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
152e0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21  HERE_TOP_LIMIT)!
152f0 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 74  =0;.      int bt
15300 6d 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c  mLimit = (pLevel
15310 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
15320 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20  BTM_LIMIT)!=0;. 
15330 20 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75       int isMinQu
15340 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ery = 0;      /*
15350 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
15360 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
15370 6d 69 6e 28 78 29 20 2e 2e 2e 20 2a 2f 0a 0a 20  min(x) ... */.. 
15380 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15390 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
153a0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
153b0 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
153c0 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61  or IN.      ** a
153d0 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c  nd level the val
153e0 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
153f0 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ms on the stack.
15400 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15410 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
15420 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
15430 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61  vel, &wc, notRea
15440 64 79 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  dy);..      /* D
15450 75 70 6c 69 63 61 74 65 20 74 68 65 20 65 71 75  uplicate the equ
15460 61 6c 69 74 79 20 74 65 72 6d 20 76 61 6c 75 65  ality term value
15470 73 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77  s because they w
15480 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20 20 20 20  ill all be.     
15490 20 2a 2a 20 75 73 65 64 20 74 77 69 63 65 3a 20   ** used twice: 
154a0 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  once to make the
154b0 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79   termination key
154c0 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20 6d 61 6b   and once to mak
154d0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
154e0 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20  tart key..      
154f0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
15500 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
15510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15520 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
15530 6f 70 79 2c 20 31 2d 6e 45 71 29 3b 0a 20 20 20  opy, 1-nEq);.   
15540 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
15550 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 63  igure out what c
15560 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
15570 6f 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ors to use for t
15580 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 0a 20  op and bottom . 
15590 20 20 20 20 20 2a 2a 20 73 65 61 72 63 68 20 62       ** search b
155a0 6f 75 6e 64 73 2e 20 46 6f 72 20 61 6e 20 61 73  ounds. For an as
155b0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 74  cending index, t
155c0 68 65 20 62 6f 74 74 6f 6d 20 62 6f 75 6e 64 20  he bottom bound 
155d0 69 73 20 61 20 3e 20 6f 72 20 3e 3d 0a 20 20 20  is a > or >=.   
155e0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61     ** operator a
155f0 6e 64 20 74 68 65 20 74 6f 70 20 62 6f 75 6e 64  nd the top bound
15600 20 69 73 20 61 20 3c 20 6f 72 20 3c 3d 20 6f 70   is a < or <= op
15610 65 72 61 74 6f 72 2e 20 20 46 6f 72 20 61 20 64  erator.  For a d
15620 65 73 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20  escending.      
15630 2a 2a 20 69 6e 64 65 78 20 74 68 65 20 6f 70 65  ** index the ope
15640 72 61 74 6f 72 73 20 61 72 65 20 72 65 76 65 72  rators are rever
15650 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
15660 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
15670 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
15680 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
15690 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20          topOp = 
156a0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_LT|WO_LE;.   
156b0 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f       btmOp = WO_
156c0 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20  GT|WO_GE;.      
156d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
156e0 6f 70 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  opOp = WO_GT|WO_
156f0 47 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f  GE;.        btmO
15700 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  p = WO_LT|WO_LE;
15710 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
15720 74 2c 20 74 6f 70 4c 69 6d 69 74 2c 20 62 74 6d  t, topLimit, btm
15730 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
15740 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
15750 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
15760 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
15770 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
15780 20 74 68 61 74 20 0a 20 20 20 20 20 20 2a 2a 20   that .      ** 
15790 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
157a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
157b0 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
157c0 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
157d0 20 20 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20        ** query, 
157e0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
157f0 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
15800 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
15810 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  for.      ** a s
15820 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
15830 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
15840 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
15850 65 74 75 72 6e 65 64 0a 20 20 20 20 20 20 2a 2a  eturned.      **
15860 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
15870 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
15880 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
15890 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
158a0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
158b0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
158c0 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
158d0 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
158e0 6e 64 65 78 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ndex,.      ** t
158f0 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d  his requires som
15900 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
15910 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
15920 20 20 20 69 66 28 20 28 6f 62 66 6c 61 67 3d 3d     if( (obflag==
15930 4f 52 44 45 52 42 59 5f 4d 49 4e 29 0a 20 20 20  ORDERBY_MIN).   
15940 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
15950 66 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  flags&WHERE_ORDE
15960 52 42 59 29 0a 20 20 20 20 20 20 20 26 26 20 28  RBY).       && (
15970 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45  pIdx->nColumn>nE
15980 71 29 0a 20 20 20 20 20 20 20 26 26 20 28 70 4f  q).       && (pO
15990 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
159a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
159b0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
159c0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
159d0 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20     isMinQuery = 
159e0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
159f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
15a00 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
15a10 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
15a20 6b 65 79 20 76 61 6c 75 65 20 74 68 61 74 0a 20  key value that. 
15a30 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64       ** will end
15a40 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 54 68   the search.  Th
15a50 65 72 65 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e  ere is no termin
15a60 61 74 69 6f 6e 20 6b 65 79 20 69 66 20 74 68 65  ation key if the
15a70 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20  re.      ** are 
15a80 6e 6f 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  no equality term
15a90 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22  s and no "X<..."
15aa0 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a   term..      **.
15ab0 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65        ** 2002-De
15ac0 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76 65 72  c-04: On a rever
15ad0 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c 20 74  se-order scan, t
15ae0 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65  he so-called "te
15af0 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20  rmination".     
15b00 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74 65 64   ** key computed
15b10 20 68 65 72 65 20 72 65 61 6c 6c 79 20 65 6e 64   here really end
15b20 73 20 75 70 20 62 65 69 6e 67 20 74 68 65 20 73  s up being the s
15b30 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20  tart key..      
15b40 2a 2f 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70  */.      nxt = p
15b50 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20  Level->nxt;.    
15b60 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 29    if( topLimit )
15b70 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
15b80 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
15b90 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
15ba0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
15bb0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
15bc0 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
15bd0 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20 70  tReady, topOp, p
15be0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
15bf0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
15c00 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
15c10 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
15c20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
15c30 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
15c40 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
15c50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
15c60 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15c70 58 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  X->pRight, 0);. 
15c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15c90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
15ca0 74 61 63 6b 49 73 4e 75 6c 6c 2c 20 2d 28 6e 45  tackIsNull, -(nE
15cb0 71 2a 32 2b 31 29 2c 20 6e 78 74 29 3b 0a 20 20  q*2+1), nxt);.  
15cc0 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54        topEq = pT
15cd0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15ce0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
15cf0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
15d00 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
15d10 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  m);.        test
15d20 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20  Op = OP_IdxGE;. 
15d30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15d40 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71      testOp = nEq
15d50 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20  >0 ? OP_IdxGE : 
15d60 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
15d70 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20 20   topEq = 1;.    
15d80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65    }.      if( te
15d90 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 7c 7c  stOp!=OP_Noop ||
15da0 20 28 69 73 4d 69 6e 51 75 65 72 79 26 26 62 52   (isMinQuery&&bR
15db0 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ev) ){.        i
15dc0 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20  nt nCol = nEq + 
15dd0 74 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  topLimit;.      
15de0 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
15df0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
15e10 69 6e 51 75 65 72 79 20 26 26 20 21 74 6f 70 4c  inQuery && !topL
15e20 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
15e30 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
15e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15e50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15e60 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
15e70 20 20 20 74 6f 70 45 71 20 3d 20 30 3b 0a 20 20     topEq = 0;.  
15e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15e90 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28  buildIndexProbe(
15ea0 76 2c 20 6e 43 6f 6c 2c 20 70 49 64 78 29 3b 0a  v, nCol, pIdx);.
15eb0 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76          if( bRev
15ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15ed0 74 20 6f 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f  t op = topEq ? O
15ee0 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f  P_MoveLe : OP_Mo
15ef0 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20  veLt;.          
15f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f10 32 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  2(v, op, iIdxCur
15f20 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  , nxt);.        
15f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15f40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15f50 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30  p2(v, OP_Move, 0
15f60 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b  , pLevel->iMem);
15f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15f80 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20   }else if( bRev 
15f90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15fa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15fb0 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72  OP_Last, iIdxCur
15fc0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
15fd0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e     .      /* Gen
15fe0 65 72 61 74 65 20 74 68 65 20 73 74 61 72 74 20  erate the start 
15ff0 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  key.  This is th
16000 65 20 6b 65 79 20 74 68 61 74 20 64 65 66 69 6e  e key that defin
16010 65 73 20 74 68 65 20 6c 6f 77 65 72 0a 20 20 20  es the lower.   
16020 20 20 20 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74     ** bound on t
16030 68 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72  he search.  Ther
16040 65 20 69 73 20 6e 6f 20 73 74 61 72 74 20 6b 65  e is no start ke
16050 79 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  y if there are n
16060 6f 0a 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c  o.      ** equal
16070 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20 69 66  ity terms and if
16080 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22 58 3e   there is no "X>
16090 2e 2e 2e 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20  ..." term.  In. 
160a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73       ** that cas
160b0 65 2c 20 67 65 6e 65 72 61 74 65 20 61 20 22 52  e, generate a "R
160c0 65 77 69 6e 64 22 20 69 6e 73 74 72 75 63 74 69  ewind" instructi
160d0 6f 6e 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  on in place of t
160e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72  he.      ** star
160f0 74 20 6b 65 79 20 73 65 61 72 63 68 2e 0a 20 20  t key search..  
16100 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
16110 32 30 30 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20  2002-Dec-04: In 
16120 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 72 65  the case of a re
16130 76 65 72 73 65 2d 6f 72 64 65 72 20 73 65 61 72  verse-order sear
16140 63 68 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65  ch, the so-calle
16150 64 0a 20 20 20 20 20 20 2a 2a 20 22 73 74 61 72  d.      ** "star
16160 74 22 20 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e  t" key really en
16170 64 73 20 75 70 20 62 65 69 6e 67 20 75 73 65 64  ds up being used
16180 20 61 73 20 74 68 65 20 74 65 72 6d 69 6e 61 74   as the terminat
16190 69 6f 6e 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a  ion key..      *
161a0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 74 6d 4c  /.      if( btmL
161b0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
161c0 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
161d0 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
161e0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
161f0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
16200 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
16210 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 74   k, notReady, bt
16220 6d 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  mOp, pIdx);.    
16230 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
16240 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  m!=0 );.        
16250 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
16260 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  r;.        asser
16270 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  t( (pTerm->flags
16280 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
16290 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
162a0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
162b0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
162c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
162d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
162e0 2c 20 4f 50 5f 53 74 61 63 6b 49 73 4e 75 6c 6c  , OP_StackIsNull
162f0 2c 20 2d 28 6e 45 71 2b 31 29 2c 20 6e 78 74 29  , -(nEq+1), nxt)
16300 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71 20  ;.        btmEq 
16310 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
16320 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
16330 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  E);.        disa
16340 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
16350 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
16360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 74 6d  lse{.        btm
16370 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Eq = 1;.      }.
16380 20 20 20 20 20 20 69 66 28 20 6e 45 71 3e 30 20        if( nEq>0 
16390 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 7c 7c 20 28  || btmLimit || (
163a0 69 73 4d 69 6e 51 75 65 72 79 26 26 21 62 52 65  isMinQuery&&!bRe
163b0 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  v) ){.        in
163c0 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 62  t nCol = nEq + b
163d0 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  tmLimit;.       
163e0 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20   if( isMinQuery 
163f0 26 26 20 21 62 74 6d 4c 69 6d 69 74 20 29 7b 0a  && !btmLimit ){.
16400 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
16410 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
16420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16430 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
16440 0a 20 20 20 20 20 20 20 20 20 20 62 74 6d 45 71  .          btmEq
16450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
16460 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64          buildInd
16470 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c  exProbe(v, nCol,
16480 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
16490 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
164a0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
164b0 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
164c0 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Mem;.          s
164d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
164e0 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c 20  (v, OP_Move, 0, 
164f0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20  pLevel->iMem);. 
16500 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
16510 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20  = OP_IdxLT;.    
16520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16530 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 62 74       int op = bt
16540 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47 65 20  mEq ? OP_MoveGe 
16550 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20  : OP_MoveGt;.   
16560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16570 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
16580 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20  iIdxCur, nxt);. 
16590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
165a0 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
165b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
165c0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
165d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
165e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
165f0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
16600 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
16610 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16620 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 68   Generate the th
16630 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
16640 70 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  p.  If there is 
16650 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20  a termination.  
16660 20 20 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61      ** key we ha
16670 76 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74  ve to test for t
16680 68 61 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72  hat key and abor
16690 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  t at the top of 
166a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  the.      ** loo
166b0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
166c0 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
166d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
166e0 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  (v);.      if( t
166f0 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
16700 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16710 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16720 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d  P_SCopy, pLevel-
16730 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
16740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16750 64 4f 70 32 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp2(v, testOp, 
16760 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20  iIdxCur, nxt);. 
16770 20 20 20 20 20 20 20 69 66 28 20 28 74 6f 70 45         if( (topE
16780 71 20 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28  q && !bRev) || (
16790 21 62 74 6d 45 71 20 26 26 20 62 52 65 76 29 20  !btmEq && bRev) 
167a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
167b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
167c0 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 34 5f  (v, -1, "+", P4_
167d0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
167e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
167f0 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20 7c 20   if( topLimit | 
16800 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  btmLimit ){.    
16810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp2(v, OP_Colu
16830 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71  mn, iIdxCur, nEq
16840 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16850 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16860 4f 50 5f 53 74 61 63 6b 49 73 4e 75 6c 6c 2c 20  OP_StackIsNull, 
16870 31 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20  1, cont);.      
16880 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69  }.      if( !omi
16890 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
168a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
168b0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
168c0 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
168d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
168e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
168f0 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30  _MoveGe, iCur, 0
16900 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
16910 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
16920 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
16930 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
16940 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  e loop..      */
16950 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
16960 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
16970 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
16980 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
16990 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
169a0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
169b0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rt;.    }else if
169c0 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
169d0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  & WHERE_COLUMN_E
169e0 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  Q ){.      /* Ca
169f0 73 65 20 34 3a 20 20 54 68 65 72 65 20 69 73 20  se 4:  There is 
16a00 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c  an index and all
16a10 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
16a20 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a  ERE clause that.
16a30 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16a40 20 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69    refer to the i
16a50 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22  ndex using the "
16a60 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
16a70 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ators..      */.
16a80 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b        int start;
16a90 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
16aa0 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20   pLevel->nEq;.  
16ab0 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65      int isMinQue
16ac0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ry = 0;      /* 
16ad0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70  If this is an op
16ae0 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d  timized SELECT m
16af0 69 6e 28 78 29 20 2e 2e 2e 20 2a 2f 0a 0a 20 20  in(x) ... */..  
16b00 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
16b10 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
16b20 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
16b30 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
16b40 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
16b50 64 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75  d leave the valu
16b60 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
16b70 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
16b80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
16b90 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
16ba0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
16bb0 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
16bc0 79 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20  y);.      nxt = 
16bd0 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20  pLevel->nxt;..  
16be0 20 20 20 20 69 66 28 20 28 6f 62 66 6c 61 67 3d      if( (obflag=
16bf0 3d 4f 52 44 45 52 42 59 5f 4d 49 4e 29 0a 20 20  =ORDERBY_MIN).  
16c00 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
16c10 3e 66 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  >flags&WHERE_ORD
16c20 45 52 42 59 29 20 0a 20 20 20 20 20 20 20 26 26  ERBY) .       &&
16c30 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e   (pIdx->nColumn>
16c40 6e 45 71 29 0a 20 20 20 20 20 20 20 26 26 20 28  nEq).       && (
16c50 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70  pOrderBy->a[0].p
16c60 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
16c70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  Idx->aiColumn[nE
16c80 71 5d 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  q]).      ){.   
16c90 20 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20       int h;.    
16ca0 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
16cb0 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
16cc0 68 3d 30 3b 20 68 3c 6e 45 71 3b 20 68 2b 2b 29  h=0; h<nEq; h++)
16cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
16ce0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16cf0 20 4f 50 5f 43 6f 70 79 2c 20 31 2d 6e 45 71 29   OP_Copy, 1-nEq)
16d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16d10 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
16d20 6f 62 65 28 76 2c 20 6e 45 71 2c 20 70 49 64 78  obe(v, nEq, pIdx
16d30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16d40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16d50 4f 50 5f 43 6f 70 79 2c 20 30 2c 20 70 4c 65 76  OP_Copy, 0, pLev
16d60 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  el->iMem);.     
16d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16d80 64 4f 70 32 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  dOp2(v, OP_Pop, 
16d90 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
16da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16db0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
16dc0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c  0);.        buil
16dd0 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e  dIndexProbe(v, n
16de0 45 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20 20  Eq+1, pIdx);.   
16df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16e00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
16e10 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74 20  single key that 
16e20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
16e30 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20 0a  both start and .
16e40 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 69          ** termi
16e50 6e 61 74 65 20 74 68 65 20 73 65 61 72 63 68 0a  nate the search.
16e60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16e70 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
16e80 62 65 28 76 2c 20 6e 45 71 2c 20 70 49 64 78 29  be(v, nEq, pIdx)
16e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16ea0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16eb0 50 5f 43 6f 70 79 2c 20 30 2c 20 70 4c 65 76 65  P_Copy, 0, pLeve
16ec0 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  l->iMem);.      
16ed0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
16ee0 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74 6f  rate code (1) to
16ef0 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69 72   move to the fir
16f00 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d  st matching elem
16f10 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
16f20 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ..      ** Then 
16f30 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 32  generate code (2
16f40 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  ) that jumps to 
16f50 22 6e 78 74 22 20 61 66 74 65 72 20 74 68 65 20  "nxt" after the 
16f60 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a 20  cursor is past. 
16f70 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
16f80 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e   matching elemen
16f90 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
16fa0 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69 73   The code (1) is
16fb0 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20 20   executed.      
16fc0 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ** once to initi
16fd0 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63 68  alize the search
16fe0 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20 69  , the code (2) i
16ff0 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72  s executed befor
17000 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a 20  e each.      ** 
17010 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
17020 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66 20   scan to see if 
17030 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e  the scan has fin
17040 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  ished. */.      
17050 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
17060 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72      /* Scan in r
17070 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
17080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 28 69 73  dbeAddOp2(v, (is
170a0 4d 69 6e 51 75 65 72 79 3f 4f 50 5f 4d 6f 76 65  MinQuery?OP_Move
170b0 4c 74 3a 4f 50 5f 4d 6f 76 65 4c 65 29 2c 20 69  Lt:OP_MoveLe), i
170c0 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
170d0 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
170e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
170f0 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 70 4c 65  v, OP_SCopy, pLe
17100 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20  vel->iMem, 0);. 
17110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17130 64 78 4c 54 2c 20 69 49 64 78 43 75 72 2c 20 6e  dxLT, iIdxCur, n
17140 78 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  xt);.        pLe
17150 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65  vel->op = OP_Pre
17160 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  v;.      }else{.
17170 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
17180 69 6e 20 74 68 65 20 66 6f 72 77 61 72 64 20 6f  in the forward o
17190 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
171a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
171b0 32 28 76 2c 20 28 69 73 4d 69 6e 51 75 65 72 79  2(v, (isMinQuery
171c0 3f 4f 50 5f 4d 6f 76 65 47 74 3a 4f 50 5f 4d 6f  ?OP_MoveGt:OP_Mo
171d0 76 65 47 65 29 2c 20 69 49 64 78 43 75 72 2c 20  veGe), iIdxCur, 
171e0 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73 74  nxt);.        st
171f0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
17200 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17210 6f 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  opy, pLevel->iMe
17220 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
17230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17240 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49  (v, OP_IdxGE, iI
17250 64 78 43 75 72 2c 20 6e 78 74 2c 20 30 2c 20 22  dxCur, nxt, 0, "
17260 2b 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  +", P4_STATIC);.
17270 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
17280 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
17290 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
172a0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
172b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
172d0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
172e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
172f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17300 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
17310 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
17320 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
17330 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
17340 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
17350 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
17360 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a        /* Case 5:
17370 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
17380 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
17390 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
173a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  te.      **     
173b0 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
173c0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
173d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
173e0 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
173f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
17400 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
17410 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
17420 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
17430 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
17440 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
17450 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
17460 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17470 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
17480 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20   brk);.    }.   
17490 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
174a0 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
174b0 69 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iCur);.    sqlit
174c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
174d0 4f 50 5f 53 74 61 63 6b 44 65 70 74 68 2c 20 2d  OP_StackDepth, -
174e0 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  1, 0);..    /* I
174f0 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
17500 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
17510 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
17520 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
17530 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
17540 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
17550 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
17560 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54     */.    for(pT
17570 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e  erm=wc.a, j=wc.n
17580 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
17590 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
175a0 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
175b0 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
175c0 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c   & (TERM_VIRTUAL
175d0 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63  |TERM_CODED) ) c
175e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
175f0 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
17600 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
17610 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
17620 20 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d        pE = pTerm
17630 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
17640 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a  ssert( pE!=0 );.
17650 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
17660 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
17670 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17680 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
17690 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
176a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
176b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
176c0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
176d0 45 2c 20 63 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  E, cont, SQLITE_
176e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
176f0 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
17700 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
17710 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
17720 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
17730 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
17740 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
17750 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
17760 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  .    ** at least
17770 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
17780 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
17790 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
177a0 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f   table.  .    */
177b0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
177c0 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
177d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20      pLevel->top 
177e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
177f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17810 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17820 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69  er, 1, pLevel->i
17830 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
17840 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17850 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f   "record LEFT JO
17860 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20  IN hit"));.     
17870 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
17880 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d   j=0; j<wc.nTerm
17890 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
178a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
178b0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
178c0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
178d0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
178e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
178f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
17900 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
17910 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17920 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
17930 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
17940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
17950 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
17960 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74  erm->pExpr, cont
17970 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
17980 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ULL);.        pT
17990 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
179a0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20  RM_CODED;.      
179b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  }.    }.  }..#if
179c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
179d0 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
179e0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
179f0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
17a00 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
17a10 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
17a20 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
17a30 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
17a40 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
17a50 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
17a60 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
17a70 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
17a80 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
17a90 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
17aa0 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
17ab0 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
17ac0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
17ad0 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
17ae0 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
17af0 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
17b00 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
17b10 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
17b20 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
17b30 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
17b40 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
17b50 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
17b60 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
17b70 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
17b80 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
17b90 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
17ba0 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
17bb0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
17bc0 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
17bd0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
17be0 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  me;.    n = strl
17bf0 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  en(z);.    if( n
17c00 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
17c10 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
17c20 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
17c30 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
17c40 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
17c50 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
17c60 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
17c70 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
17c80 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
17c90 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
17ca0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17cb0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
17cc0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
17cd0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
17ce0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
17cf0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
17d00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
17d10 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
17d20 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
17d30 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
17d40 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f  lags & (WHERE_RO
17d50 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57  WID_EQ|WHERE_ROW
17d60 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20  ID_RANGE) ){.   
17d70 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
17d80 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
17d90 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b  Plan], "* ", 2);
17da0 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
17db0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
17dc0 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d  ( pLevel->pIdx==
17dd0 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
17de0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
17df0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
17e00 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  {} ", 3);.      
17e10 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20  nQPlan += 3;.   
17e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
17e30 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d  = strlen(pLevel-
17e40 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pIdx->zName);. 
17e50 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61       if( n+nQPla
17e60 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  n < sizeof(sqlit
17e70 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32  e3_query_plan)-2
17e80 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
17e90 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
17ea0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
17eb0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
17ec0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  ame, n);.       
17ed0 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
17ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
17ef0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
17f00 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
17f10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
17f20 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
17f30 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
17f40 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
17f50 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
17f60 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
17f70 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
17f80 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
17f90 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
17fa0 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
17fb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17fc0 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
17fd0 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
17fe0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
17ff0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
18000 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
18010 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
18020 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
18030 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
18040 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
18050 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
18060 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
18070 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
18080 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
18090 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
180a0 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
180b0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
180c0 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
180d0 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
180e0 77 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  wc);.  whereInfo
180f0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
18100 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18110 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
18120 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
18130 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
18140 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
18150 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
18160 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18170 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
18180 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
18190 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
181a0 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
181b0 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
181c0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
181d0 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
181e0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
181f0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
18200 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
18210 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
18220 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
18230 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
18240 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
18250 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
18260 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
18270 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
18280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18290 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
182a0 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
182b0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
182c0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
182d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
182e0 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  Op2(v, pLevel->o
182f0 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  p, pLevel->p1, p
18300 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20  Level->p2);.    
18310 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
18320 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 73  ->nIn ){.      s
18330 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49  truct InLoop *pI
18340 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  n;.      int j;.
18350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18360 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18370 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b 0a 20   pLevel->nxt);. 
18380 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
18390 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  l->nIn, pIn=&pLe
183a0 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31  vel->aInLoop[j-1
183b0 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e  ]; j>0; j--, pIn
183c0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  --){.        sql
183d0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
183e0 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72  (v, pIn->topAddr
183f0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
18400 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18410 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e  , OP_Next, pIn->
18420 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f 70 41 64  iCur, pIn->topAd
18430 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
18440 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18450 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64 64 72  (v, pIn->topAddr
18460 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
18470 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18480 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29  pLevel->aInLoop)
18490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
184a0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
184b0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62  bel(v, pLevel->b
184c0 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
184d0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
184e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
184f0 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
18500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18510 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
18520 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
18530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18540 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
18550 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
18560 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
18570 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
18580 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
18590 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
185a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
185b0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
185c0 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
185d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
185e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
185f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
18600 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20  el->top);.      
18610 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
18620 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
18630 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
18640 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
18650 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
18660 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
18670 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
18680 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
18690 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
186a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
186b0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
186c0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
186d0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
186e0 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
186f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18700 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  in..  */.  for(i
18710 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
18720 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
18730 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
18740 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
18750 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18760 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
18770 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
18780 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
18790 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
187a0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
187b0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
187c0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
187d0 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d  isEphem || pTab-
187e0 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69  >pSelect ) conti
187f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c  nue;.    if( (pL
18800 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
18810 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
18820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18830 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18840 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
18850 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
18860 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65   }.    if( pLeve
18870 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20  l->pIdx!=0 ){.  
18880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18890 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
188a0 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  e, pLevel->iIdxC
188b0 75 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ur);.    }..    
188c0 2f 2a 20 49 66 20 74 68 69 73 20 73 63 61 6e 20  /* If this scan 
188d0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d  uses an index, m
188e0 61 6b 65 20 63 6f 64 65 20 73 75 62 73 74 69 74  ake code substit
188f0 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64  utions to read d
18900 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ata.    ** from 
18910 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 72 65  the index in pre
18920 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 74  ference to the t
18930 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d 65 73 2c  able. Sometimes,
18940 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   this means.    
18950 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65  ** the table nee
18960 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
18970 66 72 6f 6d 2e 20 54 68 69 73 20 69 73 20 61 20  from. This is a 
18980 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
18990 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65  t,.    ** as the
189a0 20 76 64 62 65 20 6c 65 76 65 6c 20 77 61 69 74   vdbe level wait
189b0 73 20 75 6e 74 69 6c 20 74 68 65 20 74 61 62 6c  s until the tabl
189c0 65 20 69 73 20 72 65 61 64 20 62 65 66 6f 72 65  e is read before
189d0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
189e0 20 73 65 65 6b 69 6e 67 20 74 68 65 20 74 61 62   seeking the tab
189f0 6c 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  le cursor to the
18a00 20 72 65 63 6f 72 64 20 63 6f 72 72 65 73 70 6f   record correspo
18a10 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
18a20 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 6f 73 69  rent.    ** posi
18a30 74 69 6f 6e 20 69 6e 20 74 68 65 20 69 6e 64 65  tion in the inde
18a40 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  x..    ** .    *
18a50 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63  * Calls to the c
18a60 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e  ode generator in
18a70 20 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33   between sqlite3
18a80 57 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20  WhereBegin and. 
18a90 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65     ** sqlite3Whe
18aa0 72 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20  reEnd will have 
18ab0 63 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61  created code tha
18ac0 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
18ad0 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69   table.    ** di
18ae0 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f  rectly.  This lo
18af0 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61  op scans all tha
18b00 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66  t code looking f
18b10 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a  or opcodes.    *
18b20 2a 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  * that reference
18b30 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63   the table and c
18b40 6f 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74  onverts them int
18b50 6f 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20  o opcodes that. 
18b60 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20     ** reference 
18b70 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  the index..    *
18b80 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
18b90 2d 3e 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ->pIdx ){.      
18ba0 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a  int k, j, last;.
18bb0 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
18bc0 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  p;.      Index *
18bd0 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  pIdx = pLevel->p
18be0 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 75  Idx;.      int u
18bf0 73 65 49 6e 64 65 78 4f 6e 6c 79 20 3d 20 70 4c  seIndexOnly = pL
18c00 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
18c10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20  ERE_IDX_ONLY;.. 
18c20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
18c30 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f  x!=0 );.      pO
18c40 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
18c50 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  etOp(v, pWInfo->
18c60 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73  iTop);.      las
18c70 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
18c80 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18c90 20 20 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66       for(k=pWInf
18ca0 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b  o->iTop; k<last;
18cb0 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
18cc0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
18cd0 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
18ce0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
18cf0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
18d00 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
18d10 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  n ){.          f
18d20 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
18d30 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
18d40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
18d50 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69  Op->p2==pIdx->ai
18d60 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20  Column[j] ){.   
18d70 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
18d80 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  p2 = j;.        
18d90 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
18da0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
18db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
18dc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
18dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
18de0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18df0 28 21 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 7c  (!useIndexOnly |
18e00 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
18e10 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
18e20 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
18e30 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
18e40 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
18e50 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
18e60 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
18e70 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
18e80 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
18e90 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
18ea0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52  opcode==OP_NullR
18eb0 6f 77 20 26 26 20 75 73 65 49 6e 64 65 78 4f 6e  ow && useIndexOn
18ec0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
18ed0 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
18ee0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  _Noop;.        }
18ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18f00 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
18f10 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68  leanup.  */.  wh
18f20 65 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e  ereInfoFree(pWIn
18f30 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
18f40 0a                                               .