/ Hex Artifact Content
Login

Artifact 941635bb007484330bc1a0f3cc013b67f1c41864:


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 35   where.c,v 1.275
0340: 20 32 30 30 38 2f 30 31 2f 30 35 20 30 35 3a 33   2008/01/05 05:3
0350: 38 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a 2a  8:21 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 49 73 4e 75 6c 6c 2c 20 2d 31 2c 20 30 29 3b  _IsNull, -1, 0);
f070: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f080: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20    pLevel->nIn = 
f090: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
f0a0: 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
f0b0: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
f0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
f0d0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
f0e0: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
f0f0: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
f100: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
f110: 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75  index.  The valu
f120: 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
f130: 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20  raints are left 
f140: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
f150: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
f160: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
f170: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
f180: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
f190: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
f1a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
f1b0: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
f1c0: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
f1d0: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
f1e0: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
f1f0: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
f200: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
f210: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
f220: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
f230: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
f240: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
f250: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
f260: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
f270: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
f280: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
f290: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
f2a0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
f2b0: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
f2c0: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
f2d0: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
f2e0: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
f2f0: 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  left.** on the s
f300: 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20  tack - a is the 
f310: 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68  deepest and b th
f320: 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a  e shallowest..**
f330: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
f340: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
f350: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
f360: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
f370: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
f380: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
f390: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
f3a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
f3b0: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
f3c0: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
f3d0: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
f3e0: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
f3f0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  Mem memory cell.
f400: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f410: 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
f420: 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
f430: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
f440: 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64  d puts.** the ad
f450: 64 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65  dress of that me
f460: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65  mory cell in pLe
f470: 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20  vel->iMem.  The 
f480: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
f490: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
f4a0: 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d  will use pLevel-
f4b0: 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74  >iMem to store t
f4c0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
f4d0: 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
f4e0: 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
f4f0: 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
f500: 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
f510: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
f520: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
f530: 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
f540: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
f550: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
f560: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f570: 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
f580: 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
f590: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
f5a0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
f5b0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
f5c0: 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57   *pLevel,   /* W
f5d0: 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70  hich nested loop
f5e0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20   of the FROM we 
f5f0: 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  are coding */.  
f600: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
f610: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
f620: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42  RE clause */.  B
f630: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20  itmask notReady 
f640: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61       /* Which pa
f650: 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65  rts of FROM have
f660: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
f670: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ded */.){.  int 
f680: 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
f690: 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q;        /* The
f6a0: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
f6b0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
f6c0: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  to code */.  int
f6d0: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b   termsInMem = 0;
f6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
f6f0: 20 74 72 75 65 2c 20 73 74 6f 72 65 20 76 61 6c   true, store val
f700: 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c  ue in mem[] cell
f710: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
f720: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
f730: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
f740: 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
f750: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
f760: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
f770: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20  = pLevel->pIdx; 
f780: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
f790: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
f7a0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
f7b0: 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
f7c0: 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
f7d0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
f7e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
f7f0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
f800: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
f810: 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
f820: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f850: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  counter */..  /*
f860: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
f870: 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
f880: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
f890: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
f8a0: 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77 61 79  m..  ** We alway
f8b0: 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73 74 20  s need at least 
f8c0: 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  one used to stor
f8d0: 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69  e the loop termi
f8e0: 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65  nator.  ** value
f8f0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
f900: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77 65 27  IN operators we'
f910: 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20  ll need one for 
f920: 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20  each == or.  ** 
f930: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  IN constraint.. 
f940: 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d   */.  pLevel->iM
f950: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
f960: 4d 65 6d 3b 0a 20 20 69 66 28 20 70 4c 65 76 65  Mem;.  if( pLeve
f970: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
f980: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20  _COLUMN_IN ){.  
f990: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
f9a0: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20  = pLevel->nEq;. 
f9b0: 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20     termsInMem = 
f9c0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
f9d0: 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
f9e0: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
f9f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 49   */.  assert( pI
fa00: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71  dx->nColumn>=nEq
fa10: 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   );.  for(j=0; j
fa20: 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  <nEq; j++){.    
fa30: 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69  int k = pIdx->ai
fa40: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70  Column[j];.    p
fa50: 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
fa60: 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
fa70: 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e  tReady, pLevel->
fa80: 66 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20  flags, pIdx);.  
fa90: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
faa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
fab0: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
fac0: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
fad0: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71  =0 );.    codeEq
fae0: 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
faf0: 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
fb00: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
fb10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
fb20: 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29  WO_ISNULL|WO_IN)
fb30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
fb40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fb50: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 74 65  v, OP_IsNull, te
fb60: 72 6d 73 49 6e 4d 65 6d 20 3f 20 2d 31 20 3a 20  rmsInMem ? -1 : 
fb70: 2d 28 6a 2b 31 29 2c 20 70 4c 65 76 65 6c 2d 3e  -(j+1), pLevel->
fb80: 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  brk);.    }.    
fb90: 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29  if( termsInMem )
fba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
fbb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fbc0: 4d 6f 76 65 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Move, 0, pLevel-
fbd0: 3e 69 4d 65 6d 2b 6a 2b 31 29 3b 0a 20 20 20 20  >iMem+j+1);.    
fbe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
fbf0: 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 63 6f   sure all the co
fc00: 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20  nstraint values 
fc10: 61 72 65 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  are on the top o
fc20: 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f  f the stack.  */
fc30: 0a 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65  .  if( termsInMe
fc40: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  m ){.    for(j=0
fc50: 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
fc60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fc70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
fc80: 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  py, pLevel->iMem
fc90: 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  +j+1, 0);.    }.
fca0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
fcb0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
fcc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
fcd0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  ing variable hol
fce0: 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69  ds a text descri
fcf0: 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70  ption of query p
fd00: 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lan generated.**
fd10: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
fd20: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
fd30: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
fd40: 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57    Each call to W
fd50: 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65  hereBegin.** ove
fd60: 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
fd70: 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f  ious.  This info
fd80: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
fd90: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a  for testing and.
fda0: 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  ** analysis only
fdb0: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
fdc0: 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53  3_query_plan[BMS
fdd0: 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74  *2*40];  /* Text
fde0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
fdf0: 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61  static int nQPla
fe00: 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
fe10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
fe20: 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f   slow in _query_
fe30: 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69  plan[] */..#endi
fe40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
fe50: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   */.../*.** Free
fe60: 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
fe70: 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
fe80: 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
fe90: 72 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ree(WhereInfo *p
fea0: 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57  WInfo){.  if( pW
feb0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  Info ){.    int 
fec0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
fed0: 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
fee0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
fef0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
ff00: 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f   *pInfo = pWInfo
ff10: 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[i].pIdxInfo;
ff20: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
ff30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ff40: 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  pInfo->needToFre
ff50: 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20  eIdxStr ){.     
ff60: 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
ff70: 3a 20 44 6f 6e 27 74 20 74 68 69 6e 6b 20 74 68  : Don't think th
ff80: 69 73 20 63 61 6e 20 62 65 20 72 65 61 63 68 65  is can be reache
ff90: 64 2e 20 42 79 20 74 68 65 20 74 69 6d 65 20 74  d. By the time t
ffa0: 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
ffb0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
ffc0: 6c 65 64 2c 20 74 68 65 20 69 6e 64 65 78 2d 73  led, the index-s
ffd0: 74 72 69 6e 67 73 20 68 61 76 65 20 62 65 65 6e  trings have been
ffe0: 20 70 61 73 73 65 64 0a 20 20 20 20 20 20 20 20   passed.        
fff0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 76 64 62 65    ** to the vdbe
10000 20 6c 61 79 65 72 20 66 6f 72 20 64 65 6c 65 74   layer for delet
10010 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ion..          *
10020 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
10030 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e  te3_free(pInfo->
10040 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20  idxStr);.       
10050 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10060 65 33 5f 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a  e3_free(pInfo);.
10070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10090 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
100a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
100b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
100c0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
100d0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
100e0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
100f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
10100 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
10110 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
10120 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
10130 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
10140 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
10150 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
10160 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
10170 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
10180 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
10190 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
101a0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
101b0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
101c0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
101d0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
101e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
101f0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
10200 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10210 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10220 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
10230 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
10240 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
10250 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
10260 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
10270 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
10280 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
10290 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
102a0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
102b0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
102c0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
102d0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
102e0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
102f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
10300 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
10310 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
10320 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
10330 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
10340 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
10350 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
10360 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
10370 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
10380 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
10390 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
103a0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
103b0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
103c0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
103d0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
103e0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
103f0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
10400 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
10420 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
10430 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
10440 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
10450 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
10470 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
10480 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
104b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
104c0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
104f0 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
10500 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
10510 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
10520 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
10530 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
10540 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
10550 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
10560 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
10570 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
10580 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
10590 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
105a0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
105b0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
105c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
105d0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
105e0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
105f0 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
10600 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
10610 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
10620 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
10630 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
10640 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
10650 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
10660 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
10670 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
10680 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
10690 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
106a0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
106b0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
106c0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
106d0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
106e0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
106f0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
10700 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
10710 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
10720 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
10730 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
10740 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
10750 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
10760 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
10770 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10780 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
10790 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
107a0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
107b0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
107c0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
107d0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
107e0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
107f0 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
10800 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
10810 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
10820 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
10830 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
10840 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
10850 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
10860 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
10870 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
10880 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
10890 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
108a0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
108b0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
108c0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
108d0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
108e0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
108f0 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
10900 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
10910 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
10920 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
10930 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
10940 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
10950 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
10960 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
10970 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
10980 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
10990 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
109a0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
109b0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
109c0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
109d0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
109e0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
109f0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
10a00 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
10a10 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
10a20 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
10a30 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
10a40 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
10a50 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
10a60 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
10a70 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
10a80 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
10a90 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
10aa0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
10ab0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
10ac0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
10ad0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
10ae0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
10af0 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
10b00 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
10b10 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
10b20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
10b30 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
10b40 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
10b50 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
10b60 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
10b70 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
10b80 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
10b90 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
10ba0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
10bb0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
10bc0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
10bd0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
10be0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
10bf0 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
10c00 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
10c10 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
10c20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
10c30 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
10c40 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
10c50 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
10c60 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
10c70 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
10c80 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
10c90 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
10ca0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
10cb0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
10cc0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
10cd0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
10ce0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
10cf0 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
10d00 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
10d10 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
10d20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
10d30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10d40 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
10d50 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
10d60 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
10d70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
10d80 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
10d90 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
10da0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
10db0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
10dc0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
10dd0 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
10de0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
10df0 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
10e00 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
10e10 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
10e20 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
10e30 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
10e40 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
10e50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
10e60 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
10e70 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
10e80 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
10e90 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
10ea0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
10eb0 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
10ec0 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
10ed0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
10ee0 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
10ef0 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
10f00 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
10f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
10f20 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
10f30 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
10f40 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
10f50 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
10f60 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
10f70 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
10f80 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
10f90 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
10fa0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
10fb0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
10fc0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
10fd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10fe0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
10ff0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
11000 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
11010 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
11020 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
11030 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
11040 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
11050 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
11060 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
11070 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
11080 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy  /* An ORDER
11090 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
110a0 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
110b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
110c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
110d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72  ounter */.  Wher
110e0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
110f0 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62         /* Will b
11100 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
11110 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
11120 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  unction */.  Vdb
11130 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11140 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76  Vdbe;   /* The v
11150 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
11160 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  engine */.  int 
11170 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20  brk, cont = 0;  
11180 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
11190 73 65 73 20 75 73 65 64 20 64 75 72 69 6e 67 20  ses used during 
111a0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
111b0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
111c0 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
111d0 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
111e0 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
111f0 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
11200 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
11210 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
11220 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  le term in the W
11230 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
11240 20 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73   ExprMaskSet mas
11250 6b 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  kSet;       /* T
11260 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
11270 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
11280 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20  eClause wc;     
11290 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
112a0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 64 69  ERE clause is di
112b0 76 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65  vided into these
112c0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75   terms */.  stru
112d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
112e0 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41  *pTabItem;  /* A
112f0 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72   single entry fr
11300 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20  om pTabList */. 
11310 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
11320 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  vel;            
11330 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76   /* A single lev
11340 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f  el in the pWInfo
11350 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
11360 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
11370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
11380 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20  rst unused FROM 
11390 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a  clause element *
113a0 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73  /.  int andFlags
113b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
113c0 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61  * AND-ed combina
113d0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61  tion of all wc.a
113e0 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71  [].flags */.  sq
113f0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
11400 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11410 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11420 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d  */..  /* The num
11430 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
11440 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11450 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74   is limited by t
11460 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  he number of.  *
11470 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d  * bits in a Bitm
11480 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask .  */.  if( 
11490 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42  pTabList->nSrc>B
114a0 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MS ){.    sqlite
114b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
114c0 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61  , "at most %d ta
114d0 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c  bles in a join",
114e0 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72   BMS);.    retur
114f0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  n 0;.  }..  /* S
11500 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
11510 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
11520 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
11530 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
11540 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
11550 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
11560 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
11570 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
11580 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a  kSet(&maskSet);.
11590 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
115a0 74 28 26 77 63 2c 20 70 50 61 72 73 65 2c 20 26  t(&wc, pParse, &
115b0 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  maskSet);.  wher
115c0 65 53 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65  eSplit(&wc, pWhe
115d0 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
115e0 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20   .  /* Allocate 
115f0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
11600 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
11610 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
11620 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
11630 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20   return value.. 
11640 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
11650 65 2d 3e 64 62 3b 0a 20 20 70 57 49 6e 66 6f 20  e->db;.  pWInfo 
11660 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11670 63 5a 65 72 6f 28 64 62 2c 20 20 0a 20 20 20 20  cZero(db,  .    
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e    sizeof(WhereIn
116a0 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e  fo) + pTabList->
116b0 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72  nSrc*sizeof(Wher
116c0 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20  eLevel));.  if( 
116d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
116e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
116f0 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20  reBeginNoMem;.  
11700 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  }.  pWInfo->nLev
11710 65 6c 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e  el = pTabList->n
11720 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  Src;.  pWInfo->p
11730 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
11740 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
11750 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
11760 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
11770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11780 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
11790 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
117a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
117b0 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
117c0 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
117d0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
117e0 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
117f0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
11800 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
11810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
11820 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  re && (pTabList-
11830 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >nSrc==0 || sqli
11840 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11850 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29  tNotJoin(pWhere)
11860 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11870 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
11880 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
11890 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a  fo->iBreak, 1);.
118a0 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
118b0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
118c0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
118d0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
118e0 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
118f0 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
11900 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
11910 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
11920 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
11930 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
11940 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
11950 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
11960 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
11970 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
11980 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
11990 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
119a0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
119b0 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
119c0 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
119d0 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  essed..  */.  fo
119e0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
119f0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
11a00 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d     createMask(&m
11a10 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
11a20 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
11a30 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c 79  .  }.  exprAnaly
11a40 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
11a50 26 77 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  &wc);.  if( db->
11a60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11a70 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
11a80 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20  ginNoMem;.  }.. 
11a90 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
11aa0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
11ab0 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
11ac0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
11ad0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
11ae0 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
11af0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
11b00 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
11b10 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
11b20 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
11b30 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
11b40 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
11b50 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
11b60 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20  fo->a[].flags   
11b70 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
11b80 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
11b90 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
11ba0 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
11bb0 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
11bc0 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
11bd0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
11be0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
11bf0 20 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f       When term o
11c00 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
11c10 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  e is being coded
11c20 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
11c30 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68  a[].iTabCur   Th
11c40 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
11c50 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
11c60 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e  able.  **   pWIn
11c70 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20  fo->a[].iIdxCur 
11c80 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
11c90 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  r for the index.
11ca0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
11cb0 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73  oop also figures
11cc0 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67   out the nesting
11cd0 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
11ce0 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a   in the FROM.  *
11cf0 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
11d00 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
11d10 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49  tmask)0;.  pTabI
11d20 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
11d30 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57  a;.  pLevel = pW
11d40 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c  Info->a;.  andFl
11d50 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52  ags = ~0;.  WHER
11d60 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
11d70 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
11d80 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69  \n"));.  for(i=i
11d90 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  From=0, pLevel=p
11da0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
11db0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
11dc0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
11dd0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11df0 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
11e00 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
11e10 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
11e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e30 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73     /* Flags asss
11e40 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
11e50 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71  x */.    int nEq
11e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11e80 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
11e90 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f  raints */.    do
11ea0 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20  uble cost;      
11eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11ec0 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a   cost for pIdx *
11ed0 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11f00 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65   over FROM table
11f10 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
11f20 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
11f30 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
11f40 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66   index seen so f
11f50 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  ar */.    int be
11f60 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
11f70 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
11f80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
11f90 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
11fa0 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
11fb0 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61          /* nEq a
11fc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
11fd0 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62  Best */.    doub
11fe0 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
11ff0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
12000 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a  of the pBest */.
12010 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20      int bestJ = 
12020 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12030 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
12040 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
12050 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
12060 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
12070 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
12080 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20  estJ */.    int 
12090 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  once = 0;       
120a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
120b0 77 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65  when first table
120c0 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20   is seen */.    
120d0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
120e0 66 6f 20 2a 70 49 6e 64 65 78 3b 20 2f 2a 20 43  fo *pIndex; /* C
120f0 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 69  urrent virtual i
12100 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77  ndex */..    low
12110 65 73 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  estCost = SQLITE
12120 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f  _BIG_DBL;.    fo
12130 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
12140 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
12150 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  [j]; j<pTabList-
12160 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nSrc; j++, pTab
12170 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
12180 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b  nt doNotReorder;
12190 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
121a0 73 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e  s table should n
121b0 6f 74 20 62 65 20 72 65 6f 72 64 65 72 65 64 20  ot be reordered 
121c0 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52  */..      doNotR
121d0 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61 62 49  eorder =  (pTabI
121e0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
121f0 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
12200 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 69 66  S))!=0;.      if
12210 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52  ( once && doNotR
12220 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
12230 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73        m = getMas
12240 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(&maskSet, pTab
12250 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
12260 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
12270 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
12280 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46         if( j==iF
12290 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20  rom ) iFrom++;. 
122a0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
122b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
122c0 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
122d0 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64 65 66  >pTab );.#ifndef
122e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
122f0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
12300 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
12310 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  abItem->pTab) ){
12320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12330 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70  _index_info **pp
12340 49 64 78 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66  IdxInfo = &pWInf
12350 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f  o->a[j].pIdxInfo
12360 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d  ;.        cost =
12370 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
12380 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70  x(pParse, &wc, p
12390 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
123a0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 20 20 70 70 4f 72 64 65 72 42 79 20 3f 20 2a     ppOrderBy ? *
123d0 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 20 69  ppOrderBy : 0, i
123e0 3d 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ==0,.           
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 20 20 20 20 70 70 49 64 78 49 6e 66 6f 29 3b       ppIdxInfo);
12410 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
12420 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
12430 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  BLE;.        pIn
12440 64 65 78 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f  dex = *ppIdxInfo
12450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
12460 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
12470 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
12480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
12490 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
124a0 41 4c 54 41 42 4c 45 20 7c 20 57 48 45 52 45 5f  ALTABLE | WHERE_
124b0 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20  ORDERBY;.       
124c0 20 7d 0a 20 20 20 20 20 20 20 20 70 49 64 78 20   }.        pIdx 
124d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 45 71  = 0;.        nEq
124e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
124f0 28 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ( (SQLITE_BIG_DB
12500 4c 2f 32 2e 30 29 3c 63 6f 73 74 20 29 7b 0a 20  L/2.0)<cost ){. 
12510 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12520 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  cost is not allo
12530 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72  wed to be larger
12540 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47   than SQLITE_BIG
12550 5f 44 42 4c 20 28 74 68 65 0a 20 20 20 20 20 20  _DBL (the.      
12560 20 20 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61      ** inital va
12570 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73  lue of lowestCos
12580 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20  t in this loop. 
12590 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 0a 20  If it is, then. 
125a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
125b0 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74  (cost<lowestCost
125c0 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c  ) test below wil
125d0 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 20  l never be true 
125e0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
125f0 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64   pLevel->pBestId
12600 78 20 6e 65 76 65 72 20 73 65 74 2e 0a 20 20 20  x never set..   
12610 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
12620 20 20 20 20 20 63 6f 73 74 20 3d 20 28 53 51 4c       cost = (SQL
12630 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29  ITE_BIG_DBL/2.0)
12640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12650 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a    }else .#endif.
12660 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
12670 63 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65 78  cost = bestIndex
12680 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54  (pParse, &wc, pT
12690 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
126a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
126b0 20 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d 30             (i==0
126c0 20 26 26 20 70 70 4f 72 64 65 72 42 79 29 20 3f   && ppOrderBy) ?
126d0 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c   *ppOrderBy : 0,
126e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
126f0 20 20 20 20 20 20 20 20 20 20 26 70 49 64 78 2c            &pIdx,
12700 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a   &flags, &nEq);.
12710 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
12720 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
12730 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73    if( cost<lowes
12740 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tCost ){.       
12750 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
12760 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
12770 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 42  cost;.        pB
12780 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
12790 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
127a0 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62  flags;.        b
127b0 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20  estNEq = nEq;.  
127c0 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b        bestJ = j;
127d0 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
127e0 3e 70 42 65 73 74 49 64 78 20 3d 20 70 49 6e 64  >pBestIdx = pInd
127f0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
12800 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64    if( doNotReord
12810 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
12820 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  }.    WHERETRACE
12830 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
12840 20 63 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64   choose table %d
12850 20 66 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c   for loop %d\n",
12860 20 62 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20   bestJ,.        
12870 20 20 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f     pLevel-pWInfo
12880 2d 3e 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28  ->a));.    if( (
12890 62 65 73 74 46 6c 61 67 73 20 26 20 57 48 45 52  bestFlags & WHER
128a0 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b  E_ORDERBY)!=0 ){
128b0 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42  .      *ppOrderB
128c0 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
128d0 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73   andFlags &= bes
128e0 74 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76  tFlags;.    pLev
128f0 65 6c 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74  el->flags = best
12900 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
12910 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b  l->pIdx = pBest;
12920 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  .    pLevel->nEq
12930 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20   = bestNEq;.    
12940 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
12950 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  = 0;.    pLevel-
12960 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66  >nIn = 0;.    if
12970 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
12980 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
12990 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
129a0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
129b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78      pLevel->iIdx
129c0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Cur = -1;.    }.
129d0 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20      notReady &= 
129e0 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65  ~getMask(&maskSe
129f0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
12a00 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  estJ].iCursor);.
12a10 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
12a20 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20  m = bestJ;.  }. 
12a30 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a   WHERETRACE(("**
12a40 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
12a50 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a  shed ***\n"));..
12a60 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
12a70 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
12a80 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
12a90 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
12aa0 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
12ab0 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
12ac0 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
12ad0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
12ae0 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
12af0 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
12b00 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
12b10 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
12b20 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
12b30 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
12b40 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
12b50 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
12b60 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
12b70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
12b80 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
12b90 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
12ba0 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
12bb0 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
12bc0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  /.  for(i=0, pLe
12bd0 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
12be0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
12bf0 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
12c00 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
12c10 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
12c20 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e  o open */.    In
12c30 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20 20 2f  dex *pIx;      /
12c40 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
12c50 61 63 63 65 73 73 20 70 54 61 62 20 28 69 66 20  access pTab (if 
12c60 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  any) */.    int 
12c70 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
12c80 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73  Index of databas
12c90 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
12ca0 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  le/index */.    
12cb0 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
12cc0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a  evel->iIdxCur;..
12cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ce0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
12cf0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
12d00 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ain==2 ){.      
12d10 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20  char *zMsg;.    
12d20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
12d30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
12d40 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
12d50 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
12d60 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
12d70 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41 42  MPrintf(db, "TAB
12d80 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  LE %s", pItem->z
12d90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
12da0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
12db0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
12dc0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
12dd0 64 62 2c 20 22 25 7a 20 41 53 20 25 73 22 2c 20  db, "%z AS %s", 
12de0 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
12df0 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
12e00 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70      if( (pIx = p
12e10 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20  Level->pIdx)!=0 
12e20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
12e30 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
12e40 28 64 62 2c 20 22 25 7a 20 57 49 54 48 20 49 4e  (db, "%z WITH IN
12e50 44 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  DEX %s", zMsg, p
12e60 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Ix->zName);.    
12e70 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
12e80 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
12e90 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
12ea0 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
12eb0 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
12ec0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
12ed0 64 62 2c 20 22 25 7a 20 55 53 49 4e 47 20 50 52  db, "%z USING PR
12ee0 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
12ef0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
12f00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12f10 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
12f20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65    else if( pLeve
12f30 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20  l->pBestIdx ){. 
12f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
12f50 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74  ndex_info *pBest
12f60 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42  Idx = pLevel->pB
12f70 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 20 20  estIdx;.        
12f80 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
12f90 72 69 6e 74 66 28 64 62 2c 20 22 25 7a 20 56 49  rintf(db, "%z VI
12fa0 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
12fb0 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 69 64      pBestIdx->id
12fe0 78 4e 75 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e  xNum, pBestIdx->
12ff0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d  idxStr);.      }
13000 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
13010 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
13020 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20  & WHERE_ORDERBY 
13030 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
13040 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
13050 28 64 62 2c 20 22 25 7a 20 4f 52 44 45 52 20 42  (db, "%z ORDER B
13060 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
13070 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13080 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13090 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
130a0 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a  vel->iFrom, 0, z
130b0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
130c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
130d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
130e0 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
130f0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
13100 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
13110 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
13120 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
13130 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13140 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
13150 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
13160 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
13170 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d  f( pTab->isEphem
13180 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
13190 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
131a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
131b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
131c0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
131d0 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20  BestIdx ){.     
131e0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
131f0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
13200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13210 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
13220 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 0a  en, iCur, 0, 0,.
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
13250 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62  har*)pTab->pVtab
13260 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
13270 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13280 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
13290 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
132a0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
132b0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
132c0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
132d0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
132e0 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
132f0 52 65 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28  Read);.      if(
13300 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a   pTab->nCol<(siz
13310 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 29 20  eof(Bitmask)*8) 
13320 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
13330 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
13340 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
13350 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
13360 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
13370 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
13380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13390 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c 69  ChangeP2(v, sqli
133a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
133b0 64 72 28 76 29 2d 31 2c 20 6e 29 3b 0a 20 20 20  dr(v)-1, n);.   
133c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
133d0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
133e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
133f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
13400 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
13410 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
13420 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
13430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
13440 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
13450 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
13460 0a 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20  .    if( (pIx = 
13470 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30  pLevel->pIdx)!=0
13480 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
13490 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
134a0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
134b0 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
134c0 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
134d0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
134e0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
134f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13500 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
13510 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74   iIdxCur, pIx->t
13520 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  num, iDb,.      
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
13550 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
13560 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  F);.      VdbeCo
13570 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
13580 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  pIx->zName));.  
13590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
135a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
135b0 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43  umColumns, iIdxC
135c0 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e  ur, pIx->nColumn
135d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
135e0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
135f0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
13600 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
13610 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
13620 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13630 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  (v);..  /* Gener
13640 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
13650 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
13660 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
13670 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
13680 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
13690 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
136a0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
136b0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
136c0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
136d0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
136e0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
136f0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
13700 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
13710 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
13720 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
13730 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20  j;.    int iCur 
13740 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
13750 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  sor;  /* The VDB
13760 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
13770 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e   table */.    In
13780 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
13790 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
137a0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
137b0 2f 0a 20 20 20 20 69 6e 74 20 6e 78 74 3b 20 20  /.    int nxt;  
137c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
137d0 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
137e0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
137f0 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
13800 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
13810 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
13820 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
13830 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
13840 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
13850 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
13860 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
13870 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65  y */.    int bRe
13880 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  v;          /* T
13890 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
138a0 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
138b0 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20  e order */..    
138c0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
138d0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
138e0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72  iFrom];.    iCur
138f0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
13900 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d  rsor;.    pIdx =
13910 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20   pLevel->pIdx;. 
13920 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
13930 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
13940 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
13950 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
13960 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20  REVERSE)!=0;.   
13970 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
13980 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
13990 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
139a0 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
139b0 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
139c0 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
139d0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
139e0 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ons.    ** for t
139f0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
13a00 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f    Jump to brk to
13a10 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
13a20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d  loop..    ** Jum
13a30 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
13a40 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
13a50 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
13a60 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  n of the.    ** 
13a70 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop..    **.   
13a80 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
13a90 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
13aa0 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
13ab0 20 22 6e 78 74 22 20 6c 61 62 65 6c 20 74 68 61   "nxt" label tha
13ac0 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74  t.    ** means t
13ad0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
13ae0 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
13af0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
13b00 57 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  When.    ** ther
13b10 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
13b20 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
13b30 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 6e  straints, the "n
13b40 78 74 22 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a  xt" label.    **
13b50 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
13b60 22 62 72 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  "brk"..    */.  
13b70 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e    brk = pLevel->
13b80 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78  brk = pLevel->nx
13b90 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
13ba0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13bb0 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
13bc0 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
13bd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13be0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
13bf0 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
13c00 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
13c10 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
13c20 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69  e and.    ** ini
13c30 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
13c40 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
13c50 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
13c60 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20   matches any.   
13c70 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
13c80 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
13c90 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   join..    */.  
13ca0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
13cb0 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
13cc0 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
13cd0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
13ce0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
13cf0 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
13d00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
13d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13d30 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
13d40 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64  tJoin);.      Vd
13d50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
13d60 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
13d70 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
13d80 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
13d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13da0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
13db0 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
13dc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
13dd0 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
13de0 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
13df0 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
13e00 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
13e10 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
13e20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
13e30 61 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ata..      */.  
13e40 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
13e50 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
13e60 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
13e70 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 20  VFilter */.     
13e80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13e90 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20  nfo *pBestIdx = 
13ea0 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
13eb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e  ;.      int nCon
13ec0 73 74 72 61 69 6e 74 20 3d 20 70 42 65 73 74 49  straint = pBestI
13ed0 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
13ee0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 71  .      struct sq
13ef0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13f00 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
13f10 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
13f50 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  x->aConstraintUs
13f60 61 67 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  age;.      const
13f70 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
13f80 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
13f90 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e    pBestIdx->aCon
13fe0 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20  straint;..      
13ff0 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e  for(j=1; j<=nCon
14000 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
14010 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
14020 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
14030 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
14040 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
14050 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76  ( aUsage[k].argv
14060 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20  Index==j ){.    
14070 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
14080 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
14090 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  k].iTermOffset;.
140a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
140b0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
140c0 73 65 2c 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e  se, wc.a[iTerm].
140d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30  pExpr->pRight, 0
140e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
140f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14100 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14110 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
14120 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
14130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 52        }.      iR
14140 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
14150 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
14160 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
14170 20 73 71 6c 69 74 65 33 53 74 61 63 6b 54 6f 52   sqlite3StackToR
14180 65 67 28 70 50 61 72 73 65 2c 20 6a 2d 31 29 3b  eg(pParse, j-1);
14190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
141a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
141b0 6e 74 65 67 65 72 2c 20 70 42 65 73 74 49 64 78  nteger, pBestIdx
141c0 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  ->idxNum, iReg);
141d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
141e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
141f0 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65  nteger, j-1, iRe
14200 67 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g+1);.      sqli
14210 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14220 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75   OP_VFilter, iCu
14230 72 2c 20 62 72 6b 2c 20 69 52 65 67 2c 20 70 42  r, brk, iReg, pB
14240 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a  estIdx->idxStr,.
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
14270 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
14280 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20  tr ? P4_MPRINTF 
14290 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P4_STATIC);.  
142a0 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e 65      pBestIdx->ne
142b0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
142c0 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
142d0 30 3b 20 6a 3c 70 42 65 73 74 49 64 78 2d 3e 6e  0; j<pBestIdx->n
142e0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
142f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55  {.        if( aU
14300 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a  sage[j].omit ){.
14310 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54            int iT
14320 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e  erm = aConstrain
14330 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  t[j].iTermOffset
14340 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 61  ;.          disa
14350 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
14360 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20  &wc.a[iTerm]);. 
14370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14380 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
14390 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20  p = OP_VNext;.  
143a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
143b0 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65   iCur;.      pLe
143c0 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
143d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
143e0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  (v);.    }else.#
143f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14400 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
14410 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4c  E */..    if( pL
14420 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
14430 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a  ERE_ROWID_EQ ){.
14440 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
14450 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
14460 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
14470 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
14480 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  n.      **      
14490 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d      equality com
144a0 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
144b0 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
144c0 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20    Or.      **   
144d0 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65         we refere
144e0 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  nce multiple row
144f0 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64  s using a "rowid
14500 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20   IN (...)".     
14510 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
14520 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f  struct..      */
14530 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
14540 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75  indTerm(&wc, iCu
14550 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
14560 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29   WO_EQ|WO_IN, 0)
14570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14580 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
14590 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
145a0 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  >pExpr!=0 );.   
145b0 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
145c0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
145d0 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ur );.      asse
145e0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
145f0 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71   );.      codeEq
14600 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
14610 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
14620 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70  );.      nxt = p
14630 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20  Level->nxt;.    
14640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14650 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
14660 49 6e 74 2c 20 31 2c 20 6e 78 74 29 3b 0a 20 20  Int, 1, nxt);.  
14670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14680 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp2(v, OP_NotE
14690 78 69 73 74 73 2c 20 69 43 75 72 2c 20 6e 78 74  xists, iCur, nxt
146a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
146b0 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
146c0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
146d0 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
146e0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
146f0 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
14700 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a  _ROWID_RANGE ){.
14710 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
14720 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
14730 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
14740 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
14750 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
14760 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
14770 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
14780 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
14790 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
147a0 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64  m *pStart, *pEnd
147b0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
147c0 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
147d0 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
147e0 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
147f0 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
14800 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
14810 29 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  );.      pEnd = 
14820 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
14830 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
14840 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
14850 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  );.      if( bRe
14860 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65  v ){.        pTe
14870 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20  rm = pStart;.   
14880 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
14890 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64  nd;.        pEnd
148a0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
148b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  }.      if( pSta
148c0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  rt ){.        Ex
148d0 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
148e0 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
148f0 70 72 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pr;.        asse
14900 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
14910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
14920 61 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  art->leftCursor=
14930 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20  =iCur );.       
14940 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14950 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
14960 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
14970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14980 70 33 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e  p3(v, OP_ForceIn
14990 74 2c 20 30 2c 20 62 72 6b 2c 20 0a 20 20 20 20  t, 0, brk, .    
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 6f 70 3d           pX->op=
149c0 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LE || pX->op
149d0 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
149e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
149f0 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
14a00 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76  _MoveLt : OP_Mov
14a10 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b  eGe, iCur, brk);
14a20 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
14a30 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
14a40 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
14a50 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
14a60 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  art);.      }els
14a70 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14a80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14a90 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
14aa0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72   OP_Rewind, iCur
14ab0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
14ac0 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29        if( pEnd )
14ad0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
14ae0 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  pX;.        pX =
14af0 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20   pEnd->pExpr;.  
14b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
14b10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
14b20 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
14b30 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
14b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14b50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14b60 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b   pX->pRight, 0);
14b70 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
14b80 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
14b90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
14ba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14bb0 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 30 2c  2(v, OP_Move, 0,
14bc0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a   pLevel->iMem);.
14bd0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e          if( pX->
14be0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
14bf0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
14c00 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
14c10 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
14c20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d  OP_Ge;.        }
14c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14c40 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
14c50 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20  OP_Lt : OP_Gt;. 
14c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14c70 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
14c80 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
14c90 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 20    }.      start 
14ca0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14cb0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
14cc0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
14cd0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
14ce0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
14cf0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
14d00 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
14d10 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
14d20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
14d30 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
14d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d50 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
14d60 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
14d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d80 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
14d90 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
14da0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
14db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14dc0 20 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f   testOp, SQLITE_
14dd0 41 46 46 5f 4e 55 4d 45 52 49 43 7c 30 78 31 30  AFF_NUMERIC|0x10
14de0 30 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  0, brk);.      }
14df0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14e00 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
14e10 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
14e20 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  E ){.      /* Ca
14e30 73 65 20 33 3a 20 54 68 65 20 57 48 45 52 45 20  se 3: The WHERE 
14e40 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74  clause term that
14e50 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72   refers to the r
14e60 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20  ight-most.      
14e70 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  **         colum
14e80 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  n of the index i
14e90 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
14ea0 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
14eb0 66 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  f.      **      
14ec0 20 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20     the index is 
14ed0 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74  on (x,y,z) and t
14ee0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
14ef0 69 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  is of the.      
14f00 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20  **         form 
14f10 22 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74  "x=5 AND y<10" t
14f20 68 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73  hen this case is
14f30 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65   used.  Only the
14f40 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
14f50 20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c    right-most col
14f60 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
14f70 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
14f80 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  est must.      *
14f90 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68  *         use th
14fa0 65 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20  e "==" and "IN" 
14fb0 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20  operators..     
14fc0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
14fd0 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
14fe0 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
14ff0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
15000 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ERE clause.     
15010 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
15020 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
15030 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
15040 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
15050 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
15060 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
15070 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
15080 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
15090 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f  DER BY..      */
150a0 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
150b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20  ;.      int nEq 
150c0 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20  = pLevel->nEq;. 
150d0 20 20 20 20 20 69 6e 74 20 74 6f 70 45 71 3d 30       int topEq=0
150e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
150f0 20 69 66 20 74 6f 70 20 6c 69 6d 69 74 20 75 73   if top limit us
15100 65 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 73 20  es ==. False is 
15110 73 74 72 69 63 74 6c 79 20 3c 20 2a 2f 0a 20 20  strictly < */.  
15120 20 20 20 20 69 6e 74 20 62 74 6d 45 71 3d 30 3b      int btmEq=0;
15130 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15140 69 66 20 62 74 6d 20 6c 69 6d 69 74 20 75 73 65  if btm limit use
15150 73 20 3d 3d 2e 20 46 61 6c 73 65 20 69 66 20 73  s ==. False if s
15160 74 72 69 63 74 6c 79 20 3e 20 2a 2f 0a 20 20 20  trictly > */.   
15170 20 20 20 69 6e 74 20 74 6f 70 4f 70 2c 20 62 74     int topOp, bt
15180 6d 4f 70 3b 20 20 20 2f 2a 20 4f 70 65 72 61 74  mOp;   /* Operat
15190 6f 72 73 20 66 6f 72 20 74 68 65 20 74 6f 70 20  ors for the top 
151a0 61 6e 64 20 62 6f 74 74 6f 6d 20 73 65 61 72 63  and bottom searc
151b0 68 20 62 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20  h bounds */.    
151c0 20 20 69 6e 74 20 74 65 73 74 4f 70 3b 0a 20 20    int testOp;.  
151d0 20 20 20 20 69 6e 74 20 74 6f 70 4c 69 6d 69 74      int topLimit
151e0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
151f0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
15200 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69  MIT)!=0;.      i
15210 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d 20 28 70  nt btmLimit = (p
15220 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
15230 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
15240 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  =0;..      /* Ge
15250 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
15260 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
15270 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
15280 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
15290 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65 6c 20 74    ** and level t
152a0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
152b0 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
152c0 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
152d0 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71 75        codeAllEqu
152e0 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
152f0 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c 20  e, pLevel, &wc, 
15300 6e 6f 74 52 65 61 64 79 29 3b 0a 0a 20 20 20 20  notReady);..    
15310 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74    /* Duplicate t
15320 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  he equality term
15330 20 76 61 6c 75 65 73 20 62 65 63 61 75 73 65 20   values because 
15340 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65  they will all be
15350 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74  .      ** used t
15360 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61  wice: once to ma
15370 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ke the terminati
15380 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20  on key and once 
15390 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  to make the.    
153a0 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a    ** start key..
153b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
153c0 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a  or(j=0; j<nEq; j
153d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
153e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
153f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 31 2d 6e 45 71  , OP_Copy, 1-nEq
15400 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
15410 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
15420 77 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  what comparison 
15430 6f 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65  operators to use
15440 20 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74   for top and bot
15450 74 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  tom .      ** se
15460 61 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72  arch bounds. For
15470 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
15480 64 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20  dex, the bottom 
15490 62 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20  bound is a > or 
154a0 3e 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72  >=.      ** oper
154b0 61 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70  ator and the top
154c0 20 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72   bound is a < or
154d0 20 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46   <= operator.  F
154e0 6f 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a  or a descending.
154f0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74        ** index t
15500 68 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  he operators are
15510 20 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20   reversed..     
15520 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
15530 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
15540 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
15550 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f  SC ){.        to
15560 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  pOp = WO_LT|WO_L
15570 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70  E;.        btmOp
15580 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a   = WO_GT|WO_GE;.
15590 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
155a0 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f       topOp = WO_
155b0 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20  GT|WO_GE;.      
155c0 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c    btmOp = WO_LT|
155d0 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53  WO_LE;.        S
155e0 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69  WAP(int, topLimi
155f0 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20  t, btmLimit);.  
15600 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15610 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72  Generate the ter
15620 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54  mination key.  T
15630 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76  his is the key v
15640 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20  alue that.      
15650 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20  ** will end the 
15660 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69  search.  There i
15670 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e  s no termination
15680 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20   key if there.  
15690 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71      ** are no eq
156a0 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64  uality terms and
156b0 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d   no "X<..." term
156c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
156d0 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a   ** 2002-Dec-04:
156e0 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72   On a reverse-or
156f0 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f  der scan, the so
15700 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61  -called "termina
15710 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b  tion".      ** k
15720 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65  ey computed here
15730 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
15740 62 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  being the start 
15750 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
15760 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c      nxt = pLevel
15770 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20 69 66 28  ->nxt;.      if(
15780 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20   topLimit ){.   
15790 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
157a0 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70         int k = p
157b0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
157c0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
157d0 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
157e0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
157f0 79 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29 3b  y, topOp, pIdx);
15800 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15810 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
15820 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
15830 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
15840 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
15850 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
15860 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
15870 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15880 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
15890 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
158a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
158b0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
158c0 2c 20 2d 28 6e 45 71 2a 32 2b 31 29 2c 20 6e 78  , -(nEq*2+1), nx
158d0 74 29 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45  t);.        topE
158e0 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  q = pTerm->eOper
158f0 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
15900 5f 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69  _GE);.        di
15910 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
15920 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
15930 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64    testOp = OP_Id
15940 78 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xGE;.      }else
15950 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
15960 20 3d 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64   = nEq>0 ? OP_Id
15970 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  xGE : OP_Noop;. 
15980 20 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 31         topEq = 1
15990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
159a0 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
159b0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  oop ){.        i
159c0 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20  nt nCol = nEq + 
159d0 74 6f 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  topLimit;.      
159e0 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
159f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15a00 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e  .        buildIn
15a10 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c  dexProbe(v, nCol
15a20 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
15a30 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
15a40 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
15a50 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c  topEq ? OP_MoveL
15a60 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20  e : OP_MoveLt;. 
15a70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15a80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
15a90 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29 3b  , iIdxCur, nxt);
15aa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15ac0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ad0 50 5f 4d 6f 76 65 2c 20 30 2c 20 70 4c 65 76 65  P_Move, 0, pLeve
15ae0 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  l->iMem);.      
15af0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
15b00 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
15b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15b20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp2(v, OP_Last
15b30 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
15b40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15b50 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
15b60 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73  start key.  This
15b70 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74   is the key that
15b80 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77   defines the low
15b90 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e  er.      ** boun
15ba0 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e  d on the search.
15bb0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74    There is no st
15bc0 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65  art key if there
15bd0 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a   are no.      **
15be0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
15bf0 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20  and if there is 
15c00 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e  no "X>..." term.
15c10 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68    In.      ** th
15c20 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74  at case, generat
15c30 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73  e a "Rewind" ins
15c40 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63  truction in plac
15c50 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  e of the.      *
15c60 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72  * start key sear
15c70 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ch..      **.   
15c80 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
15c90 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  4: In the case o
15ca0 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  f a reverse-orde
15cb0 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f  r search, the so
15cc0 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a  -called.      **
15cd0 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61   "start" key rea
15ce0 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e  lly ends up bein
15cf0 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65  g used as the te
15d00 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20  rmination key.. 
15d10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
15d20 28 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20  ( btmLimit ){.  
15d30 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
15d40 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
15d50 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
15d60 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
15d70 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
15d80 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
15d90 64 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78 29  dy, btmOp, pIdx)
15da0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15db0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
15dc0 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
15dd0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
15de0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
15df0 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
15e00 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DED)==0 );.     
15e10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15e20 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
15e30 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
15e40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e50 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
15e60 6c 2c 20 2d 28 6e 45 71 2b 31 29 2c 20 6e 78 74  l, -(nEq+1), nxt
15e70 29 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 45 71  );.        btmEq
15e80 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
15e90 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
15ea0 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  GE);.        dis
15eb0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
15ec0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
15ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 74  else{.        bt
15ee0 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mEq = 1;.      }
15ef0 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3e 30  .      if( nEq>0
15f00 20 7c 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a   || btmLimit ){.
15f10 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
15f20 20 3d 20 6e 45 71 20 2b 20 62 74 6d 4c 69 6d 69   = nEq + btmLimi
15f30 74 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64  t;.        build
15f40 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43  IndexProbe(v, nC
15f50 6f 6c 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  ol, pIdx);.     
15f60 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
15f70 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
15f80 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
15f90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
15fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15fb0 4f 70 32 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20  Op2(v, OP_Move, 
15fc0 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29  0, pLevel->iMem)
15fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
15fe0 4f 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20  Op = OP_IdxLT;. 
15ff0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16000 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
16010 20 62 74 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65   btmEq ? OP_Move
16020 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Ge : OP_MoveGt;.
16030 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16040 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
16050 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29  p, iIdxCur, nxt)
16060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16070 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
16090 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
160a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
160b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
160c0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
160d0 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29  d, iIdxCur, brk)
160e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
160f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
16100 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
16110 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72 65 20  loop.  If there 
16120 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e  is a termination
16130 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 77 65  .      ** key we
16140 20 68 61 76 65 20 74 6f 20 74 65 73 74 20 66 6f   have to test fo
16150 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64 20 61  r that key and a
16160 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f 70 20  bort at the top 
16170 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
16180 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
16190 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c       start = sql
161a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
161b0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 66  ddr(v);.      if
161c0 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
161d0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
161e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
161f0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76  , OP_SCopy, pLev
16200 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  el->iMem, 0);.  
16210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16220 65 41 64 64 4f 70 32 28 76 2c 20 74 65 73 74 4f  eAddOp2(v, testO
16230 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 29  p, iIdxCur, nxt)
16240 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 74  ;.        if( (t
16250 6f 70 45 71 20 26 26 20 21 62 52 65 76 29 20 7c  opEq && !bRev) |
16260 7c 20 28 21 62 74 6d 45 71 20 26 26 20 62 52 65  | (!btmEq && bRe
16270 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  v) ){.          
16280 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16290 65 50 34 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20  eP4(v, -1, "+", 
162a0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
162b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
162c0 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74      if( topLimit
162d0 20 7c 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20   | btmLimit ){. 
162e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
162f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
16300 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
16310 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nEq);.        sq
16320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16330 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 31 2c  v, OP_IsNull, 1,
16340 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a   cont);.      }.
16350 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54        if( !omitT
16360 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
16370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16380 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64  2(v, OP_IdxRowid
16390 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  , iIdxCur, 0);. 
163a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
163b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
163c0 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b  oveGe, iCur, 0);
163d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
163e0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e  /* Record the in
163f0 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74  struction used t
16400 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
16410 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
16420 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
16430 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
16440 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
16450 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
16460 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 4c  IdxCur;.      pL
16470 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
16480 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16490 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
164a0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
164b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
164c0 20 34 3a 20 20 54 68 65 72 65 20 69 73 20 61 6e   4:  There is an
164d0 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20 74   index and all t
164e0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
164f0 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20  E clause that.  
16500 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
16510 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e 64  refer to the ind
16520 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d 3d  ex using the "==
16530 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74  " or "IN" operat
16540 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ors..      */.  
16550 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
16560 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70       int nEq = p
16570 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 0a 20 20 20  Level->nEq;..   
16580 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16590 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
165a0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
165b0 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
165c0 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64   IN.      ** and
165d0 20 6c 65 61 76 65 20 74 68 65 20 76 61 6c 75 65   leave the value
165e0 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
165f0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
16600 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
16610 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
16620 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  ms(pParse, pLeve
16630 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79  l, &wc, notReady
16640 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70  );.      nxt = p
16650 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20  Level->nxt;..   
16660 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
16670 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74   single key that
16680 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
16690 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20   both start and 
166a0 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20  terminate.      
166b0 2a 2a 20 74 68 65 20 73 65 61 72 63 68 0a 20 20  ** the search.  
166c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69      */.      bui
166d0 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
166e0 6e 45 71 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  nEq, pIdx);.    
166f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16700 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
16710 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29  0, pLevel->iMem)
16720 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
16730 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74 6f  rate code (1) to
16740 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69 72   move to the fir
16750 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d  st matching elem
16760 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
16770 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ..      ** Then 
16780 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 32  generate code (2
16790 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  ) that jumps to 
167a0 22 6e 78 74 22 20 61 66 74 65 72 20 74 68 65 20  "nxt" after the 
167b0 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a 20  cursor is past. 
167c0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
167d0 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e   matching elemen
167e0 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
167f0 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69 73   The code (1) is
16800 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20 20   executed.      
16810 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ** once to initi
16820 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63 68  alize the search
16830 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20 69  , the code (2) i
16840 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72  s executed befor
16850 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a 20  e each.      ** 
16860 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
16870 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66 20   scan to see if 
16880 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e  the scan has fin
16890 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  ished. */.      
168a0 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
168b0 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72      /* Scan in r
168c0 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
168d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
168e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
168f0 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c  MoveLe, iIdxCur,
16900 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73   nxt);.        s
16910 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16930 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Copy, pLevel->iM
16940 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
16950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16960 32 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69  2(v, OP_IdxLT, i
16970 49 64 78 43 75 72 2c 20 6e 78 74 29 3b 0a 20 20  IdxCur, nxt);.  
16980 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
16990 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
169a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
169b0 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20   /* Scan in the 
169c0 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f  forward order */
169d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
169e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
169f0 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72  _MoveGe, iIdxCur
16a00 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  , nxt);.        
16a10 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
16a20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16a30 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69  SCopy, pLevel->i
16a40 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
16a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a60 70 34 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20  p4(v, OP_IdxGE, 
16a70 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 30 2c  iIdxCur, nxt, 0,
16a80 20 22 2b 22 2c 20 50 34 5f 53 54 41 54 49 43 29   "+", P4_STATIC)
16a90 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
16aa0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
16ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16ac0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
16ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16af0 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
16b00 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  r, 0);.        s
16b10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16b20 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  (v, OP_MoveGe, i
16b30 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
16b40 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
16b50 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20  1 = iIdxCur;.   
16b60 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20     pLevel->p2 = 
16b70 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  start;.    }else
16b80 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
16b90 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  5:  There is no 
16ba0 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57  usable index.  W
16bb0 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70  e must do a comp
16bc0 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  lete.      **   
16bd0 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
16be0 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
16bf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16c00 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c  assert( omitTabl
16c10 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  e==0 );.      as
16c20 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b  sert( bRev==0 );
16c30 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
16c40 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  p = OP_Next;.   
16c50 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
16c60 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
16c70 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c  el->p2 = 1 + sql
16c80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16c90 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
16ca0 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  r, brk);.    }. 
16cb0 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
16cc0 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74  getMask(&maskSet
16cd0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  , iCur);.    sql
16ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16cf0 2c 20 4f 50 5f 53 74 61 63 6b 44 65 70 74 68 2c  , OP_StackDepth,
16d00 20 2d 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a   -1, 0);..    /*
16d10 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20   Insert code to 
16d20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78  test every subex
16d30 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61  pression that ca
16d40 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  n be completely.
16d50 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
16d60 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
16d70 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
16d80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
16d90 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63  pTerm=wc.a, j=wc
16da0 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  .nTerm; j>0; j--
16db0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
16dc0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
16dd0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
16de0 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
16df0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
16e00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16e10 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
16e20 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
16e30 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
16e40 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70 54 65  ;.      pE = pTe
16e50 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
16e60 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
16e70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
16e80 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26  el->iLeftJoin &&
16e90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16ea0 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
16eb0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  n) ){.        co
16ec0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
16ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16ee0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
16ef0 20 70 45 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20   pE, cont, 1);. 
16f00 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
16f10 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
16f20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
16f30 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  or a LEFT OUTER 
16f40 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63  JOIN, generate c
16f50 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ode that will re
16f60 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
16f70 61 74 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61  at.    ** at lea
16f80 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  st one row of th
16f90 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61  e right table ha
16fa0 73 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65  s matched the le
16fb0 66 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20  ft table.  .    
16fc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
16fd0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a  l->iLeftJoin ){.
16fe0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f        pLevel->to
16ff0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
17000 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17020 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
17030 65 67 65 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d  eger, 1, pLevel-
17040 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
17050 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
17060 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54 20  v, "record LEFT 
17070 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20 20  JOIN hit"));.   
17080 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
17090 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65  a, j=0; j<wc.nTe
170a0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
170b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
170c0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54  Term->flags & (T
170d0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
170e0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
170f0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
17100 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  (pTerm->prereqAl
17110 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30  l & notReady)!=0
17120 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
17140 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
17150 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17160 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
17170 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f  pTerm->pExpr, co
17180 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  nt, 1);.        
17190 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
171a0 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
171b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
171c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
171d0 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
171e0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
171f0 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
17200 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
17210 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
17220 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
17230 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
17240 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
17250 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
17260 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
17270 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
17280 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
17290 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
172a0 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
172b0 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
172c0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
172d0 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
172e0 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
172f0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
17300 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
17310 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
17320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
17330 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
17340 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20  {.    char *z;. 
17350 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c     int n;.    pL
17360 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
17370 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74  a[i];.    pTabIt
17380 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
17390 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
173a0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74  ;.    z = pTabIt
173b0 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
173c0 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70  if( z==0 ) z = p
173d0 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  TabItem->pTab->z
173e0 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74  Name;.    n = st
173f0 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28  rlen(z);.    if(
17400 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65   n+nQPlan < size
17410 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79  of(sqlite3_query
17420 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20  _plan)-10 ){.   
17430 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
17440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
17450 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  _ONLY ){.       
17460 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
17470 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
17480 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20  an], "{}", 2);. 
17490 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
174a0 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   2;.      }else{
174b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
174c0 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
174d0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20  lan[nQPlan], z, 
174e0 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c  n);.        nQPl
174f0 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  an += n;.      }
17500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71  .      sqlite3_q
17510 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
17520 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  ++] = ' ';.    }
17530 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
17540 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  >flags & (WHERE_
17550 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
17560 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
17570 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
17580 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
17590 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20 32  nQPlan], "* ", 2
175a0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
175b0 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  += 2;.    }else 
175c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  if( pLevel->pIdx
175d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
175e0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
175f0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
17600 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20   "{} ", 3);.    
17610 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20    nQPlan += 3;. 
17620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17630 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65  n = strlen(pLeve
17640 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
17650 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  .      if( n+nQP
17660 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
17670 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
17680 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  -2 ){.        me
17690 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
176a0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
176b0 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e  , pLevel->pIdx->
176c0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
176d0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
176e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
176f0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
17700 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
17710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
17720 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20  while( nQPlan>0 
17730 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79  && sqlite3_query
17740 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d  _plan[nQPlan-1]=
17750 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69  =' ' ){.    sqli
17760 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d  te3_query_plan[-
17770 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20  -nQPlan] = 0;.  
17780 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72  }.  sqlite3_quer
17790 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d  y_plan[nQPlan] =
177a0 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30   0;.  nQPlan = 0
177b0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
177c0 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69  TE_TEST // Testi
177d0 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
177e0 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20   use only */..  
177f0 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f  /* Record the co
17800 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65  ntinuation addre
17810 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 49  ss in the WhereI
17820 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
17830 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20  Then.  ** clean 
17840 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  up and return.. 
17850 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43   */.  pWInfo->iC
17860 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a  ontinue = cont;.
17870 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
17880 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72  ar(&wc);.  retur
17890 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
178a0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
178b0 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
178c0 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20  reBeginNoMem:.  
178d0 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
178e0 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65 49 6e  (&wc);.  whereIn
178f0 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a  foFree(pWInfo);.
17900 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
17910 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
17920 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
17930 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
17940 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
17950 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
17960 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
17970 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
17980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
17990 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
179a0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  *pWInfo){.  Vdbe
179b0 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50   *v = pWInfo->pP
179c0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
179d0 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76  nt i;.  WhereLev
179e0 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72  el *pLevel;.  Sr
179f0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
17a00 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
17a10 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  st;..  /* Genera
17a20 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  te loop terminat
17a30 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ion code..  */. 
17a40 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d   for(i=pTabList-
17a50 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  >nSrc-1; i>=0; i
17a60 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  --){.    pLevel 
17a70 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
17a80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17a90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17aa0 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20  pLevel->cont);. 
17ab0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
17ac0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
17ad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ae0 64 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp2(v, pLevel-
17af0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
17b00 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20   pLevel->p2);.  
17b10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
17b20 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20 20 20 20  el->nIn ){.     
17b30 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
17b40 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  pIn;.      int j
17b50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
17b70 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 29 3b  v, pLevel->nxt);
17b80 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
17b90 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e 3d 26 70  vel->nIn, pIn=&p
17ba0 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a  Level->aInLoop[j
17bb0 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
17bc0 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
17bd0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17be0 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64  re(v, pIn->topAd
17bf0 64 72 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  dr+1);.        s
17c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17c10 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e  (v, OP_Next, pIn
17c20 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 74 6f 70  ->iCur, pIn->top
17c30 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Addr);.        s
17c40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17c50 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f 70 41 64  re(v, pIn->topAd
17c60 64 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dr-1);.      }. 
17c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17c80 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  e(pLevel->aInLoo
17c90 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
17ca0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17cb0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
17cc0 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  >brk);.    if( p
17cd0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
17ce0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
17cf0 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  dr;.      addr =
17d00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d10 70 32 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  p2(v, OP_IfMemPo
17d20 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
17d30 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  Join, 0);.      
17d40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d50 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  2(v, OP_NullRow,
17d60 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
17d70 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  iCursor, 0);.   
17d80 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
17d90 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20  IdxCur>=0 ){.   
17da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17db0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
17dc0 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
17dd0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
17de0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17e00 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c  _Goto, 0, pLevel
17e10 2d 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  ->top);.      sq
17e20 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17e30 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
17e40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
17e50 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73  "break" point is
17e60 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74   here, just past
17e70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17e80 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a  outer loop..  **
17e90 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20   Set it..  */.  
17ea0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17eb0 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66  veLabel(v, pWInf
17ec0 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f  o->iBreak);..  /
17ed0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74  * Close all of t
17ee0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
17ef0 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73  were opened by s
17f00 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
17f10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
17f20 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
17f30 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
17f40 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
17f50 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  l++){.    struct
17f60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17f70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
17f80 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
17f90 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
17fa0 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
17fb0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
17fc0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
17fd0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73      if( pTab->is
17fe0 45 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70  Ephem || pTab->p
17ff0 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75  Select ) continu
18000 65 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  e;.    if( (pLev
18010 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
18020 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
18030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18050 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Close, pTabItem-
18060 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  >iCursor, 0);.  
18070 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
18080 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20  el->pIdx!=0 ){. 
18090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
180a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
180b0 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  se, pLevel->iIdx
180c0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  Cur, 0);.    }..
180d0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
180e0 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
180f0 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62  x, make code sub
18100 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
18110 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
18120 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
18130 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74   preference to t
18140 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69  he table. Someti
18150 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  mes, this means.
18160 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
18170 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72   need never be r
18180 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69  ead from. This i
18190 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
181a0 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73  boost,.    ** as
181b0 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20   the vdbe level 
181c0 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20  waits until the 
181d0 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65  table is read be
181e0 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20  fore actually.  
181f0 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65    ** seeking the
18200 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
18210 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72   the record corr
18220 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
18230 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
18240 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
18250 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20  index..    ** . 
18260 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
18270 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
18280 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
18290 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
182a0 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
182b0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
182c0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
182d0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
182e0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
182f0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
18300 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
18310 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
18320 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
18330 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
18340 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
18350 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
18360 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
18370 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
18380 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
18390 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
183a0 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b 0a 20 20  evel->pIdx ){.  
183b0 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61      int k, j, la
183c0 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  st;.      VdbeOp
183d0 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64   *pOp;.      Ind
183e0 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
183f0 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 20 20 69  l->pIdx;.      i
18400 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20  nt useIndexOnly 
18410 3d 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  = pLevel->flags 
18420 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
18430 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
18440 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
18450 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
18460 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
18470 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
18480 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
18490 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
184a0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  );.      for(k=p
184b0 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c  WInfo->iTop; k<l
184c0 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; k++, pOp++)
184d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
184e0 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
184f0 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
18500 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
18510 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
18520 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
18530 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
18540 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
18550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
18560 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78  f( pOp->p2==pIdx
18570 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b  ->aiColumn[j] ){
18580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
18590 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20  Op->p2 = j;.    
185a0 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
185b0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
185c0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Cur;.           
185d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
185e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
185f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
18600 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f 6e  sert(!useIndexOn
18610 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43  ly || j<pIdx->nC
18620 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
18630 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f  }else if( pOp->o
18640 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20  pcode==OP_Rowid 
18650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
18660 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
18670 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
18680 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
18690 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20  OP_IdxRowid;.   
186a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
186b0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
186c0 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e 64  ullRow && useInd
186d0 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  exOnly ){.      
186e0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
186f0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
18700 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18710 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
18720 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a  al cleanup.  */.
18730 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
18740 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
18750 6e 3b 0a 7d 0a                                   n;.}.