/ Hex Artifact Content
Login

Artifact ee4878e42ac97e2b3389b44cee34b35458321488:


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 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 31  : where.c,v 1.31
0340: 38 20 32 30 30 38 2f 30 37 2f 32 38 20 31 39 3a  8 2008/07/28 19:
0350: 33 34 3a 35 34 20 64 72 68 20 45 78 70 20 24 0a  34:54 drh Exp $.
0360: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0370: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0380: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
0390: 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
03a0: 2e 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22  .  "BMS" means "
03b0: 42 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a  BitMask Size"..*
03c0: 2f 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28  /.#define BMS  (
03d0: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
03e0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20  8)../*.** Trace 
03f0: 6f 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f  output macros.*/
0400: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0410: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0420: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0430: 47 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  G).int sqlite3Wh
0440: 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  ereTrace = 0;.#e
0450: 6e 64 69 66 0a 23 69 66 20 30 0a 23 20 64 65 66  ndif.#if 0.# def
0460: 69 6e 65 20 57 48 45 52 45 54 52 41 43 45 28 58  ine WHERETRACE(X
0470: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0480: 72 65 54 72 61 63 65 29 20 73 71 6c 69 74 65 33  reTrace) sqlite3
0490: 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65  DebugPrintf X.#e
04a0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57 48 45  lse.# define WHE
04b0: 52 45 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  RETRACE(X).#endi
04c0: 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  f../* Forward re
04d0: 66 65 72 65 6e 63 65 0a 2a 2f 0a 74 79 70 65 64  ference.*/.typed
04e0: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43  ef struct WhereC
04f0: 6c 61 75 73 65 20 57 68 65 72 65 43 6c 61 75 73  lause WhereClaus
0500: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
0510: 74 20 45 78 70 72 4d 61 73 6b 53 65 74 20 45 78  t ExprMaskSet Ex
0520: 70 72 4d 61 73 6b 53 65 74 3b 0a 0a 2f 2a 0a 2a  prMaskSet;../*.*
0530: 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65  * The query gene
0540: 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72  rator uses an ar
0550: 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73  ray of instances
0560: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
0570: 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74  re to.** help it
0580: 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62   analyze the sub
0590: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
05a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
05b0: 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20    Each WHERE.** 
05c0: 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73  clause subexpres
05d0: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
05e0: 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  d from the other
05f0: 73 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  s by an AND oper
0600: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ator..**.** All 
0610: 57 68 65 72 65 54 65 72 6d 73 20 61 72 65 20 63  WhereTerms are c
0620: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 61 20  ollected into a 
0630: 73 69 6e 67 6c 65 20 57 68 65 72 65 43 6c 61 75  single WhereClau
0640: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 0a  se structure.  .
0650: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0660: 20 69 64 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a   identity holds:
0670: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 68  .**.**        Wh
0680: 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57  ereTerm.pWC->a[W
0690: 68 65 72 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d  hereTerm.idx] ==
06a0: 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a   WhereTerm.**.**
06b0: 20 57 68 65 6e 20 61 20 74 65 72 6d 20 69 73 20   When a term is 
06c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
06d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
06e0: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  X <op> <expr>.**
06f0: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
0700: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
0710: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
0720: 63 65 72 74 61 69 6e 20 6f 70 65 72 61 74 6f 72  certain operator
0730: 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68 65 72 65  s,.** then Where
0740: 54 65 72 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20  Term.leftCursor 
0750: 61 6e 64 20 57 68 65 72 65 54 65 72 6d 2e 6c 65  and WhereTerm.le
0760: 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20  ftColumn record 
0770: 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75  the.** cursor nu
0780: 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  mber and column 
0790: 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57  number for X.  W
07a0: 68 65 72 65 54 65 72 6d 2e 6f 70 65 72 61 74 6f  hereTerm.operato
07b0: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
07c0: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
07d0: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
07e0: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
07f0: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
0800: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
0810: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
0820: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
0830: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
0840: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
0850: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
0860: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
0870: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
0880: 73 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 52  s..**.** prereqR
0890: 69 67 68 74 20 61 6e 64 20 70 72 65 72 65 71 41  ight and prereqA
08a0: 6c 6c 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f  ll record sets o
08b0: 66 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  f cursor numbers
08c0: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f  ,.** but they do
08d0: 20 73 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   so indirectly. 
08e0: 20 41 20 73 69 6e 67 6c 65 20 45 78 70 72 4d 61   A single ExprMa
08f0: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20  skSet structure 
0900: 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75  translates.** cu
0910: 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f  rsor number into
0920: 20 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72   bits and the tr
0930: 61 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20  anslated bit is 
0940: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72  stored in the pr
0950: 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20  ereq.** fields. 
0960: 20 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e   The translation
0970: 20 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65   is used in orde
0980: 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68  r to maximize th
0990: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62  e number of.** b
09a0: 69 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69  its that will fi
09b0: 74 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20  t in a Bitmask. 
09c0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
09d0: 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62   numbers might b
09e0: 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20  e.** spread out 
09f0: 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67  over the non-neg
0a00: 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20  ative integers. 
0a10: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
0a20: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
0a30: 65 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20  ers might be 3, 
0a40: 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33  8, 9, 10, 20, 23
0a50: 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54  , 41, and 45.  T
0a60: 68 65 20 45 78 70 72 4d 61 73 6b 53 65 74 0a 2a  he ExprMaskSet.*
0a70: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
0a80: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
0a90: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
0aa0: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
0ab0: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
0ac0: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
0ad0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
0ae0: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
0af0: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
0b00: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
0b10: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
0b20: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
0b30: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
0b40: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
0b50: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
0b60: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
0b70: 37 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  7..*/.typedef st
0b80: 72 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 57  ruct WhereTerm W
0b90: 68 65 72 65 54 65 72 6d 3b 0a 73 74 72 75 63 74  hereTerm;.struct
0ba0: 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45   WhereTerm {.  E
0bb0: 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20  xpr *pExpr;     
0bc0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
0bd0: 72 20 74 6f 20 74 68 65 20 73 75 62 65 78 70 72  r to the subexpr
0be0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ession */.  i16 
0bf0: 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
0c00: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 70      /* Disable p
0c10: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77  WC->a[iParent] w
0c20: 68 65 6e 20 74 68 69 73 20 74 65 72 6d 20 64 69  hen this term di
0c30: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69 31 36 20  sabled */.  i16 
0c40: 6c 65 66 74 43 75 72 73 6f 72 3b 20 20 20 20 20  leftCursor;     
0c50: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0c60: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
0c70: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
0c80: 20 20 69 31 36 20 6c 65 66 74 43 6f 6c 75 6d 6e    i16 leftColumn
0c90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
0ca0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
0cb0: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
0cc0: 3e 22 20 2a 2f 0a 20 20 75 31 36 20 65 4f 70 65  >" */.  u16 eOpe
0cd0: 72 61 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  rator;          
0ce0: 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61 6c 75 65  /* A WO_xx value
0cf0: 20 64 65 73 63 72 69 62 69 6e 67 20 3c 6f 70 3e   describing <op>
0d00: 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 3b 20   */.  u8 flags; 
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d20: 20 42 69 74 20 66 6c 61 67 73 2e 20 20 53 65 65   Bit flags.  See
0d30: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38 20 6e   below */.  u8 n
0d40: 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
0d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0d60: 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74 20 6d   children that m
0d70: 75 73 74 20 64 69 73 61 62 6c 65 20 75 73 20 2a  ust disable us *
0d80: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
0d90: 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a 20 54  *pWC;       /* T
0da0: 68 65 20 63 6c 61 75 73 65 20 74 68 69 73 20 74  he clause this t
0db0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 2a  erm is part of *
0dc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0dd0: 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42  eqRight;    /* B
0de0: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
0df0: 20 75 73 65 64 20 62 79 20 70 52 69 67 68 74 20   used by pRight 
0e00: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0e10: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20  reqAll;      /* 
0e20: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
0e30: 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  s referenced by 
0e40: 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  p */.};../*.** A
0e50: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
0e60: 20 57 68 65 72 65 54 65 72 6d 2e 66 6c 61 67 73   WhereTerm.flags
0e70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d  .*/.#define TERM
0e80: 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31  _DYNAMIC    0x01
0e90: 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61     /* Need to ca
0ea0: 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  ll sqlite3ExprDe
0eb0: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20  lete(db, pExpr) 
0ec0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0ed0: 56 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20  VIRTUAL    0x02 
0ee0: 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68    /* Added by th
0ef0: 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f  e optimizer.  Do
0f00: 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65   not code */.#de
0f10: 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20  fine TERM_CODED 
0f20: 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54       0x04   /* T
0f30: 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65  his term is alre
0f40: 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65  ady coded */.#de
0f50: 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44  fine TERM_COPIED
0f60: 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48       0x08   /* H
0f70: 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64  as a child */.#d
0f80: 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b  efine TERM_OR_OK
0f90: 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20        0x10   /* 
0fa0: 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63  Used during OR-c
0fb0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
0fc0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e   */../*.** An in
0fd0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0fe0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0ff0: 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f  e holds all info
1000: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a  rmation about a.
1010: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  ** WHERE clause.
1020: 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73    Mostly this is
1030: 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72   a container for
1040: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65   one or more Whe
1050: 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75  reTerms..*/.stru
1060: 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b  ct WhereClause {
1070: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1080: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1090: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
10a0: 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53  t */.  ExprMaskS
10b0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
10c0: 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61  /* Mapping of ta
10d0: 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f 20 62  ble indices to b
10e0: 69 74 6d 61 73 6b 73 20 2a 2f 0a 20 20 69 6e 74  itmasks */.  int
10f0: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
1100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1110: 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  of terms */.  in
1120: 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
1130: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1140: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
1150: 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  [] */.  WhereTer
1160: 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  m *a;           
1170: 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73   /* Each a[] des
1180: 63 72 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66  cribes a term of
1190: 20 74 68 65 20 57 48 45 52 45 20 63 6c 75 61 73   the WHERE cluas
11a0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
11b0: 20 61 53 74 61 74 69 63 5b 31 30 5d 3b 20 20 20   aStatic[10];   
11c0: 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69  /* Initial stati
11d0: 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20  c space for a[] 
11e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
11f0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1200: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1210: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
1220: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
1230: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
1240: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
1250: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
1260: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
1270: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
1280: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
1290: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
12a0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
12b0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
12c0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
12d0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
12e0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
12f0: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
1300: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
1310: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
1320: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
1330: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
1340: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
1350: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
1360: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
1370: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
1380: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
1390: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
13a0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
13b0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
13c0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
13d0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
13e0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
13f0: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
1400: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
1410: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
1420: 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74  * If ExprMaskSet
1430: 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61  .ix[A]==B it mea
1440: 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74 68  ns that The A-th
1450: 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73   bit of a Bitmas
1460: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  k.** corresponds
1470: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1480: 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68  ber B.  The A-th
1490: 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73   bit of a bitmas
14a0: 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a  k is 1<<A..**.**
14b0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
14c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
14d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  e expression use
14e0: 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20  d these VDBE.** 
14f0: 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20  cursors:  4, 5, 
1500: 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20  8, 29, 57, 73.  
1510: 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61  Then the  ExprMa
1520: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a  skSet structure.
1530: 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f  ** would map tho
1540: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
1550: 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68  s into bits 0 th
1560: 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e  rough 5..**.** N
1570: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70  ote that the map
1580: 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  ping is not nece
1590: 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e  ssarily ordered.
15a0: 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65    In the example
15b0: 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d  .** above, the m
15c0: 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20  apping might go 
15d0: 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33  like this:  4->3
15e0: 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39  , 5->1, 8->2, 29
15f0: 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37  ->0,.** 57->5, 7
1600: 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66  3->4.  Or one of
1610: 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69   719 other combi
1620: 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65  nations might be
1630: 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65   used. It.** doe
1640: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74  s not really mat
1650: 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d  ter.  What is im
1660: 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20  portant is that 
1670: 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a  sparse cursor.**
1680: 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74   numbers all get
1690: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74   mapped into bit
16a0: 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65   numbers that be
16b0: 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63  gin with 0 and c
16c0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70  ontain.** no gap
16d0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 78 70  s..*/.struct Exp
16e0: 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e 74  rMaskSet {.  int
16f0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1710: 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65 64  mber of assigned
1720: 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20 2a   cursor values *
1730: 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a 65 6f  /.  int ix[sizeo
1740: 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20 20  f(Bitmask)*8];  
1750: 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73 69    /* Cursor assi
1760: 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69 74  gned to each bit
1770: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42   */.};.../*.** B
1780: 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65 20  itmasks for the 
1790: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
17a0: 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65 20  ndices are able 
17b0: 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e 0a  to exploit.  An.
17c0: 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61  ** OR-ed combina
17d0: 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61  tion of these va
17e0: 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64  lues can be used
17f0: 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20   when searching 
1800: 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e 20  for.** terms in 
1810: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
1820: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
1830: 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65  IN     1.#define
1840: 20 57 4f 5f 45 51 20 20 20 20 20 32 0a 23 64 65   WO_EQ     2.#de
1850: 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20 28  fine WO_LT     (
1860: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b  WO_EQ<<(TK_LT-TK
1870: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
1880: 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _LE     (WO_EQ<<
1890: 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a 23  (TK_LE-TK_EQ)).#
18a0: 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20 20  define WO_GT    
18b0: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d   (WO_EQ<<(TK_GT-
18c0: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
18d0: 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45 51  WO_GE     (WO_EQ
18e0: 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29 29  <<(TK_GE-TK_EQ))
18f0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54 43  .#define WO_MATC
1900: 48 20 20 36 34 0a 23 64 65 66 69 6e 65 20 57 4f  H  64.#define WO
1910: 5f 49 53 4e 55 4c 4c 20 31 32 38 0a 0a 2f 2a 0a  _ISNULL 128../*.
1920: 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20 66 6c 61  ** Value for fla
1930: 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 62  gs returned by b
1940: 65 73 74 49 6e 64 65 78 28 29 2e 20 20 0a 2a 2a  estIndex().  .**
1950: 0a 2a 2a 20 54 68 65 20 6c 65 61 73 74 20 73 69  .** The least si
1960: 67 6e 69 66 69 63 61 6e 74 20 62 79 74 65 20 69  gnificant byte i
1970: 73 20 72 65 73 65 72 76 65 64 20 61 73 20 61 20  s reserved as a 
1980: 6d 61 73 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c  mask for WO_ val
1990: 75 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68  ues above..** Th
19a0: 65 20 57 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61  e WhereLevel.fla
19b0: 67 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61  gs field is usua
19c0: 6c 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e  lly set to WO_IN
19d0: 7c 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_EQ|WO_ISNULL
19e0: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
19f0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
1a00: 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65  ht table of a le
1a10: 66 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65  ft join, WhereLe
1a20: 76 65 6c 2e 66 6c 61 67 73 0a 2a 2a 20 69 73 20  vel.flags.** is 
1a30: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
1a40: 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c 65  EQ.  The WhereLe
1a50: 76 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c 64 20  vel.flags field 
1a60: 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64  can then be used
1a70: 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20   as.** the "op" 
1a80: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e  parameter to fin
1a90: 64 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72  dTerm when we ar
1aa0: 65 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61  e resolving equa
1ab0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1ac0: 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73  ..** ISNULL cons
1ad0: 74 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65  traints will the
1ae0: 6e 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e  n not be used on
1af0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1b00: 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f   of a left.** jo
1b10: 69 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31  in.  Tickets #21
1b20: 37 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f  77 and #2189..*/
1b30: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52  .#define WHERE_R
1b40: 4f 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30  OWID_EQ     0x00
1b50: 30 31 30 30 20 20 20 2f 2a 20 72 6f 77 69 64 3d  0100   /* rowid=
1b60: 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
1b70: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1b80: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  e WHERE_ROWID_RA
1b90: 4e 47 45 20 20 30 78 30 30 30 32 30 30 20 20 20  NGE  0x000200   
1ba0: 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61 6e  /* rowid<EXPR an
1bb0: 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52 20  d/or rowid>EXPR 
1bc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
1bd0: 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30 78  _COLUMN_EQ    0x
1be0: 30 30 31 30 30 30 20 20 20 2f 2a 20 78 3d 45 58  001000   /* x=EX
1bf0: 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  PR or x IN (...)
1c00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1c10: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30  E_COLUMN_RANGE 0
1c20: 78 30 30 32 30 30 30 20 20 20 2f 2a 20 78 3c 45  x002000   /* x<E
1c30: 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50  XPR and/or x>EXP
1c40: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
1c50: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20  RE_COLUMN_IN    
1c60: 30 78 30 30 34 30 30 30 20 20 20 2f 2a 20 78 20  0x004000   /* x 
1c70: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1c80: 69 6e 65 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ine WHERE_TOP_LI
1c90: 4d 49 54 20 20 20 20 30 78 30 31 30 30 30 30 20  MIT    0x010000 
1ca0: 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78    /* x<EXPR or x
1cb0: 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  <=EXPR constrain
1cc0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
1cd0: 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20  RE_BTM_LIMIT    
1ce0: 30 78 30 32 30 30 30 30 20 20 20 2f 2a 20 78 3e  0x020000   /* x>
1cf0: 45 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20  EXPR or x>=EXPR 
1d00: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64  constraint */.#d
1d10: 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f  efine WHERE_IDX_
1d20: 4f 4e 4c 59 20 20 20 20 20 30 78 30 38 30 30 30  ONLY     0x08000
1d30: 30 20 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  0   /* Use index
1d40: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
1d50: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
1d60: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
1d70: 20 30 78 31 30 30 30 30 30 20 20 20 2f 2a 20 4f   0x100000   /* O
1d80: 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65 61  utput will appea
1d90: 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72 64  r in correct ord
1da0: 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  er */.#define WH
1db0: 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20 20  ERE_REVERSE     
1dc0: 20 30 78 32 30 30 30 30 30 20 20 20 2f 2a 20 53   0x200000   /* S
1dd0: 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1de0: 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rder */.#define 
1df0: 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20 20 20  WHERE_UNIQUE    
1e00: 20 20 20 30 78 34 30 30 30 30 30 20 20 20 2f 2a     0x400000   /*
1e10: 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d 6f 72 65   Selects no more
1e20: 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f   than one row */
1e30: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 56  .#define WHERE_V
1e40: 49 52 54 55 41 4c 54 41 42 4c 45 20 30 78 38 30  IRTUALTABLE 0x80
1e50: 30 30 30 30 20 20 20 2f 2a 20 55 73 65 20 76 69  0000   /* Use vi
1e60: 72 74 75 61 6c 2d 74 61 62 6c 65 20 70 72 6f 63  rtual-table proc
1e70: 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  essing */../*.**
1e80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
1e90: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
1ea0: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
1eb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ec0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1ed0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
1ee0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pWC,        /* 
1ef0: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
1f00: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
1f10: 64 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  d */.  Parse *pP
1f20: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1f30: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1f40: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1f50: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
1f60: 74 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20  t    /* Mapping 
1f70: 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64 69 63  from table indic
1f80: 65 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a  es to bitmasks *
1f90: 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61 72  /.){.  pWC->pPar
1fa0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
1fb0: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d 20 70  WC->pMaskSet = p
1fc0: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43 2d 3e  MaskSet;.  pWC->
1fd0: 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43  nTerm = 0;.  pWC
1fe0: 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  ->nSlot = ArrayS
1ff0: 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63  ize(pWC->aStatic
2000: 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57  );.  pWC->a = pW
2010: 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f  C->aStatic;.}../
2020: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
2030: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
2040: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68  ructure.  The Wh
2050: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2060: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73  ure.** itself is
2070: 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69   not freed.  Thi
2080: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2090: 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72   inverse of wher
20a0: 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a  eClauseInit()..*
20b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
20c0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
20d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
20e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
20f0: 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c  reTerm *a;.  sql
2100: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
2110: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f  pParse->db;.  fo
2120: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
2130: 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30  , a=pWC->a; i>=0
2140: 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20  ; i--, a++){.   
2150: 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26 20   if( a->flags & 
2160: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
2170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2180: 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70  rDelete(db, a->p
2190: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
21a0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
21b0: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
21c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21d0: 28 64 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20  (db, pWC->a);.  
21e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
21f0: 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20   new entries to 
2200: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
2210: 73 74 72 75 63 74 75 72 65 2e 20 20 49 6e 63 72  structure.  Incr
2220: 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  ease the allocat
2230: 65 64 0a 2a 2a 20 73 70 61 63 65 20 61 73 20 6e  ed.** space as n
2240: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
2250: 49 66 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  If the flags arg
2260: 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73 20 54  ument includes T
2270: 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ERM_DYNAMIC, the
2280: 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  n responsibility
2290: 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e 67 20  .** for freeing 
22a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
22b0: 20 69 73 20 61 73 73 75 6d 65 64 20 62 79 20 74   is assumed by t
22c0: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f  he WhereClause o
22d0: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 57 41 52  bject..**.** WAR
22e0: 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74  NING:  This rout
22f0: 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f  ine might reallo
2300: 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75  cate the space u
2310: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
2320: 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c  WhereTerms.  All
2330: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65   pointers to Whe
2340: 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62  reTerms should b
2350: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66  e invalidated af
2360: 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  ter.** calling t
2370: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75  his routine.  Su
2380: 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20  ch pointers may 
2390: 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  be reinitialized
23a0: 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a   by referencing.
23b0: 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20  ** the pWC->a[] 
23c0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
23d0: 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65   int whereClause
23e0: 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75  Insert(WhereClau
23f0: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
2400: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2410: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2420: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
2430: 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70  f( pWC->nTerm>=p
2440: 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20  WC->nSlot ){.   
2450: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64   WhereTerm *pOld
2460: 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73   = pWC->a;.    s
2470: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43  qlite3 *db = pWC
2480: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
2490: 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74    pWC->a = sqlit
24a0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
24b0: 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  , sizeof(pWC->a[
24c0: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
24d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
24e0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >a==0 ){.      i
24f0: 66 28 20 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  f( flags & TERM_
2500: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
2510: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2520: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
2530: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
2540: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
2550: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
2560: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
2570: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
2580: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
2590: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
25a0: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
25b0: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
25c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
25d0: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
25e0: 57 43 2d 3e 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a  WC->nSlot *= 2;.
25f0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
2600: 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d  WC->a[idx = pWC-
2610: 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e  >nTerm];.  pWC->
2620: 6e 54 65 72 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d  nTerm++;.  pTerm
2630: 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70  ->pExpr = p;.  p
2640: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  Term->flags = fl
2650: 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57  ags;.  pTerm->pW
2660: 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d  C = pWC;.  pTerm
2670: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
2680: 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a    return idx;.}.
2690: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26a0: 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73  ine identifies s
26b0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
26c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26d0: 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20  e where.** each 
26e0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
26f0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68   separated by th
2700: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f  e AND operator o
2710: 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
2720: 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69  operator specifi
2730: 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72  ed in the op par
2740: 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65  ameter.  The Whe
2750: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2760: 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  re.** is filled 
2770: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
2780: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
2790: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
27a0: 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61  *.**    WHERE  a
27b0: 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f  =='hello' AND co
27c0: 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20  alesce(b,11)<10 
27d0: 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20  AND (c+12!=d OR 
27e0: 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20  c==22).**       
27f0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20      \________/  
2800: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
2810: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
2820: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
2830: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30            slot[0
2840: 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  ]            slo
2850: 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[1]            
2860: 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a     slot[2].**.**
2870: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   The original WH
2880: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45  ERE clause in pE
2890: 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64  xpr is unaltered
28a0: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
28b0: 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d  ine.** does is m
28c0: 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69  ake slot[] entri
28d0: 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73  es point to subs
28e0: 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20  tructure within 
28f0: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pExpr..**.** In 
2900: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
2910: 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65  tence and in the
2920: 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b   diagram, "slot[
2930: 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20  ]" refers to.** 
2940: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
2950: 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73  a[] array.  This
2960: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
2970: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
2980: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
2990: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
29a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
29b0: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
29c0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
29d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
29e0: 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 45 78 70   op){.  if( pExp
29f0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
2a00: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2a10: 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43  op ){.    whereC
2a20: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
2a30: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65   pExpr, 0);.  }e
2a40: 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70  lse{.    whereSp
2a50: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
2a60: 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20  pLeft, op);.    
2a70: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
2a80: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
2a90: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
2aa0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65   Initialize an e
2ab0: 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
2ac0: 65 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  et.*/.#define in
2ad0: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65  itMaskSet(P)  me
2ae0: 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f  mset(P, 0, sizeo
2af0: 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  f(*P))../*.** Re
2b00: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2b10: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2b20: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2b30: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
2b40: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2b50: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
2b60: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
2b70: 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  sk(ExprMaskSet *
2b80: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
2b90: 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b  ursor){.  int i;
2ba0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
2bb0: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
2bc0: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
2bd0: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
2be0: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
2bf0: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
2c00: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
2c10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2c20: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
2c30: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
2c40: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
2c50: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
2c60: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
2c70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
2c80: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
2c90: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
2ca0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
2cb0: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
2cc0: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
2cd0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2ce0: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
2cf0: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
2d00: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
2d10: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
2d20: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
2d30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2d40: 72 65 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61  reateMask(ExprMa
2d50: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2d60: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2d70: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
2d80: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2d90: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2da0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2db0: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2dc0: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2dd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2de0: 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76   walks (recursiv
2df0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
2e00: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
2e10: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
2e20: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
2e30: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
2e40: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
2e50: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
2e60: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
2e70: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2e80: 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c  to work, the cal
2e90: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
2ea0: 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  st have.** previ
2eb0: 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71  ously invoked sq
2ec0: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
2ed0: 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65  Names() on the e
2ee0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a  xpression.  See.
2ef0: 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ** the header co
2f00: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
2f10: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
2f20: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2f30: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
2f40: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
2f50: 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b  () routines look
2f60: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  s for column nam
2f70: 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74  es and.** sets t
2f80: 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20  heir opcodes to 
2f90: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
2fa0: 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20  eir Expr.iTable 
2fb0: 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65  fields to.** the
2fc0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
2fd0: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
2fe0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2ff0: 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74  just has to.** t
3000: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72  ranslate the cur
3010: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
3020: 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
3030: 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68  and OR all.** th
3040: 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74  e bitmasks toget
3050: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  her..*/.static B
3060: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
3070: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
3080: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
3090: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
30a0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
30b0: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
30c0: 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  Set*, Select*);.
30d0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
30e0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 45 78  xprTableUsage(Ex
30f0: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
3100: 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  Set, Expr *p){. 
3110: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
3120: 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
3130: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
3140: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
3150: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67   ){.    mask = g
3160: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
3170: 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20   p->iTable);.   
3180: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20   return mask;.  
3190: 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54  }.  mask = exprT
31a0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
31b0: 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  et, p->pRight);.
31c0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
31d0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
31e0: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
31f0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
3200: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
3210: 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  Set, p->pList);.
3220: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
3230: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
3240: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 53 65 6c  MaskSet, p->pSel
3250: 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  ect);.  return m
3260: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
3270: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
3280: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
3290: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
32a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
32b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
32c0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
32d0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
32e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
32f0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3300: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  .      mask |= e
3310: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
3320: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
3330: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
3340: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
3350: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
3360: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
3370: 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d  TableUsage(ExprM
3380: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
3390: 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20  , Select *pS){. 
33a0: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
33b0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29  0;.  while( pS )
33c0: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
33d0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
33e0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
33f0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
3400: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
3410: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3420: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
3430: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3440: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3450: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
3460: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
3470: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
3480: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
3490: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
34a0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
34b0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
34c0: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  S->pHaving);.   
34d0: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
34e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
34f0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
3500: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
3510: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
3520: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
3530: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
3540: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
3550: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
3560: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
3570: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
3580: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
3590: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
35a0: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
35b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35c0: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
35d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
35e0: 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47  GT>TK_EQ && TK_G
35f0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
3600: 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51  ert( TK_LT>TK_EQ
3610: 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20   && TK_LT<TK_GE 
3620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
3630: 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LE>TK_EQ && TK_L
3640: 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  E<TK_GE );.  ass
3650: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45  ert( TK_GE==TK_E
3660: 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Q+4 );.  return 
3670: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70  op==TK_IN || (op
3680: 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54  >=TK_EQ && op<=T
3690: 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_GE) || op==TK_
36a0: 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ISNULL;.}../*.**
36b0: 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74   Swap two object
36c0: 73 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a 2f 0a  s of type T..*/.
36d0: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
36e0: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
36f0: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
3700: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
3710: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
3720: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
3730: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
3740: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
3750: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
3760: 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20   X"..**.** If a 
3770: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
3780: 63 65 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  ce is associated
3790: 20 77 69 74 68 20 65 69 74 68 65 72 20 74 68 65   with either the
37a0: 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a   left or right.*
37b0: 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  * side of the co
37c0: 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d  mparison, it rem
37d0: 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ains associated 
37e0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 69  with the same si
37f0: 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  de after.** the 
3800: 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20  commutation. So 
3810: 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "Y collate NOCAS
3820: 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20  E op X" becomes 
3830: 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e  .** "X collate N
3840: 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69  OCASE op Y". Thi
3850: 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e 79  s is because any
3860: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
3870: 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65  nce on.** the le
3880: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
3890: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65  a comparison ove
38a0: 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61  rrides any colla
38b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a  tion sequence .*
38c0: 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  * attached to th
38d0: 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65  e right. For the
38e0: 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65   same reason the
38f0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66   EP_ExpCollate f
3900: 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  lag.** is not co
3910: 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mmuted..*/.stati
3920: 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75  c void exprCommu
3930: 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  te(Expr *pExpr){
3940: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
3950: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
3960: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
3970: 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20  Collate);.  u16 
3980: 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72  expLeft = (pExpr
3990: 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26  ->pLeft->flags &
39a0: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
39b0: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
39c0: 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20  edOp(pExpr->op) 
39d0: 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
39e0: 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28 43 6f  _IN );.  SWAP(Co
39f0: 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70 52  llSeq*,pExpr->pR
3a00: 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78 70  ight->pColl,pExp
3a10: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 29  r->pLeft->pColl)
3a20: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
3a30: 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70  t->flags = (pExp
3a40: 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  r->pRight->flags
3a50: 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74   & ~EP_ExpCollat
3a60: 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20 20  e) | expLeft;.  
3a70: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
3a80: 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c  ags = (pExpr->pL
3a90: 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50  eft->flags & ~EP
3aa0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65  _ExpCollate) | e
3ab0: 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50 28  xpRight;.  SWAP(
3ac0: 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69  Expr*,pExpr->pRi
3ad0: 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  ght,pExpr->pLeft
3ae0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
3af0: 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op>=TK_GT ){.   
3b00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
3b10: 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61  TK_GT+2 );.    a
3b20: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
3b30: 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _LE+2 );.    ass
3b40: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
3b50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3b60: 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20  TK_GT<TK_LE );. 
3b70: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3b80: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70  ->op>=TK_GT && p
3b90: 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20  Expr->op<=TK_GE 
3ba0: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
3bb0: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54   = ((pExpr->op-T
3bc0: 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a  K_GT)^2)+TK_GT;.
3bd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    }.}../*.** Tra
3be0: 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78  nslate from TK_x
3bf0: 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f  x operator to WO
3c00: 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a  _xx bitmask..*/.
3c10: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72 61  static int opera
3c20: 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b  torMask(int op){
3c30: 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73 65  .  int c;.  asse
3c40: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  rt( allowedOp(op
3c50: 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  ) );.  if( op==T
3c60: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20  K_IN ){.    c = 
3c70: 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_IN;.  }else i
3c80: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
3c90: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
3ca0: 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  SNULL;.  }else{.
3cb0: 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c 28      c = WO_EQ<<(
3cc0: 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20  op-TK_EQ);.  }. 
3cd0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3ce0: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
3cf0: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
3d00: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
3d10: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
3d20: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
3d30: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
3d40: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3d50: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
3d60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3d70: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
3d80: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
3d90: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
3da0: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
3db0: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
3dc0: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
3dd0: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
3de0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 65   Search for a te
3df0: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
3e00: 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 6f  clause that is o
3e10: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
3e20: 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68  p> <expr>".** wh
3e30: 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65 72  ere X is a refer
3e40: 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f 6c  ence to the iCol
3e50: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75  umn of table iCu
3e60: 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e  r and <op> is on
3e70: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78  e of.** the WO_x
3e80: 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65 73  x operator codes
3e90: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
3ea0: 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 0a  e op parameter..
3eb0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
3ec0: 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d 2e  ter to the term.
3ed0: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
3ee0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
3ef0: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69  ic WhereTerm *fi
3f00: 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43  ndTerm(.  WhereC
3f10: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
3f20: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3f30: 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  use to be search
3f40: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ed */.  int iCur
3f50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3f60: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
3f70: 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  f LHS */.  int i
3f80: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
3f90: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
3fa0: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69  r of LHS */.  Bi
3fb0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
3fc0: 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20      /* RHS must 
3fd0: 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68  not overlap with
3fe0: 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20   this mask */.  
3ff0: 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20 20  u16 op,         
4000: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
4010: 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65   WO_xx values de
4020: 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f  scribing operato
4030: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
4040: 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx           /* 
4050: 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  Must be compatib
4060: 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64  le with this ind
4070: 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ex, if not NULL 
4080: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
4090: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
40a0: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  k;.  assert( iCu
40b0: 72 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 54  r>=0 );.  for(pT
40c0: 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70 57  erm=pWC->a, k=pW
40d0: 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d  C->nTerm; k; k--
40e0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
40f0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
4100: 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20  ursor==iCur.    
4110: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72     && (pTerm->pr
4120: 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52  ereqRight & notR
4130: 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20 20  eady)==0.       
4140: 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f  && pTerm->leftCo
4150: 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20  lumn==iColumn.  
4160: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
4170: 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21  eOperator & op)!
4180: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
4190: 69 66 28 20 70 49 64 78 20 26 26 20 70 54 65 72  if( pIdx && pTer
41a0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f  m->eOperator!=WO
41b0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
41c0: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
41d0: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
41e0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
41f0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ll;.        char
4200: 20 69 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20   idxaff;.       
4210: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
4220: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
4230: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  pWC->pParse;..  
4240: 20 20 20 20 20 20 69 64 78 61 66 66 20 3d 20 70        idxaff = p
4250: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
4260: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
4270: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ity;.        if(
4280: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
4290: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78  finityOk(pX, idx
42a0: 61 66 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  aff) ) continue;
42b0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67  ..        /* Fig
42c0: 75 72 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c  ure out the coll
42d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72  ation sequence r
42e0: 65 71 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20  equired from an 
42f0: 69 6e 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20  index for.      
4300: 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73    ** it to be us
4310: 65 66 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73  eful for optimis
4320: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ing expression p
4330: 58 2e 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20  X. Store this.  
4340: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69        ** value i
4350: 6e 20 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c  n variable pColl
4360: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4370: 20 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e       assert(pX->
4380: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
4390: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
43a0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
43b0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
43c0: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
43d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
43e0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
43f0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
4400: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
4410: 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  l;.        }..  
4420: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70        for(j=0; p
4430: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
4440: 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  !=iColumn; j++){
4450: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
4460: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43  EVER(j>=pIdx->nC
4470: 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20  olumn) ) return 
4480: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
4490: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
44a0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
44b0: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
44c0: 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75  ll[j]) ) continu
44d0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
44e0: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
44f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4500: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
4510: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
4520: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4530: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
4540: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
4550: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  int);../*.** Cal
4560: 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e  l exprAnalyze on
4570: 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20   all terms in a 
4580: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
4590: 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  **.**.*/.static 
45a0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
45b0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
45c0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
45d0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
45e0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
45f0: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
4600: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
4610: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
4620: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
4630: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
4640: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
4650: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
4660: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
4670: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
4680: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4690: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
46a0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
46b0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
46c0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
46d0: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
46e0: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
46f0: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
4700: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
4710: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
4720: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
4730: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
4740: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
4750: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
4760: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
4770: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
4780: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
4790: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
47a0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
47b0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
47c0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
47d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
47e0: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73 71 6c 69  keOrGlob(.  sqli
47f0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
4800: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
4810: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
4820: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
4830: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
4840: 20 20 69 6e 74 20 2a 70 6e 50 61 74 74 65 72 6e    int *pnPattern
4850: 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ,   /* Number of
4860: 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70 72   non-wildcard pr
4870: 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73 20  efix characters 
4880: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f 6d  */.  int *pisCom
4890: 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20 69  plete, /* True i
48a0: 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64 63  f the only wildc
48b0: 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65 20  ard is % in the 
48c0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 2a  last character *
48d0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73 65  /.  int *pnoCase
48e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
48f0: 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65 71   uppercase is eq
4900: 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77 65  uivalent to lowe
4910: 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  rcase */.){.  co
4920: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45  nst char *z;.  E
4930: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
4940: 65 66 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  eft;.  ExprList 
4950: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 63 2c  *pList;.  int c,
4960: 20 63 6e 74 3b 0a 20 20 63 68 61 72 20 77 63 5b   cnt;.  char wc[
4970: 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  3];.  CollSeq *p
4980: 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20 21 73 71  Coll;..  if( !sq
4990: 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74  lite3IsLikeFunct
49a0: 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70  ion(db, pExpr, p
49b0: 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20  noCase, wc) ){. 
49c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
49d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
49e0: 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f  BCDIC.  if( *pno
49f0: 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Case ) return 0;
4a00: 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20  .#endif.  pList 
4a10: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
4a20: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
4a30: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
4a40: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d  if( pRight->op!=
4a50: 54 4b 5f 53 54 52 49 4e 47 0a 20 20 20 26 26 20  TK_STRING.   && 
4a60: 28 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  (pRight->op!=TK_
4a70: 52 45 47 49 53 54 45 52 20 7c 7c 20 70 52 69 67  REGISTER || pRig
4a80: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 54 4b 5f  ht->iColumn!=TK_
4a90: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 72  STRING) ){.    r
4aa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4ab0: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
4ac0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
4ad0: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
4ae0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
4af0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  rn 0;.  }.  pCol
4b00: 6c 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  l = pLeft->pColl
4b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
4b20: 6c 21 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 69  l!=0 || pLeft->i
4b30: 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20  Column==-1 );.  
4b40: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  if( pColl==0 ){.
4b50: 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74      /* No collat
4b60: 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20 66  ion is defined f
4b70: 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 20 20 55  or the ROWID.  U
4b80: 73 65 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  se the default. 
4b90: 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64  */.    pColl = d
4ba0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
4bb0: 7d 0a 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e  }.  if( (pColl->
4bc0: 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c  type!=SQLITE_COL
4bd0: 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f  L_BINARY || *pno
4be0: 43 61 73 65 29 20 26 26 0a 20 20 20 20 20 20 28  Case) &&.      (
4bf0: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
4c00: 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20  ITE_COLL_NOCASE 
4c10: 7c 7c 20 21 2a 70 6e 6f 43 61 73 65 29 20 29 7b  || !*pnoCase) ){
4c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4c30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
4c40: 6f 74 65 45 78 70 72 28 64 62 2c 20 70 52 69 67  oteExpr(db, pRig
4c50: 68 74 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  ht);.  z = (char
4c60: 20 2a 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e   *)pRight->token
4c70: 2e 7a 3b 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20  .z;.  cnt = 0;. 
4c80: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 77 68   if( z ){.    wh
4c90: 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  ile( (c=z[cnt])!
4ca0: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
4cb0: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
4cc0: 3d 77 63 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b  =wc[2] ){ cnt++;
4cd0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e 74   }.  }.  if( cnt
4ce0: 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29  ==0 || 255==(u8)
4cf0: 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65  z[cnt] ){.    re
4d00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  turn 0;.  }.  *p
4d10: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63  isComplete = z[c
4d20: 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  nt]==wc[0] && z[
4d30: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e  cnt+1]==0;.  *pn
4d40: 50 61 74 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20  Pattern = cnt;. 
4d50: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
4d60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4d70: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
4d80: 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TION */...#ifnde
4d90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4da0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
4db0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
4dc0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
4dd0: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
4de0: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
4df0: 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20     column MATCH 
4e00: 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  expr.**.** If it
4e10: 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20   is then return 
4e20: 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72  TRUE.  If not, r
4e30: 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a  eturn FALSE..*/.
4e40: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74  static int isMat
4e50: 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78  chOfColumn(.  Ex
4e60: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f  pr *pExpr      /
4e70: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
4e80: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ession */.){.  E
4e90: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
4ea0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
4eb0: 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b  !=TK_FUNCTION ){
4ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4ed0: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
4ee0: 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20  token.n!=5 ||.  
4ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 4e       sqlite3StrN
4f00: 49 43 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72  ICmp((const char
4f10: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
4f20: 2c 22 6d 61 74 63 68 22 2c 35 29 21 3d 30 20 29  ,"match",5)!=0 )
4f30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4f40: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
4f50: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
4f60: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ( pList->nExpr!=
4f70: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
4f80: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  0;.  }.  if( pLi
4f90: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e  st->a[1].pExpr->
4fa0: 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20  op != TK_COLUMN 
4fb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4fc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
4fd0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
4fe0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4ff0: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
5000: 49 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70  If the pBase exp
5010: 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
5020: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
5030: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a  USING clause of.
5040: 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20  ** a join, then 
5050: 74 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70  transfer the app
5060: 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67  ropriate marking
5070: 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65  s over to derive
5080: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
5090: 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61  d transferJoinMa
50a0: 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65  rkings(Expr *pDe
50b0: 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61  rived, Expr *pBa
50c0: 73 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d  se){.  pDerived-
50d0: 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d  >flags |= pBase-
50e0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d  >flags & EP_From
50f0: 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64  Join;.  pDerived
5100: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
5110: 65 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68  e = pBase->iRigh
5120: 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23  tJoinTable;.}..#
5130: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5140: 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
5150: 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66  IZATION) && !def
5160: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5170: 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a  _SUBQUERY)./*.**
5180: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5190: 74 68 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f  the given term o
51a0: 66 20 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63  f an OR clause c
51b0: 61 6e 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0a  an be converted.
51c0: 2a 2a 20 69 6e 74 6f 20 61 6e 20 49 4e 20 63 6c  ** into an IN cl
51d0: 61 75 73 65 2e 20 20 54 68 65 20 69 43 75 72 73  ause.  The iCurs
51e0: 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 20 64  or and iColumn d
51f0: 65 66 69 6e 65 20 74 68 65 20 6c 65 66 74 2d 68  efine the left-h
5200: 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74  and.** side of t
5210: 68 65 20 49 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a  he IN clause..**
5220: 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 78 74 20  .** The context 
5230: 69 73 20 74 68 61 74 20 77 65 20 68 61 76 65 20  is that we have 
5240: 6d 75 6c 74 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e  multiple OR-conn
5250: 65 63 74 65 64 20 65 71 75 61 6c 69 74 79 20 74  ected equality t
5260: 65 72 6d 73 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  erms.** like thi
5270: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
5280: 20 20 20 61 3d 3c 65 78 70 72 31 3e 20 4f 52 20     a=<expr1> OR 
5290: 20 61 3d 3c 65 78 70 72 32 3e 20 4f 52 20 62 3d   a=<expr2> OR b=
52a0: 3c 65 78 70 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a  <expr3>  OR ....
52b0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 4f 72 54 65 72  **.** The pOrTer
52c0: 6d 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  m input to this 
52d0: 72 6f 75 74 69 6e 65 20 63 6f 72 72 65 73 70 6f  routine correspo
52e0: 6e 64 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nds to a single 
52f0: 74 65 72 6d 20 6f 66 0a 2a 2a 20 74 68 69 73 20  term of.** this 
5300: 4f 52 20 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f  OR clause.  In o
5310: 72 64 65 72 20 66 6f 72 20 74 68 65 20 74 65 72  rder for the ter
5320: 6d 20 74 6f 20 62 65 20 61 20 63 61 6e 64 69 64  m to be a candid
5330: 61 74 65 20 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65  ate for.** conve
5340: 72 73 69 6f 6e 20 74 6f 20 61 6e 20 49 4e 20 6f  rsion to an IN o
5350: 70 65 72 61 74 6f 72 2c 20 74 68 65 20 66 6f 6c  perator, the fol
5360: 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62 65 20 74  lowing must be t
5370: 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  rue:.**.**     *
5380: 20 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20    The left-hand 
5390: 73 69 64 65 20 6f 66 20 74 68 65 20 74 65 72 6d  side of the term
53a0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 6f 6c   must be the col
53b0: 75 6d 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 20  umn which.**    
53c0: 20 20 20 20 69 73 20 69 64 65 6e 74 69 66 69 65      is identifie
53d0: 64 20 62 79 20 69 43 75 72 73 6f 72 20 61 6e 64  d by iCursor and
53e0: 20 69 43 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20   iColumn..**.** 
53f0: 20 20 20 20 2a 20 20 49 66 20 74 68 65 20 72 69      *  If the ri
5400: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
5410: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
5420: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
5430: 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ies.**        of
5440: 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20   both right and 
5450: 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20  left sides must 
5460: 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  be such that no 
5470: 74 79 70 65 0a 2a 2a 20 20 20 20 20 20 20 20 63  type.**        c
5480: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 72  onversions are r
5490: 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 72  equired on the r
54a0: 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20 23  ight.  (Ticket #
54b0: 32 32 34 39 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62  2249).**.** If b
54c0: 6f 74 68 20 6f 66 20 74 68 65 73 65 20 63 6f 6e  oth of these con
54d0: 64 69 74 69 6f 6e 73 20 61 72 65 20 74 72 75 65  ditions are true
54e0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 72  , then return tr
54f0: 75 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  ue.  Otherwise.*
5500: 2a 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a  * return false..
5510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 72  */.static int or
5520: 54 65 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61  TermIsOptCandida
5530: 74 65 28 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  te(WhereTerm *pO
5540: 72 54 65 72 6d 2c 20 69 6e 74 20 69 43 75 72 73  rTerm, int iCurs
5550: 6f 72 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 29  or, int iColumn)
5560: 7b 0a 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c  {.  int affLeft,
5570: 20 61 66 66 52 69 67 68 74 3b 0a 20 20 61 73 73   affRight;.  ass
5580: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
5590: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
55a0: 3b 0a 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  ;.  if( pOrTerm-
55b0: 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
55c0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
55d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
55e0: 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c  pOrTerm->leftCol
55f0: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn!=iColumn ){.
5600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5610: 7d 0a 20 20 61 66 66 52 69 67 68 74 20 3d 20 73  }.  affRight = s
5620: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
5630: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
5640: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 69 66  r->pRight);.  if
5650: 28 20 61 66 66 52 69 67 68 74 3d 3d 30 20 29 7b  ( affRight==0 ){
5660: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
5670: 20 7d 0a 20 20 61 66 66 4c 65 66 74 20 3d 20 73   }.  affLeft = s
5680: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
5690: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
56a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
56b0: 20 61 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65   affRight!=affLe
56c0: 66 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ft ){.    return
56d0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
56e0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   1;.}../*.** Ret
56f0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
5700: 67 69 76 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e  given term of an
5710: 20 4f 52 20 63 6c 61 75 73 65 20 63 61 6e 20 62   OR clause can b
5720: 65 20 69 67 6e 6f 72 65 64 20 64 75 72 69 6e 67  e ignored during
5730: 0a 2a 2a 20 61 20 63 68 65 63 6b 20 74 6f 20 6d  .** a check to m
5740: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 4f 52 20  ake sure all OR 
5750: 74 65 72 6d 73 20 61 72 65 20 63 61 6e 64 69 64  terms are candid
5760: 61 74 65 73 20 66 6f 72 20 6f 70 74 69 6d 69 7a  ates for optimiz
5770: 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68  ation..** In oth
5780: 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
5790: 20 74 72 75 65 20 69 66 20 61 20 63 61 6c 6c 20   true if a call 
57a0: 74 6f 20 74 68 65 20 6f 72 54 65 72 6d 49 73 4f  to the orTermIsO
57b0: 70 74 43 61 6e 64 69 64 61 74 65 28 29 0a 2a 2a  ptCandidate().**
57c0: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
57d0: 66 61 6c 73 65 20 62 75 74 20 69 74 20 69 73 20  false but it is 
57e0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
57f0: 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 0a   disqualify the.
5800: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ** optimization.
5810: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
5820: 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 70  he original OR p
5830: 68 72 61 73 65 20 77 61 73 20 74 68 69 73 3a 0a  hrase was this:.
5840: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
5850: 61 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f  a=4  OR  a=11  O
5860: 52 20 20 61 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72  R  a=b.**.** Dur
5870: 69 6e 67 20 61 6e 61 6c 79 73 69 73 2c 20 74 68  ing analysis, th
5880: 65 20 74 68 69 72 64 20 74 65 72 6d 20 67 65 74  e third term get
5890: 73 20 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64  s flipped around
58a0: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 0a 2a   and duplicate.*
58b0: 2a 20 73 6f 20 74 68 61 74 20 77 65 20 61 72 65  * so that we are
58c0: 20 6c 65 66 74 20 77 69 74 68 20 74 68 69 73 3a   left with this:
58d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
58e0: 20 61 3d 34 20 20 4f 52 20 20 61 3d 31 31 20 20   a=4  OR  a=11  
58f0: 4f 52 20 20 61 3d 62 20 20 4f 52 20 20 62 3d 61  OR  a=b  OR  b=a
5900: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  .**.** Since the
5910: 20 6c 61 73 74 20 74 77 6f 20 74 65 72 6d 73 20   last two terms 
5920: 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 2c 20  are duplicates, 
5930: 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d  only one of them
5940: 0a 2a 2a 20 68 61 73 20 74 6f 20 71 75 61 6c 69  .** has to quali
5950: 66 79 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  fy in order for 
5960: 74 68 65 20 77 68 6f 6c 65 20 70 68 72 61 73 65  the whole phrase
5970: 20 74 6f 20 71 75 61 6c 69 66 79 2e 20 20 57 68   to qualify.  Wh
5980: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
5990: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
59a0: 20 6b 6e 6f 77 20 74 68 61 74 20 70 4f 72 54 65   know that pOrTe
59b0: 72 6d 20 64 69 64 20 6e 6f 74 20 71 75 61 6c 69  rm did not quali
59c0: 66 79 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  fy..** This rout
59d0: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
59e0: 73 20 74 6f 20 73 65 65 20 69 66 20 70 4f 72 54  s to see if pOrT
59f0: 65 72 6d 20 68 61 73 20 61 20 64 75 70 6c 69 63  erm has a duplic
5a00: 61 74 65 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ate that.** migh
5a10: 74 20 71 75 61 6c 69 66 79 2e 20 20 49 66 20 74  t qualify.  If t
5a20: 68 65 72 65 20 69 73 20 61 20 64 75 70 6c 69 63  here is a duplic
5a30: 61 74 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ate that has not
5a40: 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 64 69 73   yet been.** dis
5a50: 71 75 61 6c 69 66 69 65 64 2c 20 74 68 65 6e 20  qualified, then 
5a60: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 49 66  return true.  If
5a70: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 75   there are no du
5a80: 70 6c 69 63 61 74 65 73 2c 20 6f 72 0a 2a 2a 20  plicates, or.** 
5a90: 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 68 61  the duplicate ha
5aa0: 73 20 61 6c 73 6f 20 62 65 65 6e 20 64 69 73 71  s also been disq
5ab0: 75 61 6c 69 66 69 65 64 2c 20 72 65 74 75 72 6e  ualified, return
5ac0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
5ad0: 63 20 69 6e 74 20 6f 72 54 65 72 6d 48 61 73 4f  c int orTermHasO
5ae0: 6b 44 75 70 6c 69 63 61 74 65 28 57 68 65 72 65  kDuplicate(Where
5af0: 43 6c 61 75 73 65 20 2a 70 4f 72 2c 20 57 68 65  Clause *pOr, Whe
5b00: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 29  reTerm *pOrTerm)
5b10: 7b 0a 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  {.  if( pOrTerm-
5b20: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
5b30: 50 49 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 54  PIED ){.    /* T
5b40: 68 69 73 20 69 73 20 74 68 65 20 6f 72 69 67 69  his is the origi
5b50: 6e 61 6c 20 74 65 72 6d 2e 20 20 54 68 65 20 64  nal term.  The d
5b60: 75 70 6c 69 63 61 74 65 20 69 73 20 74 6f 20 74  uplicate is to t
5b70: 68 65 20 6c 65 66 74 20 68 61 64 0a 20 20 20 20  he left had.    
5b80: 2a 2a 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ** has not yet b
5b90: 65 65 6e 20 61 6e 61 6c 79 7a 65 64 20 61 6e 64  een analyzed and
5ba0: 20 74 68 75 73 20 68 61 73 20 6e 6f 74 20 79 65   thus has not ye
5bb0: 74 20 62 65 65 6e 20 64 69 73 71 75 61 6c 69 66  t been disqualif
5bc0: 69 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ied. */.    retu
5bd0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
5be0: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
5bf0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21  & TERM_VIRTUAL)!
5c00: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4f 72 2d  =0.     && (pOr-
5c10: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
5c20: 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20 54 45 52  ent].flags & TER
5c30: 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20  M_OR_OK)!=0 ){. 
5c40: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
5c50: 64 75 70 6c 69 63 61 74 65 20 74 65 72 6d 2e 20  duplicate term. 
5c60: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 71 75   The original qu
5c70: 61 6c 69 66 69 65 64 20 73 6f 20 74 68 69 73 20  alified so this 
5c80: 6f 6e 65 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  one.    ** does 
5c90: 6e 6f 74 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a  not have to. */.
5ca0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5cb0: 7d 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 65  }.  /* This is e
5cc0: 69 74 68 65 72 20 61 20 73 69 6e 67 6c 65 74 6f  ither a singleto
5cd0: 6e 20 74 65 72 6d 20 6f 72 20 65 6c 73 65 20 69  n term or else i
5ce0: 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  t is a duplicate
5cf0: 20 66 6f 72 0a 20 20 2a 2a 20 77 68 69 63 68 20   for.  ** which 
5d00: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 69 64  the original did
5d10: 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e 20 20 45   not qualify.  E
5d20: 69 74 68 65 72 20 77 61 79 20 77 65 20 61 72 65  ither way we are
5d30: 20 64 6f 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20   done for. */.  
5d40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
5d50: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
5d60: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
5d70: 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  ON && !SQLITE_OM
5d80: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
5d90: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
5da0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5db0: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
5dc0: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
5dd0: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
5de0: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
5df0: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
5e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5e10: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
5e20: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
5e30: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
5e40: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
5e50: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
5e60: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
5e70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
5e80: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
5e90: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
5ea0: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
5eb0: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
5ec0: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
5ed0: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
5ee0: 72 3e 22 2e 20 20 49 66 20 74 68 65 20 65 78 70  r>".  If the exp
5ef0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a  ression is of.**
5f00: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
5f10: 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20  > Y" where both 
5f20: 58 20 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75  X and Y are colu
5f30: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
5f40: 69 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73  iginal.** expres
5f50: 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65  sion is unchange
5f60: 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74  d and a new virt
5f70: 75 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ual expression o
5f80: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59  f the form.** "Y
5f90: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
5fa0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
5fb0: 6c 61 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a  lause and analyz
5fc0: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ed separately..*
5fd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
5fe0: 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63  prAnalyze(.  Src
5ff0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
6000: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
6010: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
6020: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
6030: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
6040: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
6050: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
6060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6070: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d  ndex of the term
6080: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
6090: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72  */.){.  WhereTer
60a0: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 45 78 70 72  m *pTerm;.  Expr
60b0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
60c0: 74 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  t;.  Expr *pExpr
60d0: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  ;.  Bitmask prer
60e0: 65 71 4c 65 66 74 3b 0a 20 20 42 69 74 6d 61 73  eqLeft;.  Bitmas
60f0: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 42  k prereqAll;.  B
6100: 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68  itmask extraRigh
6110: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  t = 0;.  int nPa
6120: 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43  ttern;.  int isC
6130: 6f 6d 70 6c 65 74 65 3b 0a 20 20 69 6e 74 20 6e  omplete;.  int n
6140: 6f 43 61 73 65 3b 0a 20 20 69 6e 74 20 6f 70 3b  oCase;.  int op;
6150: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6160: 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a   = pWC->pParse;.
6170: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6180: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
6190: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
61a0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
61b0: 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  n;.  }.  pTerm =
61c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
61d0: 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  ];.  pMaskSet = 
61e0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20  pWC->pMaskSet;. 
61f0: 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e   pExpr = pTerm->
6200: 70 45 78 70 72 3b 0a 20 20 70 72 65 72 65 71 4c  pExpr;.  prereqL
6210: 65 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55  eft = exprTableU
6220: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
6230: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
6240: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
6250: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20    if( op==TK_IN 
6260: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
6270: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
6280: 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  );.    pTerm->pr
6290: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
62a0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
62b0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
62c0: 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20  pList).         
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62e0: 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   | exprSelectTab
62f0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6300: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
6310: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
6320: 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
6330: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
6340: 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65  qRight = 0;.  }e
6350: 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e  lse{.    pTerm->
6360: 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78  prereqRight = ex
6370: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
6380: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52  skSet, pExpr->pR
6390: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65  ight);.  }.  pre
63a0: 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62  reqAll = exprTab
63b0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
63c0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
63d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
63e0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
63f0: 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  in) ){.    Bitma
6400: 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28 70  sk x = getMask(p
6410: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
6420: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29  iRightJoinTable)
6430: 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20  ;.    prereqAll 
6440: 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61 52  |= x;.    extraR
6450: 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20  ight = x-1;  /* 
6460: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
6470: 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64 20  may not be used 
6480: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20 20  with an index.  
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20       ** on left 
64b0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
64c0: 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23 33  JOIN.  Ticket #3
64d0: 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65  015 */.  }.  pTe
64e0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  rm->prereqAll = 
64f0: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65  prereqAll;.  pTe
6500: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
6510: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50   -1;.  pTerm->iP
6520: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54  arent = -1;.  pT
6530: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
6540: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65   0;.  if( allowe
6550: 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65 72  dOp(op) && (pTer
6560: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
6570: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
6580: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
6590: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
65a0: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  t;.    Expr *pRi
65b0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
65c0: 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ght;.    if( pLe
65d0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
65e0: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
65f0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
6600: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
6610: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
6620: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
6630: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54  Column;.      pT
6640: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
6650: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70   operatorMask(op
6660: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6670: 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68   pRight && pRigh
6680: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
6690: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
66a0: 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  erm *pNew;.     
66b0: 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20   Expr *pDup;.   
66c0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
66d0: 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20  ftCursor>=0 ){. 
66e0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
66f0: 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20  w;.        pDup 
6700: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
6710: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
6720: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
6730: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6750: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
6760: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
6770: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  turn;.        }.
6780: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
6790: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
67a0: 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45  rt(pWC, pDup, TE
67b0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
67c0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
67d0: 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20    if( idxNew==0 
67e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
67f0: 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61    pNew = &pWC->a
6800: 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
6810: 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20    pNew->iParent 
6820: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
6830: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
6840: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
6850: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
6860: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ld = 1;.        
6870: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
6880: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
6890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68a0: 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a    pDup = pExpr;.
68b0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70          pNew = p
68c0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
68d0: 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28      exprCommute(
68e0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
68f0: 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74  ft = pDup->pLeft
6900: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
6910: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
6920: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
6930: 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  pNew->leftColumn
6940: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
6950: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  n;.      pNew->p
6960: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
6970: 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20 20 70  reqLeft;.      p
6980: 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  New->prereqAll =
6990: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20   prereqAll;.    
69a0: 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f    pNew->eOperato
69b0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
69c0: 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20  (pDup->op);.    
69d0: 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  }.  }..#ifndef S
69e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
69f0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EN_OPTIMIZATION.
6a00: 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69    /* If a term i
6a10: 73 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  s the BETWEEN op
6a20: 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74  erator, create t
6a30: 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74  wo new virtual t
6a40: 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64  erms.  ** that d
6a50: 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20  efine the range 
6a60: 74 68 61 74 20 74 68 65 20 42 45 54 57 45 45 4e  that the BETWEEN
6a70: 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a 20 20 2a   implements..  *
6a80: 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  /.  else if( pEx
6a90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
6aa0: 45 4e 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  EN ){.    ExprLi
6ab0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
6ac0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 6e  r->pList;.    in
6ad0: 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63 20  t i;.    static 
6ae0: 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20 3d  const u8 ops[] =
6af0: 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d 3b   {TK_GE, TK_LE};
6b00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
6b10: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
6b20: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
6b30: 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72 28  r==2 );.    for(
6b40: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
6b50: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
6b60: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
6b70: 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  idxNew;.      pN
6b80: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
6b90: 45 78 70 72 28 64 62 2c 20 6f 70 73 5b 69 5d 2c  Expr(db, ops[i],
6ba0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6bb0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
6bc0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6bf0: 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
6c00: 45 78 70 72 29 2c 20 30 29 3b 0a 20 20 20 20 20  Expr), 0);.     
6c10: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
6c20: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
6c30: 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f   pNewExpr, TERM_
6c40: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
6c50: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70  AMIC);.      exp
6c60: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
6c70: 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20  WC, idxNew);.   
6c80: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
6c90: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
6ca0: 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77     pWC->a[idxNew
6cb0: 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ].iParent = idxT
6cc0: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  erm;.    }.    p
6cd0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
6ce0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
6cf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57  SQLITE_OMIT_BETW
6d00: 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  EEN_OPTIMIZATION
6d10: 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
6d20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  d(SQLITE_OMIT_OR
6d30: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26  _OPTIMIZATION) &
6d40: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6d50: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
6d60: 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f  .  /* Attempt to
6d70: 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63 6f 6e 6e   convert OR-conn
6d80: 65 63 74 65 64 20 74 65 72 6d 73 20 69 6e 74 6f  ected terms into
6d90: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
6da0: 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  so that.  ** the
6db0: 79 20 63 61 6e 20 6d 61 6b 65 20 75 73 65 20 6f  y can make use o
6dc0: 66 20 69 6e 64 69 63 65 73 2e 20 20 45 78 61 6d  f indices.  Exam
6dd0: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
6de0: 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f      x = expr1  O
6df0: 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52  R  expr2 = x  OR
6e00: 20 20 78 20 3d 20 65 78 70 72 33 0a 20 20 2a 2a    x = expr3.  **
6e10: 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74  .  ** is convert
6e20: 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 0a 20 20 2a  ed into.  **.  *
6e30: 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78 70  *      x IN (exp
6e40: 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a  r1,expr2,expr3).
6e50: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6f    **.  ** This o
6e60: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75 73 74  ptimization must
6e70: 20 62 65 20 6f 6d 69 74 74 65 64 20 69 66 20 4f   be omitted if O
6e80: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 69 73 20  MIT_SUBQUERY is 
6e90: 64 65 66 69 6e 65 64 20 62 65 63 61 75 73 65 0a  defined because.
6ea0: 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 69 6c 65    ** the compile
6eb0: 72 20 66 6f 72 20 74 68 65 20 74 68 65 20 49 4e  r for the the IN
6ec0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 70 61 72   operator is par
6ed0: 74 20 6f 66 20 73 75 62 2d 71 75 65 72 69 65 73  t of sub-queries
6ee0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
6ef0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6f00: 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  OR ){.    int ok
6f10: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
6f20: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c      int iColumn,
6f30: 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 57 68   iCursor;.    Wh
6f40: 65 72 65 43 6c 61 75 73 65 20 73 4f 72 3b 0a 20  ereClause sOr;. 
6f50: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
6f60: 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73 73 65  rTerm;..    asse
6f70: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
6f80: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
6f90: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68 65 72  )==0 );.    wher
6fa0: 65 43 6c 61 75 73 65 49 6e 69 74 28 26 73 4f 72  eClauseInit(&sOr
6fb0: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  , pWC->pParse, p
6fc0: 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 77 68  MaskSet);.    wh
6fd0: 65 72 65 53 70 6c 69 74 28 26 73 4f 72 2c 20 70  ereSplit(&sOr, p
6fe0: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
6ff0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
7000: 28 70 53 72 63 2c 20 26 73 4f 72 29 3b 0a 20 20  (pSrc, &sOr);.  
7010: 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e 6e 54    assert( sOr.nT
7020: 65 72 6d 3e 3d 32 20 29 3b 0a 20 20 20 20 6a 20  erm>=2 );.    j 
7030: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  = 0;.    if( db-
7040: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
7050: 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73  goto or_not_poss
7060: 69 62 6c 65 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  ible;.    do{.  
7070: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 4f      assert( j<sO
7080: 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  r.nTerm );.     
7090: 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f 72 2e 61   iColumn = sOr.a
70a0: 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  [j].leftColumn;.
70b0: 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20        iCursor = 
70c0: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 75 72  sOr.a[j].leftCur
70d0: 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b 20 3d 20  sor;.      ok = 
70e0: 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20 20 20 20  iCursor>=0;.    
70f0: 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72    for(i=sOr.nTer
7100: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72  m-1, pOrTerm=sOr
7110: 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b 20  .a; i>=0 && ok; 
7120: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
7130: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
7140: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
7150: 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  =WO_EQ ){.      
7160: 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f      goto or_not_
7170: 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 20 20  possible;.      
7180: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7190: 6f 72 54 65 72 6d 49 73 4f 70 74 43 61 6e 64 69  orTermIsOptCandi
71a0: 64 61 74 65 28 70 4f 72 54 65 72 6d 2c 20 69 43  date(pOrTerm, iC
71b0: 75 72 73 6f 72 2c 20 69 43 6f 6c 75 6d 6e 29 20  ursor, iColumn) 
71c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
71d0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
71e0: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
71f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 72 54     }else if( orT
7200: 65 72 6d 48 61 73 4f 6b 44 75 70 6c 69 63 61 74  ermHasOkDuplicat
7210: 65 28 26 73 4f 72 2c 20 70 4f 72 54 65 72 6d 29  e(&sOr, pOrTerm)
7220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
7230: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 3d 20  rTerm->flags &= 
7240: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
7250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7260: 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a 20 20        ok = 0;.  
7270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7280: 20 20 20 20 7d 77 68 69 6c 65 28 20 21 6f 6b 20      }while( !ok 
7290: 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d 2e 66  && (sOr.a[j++].f
72a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
72b0: 45 44 29 21 3d 30 20 26 26 20 6a 3c 32 20 29 3b  ED)!=0 && j<2 );
72c0: 0a 20 20 20 20 69 66 28 20 6f 6b 20 29 7b 0a 20  .    if( ok ){. 
72d0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
72e0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
72f0: 45 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70 44 75  Expr *pNew, *pDu
7300: 70 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  p;.      Expr *p
7310: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Left = 0;.      
7320: 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65 72 6d 2d  for(i=sOr.nTerm-
7330: 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f 72 2e 61  1, pOrTerm=sOr.a
7340: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72  ; i>=0; i--, pOr
7350: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
7360: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66   if( (pOrTerm->f
7370: 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f  lags & TERM_OR_O
7380: 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  K)==0 ) continue
7390: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
73a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
73b0: 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  db, pOrTerm->pEx
73c0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
73d0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
73e0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
73f0: 6e 64 28 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  nd(pWC->pParse, 
7400: 70 4c 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b  pList, pDup, 0);
7410: 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d  .        pLeft =
7420: 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d   pOrTerm->pExpr-
7430: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a  >pLeft;.      }.
7440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
7450: 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
7460: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
7470: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 29  prDup(db, pLeft)
7480: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
7490: 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
74a0: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
74b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
74c0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
74d0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
74e0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
74f0: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
7500: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  r);.        pNew
7510: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
7520: 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20  .        idxNew 
7530: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
7540: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54  ert(pWC, pNew, T
7550: 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
7560: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
7570: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
7580: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
7590: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
75a0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
75b0: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43  rm];.        pWC
75c0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
75d0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
75e0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
75f0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
7600: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
7610: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7620: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
7630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f  .      }.    }.o
7640: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a  r_not_possible:.
7650: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
7660: 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a  lear(&sOr);.  }.
7670: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7680: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
7690: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
76a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
76b0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
76c0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
76d0: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
76e0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
76f0: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
7700: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
7710: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b  .  **.  ** A lik
7720: 65 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65  e pattern of the
7730: 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61   form "x LIKE 'a
7740: 62 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64  bc%'" is changed
7750: 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74   into constraint
7760: 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  s.  **.  **     
7770: 20 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e       x>='abc' AN
7780: 44 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20  D x<'abd' AND x 
7790: 4c 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a  LIKE 'abc%'.  **
77a0: 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63  .  ** The last c
77b0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
77c0: 70 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20  prefix "abc" is 
77d0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66  incremented to f
77e0: 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72  orm the.  ** ter
77f0: 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
7800: 6f 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20  on "abd"..  */. 
7810: 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f   if( isLikeOrGlo
7820: 62 28 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50  b(db, pExpr, &nP
7830: 61 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c  attern, &isCompl
7840: 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 20 29 7b  ete, &noCase) ){
7850: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
7860: 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45  , *pRight;.    E
7870: 78 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74  xpr *pStr1, *pSt
7880: 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  r2;.    Expr *pN
7890: 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78  ewExpr1, *pNewEx
78a0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
78b0: 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a  New1, idxNew2;..
78c0: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
78d0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
78e0: 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68 74  Expr;.    pRight
78f0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
7900: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
7910: 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65 33   pStr1 = sqlite3
7920: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7930: 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30  _STRING, 0, 0, 0
7940: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 31  );.    if( pStr1
7950: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7960: 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26  3TokenCopy(db, &
7970: 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70  pStr1->token, &p
7980: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  Right->token);. 
7990: 20 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65       pStr1->toke
79a0: 6e 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a  n.n = nPattern;.
79b0: 20 20 20 20 20 20 70 53 74 72 31 2d 3e 66 6c 61        pStr1->fla
79c0: 67 73 20 3d 20 45 50 5f 44 65 71 75 6f 74 65 64  gs = EP_Dequoted
79d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72  ;.    }.    pStr
79e0: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
79f0: 75 70 28 64 62 2c 20 70 53 74 72 31 29 3b 0a 20  up(db, pStr1);. 
7a00: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
7a10: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7a20: 20 20 75 38 20 63 2c 20 2a 70 43 3b 0a 20 20 20    u8 c, *pC;.   
7a30: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 32     assert( pStr2
7a40: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20  ->token.dyn );. 
7a50: 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26       pC = (u8*)&
7a60: 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e  pStr2->token.z[n
7a70: 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20  Pattern-1];.    
7a80: 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20    c = *pC;.     
7a90: 20 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20   if( noCase ){. 
7aa0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 40         if( c=='@
7ab0: 27 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  ' ) isComplete =
7ac0: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   0;.        c = 
7ad0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7ae0: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  wer[c];.      }.
7af0: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20        *pC = c + 
7b00: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  1;.    }.    pNe
7b10: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
7b20: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7b30: 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _GE, sqlite3Expr
7b40: 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20 70  Dup(db,pLeft), p
7b50: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str1, 0);.    id
7b60: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
7b70: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
7b80: 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56  NewExpr1, TERM_V
7b90: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
7ba0: 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  MIC);.    exprAn
7bb0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
7bc0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
7bd0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
7be0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
7bf0: 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78  TK_LT, sqlite3Ex
7c00: 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c  prDup(db,pLeft),
7c10: 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20   pStr2, 0);.    
7c20: 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43  idxNew2 = whereC
7c30: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
7c40: 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d   pNewExpr2, TERM
7c50: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
7c60: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72  NAMIC);.    expr
7c70: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
7c80: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
7c90: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
7ca0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
7cb0: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
7cc0: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
7cd0: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
7ce0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
7cf0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
7d00: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7d10: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
7d20: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
7d30: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
7d40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
7d50: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
7d60: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7d70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7d80: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
7d90: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
7da0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
7db0: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
7dc0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
7dd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
7de0: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
7df0: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
7e00: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
7e10: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
7e20: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
7e30: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
7e40: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
7e50: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
7e60: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
7e70: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
7e80: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
7e90: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
7ea0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
7eb0: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
7ec0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
7ed0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
7ee0: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
7ef0: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
7f00: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
7f10: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
7f20: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
7f30: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
7f40: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
7f50: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
7f60: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
7f70: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7f80: 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72  ;.    prereqExpr
7f90: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
7fa0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67  e(pMaskSet, pRig
7fb0: 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43  ht);.    prereqC
7fc0: 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c  olumn = exprTabl
7fd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7fe0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
7ff0: 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70   (prereqExpr & p
8000: 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20  rereqColumn)==0 
8010: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
8020: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70  NewExpr;.      p
8030: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
8040: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41 54  3Expr(db, TK_MAT
8050: 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  CH, 0, sqlite3Ex
8060: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
8070: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
8080: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
8090: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
80a0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
80b0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
80c0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
80d0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
80e0: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
80f0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
8100: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
8110: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
8120: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
8130: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
8140: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
8150: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
8160: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
8170: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
8180: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
8190: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
81a0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
81b0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
81c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
81d0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
81e0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
81f0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
8200: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
8210: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
8220: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
8230: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
8240: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
8250: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
8260: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a  ALTABLE */..  /*
8270: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
8280: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
8290: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
82a0: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
82b0: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
82c0: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
82d0: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
82e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
82f0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
8300: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
8310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8320: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
8330: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
8340: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
8350: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
8360: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
8370: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
8380: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
8390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
83a0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
83b0: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
83c0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
83d0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
83e0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
83f0: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61  list */.  ExprMa
8400: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
8410: 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
8420: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
8430: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
8440: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
8450: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
8460: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
8470: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
8480: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
8490: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
84a0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
84b0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
84c0: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
84d0: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
84e0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
84f0: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
8500: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
8510: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
8520: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
8530: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
8540: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
8550: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
8560: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
8570: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
8580: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
8590: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
85a0: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
85b0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
85c0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
85d0: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
85e0: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
85f0: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
8600: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
8610: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
8620: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
8630: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
8640: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
8650: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
8660: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
8670: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
8680: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
8690: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
86a0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
86b0: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
86c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
86d0: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
86e0: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
86f0: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
8700: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
8710: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
8720: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
8730: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
8740: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
8750: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
8760: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
8770: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
8780: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
8790: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
87a0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
87b0: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
87c0: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
87d0: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
87e0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
87f0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
8800: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
8810: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
8820: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
8830: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
8840: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
8850: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
8860: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
8870: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
8880: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
8890: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
88a0: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
88b0: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
88c0: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
88d0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
88e0: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
88f0: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
8900: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8910: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
8920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
8930: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
8940: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8950: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8960: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8970: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
8980: 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet,  /* Mappin
8990: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64  g from table ind
89a0: 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20  ices to bitmaps 
89b0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
89c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
89d0: 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  The index we are
89e0: 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   testing */.  in
89f0: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
8a00: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
8a10: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
8a20: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
8a30: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
8a40: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
8a50: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
8a60: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
8a70: 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  EqCol,          
8a80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8a90: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69  index columns wi
8aa0: 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  th == constraint
8ab0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
8ac0: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
8ad0: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
8ae0: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
8af0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8b20: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
8b30: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b50: 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64  XOR of index and
8b60: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64   ORDER BY sort d
8b70: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  irection */.  in
8b80: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
8bb0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73   BY terms */.  s
8bc0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8bd0: 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  tem *pTerm;    /
8be0: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
8bf0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
8c10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
8c20: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
8c30: 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d  By!=0 );.  nTerm
8c40: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
8c50: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  pr;.  assert( nT
8c60: 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  erm>0 );..  /* M
8c70: 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
8c80: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8c90: 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
8ca0: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
8cb0: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  dex..  **.  ** N
8cc0: 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73  ote that indices
8cd0: 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c   have pIdx->nCol
8ce0: 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  umn regular colu
8cf0: 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e  mns plus.  ** on
8d00: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  e additional col
8d10: 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  umn containing t
8d20: 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72  he rowid.  The r
8d30: 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  owid column.  **
8d40: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
8d50: 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f   also allowed to
8d60: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
8d70: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
8d80: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
8d90: 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
8da0: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
8db0: 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78  nTerm && i<=pIdx
8dc0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
8dd0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
8de0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  ;       /* The e
8df0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
8e00: 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20   ORDER BY pTerm 
8e10: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
8e20: 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65  pColl;    /* The
8e30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8e40: 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  nce of pExpr */.
8e50: 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74      int termSort
8e60: 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f  Order; /* Sort o
8e70: 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65  rder for this te
8e80: 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  rm */.    int iC
8e90: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20  olumn;       /* 
8ea0: 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  The i-th column 
8eb0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d  of the index.  -
8ec0: 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20  1 for rowid */. 
8ed0: 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65     int iSortOrde
8ee0: 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44  r;    /* 1 for D
8ef0: 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f  ESC, 0 for ASC o
8f00: 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  n the i-th index
8f10: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e   term */.    con
8f20: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  st char *zColl; 
8f30: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
8f40: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8f50: 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78  e for i-th index
8f60: 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45   term */..    pE
8f70: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
8f80: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
8f90: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
8fa0: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
8fb0: 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20  e!=base ){.     
8fc0: 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20   /* Can not use 
8fd0: 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e  an index sort on
8fe0: 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69   anything that i
8ff0: 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69  s not a column i
9000: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  n the.      ** l
9010: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f  eft-most table o
9020: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
9030: 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
9040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
9050: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
9060: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9070: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21  Expr);.    if( !
9080: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
9090: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
90a0: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
90b0: 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  if( i<pIdx->nCol
90c0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  umn ){.      iCo
90d0: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43  lumn = pIdx->aiC
90e0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
90f0: 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  if( iColumn==pId
9100: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
9110: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
9120: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
9130: 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  }.      iSortOrd
9140: 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  er = pIdx->aSort
9150: 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  Order[i];.      
9160: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
9170: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  Coll[i];.    }el
9180: 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  se{.      iColum
9190: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53  n = -1;.      iS
91a0: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  ortOrder = 0;.  
91b0: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c      zColl = pCol
91c0: 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a  l->zName;.    }.
91d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
91e0: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
91f0: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
9200: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
9210: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
9220: 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65  /* Term j of the
9230: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
9240: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9250: 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20  column i of the 
9260: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
9270: 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i<nEqCol ){. 
9280: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
9290: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
92a0: 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
92b0: 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20   by == fails to 
92c0: 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20  match an.       
92d0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
92e0: 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20  m, that is OK.  
92f0: 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74  Just ignore that
9300: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
9310: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ndex.        */.
9320: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9330: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9340: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( i==pIdx->nColu
9350: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mn ){.        /*
9360: 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20   Index column i 
9370: 69 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41  is the rowid.  A
9380: 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d  ll other terms m
9390: 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20  atch. */.       
93a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
93b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
93c0: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75  If an index colu
93d0: 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63  mn fails to matc
93e0: 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e  h and is not con
93f0: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20  strained by ==. 
9400: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
9410: 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
9420: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
9430: 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e  R BY constraint.
9440: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9450: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9460: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9470: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53  assert( pIdx->aS
9480: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
9490: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
94a0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c  ->sortOrder==0 |
94b0: 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  | pTerm->sortOrd
94c0: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  er==1 );.    ass
94d0: 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d  ert( iSortOrder=
94e0: 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72  =0 || iSortOrder
94f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53  ==1 );.    termS
9500: 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74  ortOrder = iSort
9510: 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73  Order ^ pTerm->s
9520: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66  ortOrder;.    if
9530: 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i>nEqCol ){.  
9540: 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74      if( termSort
9550: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
9560: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
9570: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
9580: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
9590: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
95a0: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
95b0: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
95c0: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
95d0: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
95e0: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
95f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
9600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9610: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72   sortOrder = ter
9620: 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  mSortOrder;.    
9630: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70  }.    j++;.    p
9640: 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Term++;.    if( 
9650: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65  iColumn<0 && !re
9660: 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62  ferencesOtherTab
9670: 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d  les(pOrderBy, pM
9680: 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29  askSet, j, base)
9690: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
96a0: 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  the indexed colu
96b0: 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  mn is the primar
96c0: 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74  y key and everyt
96d0: 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20  hing matches.   
96e0: 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64     ** so far and
96f0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44   none of the ORD
9700: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74  ER BY terms to t
9710: 68 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e  he right referen
9720: 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  ce other.      *
9730: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
9740: 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72  join, then we ar
9750: 65 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74  e assured that t
9760: 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  he index can be 
9770: 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74  used .      ** t
9780: 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74  o sort because t
9790: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
97a0: 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20  s unique and so 
97b0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65  none of the othe
97c0: 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  r.      ** colum
97d0: 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79  ns will make any
97e0: 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20   difference.    
97f0: 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e    */.      j = n
9800: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
9810: 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74  .  *pbRev = sort
9820: 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20  Order!=0;.  if( 
9830: 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  j>=nTerm ){.    
9840: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  /* All terms of 
9850: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
9860: 75 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20  use are covered 
9870: 62 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f  by this index so
9880: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64  .    ** this ind
9890: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ex can be used f
98a0: 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  or sorting. */. 
98b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
98c0: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
98d0: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26  rror!=OE_None &&
98e0: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
98f0: 6e 0a 20 20 20 20 20 20 26 26 20 21 72 65 66 65  n.      && !refe
9900: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
9910: 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73  s(pOrderBy, pMas
9920: 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29  kSet, j, base) )
9930: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72  {.    /* All ter
9940: 6d 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78  ms of this index
9950: 20 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66   match some pref
9960: 69 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ix of the ORDER 
9970: 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
9980: 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
9990: 73 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20  s UNIQUE and no 
99a0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69  terms on the tai
99b0: 6c 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  l of the ORDER B
99c0: 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  Y.    ** clause 
99d0: 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20  reference other 
99e0: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
99f0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6c  .  If this is al
9a00: 6c 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20  l true then.    
9a10: 2a 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  ** the order by 
9a20: 63 6c 61 75 73 65 20 69 73 20 73 75 70 65 72 66  clause is superf
9a30: 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65  luous. */.    re
9a40: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
9a50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9a60: 20 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20   Check table to 
9a70: 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52  see if the ORDER
9a80: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f   BY clause in pO
9a90: 72 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61  rderBy can be sa
9aa0: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f  tisfied.** by so
9ab0: 72 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f  rting in order o
9ac0: 66 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e  f ROWID.  Return
9ad0: 20 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20   true if so and 
9ae0: 73 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65  set *pbRev to be
9af0: 0a 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76  .** true for rev
9b00: 65 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66  erse ROWID and f
9b10: 61 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64  alse for forward
9b20: 20 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f   ROWID order..*/
9b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
9b40: 61 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69  ableByRowid(.  i
9b50: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
9b60: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
9b70: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
9b80: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
9b90: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
9ba0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
9bb0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
9bc0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b  se */.  ExprMask
9bd0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
9be0: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
9bf0: 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70  tables to bitmap
9c00: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
9c10: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
9c20: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
9c30: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
9c40: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  /.){.  Expr *p;.
9c50: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
9c60: 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
9c70: 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
9c80: 78 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70  xpr>0 );.  p = p
9c90: 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45  OrderBy->a[0].pE
9ca0: 78 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  xpr;.  if( p->op
9cb0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
9cc0: 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 20 26  ->iTable==base &
9cd0: 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31  & p->iColumn==-1
9ce0: 0a 20 20 20 20 26 26 20 21 72 65 66 65 72 65 6e  .    && !referen
9cf0: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70  cesOtherTables(p
9d00: 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65  OrderBy, pMaskSe
9d10: 74 2c 20 31 2c 20 62 61 73 65 29 20 29 7b 0a 20  t, 1, base) ){. 
9d20: 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64     *pbRev = pOrd
9d30: 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  erBy->a[0].sortO
9d40: 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e  rder;.    return
9d50: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
9d60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65   0;.}../*.** Pre
9d70: 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74  pare a crude est
9d80: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67  imate of the log
9d90: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
9da0: 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  put value..** Th
9db0: 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e  e results need n
9dc0: 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68  ot be exact.  Th
9dd0: 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  is is only used 
9de0: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a  for estimating.*
9df0: 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74  * the total cost
9e00: 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f   of performing o
9e10: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f  perations with O
9e20: 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67  (logN) or O(Nlog
9e30: 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79  N).** complexity
9e40: 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20  .  Because N is 
9e50: 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74  just a guess, it
9e60: 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61   is no great tra
9e70: 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20  gedy if.** logN 
9e80: 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e  is a little off.
9e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
9ea0: 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20  e estLog(double 
9eb0: 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67  N){.  double log
9ec0: 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20  N = 1;.  double 
9ed0: 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28  x = 10;.  while(
9ee0: 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e   N>x ){.    logN
9ef0: 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20   += 1;.    x *= 
9f00: 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  10;.  }.  return
9f10: 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   logN;.}../*.** 
9f20: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
9f30: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
9f40: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
9f50: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
9f60: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
9f70: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
9f80: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
9f90: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
9fa0: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
9fb0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
9fc0: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
9fd0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
9fe0: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
9ff0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a000: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
a010: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
a020: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
a030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
a040: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
a050: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
a060: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
a070: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
a080: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
a090: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a0a0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
a0b0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a0c0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
a0d0: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
a0e0: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
a0f0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
a100: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
a110: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
a120: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
a130: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
a140: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
a150: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
a160: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
a170: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
a180: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
a190: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
a1a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
a1b0: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
a1c0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
a1d0: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
a1e0: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
a1f0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
a200: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
a210: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
a220: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
a230: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
a240: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
a250: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
a260: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
a270: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
a280: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
a290: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
a2a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a2b0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
a2c0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a2d0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
a2e0: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
a2f0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
a300: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
a310: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
a320: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
a330: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
a340: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
a350: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
a360: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
a370: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
a380: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
a390: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
a3a0: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
a3b0: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
a3c0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
a3d0: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
a3e0: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
a3f0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
a400: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
a410: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
a420: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
a430: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
a440: 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  st);.}.#else.#de
a450: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
a460: 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
a470: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
a480: 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69  TS(A).#endif..#i
a490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a4a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
a4b0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
a4c0: 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20   best index for 
a4d0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
a4e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20  .**.** The best 
a4f0: 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65  index is compute
a500: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
a510: 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  dex method of th
a520: 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
a530: 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73  le module.  This
a540: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c   routine is real
a550: 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65  ly just a wrappe
a560: 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a  r that sets up.*
a570: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
a580: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
a590: 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20  re that is used 
a5a0: 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77  to communicate w
a5b0: 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65  ith.** xBestInde
a5c0: 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f  x..**.** In a jo
a5d0: 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  in, this routine
a5e0: 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64   might be called
a5f0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
a600: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  for the.** same 
a610: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
a620: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
a630: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
a640: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
a650: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f  nd initialized o
a660: 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f  n the first invo
a670: 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  cation and reuse
a680: 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75  d on all subsequ
a690: 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f  ent.** invocatio
a6a0: 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ns.  The sqlite3
a6b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
a6c0: 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73  cture is also us
a6d0: 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  ed when.** code 
a6e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
a6f0: 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75  access the virtu
a700: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77  al table.  The w
a710: 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29  hereInfoDelete()
a720: 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b   .** routine tak
a730: 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69  es care of freei
a740: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ng the sqlite3_i
a750: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
a760: 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65  ure after.** eve
a770: 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73  rybody has finis
a780: 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a  hed with it..*/.
a790: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65  static double be
a7a0: 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a  stVirtualIndex(.
a7b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
a7e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
a7f0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
a800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a810: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
a820: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
a830: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
a840: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
a850: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
a860: 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
a870: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
a880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
a890: 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61  k of cursors tha
a8a0: 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61  t are not availa
a8b0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
a8c0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
a8e0: 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a  rder by clause *
a8f0: 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79 55  /.  int orderByU
a900: 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
a910: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
a920: 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73   can potential s
a930: 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ort */.  sqlite3
a940: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70  _index_info **pp
a950: 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78  IdxInfo /* Index
a960: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73   information pas
a970: 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65  sed to xBestInde
a980: 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  x */.){.  Table 
a990: 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54  *pTab = pSrc->pT
a9a0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ab;.  sqlite3_in
a9b0: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
a9c0: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
a9d0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
a9e0: 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
a9f0: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
aa00: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20  3_index_orderby 
aa10: 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20  *pIdxOrderBy;.  
aa20: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
aa30: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
aa40: 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20  usage *pUsage;. 
aa50: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
aa60: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  m;.  int i, j;. 
aa70: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
aa80: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
aa90: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
aaa0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
aab0: 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
aac0: 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20  previously.  ** 
aad0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e  allocated and in
aae0: 69 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68  itialized for th
aaf0: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
ab00: 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a  , then allocate.
ab10: 20 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c    ** and initial
ab20: 69 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a  ize it now.  */.
ab30: 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70    pIdxInfo = *pp
ab40: 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  IdxInfo;.  if( p
ab50: 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  IdxInfo==0 ){.  
ab60: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
ab70: 72 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72  rm;.    int nTer
ab80: 6d 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  m;.    WHERETRAC
ab90: 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20  E(("Recomputing 
aba0: 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25  index info for %
abb0: 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a  s...\n", pTab->z
abc0: 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Name));..    /* 
abd0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
abe0: 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45   of possible WHE
abf0: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
ac00: 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a  aints referring.
ac10: 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76      ** to this v
ac20: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
ac30: 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d      for(i=nTerm=
ac40: 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
ac50: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
ac60: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
ac70: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
ac80: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
ac90: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
aca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
acb0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
acc0: 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  or&(pTerm->eOper
acd0: 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20  ator-1))==0 );. 
ace0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
acf0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
ad00: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =WO_IN );.      
ad10: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
ad20: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
ad30: 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69  SNULL );.      i
ad40: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
ad50: 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f  tor & (WO_IN|WO_
ad60: 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e  ISNULL) ) contin
ad70: 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b  ue;.      nTerm+
ad80: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
ad90: 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
ada0: 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
adb0: 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
adc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
add0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
ade0: 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  le then allocate
adf0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
ae00: 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a  OrderBy part of.
ae10: 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74      ** the sqlit
ae20: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
ae30: 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
ae40: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
ae50: 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  ;.    if( pOrder
ae60: 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  By ){.      for(
ae70: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
ae80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
ae90: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
aea0: 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
aeb0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
aec0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
aed0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45  =TK_COLUMN || pE
aee0: 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72  xpr->iTable!=pSr
aef0: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65  c->iCursor ) bre
af00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
af10: 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42    if( i==pOrderB
af20: 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
af30: 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
af40: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
af50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
af60: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
af70: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
af80: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  _info structure.
af90: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49      */.    pIdxI
afa0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
afb0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
afc0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
afd0: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
b000: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
b010: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
b020: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
b050: 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
b060: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
b070: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
b080: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b090: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
b0a0: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
b0b0: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20  return 0.0;.    
b0c0: 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f  }.    *ppIdxInfo
b0d0: 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20   = pIdxInfo;..  
b0e0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
b0f0: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
b100: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
b110: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
b120: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
b130: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
b140: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
b150: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
b160: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
b170: 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  m.    ** changin
b180: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
b190: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
b1a0: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
b1b0: 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69  er to.    ** ini
b1c0: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
b1d0: 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
b1e0: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
b1f0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
b200: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
b210: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20  IdxInfo[1];.    
b220: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
b230: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
b240: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
b250: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
b260: 20 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72     pUsage = (str
b270: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
b280: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
b290: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
b2a0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
b2b0: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
b2c0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
b2d0: 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74  nTerm;.    *(int
b2e0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
b2f0: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
b300: 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73  ;.    *(struct s
b310: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
b320: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
b330: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
b340: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20   = pIdxCons;.   
b350: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
b360: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
b370: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
b380: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
b390: 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63  rBy;.    *(struc
b3a0: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
b3b0: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
b3c0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
b3d0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
b430: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54     for(i=j=0, pT
b440: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
b450: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
b460: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
b470: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
b480: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
b490: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
b4a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
b4b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70  rm->eOperator&(p
b4c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d  Term->eOperator-
b4d0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  1))==0 );.      
b4e0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
b4f0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
b500: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
b510: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
b520: 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c  rator==WO_ISNULL
b530: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
b540: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
b550: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c   (WO_IN|WO_ISNUL
b560: 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
b570: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
b580: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
b590: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  ->leftColumn;.  
b5a0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
b5b0: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
b5c0: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
b5d0: 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  j].op = pTerm->e
b5e0: 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20 20  Operator;.      
b5f0: 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
b600: 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
b610: 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
b620: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
b630: 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
b640: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
b650: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b660: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
b670: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
b680: 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
b690: 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
b6a0: 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
b6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
b6c0: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
b6d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
b6e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b6f0: 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
b700: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
b710: 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
b720: 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
b730: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
b740: 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73  T_LE );.      as
b750: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
b760: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
b770: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20  AINT_GT );.     
b780: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
b790: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
b7a0: 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
b7b0: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
b7c0: 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
b7d0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
b7e0: 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TCH );.      ass
b7f0: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
b800: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
b810: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
b820: 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
b830: 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20   );.      j++;. 
b840: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
b850: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
b860: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b870: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
b880: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
b890: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
b8a0: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
b8b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
b8c0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
b8d0: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
b8e0: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
b8f0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
b900: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
b910: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  , the sqlite3_in
b920: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
b930: 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f  re that pIdxInfo
b940: 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20   points.  ** to 
b950: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69  will have been i
b960: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68  nitialized, eith
b970: 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  er during the cu
b980: 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
b990: 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20   or.  ** during 
b9a0: 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63  some prior invoc
b9b0: 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a  ation.  Now we j
b9c0: 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74  ust have to cust
b9d0: 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64  omize the.  ** d
b9e0: 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e  etails of pIdxIn
b9f0: 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  fo for the curre
ba00: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  nt invocation an
ba10: 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a  d pass it to.  *
ba20: 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20  * xBestIndex..  
ba30: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64  */..  /* The mod
ba40: 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ule name must be
ba50: 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20   defined. Also, 
ba60: 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  by this point th
ba70: 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ere must.  ** be
ba80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
ba90: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
baa0: 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69  ructure. Otherwi
bab0: 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  se.  ** sqlite3V
bac0: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
bad0: 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70  s() would have p
bae0: 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72  icked up the err
baf0: 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  or. .  */.  asse
bb00: 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75  rt( pTab->azModu
bb10: 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61  leArg && pTab->a
bb20: 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b  zModuleArg[0] );
bb30: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
bb40: 3e 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a  >pVtab );.#if 0.
bb50: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61    if( pTab->pVta
bb60: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
bb70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bb80: 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d  se, "undefined m
bb90: 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62  odule %s for tab
bba0: 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  le %s",.        
bbb0: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
bbc0: 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  g[0], pTab->zNam
bbd0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
bbe0: 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  .0;.  }.#endif..
bbf0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
bc00: 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
bc10: 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
bc20: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
bc30: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
bc40: 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
bc50: 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
bc60: 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
bc70: 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
bc80: 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
bc90: 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
bca0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
bcb0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
bcc0: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
bcd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
bce0: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
bcf0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
bd00: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
bd10: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
bd20: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
bd30: 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
bd40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
bd50: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
bd60: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
bd70: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
bd80: 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
bd90: 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
bda0: 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
bdb0: 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
bdc0: 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
bdd0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
bde0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
bdf0: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
be00: 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
be10: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
be20: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
be30: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
be40: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
be50: 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
be60: 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
be70: 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
be80: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
be90: 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
bea0: 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
beb0: 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
bec0: 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
bed0: 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
bee0: 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
bef0: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
bf00: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
bf10: 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
bf20: 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
bf30: 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
bf40: 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
bf50: 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
bf60: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
bf70: 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
bf80: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
bf90: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
bfa0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
bfb0: 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
bfc0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
bfd0: 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
bfe0: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
bff0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
c000: 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
c010: 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
c020: 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
c030: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
c040: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
c050: 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d  usable =  (pTerm
c060: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
c070: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20  notReady)==0;.  
c080: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  }.  memset(pUsag
c090: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
c0a0: 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
c0b0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
c0c0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
c0d0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
c0e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c0f0: 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
c100: 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49  dxStr);.  }.  pI
c110: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
c120: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
c130: 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
c140: 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
c150: 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
c160: 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
c170: 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
c180: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
c190: 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
c1a0: 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b  E_BIG_DBL / 2.0;
c1b0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
c1c0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
c1d0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
c1e0: 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f  ->nOrderBy && !o
c1f0: 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a  rderByUsable ){.
c200: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
c210: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
c220: 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69 64   0;.  }..  (void
c230: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
c240: 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  f(pParse->db);. 
c250: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
c260: 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
c270: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
c280: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
c290: 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b  NPUTS(pIdxInfo);
c2a0: 0a 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70 56  .  rc = pTab->pV
c2b0: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
c2c0: 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e 70  estIndex(pTab->p
c2d0: 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  Vtab, pIdxInfo);
c2e0: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
c2f0: 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a  PUTS(pIdxInfo);.
c300: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
c310: 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e  afetyOn(pParse->
c320: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  db);..  for(i=0;
c330: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
c340: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
c350: 20 20 20 20 69 66 28 20 21 70 49 64 78 49 6e 66      if( !pIdxInf
c360: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
c370: 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55 73 61  ].usable && pUsa
c380: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
c390: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
c3a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c3b0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
c3c0: 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
c3d0: 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
c3e0: 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
c3f0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
c400: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
c410: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
c420: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c430: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c440: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
c450: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
c460: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
c470: 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20  .    }else {.   
c480: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c490: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
c4a0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
c4b0: 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  c));.    }.  }. 
c4c0: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
c4d0: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
c4e0: 72 64 65 72 42 79 3b 0a 0a 20 20 72 65 74 75 72  rderBy;..  retur
c4f0: 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  n pIdxInfo->esti
c500: 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e  matedCost;.}.#en
c510: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c520: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
c530: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  */../*.** Find t
c540: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
c550: 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
c560: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
c570: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
c580: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64 65  r.** to the inde
c590: 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64 65  x, flags that de
c5a0: 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20 69  scribe how the i
c5b0: 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 75  ndex should be u
c5c0: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  sed, the.** numb
c5d0: 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
c5e0: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20  onstraints, and 
c5f0: 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20 74  the "cost" for t
c600: 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  his index..**.**
c610: 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
c620: 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54 68   index wins.  Th
c630: 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
c640: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
c650: 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
c660: 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20  d disk I/O need 
c670: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72  to process the r
c680: 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65  equest using the
c690: 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 2e   selected index.
c6a0: 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74  .** Factors that
c6b0: 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20   influence cost 
c6c0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
c6d0: 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74    *  The estimat
c6e0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
c6f0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
c700: 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a  etrieved.  (The.
c710: 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74  **       fewer t
c720: 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a  he better.).**.*
c730: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
c740: 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d  or not sorting m
c750: 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  ust occur..**.**
c760: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
c770: 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74  r not there must
c780: 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f   be separate loo
c790: 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  kups in the.**  
c7a0: 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69       index and i
c7b0: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
c7c0: 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 64  ..**.*/.static d
c7d0: 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28  ouble bestIndex(
c7e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c7f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c800: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
c810: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
c820: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
c830: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
c840: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
c850: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
c860: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
c870: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
c880: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
c890: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
c8a0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
c8b0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
c8c0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
c8d0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
c8e0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
c8f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
c900: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
c910: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70   */.  Index **pp
c920: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
c930: 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64    /* Make *ppInd
c940: 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ex point to the 
c950: 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  best index */.  
c960: 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
c970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c980: 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62  ut flags describ
c990: 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20  ing this choice 
c9a0: 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20  in *pFlags */.  
c9b0: 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20  int *pnEq       
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c9d0: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
c9e0: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
c9f0: 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  aints here */.){
ca00: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
ca10: 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65  erm;.  Index *be
ca20: 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  stIdx = 0;      
ca30: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
ca40: 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73   gives the lowes
ca50: 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62  t cost */.  doub
ca60: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
ca70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
ca80: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73  ost of using bes
ca90: 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65  tIdx */.  int be
caa0: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
cab0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
cac0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62  ssociated with b
cad0: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
cae0: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
caf0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
cb00: 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f  value for nEq */
cb10: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
cb20: 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
cb30: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
cb40: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
cb50: 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
cb60: 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
cb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
cb80: 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
cb90: 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  luating */.  int
cba0: 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
cbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cbc0: 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
cbd0: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  rse order */.  i
cbe0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
cbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
cc00: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
cc10: 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ith pProbe */.  
cc20: 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cc40: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
cc50: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
cc60: 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73  .  int eqTermMas
cc70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
cc80: 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  * Mask of valid 
cc90: 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
cca0: 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63  rs */.  double c
ccb0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
ccc0: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75      /* Cost of u
ccd0: 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a  sing pProbe */..
cce0: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
ccf0: 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73  estIndex: tbl=%s
cd00: 20 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c 6e   notReady=%llx\n
cd10: 22 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a  ", pSrc->pTab->z
cd20: 4e 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29  Name, notReady))
cd30: 3b 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d  ;.  lowestCost =
cd40: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
cd50: 0a 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63  .  pProbe = pSrc
cd60: 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
cd70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
cd80: 6c 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  le has no indice
cd90: 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
cda0: 6e 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  no terms in the 
cdb0: 77 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73  where.  ** claus
cdc0: 65 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  e that refer to 
cdd0: 74 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20  the ROWID, then 
cde0: 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  we will never be
cdf0: 20 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a   able to do.  **
ce00: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
ce10: 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c  than a full tabl
ce20: 65 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74  e scan on this t
ce30: 61 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20  able.  We might 
ce40: 61 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74  as.  ** well put
ce50: 20 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65   it first in the
ce60: 20 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68   join order.  Th
ce70: 61 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20  at way, perhaps 
ce80: 69 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72  it can be.  ** r
ce90: 65 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68  eferenced by oth
cea0: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  er tables in the
ceb0: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   join..  */.  if
cec0: 28 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20  ( pProbe==0 &&. 
ced0: 20 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43      findTerm(pWC
cee0: 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
cef0: 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54  O_EQ|WO_IN|WO_LT
cf00: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
cf10: 47 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20  GE,0)==0 &&.    
cf20: 20 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c   (pOrderBy==0 ||
cf30: 20 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69   !sortableByRowi
cf40: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
cf50: 2c 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  , pWC->pMaskSet,
cf60: 20 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20 2a   &rev)) ){.    *
cf70: 70 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  pFlags = 0;.    
cf80: 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  *ppIndex = 0;.  
cf90: 20 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20    *pnEq = 0;.   
cfa0: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d   return 0.0;.  }
cfb0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
cfc0: 20 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72   a rowid=EXPR or
cfd0: 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20   rowid IN (...) 
cfe0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f  constraints.  */
cff0: 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54  .  pTerm = findT
d000: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
d010: 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
d020: 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20  EQ|WO_IN, 0);.  
d030: 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
d040: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
d050: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a    *ppIndex = 0;.
d060: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
d070: 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a  WHERE_ROWID_EQ;.
d080: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
d090: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d0a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
d0b0: 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74  id== is always t
d0c0: 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c  he best pick.  L
d0d0: 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20  ook no further. 
d0e0: 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20   Because only.  
d0f0: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
d100: 72 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64  row is generated
d110: 2c 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61  , output is alwa
d120: 79 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ys in sorted ord
d130: 65 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c  er */.      *pFl
d140: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
d150: 44 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49  D_EQ | WHERE_UNI
d160: 51 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71  QUE;.      *pnEq
d170: 20 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52   = 1;.      WHER
d180: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73  ETRACE(("... bes
d190: 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b  t is rowid\n"));
d1a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
d1b0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
d1c0: 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   (pExpr = pTerm-
d1d0: 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d  >pExpr)->pList!=
d1e0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  0 ){.      /* Ro
d1f0: 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63  wid IN (LIST): c
d200: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
d210: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
d220: 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20  er of list.     
d230: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
d240: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
d250: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
d260: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
d270: 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73  lowestCost *= es
d280: 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29  tLog(lowestCost)
d290: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d2a0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
d2b0: 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73  SELECT): cost is
d2c0: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
d2d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d2e0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rows.      ** in
d2f0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d300: 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e  he inner select.
d310: 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79    We have no way
d320: 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20   to estimate.   
d330: 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65     ** that value
d340: 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20   so make a wild 
d350: 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  guess. */.      
d360: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30  lowestCost = 200
d370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  ;.    }.    WHER
d380: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77  ETRACE(("... row
d390: 69 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67  id IN cost: %.9g
d3a0: 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29  \n", lowestCost)
d3b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74  );.  }..  /* Est
d3c0: 69 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f  imate the cost o
d3d0: 66 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20  f a table scan. 
d3e0: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e   If we do not kn
d3f0: 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a  ow how many.  **
d400: 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
d410: 74 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31  the table, use 1
d420: 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75   million as a gu
d430: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74  ess..  */.  cost
d440: 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f   = pProbe ? pPro
d450: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  be->aiRowEst[0] 
d460: 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 57 48 45  : 1000000;.  WHE
d470: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61  RETRACE(("... ta
d480: 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f  ble scan base co
d490: 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73  st: %.9g\n", cos
d4a0: 74 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57  t));.  flags = W
d4b0: 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
d4c0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
d4d0: 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  r constraints on
d4e0: 20 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69   a range of rowi
d4f0: 64 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63  ds in a table sc
d500: 61 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  an..  */.  pTerm
d510: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
d520: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
d530: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
d540: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29  |WO_GT|WO_GE, 0)
d550: 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b  ;.  if( pTerm ){
d560: 0a 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72  .    if( findTer
d570: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
d580: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
d590: 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_LE, 0) ){.  
d5a0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
d5b0: 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20  RE_TOP_LIMIT;.  
d5c0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20      cost /= 3;  
d5d0: 2f 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f  /* Guess that ro
d5e0: 77 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61  wid<EXPR elimina
d5f0: 74 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f  tes two-thirds o
d600: 72 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a  r rows */.    }.
d610: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
d620: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
d630: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
d640: 57 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_GE, 0) ){.   
d650: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d660: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
d670: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
d680: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
d690: 69 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id>EXPR eliminat
d6a0: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66  es two-thirds of
d6b0: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
d6c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
d6d0: 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20  ... rowid range 
d6e0: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
d6f0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
d700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
d710: 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ags = 0;.  }..  
d720: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
d730: 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61  scan does not sa
d740: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
d750: 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65  BY clause, incre
d760: 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73  ase.  ** the cos
d770: 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f  t by NlogN to co
d780: 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20  ver the expense 
d790: 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20  of sorting. */. 
d7a0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
d7b0: 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c  .    if( sortabl
d7c0: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
d7d0: 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d  OrderBy, pWC->pM
d7e0: 61 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b  askSet, &rev) ){
d7f0: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
d800: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48  WHERE_ORDERBY|WH
d810: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
d820: 0a 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29  .      if( rev )
d830: 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
d840: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
d850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d860: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20  lse{.      cost 
d870: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
d880: 6f 73 74 29 3b 0a 20 20 20 20 20 20 57 48 45 52  ost);.      WHER
d890: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72  ETRACE(("... sor
d8a0: 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63  ting increases c
d8b0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
d8c0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  cost));.    }.  
d8d0: 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77  }.  if( cost<low
d8e0: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c  estCost ){.    l
d8f0: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
d900: 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20  ;.    bestFlags 
d910: 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
d920: 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74  /* If the pSrc t
d930: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
d940: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
d950: 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d  T JOIN then we m
d960: 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20  ay not.  ** use 
d970: 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69  an index to sati
d980: 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73  sfy IS NULL cons
d990: 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20  traints on that 
d9a0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a  table.  This is.
d9b0: 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c    ** because col
d9c0: 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75  umns might end u
d9d0: 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20  p being NULL if 
d9e0: 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e  the table does n
d9f0: 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20  ot match -.  ** 
da00: 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77  a circumstance w
da10: 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63  hich the index c
da20: 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69  annot help us di
da30: 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20  scover.  Ticket 
da40: 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66  #2177..  */.  if
da50: 28 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  ( (pSrc->jointyp
da60: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
da70: 29 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  ){.    eqTermMas
da80: 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b  k = WO_EQ|WO_IN;
da90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71  .  }else{.    eq
daa0: 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
dab0: 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
dac0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ;.  }..  /* Look
dad0: 20 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a   at each index..
dae0: 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72    */.  for(; pPr
daf0: 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
db00: 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
db10: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db30: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
db40: 20 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c      double inMul
db50: 74 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20  tiplier = 1;..  
db60: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
db70: 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c  .. index %s:\n",
db80: 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29   pProbe->zName))
db90: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
dba0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
dbb0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
dbc0: 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69  ex that are sati
dbd0: 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sfied.    ** by 
dbe0: 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  x=EXPR constrain
dbf0: 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  ts or x IN (...)
dc00: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
dc10: 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d    */.    flags =
dc20: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
dc30: 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   i<pProbe->nColu
dc40: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
dc50: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
dc60: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
dc70: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
dc80: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
dc90: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65  , notReady, eqTe
dca0: 72 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  rmMask, pProbe);
dcb0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
dcc0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
dcd0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
dce0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
dcf0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
dd00: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
dd10: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
dd20: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
dd30: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66  pExpr;.        f
dd40: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
dd50: 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
dd60: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
dd70: 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect!=0 ){.      
dd80: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
dd90: 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20   *= 25;.        
dda0: 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
ddb0: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29  (pExpr->pList) )
ddc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75  {.          inMu
ddd0: 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70  ltiplier *= pExp
dde0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
ddf0: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + 1;.        }. 
de00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
de10: 20 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e   cost = pProbe->
de20: 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e  aiRowEst[i] * in
de30: 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74  Multiplier * est
de40: 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72  Log(inMultiplier
de50: 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a  );.    nEq = i;.
de60: 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
de70: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
de80: 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45   && (flags & WHE
de90: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30  RE_COLUMN_IN)==0
dea0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71  .         && nEq
deb0: 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  ==pProbe->nColum
dec0: 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  n ){.      flags
ded0: 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
dee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52  ;.    }.    WHER
def0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
df00: 6e 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e  nEq=%d inMult=%.
df10: 39 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c  9g cost=%.9g\n",
df20: 6e 45 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72  nEq,inMultiplier
df30: 2c 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a  ,cost));..    /*
df40: 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20   Look for range 
df50: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20  constraints.    
df60: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70  */.    if( nEq<p
df70: 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Probe->nColumn )
df80: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
df90: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
dfa0: 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65  [nEq];.      pTe
dfb0: 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
dfc0: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
dfd0: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
dfe0: 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70  E|WO_GT|WO_GE, p
dff0: 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66  Probe);.      if
e000: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( pTerm ){.     
e010: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
e020: 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a  E_COLUMN_RANGE;.
e030: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
e040: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
e050: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
e060: 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65  LT|WO_LE, pProbe
e070: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
e080: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
e090: 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
e0a0: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20     cost /= 3;.  
e0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e0c0: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
e0d0: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
e0e0: 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
e0f0: 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
e100: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
e110: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
e120: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
e130: 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
e140: 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
e150: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67  CE(("...... rang
e160: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
e170: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
e180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e190: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
e1a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74   additional cost
e1b0: 20 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74   of sorting if t
e1c0: 68 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e  hat is a factor.
e1d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e1e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e1f0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57    if( (flags & W
e200: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
e210: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
e220: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
e230: 70 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73  pParse,pWC->pMas
e240: 6b 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72  kSet,pProbe,iCur
e250: 2c 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72  ,pOrderBy,nEq,&r
e260: 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ev) ){.        i
e270: 66 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20  f( flags==0 ){. 
e280: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
e290: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
e2a0: 4e 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  NGE;.        }. 
e2b0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
e2c0: 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20  WHERE_ORDERBY;. 
e2d0: 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
e2e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
e2f0: 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
e300: 53 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SE;.        }.  
e310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e320: 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a     cost += cost*
e330: 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20  estLog(cost);.  
e340: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
e350: 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62  (("...... orderb
e360: 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  y increases cost
e370: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
e380: 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t));.      }.   
e390: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
e3a0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 63 61   to see if we ca
e3b0: 6e 20 67 65 74 20 61 77 61 79 20 77 69 74 68 20  n get away with 
e3c0: 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69  using just the i
e3d0: 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20  ndex without.   
e3e0: 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67   ** ever reading
e3f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20   the table.  If 
e400: 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
e410: 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65  , then halve the
e420: 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20  .    ** cost of 
e430: 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20  this index..    
e440: 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  */.    if( flags
e450: 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65   && pSrc->colUse
e460: 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31  d < (((Bitmask)1
e470: 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20  )<<(BMS-1)) ){. 
e480: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
e490: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a   pSrc->colUsed;.
e4a0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
e4b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
e4c0: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a  robe->nColumn; j
e4d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
e4e0: 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43   x = pProbe->aiC
e4f0: 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
e500: 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b    if( x<BMS-1 ){
e510: 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20  .          m &= 
e520: 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  ~(((Bitmask)1)<<
e530: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
e540: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e550: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
e560: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  flags |= WHERE_I
e570: 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  DX_ONLY;.       
e580: 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20   cost /= 2;.    
e590: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
e5a0: 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79  "...... idx-only
e5b0: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
e5c0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
e5d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e5e0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
e5f0: 69 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76  index has achiev
e600: 65 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ed the lowest co
e610: 73 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20  st so far, then 
e620: 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
e630: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20     if( flags && 
e640: 63 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73  cost < lowestCos
e650: 74 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49  t ){.      bestI
e660: 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20  dx = pProbe;.   
e670: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
e680: 63 6f 73 74 3b 0a 20 20 20 20 20 20 62 65 73 74  cost;.      best
e690: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
e6a0: 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e       bestNEq = n
e6b0: 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Eq;.    }.  }.. 
e6c0: 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62   /* Report the b
e6d0: 65 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a  est result.  */.
e6e0: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73    *ppIndex = bes
e6f0: 74 49 64 78 3b 0a 20 20 57 48 45 52 45 54 52 41  tIdx;.  WHERETRA
e700: 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20  CE(("best index 
e710: 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67  is %s, cost=%.9g
e720: 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d  , flags=%x, nEq=
e730: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62  %d\n",.        b
e740: 65 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78  estIdx ? bestIdx
e750: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65  ->zName : "(none
e760: 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20  )", lowestCost, 
e770: 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e  bestFlags, bestN
e780: 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20  Eq));.  *pFlags 
e790: 3d 20 62 65 73 74 46 6c 61 67 73 20 7c 20 65 71  = bestFlags | eq
e7a0: 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45  TermMask;.  *pnE
e7b0: 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72  q = bestNEq;.  r
e7c0: 65 74 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74  eturn lowestCost
e7d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ;.}.../*.** Disa
e7e0: 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
e7f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
e800: 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
e810: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
e820: 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
e830: 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
e840: 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
e850: 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
e860: 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
e870: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
e880: 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
e890: 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
e8a0: 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
e8b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
e8c0: 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
e8d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
e8e0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
e8f0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
e900: 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
e910: 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
e920: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
e930: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
e940: 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
e950: 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
e960: 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
e970: 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
e980: 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
e990: 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
e9a0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
e9b0: 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
e9c0: 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
e9d0: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
e9e0: 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
e9f0: 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
ea00: 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
ea10: 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
ea20: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
ea30: 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
ea40: 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
ea50: 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
ea60: 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
ea70: 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
ea80: 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
ea90: 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
eaa0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
eab0: 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
eac0: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
ead0: 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20   When terms are 
eae0: 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20  satisfied.** by 
eaf0: 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61  indices, we disa
eb00: 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76  ble them to prev
eb10: 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65  ent redundant te
eb20: 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72  sts in the inner
eb30: 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f  .** loop.  We wo
eb40: 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72  uld get the corr
eb50: 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e  ect results if n
eb60: 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72  othing were ever
eb70: 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75   disabled,.** bu
eb80: 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75  t joins might ru
eb90: 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
eba0: 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73  r.  The trick is
ebb0: 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d   to disable as m
ebc0: 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e  uch.** as we can
ebd0: 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69   without disabli
ebe0: 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66  ng too much.  If
ebf0: 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   we disabled in 
ec00: 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a  (1), we'd get.**
ec10: 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65   the wrong answe
ec20: 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  r.  See ticket #
ec30: 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  813..*/.static v
ec40: 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28  oid disableTerm(
ec50: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
ec60: 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  el, WhereTerm *p
ec70: 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65  Term){.  if( pTe
ec80: 72 6d 0a 20 20 20 20 20 20 26 26 20 41 4c 57 41  rm.      && ALWA
ec90: 59 53 28 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73  YS((pTerm->flags
eca0: 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d   & TERM_CODED)==
ecb0: 30 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65  0).      && (pLe
ecc0: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d  vel->iLeftJoin==
ecd0: 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  0 || ExprHasProp
ece0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
ecf0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
ed00: 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  .  ){.    pTerm-
ed10: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
ed20: 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
ed30: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
ed40: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
ed50: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
ed60: 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
ed70: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
ed80: 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
ed90: 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
eda0: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
edb0: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
edc0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
edd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ede0: 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
edf0: 74 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ties associated 
ee00: 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6e  with the first n
ee10: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65   columns of inde
ee20: 78 0a 2a 2a 20 70 49 64 78 20 74 6f 20 74 68 65  x.** pIdx to the
ee30: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e   values in the n
ee40: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
ee50: 69 6e 67 20 61 74 20 62 61 73 65 2e 0a 2a 2f 0a  ing at base..*/.
ee60: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
ee70: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61  ApplyAffinity(Pa
ee80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
ee90: 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 49 6e   base, int n, In
eea0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66  dex *pIdx){.  if
eeb0: 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 56 64 62  ( n>0 ){.    Vdb
eec0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
eed0: 56 64 62 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Vdbe;.    assert
eee0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  ( v!=0 );.    sq
eef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ef00: 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
ef10: 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
ef20: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
ef30: 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a  tyStr(v, pIdx);.
ef40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ef50: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ef60: 67 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  ge(pParse, base,
ef70: 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a   n);.  }.}.../*.
ef80: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ef90: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71   for a single eq
efa0: 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74  uality term of t
efb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
efc0: 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a    An equality.**
efd0: 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74   term can be eit
efe0: 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20  her X=expr or X 
eff0: 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
f000: 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f  m is the term to
f010: 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a   be .** coded..*
f020: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
f030: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
f040: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66  onstraint is lef
f050: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  t in register iR
f060: 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  eg..**.** For a 
f070: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68  constraint of th
f080: 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74  e form X=expr, t
f090: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f0a0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
f0b0: 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20  ts.** result is 
f0c0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63  left on the stac
f0d0: 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69  k.  For constrai
f0e0: 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  nts of the form 
f0f0: 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68  X IN (...).** th
f100: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
f110: 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  up a loop that w
f120: 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72  ill iterate over
f130: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58   all values of X
f140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f150: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
f160: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f170: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
f180: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f190: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
f1a0: 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74  Term,   /* The t
f1b0: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
f1c0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f   clause to be co
f1d0: 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  ded */.  WhereLe
f1e0: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20  vel *pLevel, /* 
f1f0: 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68  When level of th
f200: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65  e FROM clause we
f210: 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
f220: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74  */.  int iTarget
f230: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65           /* Atte
f240: 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73  mpt to leave res
f250: 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67  ults in this reg
f260: 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78  ister */.){.  Ex
f270: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
f280: 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76  pExpr;.  Vdbe *v
f290: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
f2a0: 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20  ;.  int iReg;   
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2c0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
f2d0: 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20  ng results */.. 
f2e0: 20 69 66 28 20 69 54 61 72 67 65 74 3c 3d 30 20   if( iTarget<=0 
f2f0: 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  ){.    iReg = iT
f300: 61 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33 47  arget = sqlite3G
f310: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f320: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 58 2d  );.  }.  if( pX-
f330: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20  >op==TK_EQ ){.  
f340: 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
f350: 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
f360: 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
f370: 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d  t, iTarget);.  }
f380: 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d  else if( pX->op=
f390: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20  =TK_ISNULL ){.  
f3a0: 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
f3b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f3c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
f3d0: 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69  ll, 0, iReg);.#i
f3e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f3f0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c  T_SUBQUERY.  }el
f400: 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70  se{.    int eTyp
f410: 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e;.    int iTab;
f420: 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f  .    struct InLo
f430: 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73  op *pIn;..    as
f440: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
f450: 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20  _IN );.    iReg 
f460: 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65  = iTarget;.    e
f470: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
f480: 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
f490: 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54  , pX, 0);.    iT
f4a0: 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
f4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f4c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
f4d0: 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
f4e0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f4f0: 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73  v, "%.*s", pX->s
f500: 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e  pan.n, pX->span.
f510: 7a 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  z));.    if( pLe
f520: 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  vel->nIn==0 ){. 
f530: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74       pLevel->nxt
f540: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
f550: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
f560: 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  }.    pLevel->nI
f570: 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
f580: 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  >aInLoop = sqlit
f590: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
f5a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
f5b0: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20  evel->aInLoop,. 
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
f5f0: 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  ->aInLoop[0])*pL
f600: 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20  evel->nIn);.    
f610: 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49  pIn = pLevel->aI
f620: 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
f630: 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
f640: 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d  += pLevel->nIn -
f650: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
f660: 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
f670: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
f680: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
f690: 20 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41         pIn->topA
f6a0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f6b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
f6c0: 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
f6d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f6e0: 20 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41         pIn->topA
f6f0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f700: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
f710: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
f720: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
f730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f740: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
f750: 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
f760: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
f770: 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
f780: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
f790: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
f7a0: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65  el, pTerm);.  re
f7b0: 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a  turn iReg;.}../*
f7c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f7d0: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
f7e0: 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
f7f0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
f800: 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  or an.** index. 
f810: 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   The values for 
f820: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
f830: 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20  are left on the 
f840: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stack..**.** For
f850: 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
f860: 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
f870: 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
f880: 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
f890: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
f8a0: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
f8b0: 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
f8c0: 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
f8d0: 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
f8e0: 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
f8f0: 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
f900: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
f910: 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
f920: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
f930: 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
f940: 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
f950: 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
f960: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
f970: 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
f980: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
f990: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
f9a0: 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
f9b0: 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
f9c0: 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
f9d0: 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
f9e0: 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a   will be left.**
f9f0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20   on the stack - 
fa00: 61 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74  a is the deepest
fa10: 20 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c   and b the shall
fa20: 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  owest..**.** In 
fa30: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
fa40: 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
fa50: 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
fa60: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
fa70: 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
fa80: 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
fa90: 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
faa0: 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
fab0: 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
fac0: 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
fad0: 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
fae0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
faf0: 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ory cell..**.** 
fb00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
fb10: 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
fb20: 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
fb30: 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a  y cell and puts.
fb40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
fb50: 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  f that memory ce
fb60: 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d  ll in pLevel->iM
fb70: 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68  em.  The code th
fb80: 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
fb90: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
fba0: 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74  e pLevel->iMem t
fbb0: 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
fbc0: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
fbd0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
fbe0: 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
fbf0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
fc00: 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
fc10: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
fc20: 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
fc30: 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
fc40: 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
fc50: 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l.** use..*/.sta
fc60: 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
fc70: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
fc80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
fc90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
fca0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
fcb0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
fcc0: 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
fcd0: 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
fce0: 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
fcf0: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
fd00: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
fd10: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
fd20: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
fd30: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
fd40: 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
fd50: 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
fd60: 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20   been coded */. 
fd70: 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 20   int nExtraReg  
fd80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
fd90: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
fda0: 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
fdb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20  */.){.  int nEq 
fdc0: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20  = pLevel->nEq;  
fdd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
fde0: 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20  ber of == or IN 
fdf0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63  constraints to c
fe00: 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ode */.  Vdbe *v
fe10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
fe20: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69  ;      /* The vi
fe30: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
fe40: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
fe50: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
fe60: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
fe70: 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
fe80: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
fe90: 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  this loop */.  i
fea0: 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c  nt iCur = pLevel
feb0: 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20  ->iTabCur;   /* 
fec0: 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
fed0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
fee0: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
fef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
ff00: 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e  single constrain
ff10: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  t term */.  int 
ff20: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
ff30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
ff40: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
ff50: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff70: 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f  Base register */
ff80: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
ff90: 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
ffa0: 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
ffb0: 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
ffc0: 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65  te them..  ** We
ffd0: 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20   always need at 
ffe0: 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74  least one used t
fff0: 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70  o store the loop
10000 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a   terminator.  **
10010 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72   value.  If ther
10020 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f  e are IN operato
10030 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e  rs we'll need on
10040 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72  e for each == or
10050 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61  .  ** IN constra
10060 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76  int..  */.  pLev
10070 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
10080 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 72  e->nMem + 1;.  r
10090 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
100a0 3e 6e 4d 65 6d 20 2b 20 32 3b 0a 20 20 70 50 61  >nMem + 2;.  pPa
100b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65  rse->nMem += pLe
100c0 76 65 6c 2d 3e 6e 45 71 20 2b 20 32 20 2b 20 6e  vel->nEq + 2 + n
100d0 45 78 74 72 61 52 65 67 3b 0a 0a 20 20 2f 2a 20  ExtraReg;..  /* 
100e0 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
100f0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
10100 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
10110 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
10120 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  nEq );.  for(j=0
10130 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20  ; j<nEq; j++){. 
10140 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69     int r1;.    i
10150 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
10160 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54  olumn[j];.    pT
10170 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
10180 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  WC, iCur, k, not
10190 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 66  Ready, pLevel->f
101a0 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20  lags, pIdx);.   
101b0 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d   if( NEVER(pTerm
101c0 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
101d0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
101e0 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
101f0 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
10200 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
10210 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
10220 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67  erm, pLevel, reg
10230 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
10240 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
10250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10260 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10270 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61  SCopy, r1, regBa
10280 73 65 2b 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  se+j);.    }.   
10290 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
102a0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
102b0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
102c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
102d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
102e0 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
102f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
10300 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
10310 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
10320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10330 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
10340 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65  regBase+j, pLeve
10350 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20  l->brk);.    }. 
10360 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42   }.  return regB
10370 61 73 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ase;.}..#if defi
10380 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
10390 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
103a0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f  wing variable ho
103b0 6c 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72  lds a text descr
103c0 69 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20  iption of query 
103d0 70 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a  plan generated.*
103e0 2a 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65  * by the most re
103f0 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
10400 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10410 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
10420 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76  WhereBegin.** ov
10430 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
10440 76 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66  vious.  This inf
10450 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
10460 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
10470 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  .** analysis onl
10480 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  y..*/.char sqlit
10490 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d  e3_query_plan[BM
104a0 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78  S*2*40];  /* Tex
104b0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
104c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c  .static int nQPl
104d0 61 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  an = 0;         
104e0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65       /* Next fre
104f0 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79  e slow in _query
10500 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64  _plan[] */..#end
10510 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
10520 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  T */.../*.** Fre
10530 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74  e a WhereInfo st
10540 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69  ructure.*/.stati
10550 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f  c void whereInfo
10560 46 72 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a  Free(WhereInfo *
10570 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70  pWInfo){.  if( p
10580 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74  WInfo ){.    int
10590 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   i;.    sqlite3 
105a0 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
105b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 66 6f  arse->db;.    fo
105c0 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
105d0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
105e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
105f0 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  ex_info *pInfo =
10600 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49   pWInfo->a[i].pI
10610 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  dxInfo;.      if
10620 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  ( pInfo ){.     
10630 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f     assert( pInfo
10640 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
10650 74 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  tr==0 );.       
10660 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10670 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  b, pInfo);.     
10680 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
10690 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
106a0 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  WInfo);.  }.}...
106b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
106c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
106d0 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f  the loop used fo
106e0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  r WHERE clause p
106f0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68  rocessing..** Th
10700 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
10710 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
10720 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75  n opaque structu
10730 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
10740 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
10750 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e  needed to termin
10760 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c  ate the loop.  L
10770 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ater, the callin
10780 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f  g routine.** sho
10790 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
107a0 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74  e3WhereEnd() wit
107b0 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  h the return val
107c0 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
107d0 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ion.** in order 
107e0 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
107f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
10800 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  cessing..**.** I
10810 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10820 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10830 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a  returns NULL..**
10840 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64  .** The basic id
10850 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65  ea is to do a ne
10860 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c  sted loop, one l
10870 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62  oop for each tab
10880 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f  le in.** the FRO
10890 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65  M clause of a se
108a0 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61  lect.  (INSERT a
108b0 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nd UPDATE statem
108c0 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20  ents are the.** 
108d0 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54  same as a SELECT
108e0 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e   with only a sin
108f0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
10900 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20   FROM clause.)  
10910 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  For.** example, 
10920 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68  if the SQL is th
10930 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
10940 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
10950 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e  , t2, t3 WHERE .
10960 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ..;.**.** Then t
10970 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
10980 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c  d is conceptuall
10990 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f  y like the follo
109a0 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
109b0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
109c0 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20   t1 do       \  
109d0 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
109e0 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61  .**        forea
109f0 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f  ch row2 in t2 do
10a00 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
10a10 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10a20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72  .**          for
10a30 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20  each row3 in t3 
10a40 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20  do   /.**       
10a50 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
10a60 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20               \  
10a80 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64    Code generated
10a90 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20  .**        end  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c        |-- by sql
10ac0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
10ad0 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20  *      end      
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20     /.**.** Note 
10b00 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d  that the loops m
10b10 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74  ight not be nest
10b20 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
10b30 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a  in which they.**
10b40 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
10b50 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20  ROM clause if a 
10b60 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20  different order 
10b70 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74  is better able t
10b80 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66  o make.** use of
10b90 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20   indices.  Note 
10ba0 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  also that when t
10bb0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61  he IN operator a
10bc0 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65  ppears in.** the
10bd0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
10be0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
10bf0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73  n additional nes
10c00 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a  ted loops for.**
10c10 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
10c20 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20  h all values on 
10c30 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
10c40 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a  ide of the IN..*
10c50 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42  *.** There are B
10c60 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73  tree cursors ass
10c70 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
10c80 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65  h table.  t1 use
10c90 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  s cursor.** numb
10ca0 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30  er pTabList->a[0
10cb0 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75  ].iCursor.  t2 u
10cc0 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70  ses the cursor p
10cd0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43  TabList->a[1].iC
10ce0 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ursor..** And so
10cf0 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f   forth.  This ro
10d00 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
10d10 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f  code to open tho
10d20 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a  se VDBE cursors.
10d30 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68  ** and sqlite3Wh
10d40 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74  ereEnd() generat
10d50 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63  es the code to c
10d60 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  lose them..**.**
10d70 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   The code that s
10d80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10d90 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61  () generates lea
10da0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20  ves the cursors 
10db0 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62  named.** in pTab
10dc0 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  List pointing at
10dd0 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61   their appropria
10de0 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65  te entries.  The
10df0 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63   [...] code.** c
10e00 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e  an use OP_Column
10e10 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70   and OP_Rowid op
10e20 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63  codes on these c
10e30 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63  ursors to extrac
10e40 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74  t.** data from t
10e50 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65  he various table
10e60 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a  s of the loop..*
10e70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
10e80 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74  E clause is empt
10e90 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c  y, the foreach l
10ea0 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73  oops must each s
10eb0 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74  can their.** ent
10ec0 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75  ire tables.  Thu
10ed0 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f  s a three-way jo
10ee0 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20  in is an O(N^3) 
10ef0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20  operation.  But 
10f00 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73  if.** the tables
10f10 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e   have indices an
10f20 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d  d there are term
10f30 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
10f40 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65  lause that.** re
10f50 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64  fer to those ind
10f60 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65  ices, a complete
10f70 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20   table scan can 
10f80 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74  be avoided and t
10f90 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  he.** code will 
10fa0 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e  run much faster.
10fb0 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f    Most of the wo
10fc0 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  rk of this routi
10fd0 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a  ne is checking.*
10fe0 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  * to see if ther
10ff0 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68  e are indices th
11000 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
11010 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c  o speed up the l
11020 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73  oop..**.** Terms
11030 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
11040 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73  ause are also us
11050 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63  ed to limit whic
11060 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a  h rows actually.
11070 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68  ** make it to th
11080 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d  e "..." in the m
11090 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f  iddle of the loo
110a0 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22  p.  After each "
110b0 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72  foreach",.** ter
110c0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
110d0 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20  clause that use 
110e0 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68  only terms in th
110f0 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65  at loop and oute
11100 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65  r.** loops are e
11110 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20  valuated and if 
11120 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20  false a jump is 
11130 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20  made around all 
11140 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e  subsequent.** in
11150 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72  ner loops (or ar
11160 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69  ound the "..." i
11170 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72  f the test occur
11180 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e  s within the inn
11190 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70  er-.** most loop
111a0 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f  ).**.** OUTER JO
111b0 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74  INS.**.** An out
111c0 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65  er join of table
111d0 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63  s t1 and t2 is c
111e0 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64  onceptally coded
111f0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
11200 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  **    foreach ro
11210 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20  w1 in t1 do.**  
11220 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20      flag = 0.** 
11230 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
11240 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20  2 in t2 do.**   
11250 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20       start:.**  
11260 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
11270 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31          flag = 1
11280 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20  .**      end.** 
11290 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20       if flag==0 
112a0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d  then.**        m
112b0 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72  ove the row2 cur
112c0 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f  sor to a null ro
112d0 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f  w.**        goto
112e0 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66   start.**      f
112f0 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a  i.**    end.**.*
11300 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53  * ORDER BY CLAUS
11310 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a  E PROCESSING.**.
11320 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
11330 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11340 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
11350 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
11360 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74  atement,.** if t
11370 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
11380 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
11390 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
113a0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
113b0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
113c0 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
113d0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
113e0 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20   then ppOrderBy 
113f0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  is NULL..**.** I
11400 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62  f an index can b
11410 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74  e used so that t
11420 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75  he natural outpu
11430 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74  t order of the t
11440 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20  able.** scan is 
11450 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20  correct for the 
11460 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
11470 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78   then that index
11480 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20   is used and.** 
11490 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65  *ppOrderBy is se
114a0 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73  t to NULL.  This
114b0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
114c0 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74  ion that prevent
114d0 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73  s an.** unnecess
114e0 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20  ary sort of the 
114f0 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e  result set if an
11500 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61   index appropria
11510 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52  te for the.** OR
11520 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c  DER BY clause al
11530 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a  ready exists..**
11540 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65  .** If the where
11550 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61   clause loops ca
11560 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64  nnot be arranged
11570 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
11580 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75  correct.** outpu
11590 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68  t order, then th
115a0 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  e *ppOrderBy is 
115b0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68  unchanged..*/.Wh
115c0 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  ereInfo *sqlite3
115d0 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61  WhereBegin(.  Pa
115e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
115f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
11600 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
11610 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
11620 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  ,    /* A list o
11630 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  f all tables to 
11640 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
11650 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
11660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
11670 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
11680 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65  xprList **ppOrde
11690 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52  rBy, /* An ORDER
116a0 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e   BY clause, or N
116b0 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 77 66 6c 61  ULL */.  u8 wfla
116c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
116d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
116e0 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
116f0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
11700 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11730 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49  nter */.  WhereI
11740 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
11750 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
11760 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
11770 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
11780 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
11790 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
117a0 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
117b0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
117c0 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72  gine */.  int br
117d0 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20  k, cont = 0;    
117e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65       /* Addresse
117f0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f  s used during co
11800 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  de generation */
11810 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
11820 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ady;          /*
11830 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   Cursors that ar
11840 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69  e not yet positi
11850 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54  oned */.  WhereT
11860 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
11870 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
11880 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
11890 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
118a0 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53  xprMaskSet maskS
118b0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  et;       /* The
118c0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
118d0 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43   set */.  WhereC
118e0 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
118f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11900 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69  E clause is divi
11910 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74  ded into these t
11920 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  erms */.  struct
11930 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
11940 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73  TabItem;  /* A s
11950 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  ingle entry from
11960 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
11970 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
11980 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
11990 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
119a0 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c   in the pWInfo l
119b0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ist */.  int iFr
119c0 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
119d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
119e0 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c  t unused FROM cl
119f0 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ause element */.
11a00 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20    int andFlags; 
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69  AND-ed combinati
11a30 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d  on of all wc.a[]
11a40 2e 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69  .flags */.  sqli
11a50 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
11a60 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
11a70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
11a80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
11a90 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
11aa0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
11ab0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
11ac0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
11ad0 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
11ae0 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
11af0 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
11b00 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
11b10 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20  ->nSrc>BMS ){.  
11b20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11b30 67 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f  g(pParse, "at mo
11b40 73 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20  st %d tables in 
11b50 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20  a join", BMS);. 
11b60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11b70 0a 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72 42  ..  if( ppOrderB
11b80 79 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  y ){.    pOrderB
11b90 79 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a  y = *ppOrderBy;.
11ba0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20    }..  /* Split 
11bb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
11bc0 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
11bd0 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
11be0 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
11bf0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
11c00 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
11c10 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
11c20 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
11c30 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  &maskSet);.  whe
11c40 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63  reClauseInit(&wc
11c50 2c 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53  , pParse, &maskS
11c60 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  et);.  sqlite3Ex
11c70 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28  prCodeConstants(
11c80 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b  pParse, pWhere);
11c90 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77  .  whereSplit(&w
11ca0 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  c, pWhere, TK_AN
11cb0 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c  D);.    .  /* Al
11cc0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
11cd0 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49  alize the WhereI
11ce0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
11cf0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
11d00 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  he.  ** return v
11d10 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  alue..  */.  db 
11d20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11d30 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
11d40 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
11d50 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
11d60 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
11d70 57 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61  WhereInfo) + pTa
11d80 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65  bList->nSrc*size
11d90 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
11da0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11db0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11dc0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
11dd0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Mem;.  }.  pWInf
11de0 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62  o->nLevel = pTab
11df0 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57  List->nSrc;.  pW
11e00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
11e10 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
11e20 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
11e30 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
11e40 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
11e50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11e60 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
11e70 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
11e80 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
11e90 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
11ea0 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
11eb0 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
11ec0 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
11ed0 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
11ee0 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
11ef0 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54  f( pWhere && (pT
11f00 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20  abList->nSrc==0 
11f10 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
11f20 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
11f30 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20  pWhere)) ){.    
11f40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
11f50 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  se(pParse, pWher
11f60 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
11f70 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
11f80 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72  NULL);.    pWher
11f90 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
11fa0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
11fb0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
11fc0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
11fd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
11fe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
11ff0 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
12000 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
12010 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
12020 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
12030 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
12040 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
12050 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
12060 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
12070 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
12080 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
12090 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
120a0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
120b0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
120c0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
120d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
120e0 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
120f0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
12100 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
12110 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
12120 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
12130 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
12140 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
12150 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
12160 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
12170 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
12180 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
12190 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
121a0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
121b0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
121c0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
121d0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
121e0 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
121f0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
12200 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
12210 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
12220 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
12230 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
12240 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
12250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61  ; i++){.    crea
12260 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  teMask(&maskSet,
12270 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
12280 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  iCursor);.  }.#i
12290 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b  fndef NDEBUG.  {
122a0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54  .    Bitmask toT
122b0 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  heLeft = 0;.    
122c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
122d0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
122e0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
122f0 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
12300 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
12310 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  [i].iCursor);.  
12320 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31      assert( (m-1
12330 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a  )==toTheLeft );.
12340 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20        toTheLeft 
12350 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  |= m;.    }.  }.
12360 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61  #endif..  /* Ana
12370 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lyze all of the 
12380 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
12390 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41   Note that exprA
123a0 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20  nalyze() might. 
123b0 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74   ** add new virt
123c0 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74  ual terms onto t
123d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
123e0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20  ERE clause.  We 
123f0 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74  do not.  ** want
12400 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73   to analyze thes
12410 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c  e virtual terms,
12420 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a   so start analyz
12430 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20  ing at the end. 
12440 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72   ** and work for
12450 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65  ward so that the
12460 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74   added virtual t
12470 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70  erms are never p
12480 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  rocessed..  */. 
12490 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
124a0 70 54 61 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a  pTabList, &wc);.
124b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
124c0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
124d0 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  to whereBeginNoM
124e0 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  em;.  }..  /* Ch
124f0 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64  ose the best ind
12500 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61  ex to use for ea
12510 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
12520 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
12530 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
12540 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f   fills in the fo
12550 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
12560 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e    **.  **   pWIn
12570 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20  fo->a[].pIdx    
12580 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75    The index to u
12590 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65  se for this leve
125a0 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  l of the loop.. 
125b0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
125c0 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52  ].flags     WHER
125d0 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f  E_xxx flags asso
125e0 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
125f0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
12600 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68  a[].nEq       Th
12610 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61  e number of == a
12620 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
12630 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  s.  **   pWInfo-
12640 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57  >a[].iFrom     W
12650 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20  hen term of the 
12660 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62  FROM clause is b
12670 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20  eing coded.  ** 
12680 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54    pWInfo->a[].iT
12690 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45  abCur   The VDBE
126a0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
126b0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20  database table. 
126c0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
126d0 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20  ].iIdxCur   The 
126e0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
126f0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20  the index.  **. 
12700 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
12710 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74  so figures out t
12720 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72  he nesting order
12730 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
12740 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75  e FROM.  ** clau
12750 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  se..  */.  notRe
12760 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
12770 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  0;.  pTabItem = 
12780 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70  pTabList->a;.  p
12790 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
127a0 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20  a;.  andFlags = 
127b0 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45  ~0;.  WHERETRACE
127c0 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
127d0 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b   Start ***\n"));
127e0 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30  .  for(i=iFrom=0
127f0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
12800 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
12810 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  nSrc; i++, pLeve
12820 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l++){.    Index 
12830 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
12840 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66        /* Index f
12850 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74  or FROM table at
12860 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20   pTabItem */.   
12870 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12890 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65  Flags asssociate
128a0 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20  d with pIdx */. 
128b0 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20     int nEq;     
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
128d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
128e0 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
128f0 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63   */.    double c
12900 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
12910 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
12920 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  for pIdx */.    
12930 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
12940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12950 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
12960 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20  FROM tables */. 
12970 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
12980 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
12990 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
129a0 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
129b0 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67      int bestFlag
129c0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
129d0 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61  /* Flags associa
129e0 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
129f0 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45  /.    int bestNE
12a00 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  q = 0;          
12a10 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61    /* nEq associa
12a20 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a  ted with pBest *
12a30 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77  /.    double low
12a40 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20  estCost;        
12a50 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65    /* Cost of the
12a60 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e   pBest */.    in
12a70 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20  t bestJ = 0;    
12a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12a90 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20   value of j */. 
12aa0 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20     Bitmask m;   
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ac0 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20  * Bitmask value 
12ad0 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a  for j or bestJ *
12ae0 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  /.    int once =
12af0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12b00 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66    /* True when f
12b10 69 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65  irst table is se
12b20 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  en */.    sqlite
12b30 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
12b40 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74  ndex; /* Current
12b50 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a   virtual index *
12b60 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  /..    lowestCos
12b70 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
12b80 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46  BL;.    for(j=iF
12b90 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
12ba0 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
12bb0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
12bc0 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
12bd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  ){.      int doN
12be0 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54  otReorder;  /* T
12bf0 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
12c00 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
12c10 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20  reordered */..  
12c20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72      doNotReorder
12c30 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a   =  (pTabItem->j
12c40 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
12c50 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
12c60 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
12c70 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72   && doNotReorder
12c80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12c90 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73  m = getMask(&mas
12ca0 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
12cb0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
12cc0 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64  if( (m & notRead
12cd0 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)==0 ){.       
12ce0 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20   if( j==iFrom ) 
12cf0 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  iFrom++;.       
12d00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
12d10 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
12d20 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20   pTabItem->pTab 
12d30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12d40 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12d50 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73  BLE.      if( Is
12d60 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d  Virtual(pTabItem
12d70 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
12d80 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
12d90 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
12da0 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a  o = &pWInfo->a[j
12db0 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
12dc0 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56      cost = bestV
12dd0 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72  irtualIndex(pPar
12de0 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65  se, &wc, pTabIte
12df0 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20  m, notReady,.   
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f               ppO
12e20 72 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65  rderBy ? *ppOrde
12e30 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20  rBy : 0, i==0,. 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12e60 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pIdxInfo);.     
12e70 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45     flags = WHERE
12e80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
12e90 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
12ea0 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  *ppIdxInfo;.    
12eb0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12ec0 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42  & pIndex->orderB
12ed0 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
12ee0 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
12ef0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
12f00 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42  E | WHERE_ORDERB
12f10 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
12f20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
12f30 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a         nEq = 0;.
12f40 20 20 20 20 20 20 20 20 69 66 28 20 28 53 51 4c          if( (SQL
12f50 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29  ITE_BIG_DBL/2.0)
12f60 3c 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <cost ){.       
12f70 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69     /* The cost i
12f80 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
12f90 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
12fa0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28  SQLITE_BIG_DBL (
12fb0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
12fc0 20 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66   inital value of
12fd0 20 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74   lowestCost in t
12fe0 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20  his loop. If it 
12ff0 69 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  is, then.       
13000 20 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c     ** the (cost<
13010 6c 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74  lowestCost) test
13020 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65   below will neve
13030 72 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20 20  r be true and.  
13040 20 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76 65          ** pLeve
13050 6c 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76 65  l->pBestIdx neve
13060 72 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  r set..         
13070 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 63   */ .          c
13080 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49  ost = (SQLITE_BI
13090 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20  G_DBL/2.0);.    
130a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
130b0 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
130c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d  {.        cost =
130d0 20 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73   bestIndex(pPars
130e0 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
130f0 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70       (i==0 && pp
13120 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72  OrderBy) ? *ppOr
13130 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20  derBy : 0,.     
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67      &pIdx, &flag
13160 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20  s, &nEq);.      
13170 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
13180 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13190 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20  cost<lowestCost 
131a0 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20  ){.        once 
131b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77  = 1;.        low
131c0 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
131d0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
131e0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65  pIdx;.        be
131f0 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  stFlags = flags;
13200 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71  .        bestNEq
13210 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20   = nEq;.        
13220 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20  bestJ = j;.     
13230 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74     pLevel->pBest
13240 49 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  Idx = pIndex;.  
13250 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13260 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
13270 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13280 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
13290 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63   Optimizer selec
132a0 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20  ts table %d for 
132b0 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74  loop %d\n", best
132c0 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c  J,.           pL
132d0 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29  evel-pWInfo->a))
132e0 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46  ;.    if( (bestF
132f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
13300 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ERBY)!=0 ){.    
13310 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30    *ppOrderBy = 0
13320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46  ;.    }.    andF
13330 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67  lags &= bestFlag
13340 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66  s;.    pLevel->f
13350 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73  lags = bestFlags
13360 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49  ;.    pLevel->pI
13370 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20  dx = pBest;.    
13380 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65  pLevel->nEq = be
13390 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65  stNEq;.    pLeve
133a0 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a  l->aInLoop = 0;.
133b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20      pLevel->nIn 
133c0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65  = 0;.    if( pBe
133d0 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  st ){.      pLev
133e0 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50  el->iIdxCur = pP
133f0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
13410 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
13420 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   -1;.    }.    n
13430 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
13440 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
13450 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d  abList->a[bestJ]
13460 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  .iCursor);.    p
13470 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62  Level->iFrom = b
13480 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45 52  estJ;.  }.  WHER
13490 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
134a0 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
134b0 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20  ***\n"));..  /* 
134c0 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
134d0 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
134e0 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
134f0 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
13500 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
13510 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
13520 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
13530 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
13540 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
13550 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
13560 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
13570 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
13580 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
13590 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
135a0 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
135b0 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
135c0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
135d0 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
135e0 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
135f0 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
13600 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
13610 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
13620 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13630 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
13640 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
13650 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
13660 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
13670 61 73 73 65 72 74 28 20 28 77 66 6c 61 67 73 20  assert( (wflags 
13680 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
13690 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70  DESIRED)==0 || p
136a0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31  WInfo->nLevel==1
136b0 20 29 3b 0a 20 20 69 66 28 20 28 77 66 6c 61 67   );.  if( (wflag
136c0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
136d0 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26  S_DESIRED)!=0 &&
136e0 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
136f0 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  RE_UNIQUE)!=0 ){
13700 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
13710 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
13720 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 66 6c 61  pWInfo->a[0].fla
13730 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58  gs &= ~WHERE_IDX
13740 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _ONLY;.  }..  /*
13750 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
13760 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
13770 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
13780 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
13790 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
137a0 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
137b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
137c0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
137d0 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74  , -1); /* Insert
137e0 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
137f0 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66  fier Goto */.  f
13800 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
13810 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
13820 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
13830 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
13840 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
13850 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
13860 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
13870 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  pIx;      /* Ind
13880 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
13890 73 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20  s pTab (if any) 
138a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
138b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
138c0 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
138d0 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
138e0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
138f0 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
13900 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64  >iIdxCur;..#ifnd
13910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
13920 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
13930 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
13940 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  2 ){.      char 
13950 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72  *zMsg;.      str
13960 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
13970 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
13980 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
13990 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73  From];.      zMs
139a0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
139b0 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73  tf(db, "TABLE %s
139c0 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
139d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
139e0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
139f0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
13a00 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
13a10 7a 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22  zMsg, "%s AS %s"
13a20 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
13a30 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
13a40 20 20 20 20 20 20 69 66 28 20 28 70 49 78 20 3d        if( (pIx =
13a50 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d   pLevel->pIdx)!=
13a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  0 ){.        zMs
13a70 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
13a80 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
13a90 73 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22  s WITH INDEX %s"
13aa0 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61  , zMsg, pIx->zNa
13ab0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
13ac0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
13ad0 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
13ae0 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
13af0 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
13b00 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
13b10 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
13b20 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 50 52  sg, "%s USING PR
13b30 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
13b40 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
13b50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13b60 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
13b70 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65    else if( pLeve
13b80 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20  l->pBestIdx ){. 
13b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
13ba0 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74  ndex_info *pBest
13bb0 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42  Idx = pLevel->pB
13bc0 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 20 20  estIdx;.        
13bd0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
13be0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
13bf0 20 22 25 73 20 56 49 52 54 55 41 4c 20 54 41 42   "%s VIRTUAL TAB
13c00 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73 22 2c  LE INDEX %d:%s",
13c10 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20   zMsg,.         
13c20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
13c30 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 42 65  Idx->idxNum, pBe
13c40 73 74 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  stIdx->idxStr);.
13c50 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13c60 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
13c70 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  >flags & WHERE_O
13c80 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20 20  RDERBY ){.      
13c90 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
13ca0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
13cb0 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 22  g, "%s ORDER BY"
13cc0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
13cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13ce0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
13cf0 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65  xplain, i, pLeve
13d00 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73  l->iFrom, 0, zMs
13d10 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
13d20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
13d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
13d40 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49  AIN */.    pTabI
13d50 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
13d60 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
13d70 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
13d80 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
13d90 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
13da0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
13db0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
13dc0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
13dd0 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c   pTab->isEphem |
13de0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
13df0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
13e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13e10 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
13e20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65   if( pLevel->pBe
13e30 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69  stIdx ){.      i
13e40 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
13e50 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
13e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13e70 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
13e80 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20  , iCur, 0, 0,.  
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
13eb0 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20  r*)pTab->pVtab, 
13ec0 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65  P4_VTAB);.    }e
13ed0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
13ee0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  f( (pLevel->flag
13ef0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
13f00 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
13f10 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d  int op = pWInfo-
13f20 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f  >okOnePass ? OP_
13f30 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f  OpenWrite : OP_O
13f40 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73  penRead;.      s
13f50 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
13f60 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
13f70 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
13f80 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20  pTab, op);.     
13f90 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b   if( !pWInfo->ok
13fa0 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d  OnePass && pTab-
13fb0 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69  >nCol<(sizeof(Bi
13fc0 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20  tmask)*8) ){.   
13fd0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d       Bitmask b =
13fe0 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73   pTabItem->colUs
13ff0 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ed;.        int 
14000 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  n = 0;.        f
14010 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20  or(; b; b=b>>1, 
14020 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73  n++){}.        s
14030 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14040 50 32 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  P2(v, sqlite3Vdb
14050 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
14060 32 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  2, n);.        a
14070 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e  ssert( n<=pTab->
14080 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a  nCol );.      }.
14090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
140a0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
140b0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
140c0 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
140d0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
140e0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  }.    pLevel->iT
140f0 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d  abCur = pTabItem
14100 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69  ->iCursor;.    i
14110 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c  f( (pIx = pLevel
14120 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20  ->pIdx)!=0 ){.  
14130 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14140 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
14150 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
14160 70 49 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pIx);.      asse
14170 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
14180 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
14190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
141a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
141b0 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
141c0 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  0, pIx->nColumn+
141d0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
141e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
141f0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78  P_OpenRead, iIdx
14200 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20  Cur, pIx->tnum, 
14210 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14230 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  ar*)pKey, P4_KEY
14240 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
14250 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
14260 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
14270 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
14280 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
14290 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
142a0 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70  e, iDb);.  }.  p
142b0 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71  WInfo->iTop = sq
142c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
142d0 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47  Addr(v);..  /* G
142e0 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65  enerate the code
142f0 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63   to do the searc
14300 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74 69  h.  Each iterati
14310 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20  on of the for.  
14320 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65  ** loop below ge
14330 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72  nerates code for
14340 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64   a single nested
14350 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a   loop of the VM.
14360 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20    ** program..  
14370 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20  */.  notReady = 
14380 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66  ~(Bitmask)0;.  f
14390 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
143a0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
143b0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
143c0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
143d0 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69  int j;.    int i
143e0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
143f0 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65  iCursor;  /* The
14400 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
14410 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
14420 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
14430 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
14440 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69  x we will be usi
14450 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 78  ng */.    int nx
14460 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
14470 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
14480 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
14490 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
144a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  */.    int iIdxC
144b0 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ur;       /* The
144c0 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
144d0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
144e0 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b    int omitTable;
144f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14500 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
14510 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74   only */.    int
14520 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
14530 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
14540 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
14550 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a  verse order */..
14560 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
14570 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
14580 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
14590 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
145a0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49  >iCursor;.    pI
145b0 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
145c0 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d  x;.    iIdxCur =
145d0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
145e0 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c  ;.    bRev = (pL
145f0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
14600 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
14610 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  .    omitTable =
14620 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
14630 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
14640 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  )!=0;..    /* Cr
14650 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20  eate labels for 
14660 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20  the "break" and 
14670 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72  "continue" instr
14680 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66  uctions.    ** f
14690 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
146a0 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72  oop.  Jump to br
146b0 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
146c0 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a  f a loop..    **
146d0 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f   Jump to cont to
146e0 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   go immediately 
146f0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
14700 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20  ation of the.   
14710 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a   ** loop..    **
14720 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  .    ** When the
14730 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
14740 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
14750 76 65 20 61 20 22 6e 78 74 22 20 6c 61 62 65 6c  ve a "nxt" label
14760 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 6d 65 61   that.    ** mea
14770 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  ns to continue w
14780 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20  ith the next IN 
14790 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f  value combinatio
147a0 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20 2a 2a 20  n.  When.    ** 
147b0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
147c0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
147d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
147e0 65 20 22 6e 78 74 22 20 6c 61 62 65 6c 0a 20 20  e "nxt" label.  
147f0 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
14800 20 61 73 20 22 62 72 6b 22 2e 0a 20 20 20 20 2a   as "brk"..    *
14810 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76  /.    brk = pLev
14820 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65 76 65 6c  el->brk = pLevel
14830 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  ->nxt = sqlite3V
14840 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14850 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76  .    cont = pLev
14860 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74  el->cont = sqlit
14870 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14880 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  v);..    /* If t
14890 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
148a0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
148b0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
148c0 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a  ocate and.    **
148d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
148e0 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
148f0 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
14900 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
14910 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  .    ** row of t
14920 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
14930 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a   the join..    *
14940 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
14950 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
14960 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
14970 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
14980 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
14990 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
149a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
149b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
149c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
149d0 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  ger, 0, pLevel->
149e0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
149f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
14a00 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
14a10 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
14a20 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ));.    }..#ifnd
14a30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14a40 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a50 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
14a60 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
14a70 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61   Case 0:  The ta
14a80 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
14a90 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
14aa0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
14ab0 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  xt.      **     
14ac0 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20 74       to access t
14ad0 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20 20 2a  he data..      *
14ae0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
14af0 20 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20 20       int iReg;  
14b00 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f 72   /* P3 Value for
14b10 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20   OP_VFilter */. 
14b20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64       sqlite3_ind
14b30 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64  ex_info *pBestId
14b40 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  x = pLevel->pBes
14b50 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  tIdx;.      int 
14b60 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 42  nConstraint = pB
14b70 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61  estIdx->nConstra
14b80 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  int;.      struc
14b90 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
14ba0 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
14bb0 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20 20   *aUsage =.     
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
14bf0 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  stIdx->aConstrai
14c00 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20 20 63  ntUsage;.      c
14c10 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
14c20 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14c30 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e  aint *aConstrain
14c40 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
14c80 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  aConstraint;..  
14c90 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
14ca0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
14cb0 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
14cc0 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20 70 50 61  nt+2);.      pPa
14cd0 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
14ce0 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  ache++;.      fo
14cf0 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74  r(j=1; j<=nConst
14d00 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
14d10 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
14d20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
14d30 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29  Constraint; k++)
14d40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14d50 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e  aUsage[k].argvIn
14d60 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20  dex==j ){.      
14d70 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20        int iTerm 
14d80 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d  = aConstraint[k]
14d90 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  .iTermOffset;.  
14da0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14db0 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c  ( pParse->disabl
14dc0 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20 20 20  eColCache );.   
14dd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14de0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14df0 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e 70 45 78   wc.a[iTerm].pEx
14e00 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67  pr->pRight, iReg
14e10 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  +j+1);.         
14e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14e30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14e40 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 6e          if( k==n
14e50 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65  Constraint ) bre
14e60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14e70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14e80 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
14e90 65 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e );.      pPars
14ea0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
14eb0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69  he--;.      sqli
14ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ed0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42 65   OP_Integer, pBe
14ee0 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69  stIdx->idxNum, i
14ef0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
14f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31   OP_Integer, j-1
14f20 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  , iReg+1);.     
14f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f40 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
14f50 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69 52 65  , iCur, brk, iRe
14f60 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  g, pBestIdx->idx
14f70 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65               pBe
14f90 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65  stIdx->needToFre
14fa0 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50 52  eIdxStr ? P4_MPR
14fb0 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49 43  INTF : P4_STATIC
14fc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14fd0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
14fe0 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
14ff0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
15000 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 6e       pBestIdx->n
15010 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15020 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
15030 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; j<nConstrain
15040 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
15050 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f   if( aUsage[j].o
15060 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
15070 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
15080 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
15090 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
150a0 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
150b0 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54 65  Level, &wc.a[iTe
150c0 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rm]);.        }.
150d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
150e0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e  evel->op = OP_VN
150f0 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
15100 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
15110 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
15120 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15130 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15140 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
15150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
15160 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 20  UALTABLE */..   
15170 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
15180 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
15190 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
151a0 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20  Case 1:  We can 
151b0 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e  directly referen
151c0 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ce a single row 
151d0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20 2a  using an.      *
151e0 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c  *          equal
151f0 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  ity comparison a
15200 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44  gainst the ROWID
15210 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20   field.  Or.    
15220 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65    **          we
15230 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69   reference multi
15240 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61  ple rows using a
15250 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29   "rowid IN (...)
15260 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ".      **      
15270 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20      construct.. 
15280 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
15290 74 20 72 31 3b 0a 20 20 20 20 20 20 70 54 65 72  t r1;.      pTer
152a0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  m = findTerm(&wc
152b0 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
152c0 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  eady, WO_EQ|WO_I
152d0 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  N, 0);.      ass
152e0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
152f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15300 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29  Term->pExpr!=0 )
15310 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15320 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
15330 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
15340 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
15350 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  le==0 );.      r
15360 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
15370 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
15380 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 29 3b 0a  rm, pLevel, 0);.
15390 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76        nxt = pLev
153a0 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20 73  el->nxt;.      s
153b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
153c0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
153d0 2c 20 72 31 2c 20 6e 78 74 29 3b 0a 20 20 20 20  , r1, nxt);.    
153e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
153f0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
15400 73 74 73 2c 20 69 43 75 72 2c 20 6e 78 74 2c 20  sts, iCur, nxt, 
15410 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
15420 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
15430 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
15440 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
15450 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
15460 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
15470 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29  RE_ROWID_RANGE )
15480 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20  {.      /* Case 
15490 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69  2:  We have an i
154a0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72  nequality compar
154b0 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65  ison against the
154c0 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20   ROWID field..  
154d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
154e0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
154f0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  p;.      int sta
15500 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  rt;.      WhereT
15510 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
15520 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  nd;..      asser
15530 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
15540 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20  );.      pStart 
15550 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
15560 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
15570 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
15580 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64 20   0);.      pEnd 
15590 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
155a0 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
155b0 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
155c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62   0);.      if( b
155d0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Rev ){.        p
155e0 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
155f0 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20         pStart = 
15600 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70 45  pEnd;.        pE
15610 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  nd = pTerm;.    
15620 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 53    }.      if( pS
15630 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
15640 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
15650 20 20 69 6e 74 20 72 31 2c 20 72 65 67 46 72 65    int r1, regFre
15660 65 31 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d  e1;.        pX =
15670 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a   pStart->pExpr;.
15680 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15690 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
156a0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
156b0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
156c0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 31 20  r );.        r1 
156d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
156e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
156f0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
15700 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
15710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15720 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c 20  v, OP_ForceInt, 
15730 72 31 2c 20 62 72 6b 2c 20 0a 20 20 20 20 20 20  r1, brk, .      
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 20 20 70 58 2d 3e 6f 70 3d 3d 54         pX->op==T
15760 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LE || pX->op==
15770 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 20 20  TK_GT);.        
15780 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15790 33 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d  3(v, bRev ? OP_M
157a0 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47  oveLt : OP_MoveG
157b0 65 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 72 31  e, iCur, brk, r1
157c0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
157d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
157e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
157f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15800 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
15810 31 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  1);.        disa
15820 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
15830 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  pStart);.      }
15840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
15850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15860 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73  v, bRev ? OP_Las
15870 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  t : OP_Rewind, i
15880 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
15890 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e   }.      if( pEn
158a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  d ){.        Exp
158b0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70  r *pX;.        p
158c0 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
158d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
158e0 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
158f0 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e    assert( pEnd->
15900 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
15910 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76   );.        pLev
15920 65 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  el->iMem = ++pPa
15930 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
15940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15950 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
15960 52 69 67 68 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  Right, pLevel->i
15970 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Mem);.        if
15980 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  ( pX->op==TK_LT 
15990 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
159a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
159b0 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
159c0 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20  _Le : OP_Ge;.   
159d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
159e0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
159f0 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50  Rev ? OP_Lt : OP
15a00 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _Gt;.        }. 
15a10 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
15a20 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
15a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a40 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  start = sqlite3V
15a50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15a60 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  );.      pLevel-
15a70 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
15a80 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
15a90 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
15aa0 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
15ab0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
15ac0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 73  t;.      if( tes
15ad0 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
15ae0 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
15af0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15b00 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
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 52 6f 77 69  ddOp2(v, OP_Rowi
15b30 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20 20  d, iCur, r1);.  
15b40 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
15b50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15b60 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d 3e  _SCopy, pLevel->
15b70 69 4d 65 6d 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  iMem, 0); */.   
15b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15b90 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
15ba0 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
15bb0 62 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  brk, r1);.      
15bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15bd0 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
15be0 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
15bf0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
15c00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15c10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
15c20 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
15c30 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15c40 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
15c50 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
15c60 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
15c70 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  UMN_EQ) ){.     
15c80 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63   /* Case 3: A sc
15c90 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  an using an inde
15ca0 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  x..      **.    
15cb0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65    **         The
15cc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
15cd0 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f  y contain zero o
15ce0 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74 79 20  r more equality 
15cf0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15d00 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
15d10 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
15d20 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
15d30 68 65 20 4e 0a 20 20 20 20 20 20 2a 2a 20 20 20  he N.      **   
15d40 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
15d50 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
15d60 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
15d70 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
15d80 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75  **         inequ
15d90 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
15da0 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c  s (>, <, >= or <
15db0 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65  =) on the indexe
15dc0 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  d.      **      
15dd0 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
15de0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
15df0 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
15e00 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 20  ies. Only .     
15e10 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
15e20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d  right-most colum
15e30 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71  n can be an ineq
15e40 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73  uality - the res
15e50 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  t must.      ** 
15e60 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
15e70 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
15e80 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61  erators. For exa
15e90 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20  mple, if the .  
15ea0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69      **         i
15eb0 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c  ndex is on (x,y,
15ec0 7a 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  z), then the fol
15ed0 6c 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61  lowing clauses a
15ee0 72 65 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a  re all .      **
15ef0 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
15f00 65 64 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed:.      **.   
15f10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
15f20 20 78 3d 35 0a 20 20 20 20 20 20 2a 2a 20 20 20   x=5.      **   
15f30 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
15f40 20 79 3d 31 30 0a 20 20 20 20 20 20 2a 2a 20 20   y=10.      **  
15f50 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
15f60 44 20 79 3c 31 30 0a 20 20 20 20 20 20 2a 2a 20  D y<10.      ** 
15f70 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
15f80 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a  ND y>5 AND y<10.
15f90 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
15fa0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20      x=5 AND y=5 
15fb0 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 20 20  AND z<=10.      
15fc0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
15fd0 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74 65 72      The z<10 ter
15fe0 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  m of the followi
15ff0 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ng cannot be use
16000 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a  d, only.      **
16010 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
16020 20 74 65 72 6d 3a 0a 20 20 20 20 20 20 2a 2a 0a   term:.      **.
16030 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16040 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30      x=5 AND z<10
16050 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16060 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79  **         N may
16070 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72   be zero if ther
16080 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79  e are inequality
16090 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
160a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49      **         I
160b0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69  f there are no i
160c0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
160d0 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73  aints, then N is
160e0 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   at.      **    
160f0 20 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a       least one..
16100 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16110 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
16120 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
16130 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
16140 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
16150 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16160 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
16170 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
16180 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
16190 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
161a0 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
161b0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
161c0 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
161d0 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
161e0 20 20 20 2a 2f 20 20 0a 20 20 20 20 20 20 69 6e     */  .      in
161f0 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b  t aStartOp[] = {
16200 0a 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20  .        0,.    
16210 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 4f      0,.        O
16220 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
16230 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
16240 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
16250 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
16260 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f  ev) */.        O
16270 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20  P_Last,         
16280 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72      /* 3: (!star
16290 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
162a0 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52   startEq &&   bR
162b0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f  ev) */.        O
162c0 50 5f 4d 6f 76 65 47 74 2c 20 20 20 20 20 20 20  P_MoveGt,       
162d0 20 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74      /* 4: (start
162e0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
162f0 20 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52   !startEq && !bR
16300 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f  ev) */.        O
16310 50 5f 4d 6f 76 65 4c 74 2c 20 20 20 20 20 20 20  P_MoveLt,       
16320 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61 72 74      /* 5: (start
16330 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
16340 20 21 73 74 61 72 74 45 71 20 26 26 20 20 62 52   !startEq &&  bR
16350 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f  ev) */.        O
16360 50 5f 4d 6f 76 65 47 65 2c 20 20 20 20 20 20 20  P_MoveGe,       
16370 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
16380 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
16390 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
163a0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f  ev) */.        O
163b0 50 5f 4d 6f 76 65 4c 65 20 20 20 20 20 20 20 20  P_MoveLe        
163c0 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74      /* 7: (start
163d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
163e0 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52    startEq &&  bR
163f0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  ev) */.      };.
16400 20 20 20 20 20 20 69 6e 74 20 61 45 6e 64 4f 70        int aEndOp
16410 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 4f  [] = {.        O
16420 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20 20 20 20  P_Noop,         
16430 20 20 20 20 2f 2a 20 30 3a 20 28 21 65 6e 64 5f      /* 0: (!end_
16440 63 6f 6e 73 74 72 61 69 6e 74 73 29 20 2a 2f 0a  constraints) */.
16450 20 20 20 20 20 20 20 20 4f 50 5f 49 64 78 47 45          OP_IdxGE
16460 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16470 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  1: (end_constrai
16480 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a 2f  nts && !bRev) */
16490 0a 20 20 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  .        OP_IdxL
164a0 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T             /*
164b0 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
164c0 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f  ints && bRev) */
164d0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
164e0 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
164f0 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e 74  ->nEq;.      int
16500 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
16510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16520 74 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  this is an optim
16530 69 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28  ized SELECT min(
16540 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  x).. */.      in
16550 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
16560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
16570 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  se register hold
16580 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  ing constraint v
16590 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  alues */.      i
165a0 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
165b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
165c0 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
165d0 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
165e0 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
165f0 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
16600 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
16610 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
16620 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
16630 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
16640 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
16650 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
16660 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ge end */.      
16670 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20  int startEq;    
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16690 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74  True if range st
166a0 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  art uses ==, >= 
166b0 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 20 20 69  or <= */.      i
166c0 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20  nt endEq;       
166d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
166e0 72 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64  rue if range end
166f0 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20   uses ==, >= or 
16700 3c 3d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  <= */.      int 
16710 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
16720 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
16730 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
16740 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
16750 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
16760 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20  >aiColumn[nEq]; 
16770 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e  /* Column for in
16780 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
16790 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ints */.      in
167a0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
167b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
167c0 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
167d0 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
167e0 20 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 20 20 20    int op;..     
167f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16800 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
16810 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
16820 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
16830 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73  N.      ** and s
16840 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
16850 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
16860 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
16870 67 69 73 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  gisters.      **
16880 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
16890 42 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Base..      */. 
168a0 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63       regBase = c
168b0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
168c0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
168d0 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
168e0 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 78 74  y, 2);.      nxt
168f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a   = pLevel->nxt;.
16900 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
16910 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
16920 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
16930 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
16940 20 74 68 61 74 20 0a 20 20 20 20 20 20 2a 2a 20   that .      ** 
16950 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
16960 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69  is function to i
16970 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45  mplement a "SELE
16980 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a  CT min(x) ..." .
16990 20 20 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20        ** query, 
169a0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
169b0 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
169c0 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
169d0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  for.      ** a s
169e0 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e  ingle iteration.
169f0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
16a00 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
16a10 65 74 75 72 6e 65 64 0a 20 20 20 20 20 20 2a 2a  eturned.      **
16a20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
16a30 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
16a40 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
16a50 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
16a60 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
16a70 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
16a80 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
16a90 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
16aa0 6e 64 65 78 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ndex,.      ** t
16ab0 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d  his requires som
16ac0 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
16ad0 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
16ae0 20 20 20 69 66 28 20 28 77 66 6c 61 67 73 26 57     if( (wflags&W
16af0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
16b00 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
16b10 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 26 57 48  pLevel->flags&WH
16b20 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20  ERE_ORDERBY).   
16b30 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43      && (pIdx->nC
16b40 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 20  olumn>nEq).     
16b50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16b60 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
16b70 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
16b80 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
16b90 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
16ba0 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
16bb0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 0a  iColumn[nEq] );.
16bc0 20 20 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65          isMinQue
16bd0 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ry = 1;.      }.
16be0 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  .      /* Find a
16bf0 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
16c00 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
16c10 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
16c20 20 65 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 6f   end .      ** o
16c30 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
16c40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16c50 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
16c60 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
16c70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 61 6e   ){.        pRan
16c80 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d  geEnd = findTerm
16c90 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
16ca0 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c  otReady, (WO_LT|
16cb0 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20  WO_LE), pIdx);. 
16cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16cd0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
16ce0 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
16cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 61 6e   ){.        pRan
16d00 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
16d10 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c  rm(&wc, iCur, k,
16d20 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
16d30 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
16d40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
16d50 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
16d60 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
16d70 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
16d80 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
16d90 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 66 6f 72  r.      ** a for
16da0 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20  ward order scan 
16db0 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20  on a descending 
16dc0 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e  index, interchan
16dd0 67 65 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ge the .      **
16de0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74   start and end t
16df0 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72  erms (pRangeStar
16e00 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29  t and pRangeEnd)
16e10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16e20 20 69 66 28 20 62 52 65 76 3d 3d 28 70 49 64 78   if( bRev==(pIdx
16e30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
16e40 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
16e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 53 57 41  ) ){.        SWA
16e60 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70  P(WhereTerm *, p
16e70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65  RangeEnd, pRange
16e80 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Start);.      }.
16e90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16ea0 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
16eb0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70  pRangeStart->eOp
16ec0 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29  erator & WO_LE )
16ed0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16ee0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
16ef0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
16f00 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
16f10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16f20 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20  e( pRangeEnd && 
16f30 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
16f40 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a  ator & WO_LE );.
16f50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f60 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61  pRangeEnd && pRa
16f70 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f  ngeEnd->eOperato
16f80 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  r & WO_GE );.   
16f90 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
16fa0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
16fb0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
16fc0 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
16fd0 47 45 29 3b 0a 20 20 20 20 20 20 65 6e 64 45 71  GE);.      endEq
16fe0 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
16ff0 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
17000 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
17010 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 73  |WO_GE);.      s
17020 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
17030 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c   = pRangeStart |
17040 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 20 20  | nEq>0;..      
17050 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65  /* Seek the inde
17060 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  x cursor to the 
17070 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e  start of the ran
17080 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f  ge. */.      nCo
17090 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
170a0 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
170b0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
170c0 20 69 6e 74 20 64 63 63 20 3d 20 70 50 61 72 73   int dcc = pPars
170d0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
170e0 68 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  he;.        if( 
170f0 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
17100 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
17110 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b  isableColCache++
17120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17130 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17140 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 61 6e  ode(pParse, pRan
17150 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
17160 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
17170 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20 70 50  nEq);.        pP
17180 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
17190 43 61 63 68 65 20 3d 20 64 63 63 3b 0a 20 20 20  Cache = dcc;.   
171a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
171b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
171c0 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ull, regBase+nEq
171d0 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20  , nxt);.        
171e0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
171f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
17200 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20  sMinQuery ){.   
17210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17220 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
17230 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
17240 71 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e  q);.        nCon
17250 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
17260 20 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a     startEq = 0;.
17270 20 20 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f          start_co
17280 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
17290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 64       }.      cod
172a0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
172b0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
172c0 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 70 49 64  nConstraint, pId
172d0 78 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61  x);.      op = a
172e0 53 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63  StartOp[(start_c
172f0 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b  onstraints<<2) +
17300 20 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20   (startEq<<1) + 
17310 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 61 73 73  bRev];.      ass
17320 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20  ert( op!=0 );.  
17330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17340 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
17350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17360 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20  p==OP_Last );.  
17370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17380 3d 3d 4f 50 5f 4d 6f 76 65 47 74 20 29 3b 0a 20  ==OP_MoveGt );. 
17390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
173a0 70 3d 3d 4f 50 5f 4d 6f 76 65 47 65 20 29 3b 0a  p==OP_MoveGe );.
173b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
173c0 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 4c 65 20 29 3b  op==OP_MoveLe );
173d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
173e0 20 6f 70 3d 3d 4f 50 5f 4d 6f 76 65 4c 74 20 29   op==OP_MoveLt )
173f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17400 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c  dbeAddOp4(v, op,
17410 20 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 72   iIdxCur, nxt, r
17420 65 67 42 61 73 65 2c 20 0a 20 20 20 20 20 20 20  egBase, .       
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
17450 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e 74 29 2c  TR(nConstraint),
17460 20 50 34 5f 49 4e 54 33 32 29 3b 0a 0a 20 20 20   P4_INT32);..   
17470 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76     /* Load the v
17480 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65  alue for the ine
17490 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
174a0 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
174b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61   the.      ** ra
174c0 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
174d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 43 6f      */.      nCo
174e0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
174f0 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67 65        if( pRange
17500 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73  End ){.        s
17510 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17520 50 61 72 73 65 2c 20 70 52 61 6e 67 65 45 6e 64  Parse, pRangeEnd
17530 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
17540 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
17550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17560 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17570 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e  sNull, regBase+n
17580 45 71 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20  Eq, nxt);.      
17590 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
175a0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
175b0 61 73 65 2c 20 6e 45 71 2b 31 2c 20 70 49 64 78  ase, nEq+1, pIdx
175c0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73  );.        nCons
175d0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
175e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  }..      /* Top 
175f0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79  of the loop body
17600 20 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   */.      pLevel
17610 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
17620 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
17630 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
17640 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
17650 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
17660 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
17670 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 6f 70 20  ge. */.      op 
17680 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
17690 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
176a0 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 20   + bRev)];.     
176b0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
176c0 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 20 20  P_Noop );.      
176d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
176e0 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20 20 20  _IdxGE );.      
176f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17700 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 20 20  _IdxLT );.      
17710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17720 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  4(v, op, iIdxCur
17730 2c 20 6e 78 74 2c 20 72 65 67 42 61 73 65 2c 0a  , nxt, regBase,.
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
17760 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74  NT_TO_PTR(nConst
17770 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32  raint), P4_INT32
17780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17790 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
177a0 65 6e 64 45 71 21 3d 62 52 65 76 29 3b 0a 0a 20  endEq!=bRev);.. 
177b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
177c0 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20   are inequality 
177d0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65  constraints, che
177e0 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
177f0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  e.      ** of th
17800 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74  e table column t
17810 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69  hat the inequali
17820 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20  ty contrains is 
17830 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20  not NULL..      
17840 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d  ** If it is, jum
17850 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  p to the next it
17860 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
17870 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
17880 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17890 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
178a0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
178b0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  se( pLevel->flag
178c0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
178d0 4d 49 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  MIT );.      tes
178e0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 66  tcase( pLevel->f
178f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
17900 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20 20  _LIMIT );.      
17910 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
17920 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c  s & (WHERE_BTM_L
17930 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
17940 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20 20  IMIT) ){.       
17950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17960 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
17970 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
17980 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
17990 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
179a0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
179b0 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  cont);.      }..
179c0 20 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68        /* Seek th
179d0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
179e0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
179f0 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61       if( !omitTa
17a00 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
17a10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17a20 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
17a30 20 69 49 64 78 43 75 72 2c 20 72 31 29 3b 0a 20   iIdxCur, r1);. 
17a40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17a50 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
17a60 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 2c 20  oveGe, iCur, 0, 
17a70 72 31 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65  r1);  /* Deferre
17a80 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 20 20  d seek */.      
17a90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
17aa0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17ab0 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20  arse, r1);..    
17ac0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
17ad0 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
17ae0 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
17af0 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
17b00 0a 20 20 20 20 20 20 2a 2a 20 57 48 45 52 45 20  .      ** WHERE 
17b10 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64  clause terms mad
17b20 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74  e redundant by t
17b30 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73  he index range s
17b40 63 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  can..      */.  
17b50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
17b60 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
17b70 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
17b80 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49   pLevel->p1 = iI
17b90 64 78 43 75 72 3b 0a 20 20 20 20 20 20 64 69 73  dxCur;.      dis
17ba0 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
17bb0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
17bc0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
17bd0 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
17be0 6e 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nd);.    }else{.
17bf0 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a        /* Case 4:
17c00 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
17c10 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
17c20 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
17c30 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  te.      **     
17c40 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
17c50 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
17c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
17c70 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
17c80 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
17c90 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
17ca0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
17cb0 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
17cc0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
17cd0 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
17ce0 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
17cf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17d00 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
17d10 20 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20   brk);.    }.   
17d20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
17d30 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
17d40 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  iCur);..    /* I
17d50 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
17d60 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
17d70 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
17d80 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
17d90 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73    ** computed us
17da0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
17db0 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20  set of tables.. 
17dc0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54     */.    for(pT
17dd0 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e  erm=wc.a, j=wc.n
17de0 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20  Term; j>0; j--, 
17df0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
17e00 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20  Expr *pE;.      
17e10 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
17e20 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  >flags & TERM_VI
17e30 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 74  RTUAL );.      t
17e40 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
17e50 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
17e60 45 44 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ED );.      if( 
17e70 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28  pTerm->flags & (
17e80 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
17e90 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
17ea0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nue;.      if( (
17eb0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
17ec0 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
17ed0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17ee0 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
17ef0 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
17f00 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
17f10 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
17f20 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
17f30 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
17f40 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
17f50 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f70 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
17f80 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20 63  se(pParse, pE, c
17f90 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
17fa0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70  IFNULL);.      p
17fb0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
17fc0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
17fd0 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c  ..    /* For a L
17fe0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
17ff0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
18000 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
18010 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20  he fact that.   
18020 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
18030 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
18040 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
18050 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
18060 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  le.  .    */.   
18070 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
18080 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
18090 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71  pLevel->top = sq
180a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
180b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
180c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
180d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
180e0 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
180f0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  Join);.      Vdb
18100 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
18110 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68  cord LEFT JOIN h
18120 69 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  it"));.      sql
18130 69 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c  ite3ExprClearCol
18140 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
18150 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
18160 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18170 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43  ExprClearColumnC
18180 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65  ache(pParse, pLe
18190 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
181a0 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77       for(pTerm=w
181b0 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e  c.a, j=0; j<wc.n
181c0 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
181d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  ++){.        tes
181e0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c  tcase( pTerm->fl
181f0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
18200 41 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  AL );.        te
18210 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66  stcase( pTerm->f
18220 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
18230 44 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  D );.        if(
18240 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
18250 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
18260 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
18270 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
18280 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
18290 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
182a0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
182b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
182c0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
182d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
182e0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
182f0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
18300 63 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  cont, SQLITE_JUM
18310 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
18320 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
18330 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
18340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18350 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
18360 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
18370 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
18380 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
18390 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
183a0 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
183b0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
183c0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
183d0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
183e0 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
183f0 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
18400 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
18410 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
18420 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
18430 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
18440 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
18450 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
18460 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
18470 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
18480 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
18490 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
184a0 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
184b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
184c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
184d0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
184e0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
184f0 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
18500 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62  ->a[i];.    pTab
18510 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
18520 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
18530 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62  m];.    z = pTab
18540 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
18550 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
18560 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
18570 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20  >zName;.    n = 
18580 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69  strlen(z);.    i
18590 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
185a0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
185b0 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
185c0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
185d0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
185e0 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
185f0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
18600 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
18610 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
18620 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
18630 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
18640 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
18650 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
18660 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
18670 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
18680 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
18690 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
186a0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
186b0 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
186c0 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
186d0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
186e0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
186f0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
18700 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
18710 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
18720 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  GE );.    if( pL
18730 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57  evel->flags & (W
18740 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
18750 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
18760 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
18770 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
18780 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a  plan[nQPlan], "*
18790 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51   ", 2);.      nQ
187a0 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  Plan += 2;.    }
187b0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
187c0 3e 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  >pIdx==0 ){.    
187d0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
187e0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
187f0 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b  lan], "{} ", 3);
18800 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
18810 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
18820 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28       n = strlen(
18830 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e  pLevel->pIdx->zN
18840 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
18850 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f  n+nQPlan < sizeo
18860 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  f(sqlite3_query_
18870 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20  plan)-2 ){.     
18880 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
18890 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
188a0 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70  Plan], pLevel->p
188b0 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Idx->zName, n);.
188c0 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
188d0 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = n;.        sql
188e0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
188f0 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
18900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18910 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c   }.  while( nQPl
18920 61 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f  an>0 && sqlite3_
18930 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
18940 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20  n-1]==' ' ){.   
18950 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
18960 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20  lan[--nQPlan] = 
18970 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
18980 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
18990 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61  an] = 0;.  nQPla
189a0 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a  n = 0;.#endif /*
189b0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20   SQLITE_TEST // 
189c0 54 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  Testing and debu
189d0 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a  gging use only *
189e0 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
189f0 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
18a00 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57  address in the W
18a10 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
18a20 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63  re.  Then.  ** c
18a30 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
18a40 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  rn..  */.  pWInf
18a50 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63  o->iContinue = c
18a60 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75  ont;.  whereClau
18a70 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20  seClear(&wc);.  
18a80 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a  return pWInfo;..
18a90 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
18aa0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
18ab0 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  /.whereBeginNoMe
18ac0 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  m:.  whereClause
18ad0 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 77 68  Clear(&wc);.  wh
18ae0 65 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e  ereInfoFree(pWIn
18af0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  fo);.  return 0;
18b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
18b10 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
18b20 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53  e WHERE loop.  S
18b30 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a  ee comments on .
18b40 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
18b50 65 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74  egin() for addit
18b60 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
18b70 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
18b80 65 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65  e3WhereEnd(Where
18b90 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20  Info *pWInfo){. 
18ba0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
18bb0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b   pWInfo->pParse;
18bc0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
18bd0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
18be0 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65  t i;.  WhereLeve
18bf0 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63  l *pLevel;.  Src
18c00 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
18c10 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
18c20 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
18c30 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
18c40 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f    /* Generate lo
18c50 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  op termination c
18c60 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ode..  */.  sqli
18c70 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75  te3ExprClearColu
18c80 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
18c90 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  -1);.  for(i=pTa
18ca0 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69  bList->nSrc-1; i
18cb0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
18cc0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
18cd0 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74  >a[i];.    sqlit
18ce0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18cf0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f  el(v, pLevel->co
18d00 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
18d10 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
18d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18d30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
18d40 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
18d50 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
18d60 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
18d70 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b  ( pLevel->nIn ){
18d80 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
18d90 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20  Loop *pIn;.     
18da0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71   int j;.      sq
18db0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18dc0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
18dd0 3e 6e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  >nxt);.      for
18de0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20  (j=pLevel->nIn, 
18df0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e  pIn=&pLevel->aIn
18e00 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
18e10 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
18e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18e30 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
18e40 3e 74 6f 70 41 64 64 72 2b 31 29 3b 0a 20 20 20  >topAddr+1);.   
18e50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18e60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
18e70 74 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49  t, pIn->iCur, pI
18e80 6e 2d 3e 74 6f 70 41 64 64 72 29 3b 0a 20 20 20  n->topAddr);.   
18e90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18ea0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
18eb0 3e 74 6f 70 41 64 64 72 2d 31 29 3b 0a 20 20 20  >topAddr-1);.   
18ec0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18ed0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
18ee0 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  vel->aInLoop);. 
18ef0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18f00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18f10 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29  (v, pLevel->brk)
18f20 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
18f30 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  ->iLeftJoin ){. 
18f40 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
18f50 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
18f60 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18f70 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65   OP_IfPos, pLeve
18f80 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
18f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18fa0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
18fb0 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e  lRow, pTabList->
18fc0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  a[i].iCursor);. 
18fd0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
18fe0 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20  >iIdxCur>=0 ){. 
18ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19000 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
19010 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
19020 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
19030 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
19040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19050 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
19060 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  >top);.      sql
19070 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19080 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
19090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
190a0 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
190b0 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
190c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
190d0 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
190e0 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
190f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19100 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
19110 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
19120 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
19130 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
19140 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
19150 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
19160 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
19170 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
19180 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
19190 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
191a0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
191b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
191c0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
191d0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
191e0 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
191f0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
19200 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
19210 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
19220 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45     if( pTab->isE
19230 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53  phem || pTab->pS
19240 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
19250 3b 0a 20 20 20 20 69 66 28 20 21 70 57 49 6e 66  ;.    if( !pWInf
19260 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
19270 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
19280 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
19290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
192a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
192b0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
192c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
192d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
192e0 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29 7b  evel->pIdx!=0 ){
192f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19300 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
19310 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
19320 64 78 43 75 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  dxCur);.    }.. 
19330 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73 63     /* If this sc
19340 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  an uses an index
19350 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62 73  , make code subs
19360 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61  titutions to rea
19370 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72  d data.    ** fr
19380 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  om the index in 
19390 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68  preference to th
193a0 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69 6d  e table. Sometim
193b0 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a 20  es, this means. 
193c0 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20     ** the table 
193d0 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72 65  need never be re
193e0 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69 73  ad from. This is
193f0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62   a performance b
19400 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73 20  oost,.    ** as 
19410 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20 77  the vdbe level w
19420 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20 74  aits until the t
19430 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65 66  able is read bef
19440 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  ore actually.   
19450 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65 20   ** seeking the 
19460 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f 20  table cursor to 
19470 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72 65  the record corre
19480 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
19490 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  current.    ** p
194a0 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 69  osition in the i
194b0 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  ndex..    ** .  
194c0 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74 68    ** Calls to th
194d0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
194e0 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c 69   in between sqli
194f0 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61 6e  te3WhereBegin an
19500 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  d.    ** sqlite3
19510 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68 61  WhereEnd will ha
19520 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65 20  ve created code 
19530 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
19540 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
19550 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
19560 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c 20   loop scans all 
19570 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e  that code lookin
19580 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20 20  g for opcodes.  
19590 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72 65    ** that refere
195a0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61 6e  nce the table an
195b0 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d 20  d converts them 
195c0 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68 61  into opcodes tha
195d0 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  t.    ** referen
195e0 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ce the index..  
195f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
19600 76 65 6c 2d 3e 70 49 64 78 20 29 7b 0a 20 20 20  vel->pIdx ){.   
19610 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73     int k, j, las
19620 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  t;.      VdbeOp 
19630 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65  *pOp;.      Inde
19640 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  x *pIdx = pLevel
19650 2d 3e 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e  ->pIdx;.      in
19660 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 3d  t useIndexOnly =
19670 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
19680 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
19690 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
196a0 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  pIdx!=0 );.     
196b0 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
196c0 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66  beGetOp(v, pWInf
196d0 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20  o->iTop);.      
196e0 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
196f0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19700 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57  ;.      for(k=pW
19710 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61  Info->iTop; k<la
19720 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
19730 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
19740 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
19750 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
19760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
19770 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
19780 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
19790 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
197a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
197b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
197c0 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d  ( pOp->p2==pIdx-
197d0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a  >aiColumn[j] ){.
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
197f0 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20  p->p2 = j;.     
19800 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
19810 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
19820 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur;.            
19830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19850 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
19860 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f 6e 6c  ert(!useIndexOnl
19870 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  y || j<pIdx->nCo
19880 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  lumn);.        }
19890 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
198a0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
198b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
198c0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
198d0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
198e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
198f0 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
19900 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
19910 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75  p->opcode==OP_Nu
19920 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e 64 65  llRow && useInde
19930 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  xOnly ){.       
19940 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
19950 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
19960 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19970 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
19980 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
19990 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 70   whereInfoFree(p
199a0 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
199b0 3b 0a 7d 0a                                      ;.}.