/ Hex Artifact Content
Login

Artifact 1853c1bfb567a415d904d70a4613dc07b00c74c5:


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 32  : where.c,v 1.32
0340: 37 20 32 30 30 38 2f 31 30 2f 32 35 20 31 35 3a  7 2008/10/25 15:
0350: 30 33 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a  03:21 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 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
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: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
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 50 61 72 73 65 20 2a 70 50 61 72 73 65  te(Parse *pParse
3940: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
3950: 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20 3d    u16 expRight =
3960: 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d   (pExpr->pRight-
3970: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
3980: 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65  ollate);.  u16 e
3990: 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d  xpLeft = (pExpr-
39a0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
39b0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a  EP_ExpCollate);.
39c0: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
39d0: 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26  dOp(pExpr->op) &
39e0: 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
39f0: 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  IN );.  pExpr->p
3a00: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73  Right->pColl = s
3a10: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
3a20: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
3a30: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70  >pRight);.  pExp
3a40: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20  r->pLeft->pColl 
3a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3a60: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
3a70: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57  pr->pLeft);.  SW
3a80: 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70  AP(CollSeq*,pExp
3a90: 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  r->pRight->pColl
3aa0: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70  ,pExpr->pLeft->p
3ab0: 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Coll);.  pExpr->
3ac0: 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20  pRight->flags = 
3ad0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  (pExpr->pRight->
3ae0: 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43  flags & ~EP_ExpC
3af0: 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66  ollate) | expLef
3b00: 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  t;.  pExpr->pLef
3b10: 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70  t->flags = (pExp
3b20: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
3b30: 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  & ~EP_ExpCollate
3b40: 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20  ) | expRight;.  
3b50: 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72  SWAP(Expr*,pExpr
3b60: 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e  ->pRight,pExpr->
3b70: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45  pLeft);.  if( pE
3b80: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29  xpr->op>=TK_GT )
3b90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  {.    assert( TK
3ba0: 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a  _LT==TK_GT+2 );.
3bb0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
3bc0: 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20  E==TK_LE+2 );.  
3bd0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
3be0: 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73  TK_EQ );.    ass
3bf0: 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45  ert( TK_GT<TK_LE
3c00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3c10: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
3c20: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54   && pExpr->op<=T
3c30: 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70  K_GE );.    pExp
3c40: 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  r->op = ((pExpr-
3c50: 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b  >op-TK_GT)^2)+TK
3c60: 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _GT;.  }.}../*.*
3c70: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
3c80: 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   TK_xx operator 
3c90: 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b  to WO_xx bitmask
3ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3cb0: 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74  operatorMask(int
3cc0: 20 6f 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   op){.  int c;. 
3cd0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
3ce0: 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20  Op(op) );.  if( 
3cf0: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
3d00: 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65   c = WO_IN;.  }e
3d10: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
3d20: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d  SNULL ){.    c =
3d30: 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65   WO_ISNULL;.  }e
3d40: 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  lse{.    c = WO_
3d50: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a  EQ<<(op-TK_EQ);.
3d60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70    }.  assert( op
3d70: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63  !=TK_ISNULL || c
3d80: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
3d90: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3da0: 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29  IN || c==WO_IN )
3db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
3dc0: 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45  TK_EQ || c==WO_E
3dd0: 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  Q );.  assert( o
3de0: 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57  p!=TK_LT || c==W
3df0: 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74  O_LT );.  assert
3e00: 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63  ( op!=TK_LE || c
3e10: 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73  ==WO_LE );.  ass
3e20: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c  ert( op!=TK_GT |
3e30: 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20  | c==WO_GT );.  
3e40: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47  assert( op!=TK_G
3e50: 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b  E || c==WO_GE );
3e60: 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a  .  return c;.}..
3e70: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
3e80: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
3e90: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
3ea0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
3eb0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
3ec0: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
3ed0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
3ee0: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
3ef0: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
3f00: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
3f10: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
3f20: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
3f30: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
3f40: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
3f50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3f60: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
3f70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
3f80: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
3f90: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
3fa0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
3fb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
3fc0: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
3fd0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
3fe0: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
3ff0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
4000: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4010: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
4020: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4030: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
4040: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
4050: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
4060: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
4070: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
4080: 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20 20 20  */.  u16 op,    
4090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
40a0: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
40b0: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
40c0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
40d0: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
40e0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
40f0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
4100: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
4110: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
4120: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
4130: 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72 74   int k;.  assert
4140: 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20 66  ( iCur>=0 );.  f
4150: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
4160: 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b   k=pWC->nTerm; k
4170: 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; k--, pTerm++){
4180: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
4190: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
41a0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72  .       && (pTer
41b0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
41c0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
41d0: 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 6c       && pTerm->l
41e0: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
41f0: 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  mn.       && (pT
4200: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
4210: 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20   op)!=0.    ){. 
4220: 20 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26       if( pIdx &&
4230: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
4240: 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a  r!=WO_ISNULL ){.
4250: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
4260: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
4270: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4280: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
4290: 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a 20 20   char idxaff;.  
42a0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
42b0: 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72       Parse *pPar
42c0: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
42d0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78 61 66  ;..        idxaf
42e0: 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  f = pIdx->pTable
42f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e  ->aCol[iColumn].
4300: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
4310: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
4320: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
4330: 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74  , idxaff) ) cont
4340: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f  inue;..        /
4350: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
4360: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
4370: 6e 63 65 20 72 65 71 75 69 72 65 64 20 66 72 6f  nce required fro
4380: 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 0a 20  m an index for. 
4390: 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20         ** it to 
43a0: 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20 6f 70  be useful for op
43b0: 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65 73 73  timising express
43c0: 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20 74 68  ion pX. Store th
43d0: 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  is.        ** va
43e0: 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c 65 20  lue in variable 
43f0: 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a  pColl..        *
4400: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
4410: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
4420: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
4430: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
4440: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
4450: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
4460: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
4470: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
4480: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
4490: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
44a0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
44b0: 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  }..        for(j
44c0: 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  =0; pIdx->aiColu
44d0: 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20  mn[j]!=iColumn; 
44e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
44f0: 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64  if( NEVER(j>=pId
4500: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65  x->nColumn) ) re
4510: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
4520: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
4530: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
4540: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
4550: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f  >azColl[j]) ) co
4560: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
4570: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65        return pTe
4580: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rm;.    }.  }.  
4590: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
45a0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
45b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
45c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63   exprAnalyze(Src
45d0: 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75  List*, WhereClau
45e0: 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  se*, int);../*.*
45f0: 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79  * Call exprAnaly
4600: 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ze on all terms 
4610: 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
4620: 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74  e.  .**.**.*/.st
4630: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
4640: 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c  alyzeAll(.  SrcL
4650: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
4660: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
4670: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
4680: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20  reClause *pWC   
4690: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
46a0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
46b0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
46c0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
46d0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  pWC->nTerm-1; i>
46e0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78  =0; i--){.    ex
46f0: 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
4700: 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d  st, pWC, i);.  }
4710: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4720: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
4730: 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
4740: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
4750: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
4760: 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f  sion is a LIKE o
4770: 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  r GLOB operator 
4780: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  that.** can be o
4790: 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69  ptimized using i
47a0: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
47b0: 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54  aints.  Return T
47c0: 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  RUE if it is.** 
47d0: 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  so and false if 
47e0: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  not..**.** In or
47f0: 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72  der for the oper
4800: 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d  ator to be optim
4810: 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20  izible, the RHS 
4820: 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67  must be a string
4830: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74  .** literal that
4840: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
4850: 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e  with a wildcard.
4860: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
4870: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20   isLikeOrGlob(. 
4880: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4890: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
48a0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
48b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
48c0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
48d0: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
48e0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
48f0: 74 20 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20  t *pnPattern,   
4900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  /* Number of non
4910: 2d 77 69 6c 64 63 61 72 64 20 70 72 65 66 69 78  -wildcard prefix
4920: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
4930: 20 69 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74   int *pisComplet
4940: 65 2c 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  e, /* True if th
4950: 65 20 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20  e only wildcard 
4960: 69 73 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74  is % in the last
4970: 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20   character */.  
4980: 69 6e 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20  int *pnoCase    
4990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70    /* True if upp
49a0: 65 72 63 61 73 65 20 69 73 20 65 71 75 69 76 61  ercase is equiva
49b0: 6c 65 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73  lent to lowercas
49c0: 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
49d0: 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70 72 20  char *z;.  Expr 
49e0: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
49f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4a00: 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63 6e 74  st;.  int c, cnt
4a10: 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a  ;.  char wc[3];.
4a20: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
4a30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
4a40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
4a50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c   if( !sqlite3IsL
4a60: 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ikeFunction(db, 
4a70: 70 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20  pExpr, pnoCase, 
4a80: 77 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  wc) ){.    retur
4a90: 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  n 0;.  }.#ifdef 
4aa0: 53 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20  SQLITE_EBCDIC.  
4ab0: 69 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72  if( *pnoCase ) r
4ac0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
4ad0: 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
4ae0: 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68 74  >pList;.  pRight
4af0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70   = pList->a[0].p
4b00: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69 67  Expr;.  if( pRig
4b10: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e  ht->op!=TK_STRIN
4b20: 47 0a 20 20 20 26 26 20 28 70 52 69 67 68 74 2d  G.   && (pRight-
4b30: 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
4b40: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c   || pRight->iCol
4b50: 75 6d 6e 21 3d 54 4b 5f 53 54 52 49 4e 47 29 20  umn!=TK_STRING) 
4b60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4b70: 0a 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70  .  }.  pLeft = p
4b80: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
4b90: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
4ba0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
4bb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4bc0: 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  }.  pColl = sqli
4bd0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
4be0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
4bf0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 21 3d   assert( pColl!=
4c00: 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  0 || pLeft->iCol
4c10: 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69 66 28  umn==-1 );.  if(
4c20: 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20   pColl==0 ){.   
4c30: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
4c40: 20 69 73 20 64 65 66 69 6e 65 64 20 66 6f 72 20   is defined for 
4c50: 74 68 65 20 52 4f 57 49 44 2e 20 20 55 73 65 20  the ROWID.  Use 
4c60: 74 68 65 20 64 65 66 61 75 6c 74 2e 20 2a 2f 0a  the default. */.
4c70: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
4c80: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20  pDfltColl;.  }. 
4c90: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70   if( (pColl->typ
4ca0: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  e!=SQLITE_COLL_B
4cb0: 49 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61 73  INARY || *pnoCas
4cc0: 65 29 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f  e) &&.      (pCo
4cd0: 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45  ll->type!=SQLITE
4ce0: 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20  _COLL_NOCASE || 
4cf0: 21 2a 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20 20  !*pnoCase) ){.  
4d00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d10: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4d20: 45 78 70 72 28 64 62 2c 20 70 52 69 67 68 74 29  Expr(db, pRight)
4d30: 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29  ;.  z = (char *)
4d40: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3b  pRight->token.z;
4d50: 0a 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66  .  cnt = 0;.  if
4d60: 28 20 7a 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ( z ){.    while
4d70: 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20  ( (c=z[cnt])!=0 
4d80: 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63  && c!=wc[0] && c
4d90: 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63  !=wc[1] && c!=wc
4da0: 5b 32 5d 20 29 7b 20 63 6e 74 2b 2b 3b 20 7d 0a  [2] ){ cnt++; }.
4db0: 20 20 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30    }.  if( cnt==0
4dc0: 20 7c 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63   || 255==(u8)z[c
4dd0: 6e 74 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nt] ){.    retur
4de0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43  n 0;.  }.  *pisC
4df0: 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d  omplete = z[cnt]
4e00: 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74  ==wc[0] && z[cnt
4e10: 2b 31 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74  +1]==0;.  *pnPat
4e20: 74 65 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65  tern = cnt;.  re
4e30: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4e40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4e50: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
4e60: 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N */...#ifndef S
4e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4e80: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68  ALTABLE./*.** Ch
4e90: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
4ea0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
4eb0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
4ec0: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  m.**.**         
4ed0: 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70  column MATCH exp
4ee0: 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  r.**.** If it is
4ef0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55   then return TRU
4f00: 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75  E.  If not, retu
4f10: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
4f20: 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f  tic int isMatchO
4f30: 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20  fColumn(.  Expr 
4f40: 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54  *pExpr      /* T
4f50: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
4f60: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ion */.){.  Expr
4f70: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20  List *pList;..  
4f80: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
4f90: 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20  K_FUNCTION ){.  
4fa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4fb0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
4fc0: 65 6e 2e 6e 21 3d 35 20 7c 7c 0a 20 20 20 20 20  en.n!=5 ||.     
4fd0: 20 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d    sqlite3StrNICm
4fe0: 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  p((const char*)p
4ff0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
5000: 61 74 63 68 22 2c 35 29 21 3d 30 20 29 7b 0a 20  atch",5)!=0 ){. 
5010: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5020: 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
5030: 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
5040: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
5050: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5060: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
5070: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
5080: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
5090: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
50a0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
50b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
50c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
50d0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
50e0: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
50f0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
5100: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
5110: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
5120: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
5130: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
5140: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
5150: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
5160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
5170: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
5180: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
5190: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
51a0: 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c  {.  pDerived->fl
51b0: 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c  ags |= pBase->fl
51c0: 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69  ags & EP_FromJoi
51d0: 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69  n;.  pDerived->i
51e0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
51f0: 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f   pBase->iRightJo
5200: 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20  inTable;.}..#if 
5210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5220: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
5230: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
5240: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
5250: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 52 65  BQUERY)./*.** Re
5260: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
5270: 20 67 69 76 65 6e 20 74 65 72 6d 20 6f 66 20 61   given term of a
5280: 6e 20 4f 52 20 63 6c 61 75 73 65 20 63 61 6e 20  n OR clause can 
5290: 62 65 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  be converted.** 
52a0: 69 6e 74 6f 20 61 6e 20 49 4e 20 63 6c 61 75 73  into an IN claus
52b0: 65 2e 20 20 54 68 65 20 69 43 75 72 73 6f 72 20  e.  The iCursor 
52c0: 61 6e 64 20 69 43 6f 6c 75 6d 6e 20 64 65 66 69  and iColumn defi
52d0: 6e 65 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  ne the left-hand
52e0: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
52f0: 49 4e 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  IN clause..**.**
5300: 20 54 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20   The context is 
5310: 74 68 61 74 20 77 65 20 68 61 76 65 20 6d 75 6c  that we have mul
5320: 74 69 70 6c 65 20 4f 52 2d 63 6f 6e 6e 65 63 74  tiple OR-connect
5330: 65 64 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  ed equality term
5340: 73 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  s.** like this:.
5350: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
5360: 61 3d 3c 65 78 70 72 31 3e 20 4f 52 20 20 61 3d  a=<expr1> OR  a=
5370: 3c 65 78 70 72 32 3e 20 4f 52 20 62 3d 3c 65 78  <expr2> OR b=<ex
5380: 70 72 33 3e 20 20 4f 52 20 2e 2e 2e 0a 2a 2a 0a  pr3>  OR ....**.
5390: 2a 2a 20 54 68 65 20 70 4f 72 54 65 72 6d 20 69  ** The pOrTerm i
53a0: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
53b0: 74 69 6e 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  tine corresponds
53c0: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 74 65 72   to a single ter
53d0: 6d 20 6f 66 0a 2a 2a 20 74 68 69 73 20 4f 52 20  m of.** this OR 
53e0: 63 6c 61 75 73 65 2e 20 20 49 6e 20 6f 72 64 65  clause.  In orde
53f0: 72 20 66 6f 72 20 74 68 65 20 74 65 72 6d 20 74  r for the term t
5400: 6f 20 62 65 20 61 20 63 61 6e 64 69 64 61 74 65  o be a candidate
5410: 20 66 6f 72 0a 2a 2a 20 63 6f 6e 76 65 72 73 69   for.** conversi
5420: 6f 6e 20 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72  on to an IN oper
5430: 61 74 6f 72 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ator, the follow
5440: 69 6e 67 20 6d 75 73 74 20 62 65 20 74 72 75 65  ing must be true
5450: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 54  :.**.**     *  T
5460: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
5470: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6d 75  e of the term mu
5480: 73 74 20 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e  st be the column
5490: 20 77 68 69 63 68 0a 2a 2a 20 20 20 20 20 20 20   which.**       
54a0: 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
54b0: 79 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  y iCursor and iC
54c0: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  olumn..**.**    
54d0: 20 2a 20 20 49 66 20 74 68 65 20 72 69 67 68 74   *  If the right
54e0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c  -hand side is al
54f0: 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  so a column, the
5500: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  n the affinities
5510: 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 62 6f  .**        of bo
5520: 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65 66  th right and lef
5530: 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65 20  t sides must be 
5540: 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79 70  such that no typ
5550: 65 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 76  e.**        conv
5560: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
5570: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
5580: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
5590: 39 29 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68  9).**.** If both
55a0: 20 6f 66 20 74 68 65 73 65 20 63 6f 6e 64 69 74   of these condit
55b0: 69 6f 6e 73 20 61 72 65 20 74 72 75 65 2c 20 74  ions are true, t
55c0: 68 65 6e 20 72 65 74 75 72 6e 20 74 72 75 65 2e  hen return true.
55d0: 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72    Otherwise.** r
55e0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
55f0: 73 74 61 74 69 63 20 69 6e 74 20 6f 72 54 65 72  static int orTer
5600: 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65 28  mIsOptCandidate(
5610: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
5620: 72 6d 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 2c  rm, int iCursor,
5630: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 29 7b 0a 20   int iColumn){. 
5640: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
5650: 66 52 69 67 68 74 3b 0a 20 20 61 73 73 65 72 74  fRight;.  assert
5660: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
5670: 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20  ator==WO_EQ );. 
5680: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
5690: 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f  ftCursor!=iCurso
56a0: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
56b0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 72  0;.  }.  if( pOr
56c0: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
56d0: 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  !=iColumn ){.   
56e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
56f0: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
5700: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
5710: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
5720: 70 52 69 67 68 74 29 3b 0a 20 20 69 66 28 20 61  pRight);.  if( a
5730: 66 66 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20  ffRight==0 ){.  
5740: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
5750: 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69    affLeft = sqli
5760: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
5770: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
5780: 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 61 66  pLeft);.  if( af
5790: 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20  fRight!=affLeft 
57a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
57b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
57c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
57d0: 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
57e0: 65 6e 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52  en term of an OR
57f0: 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20 69   clause can be i
5800: 67 6e 6f 72 65 64 20 64 75 72 69 6e 67 0a 2a 2a  gnored during.**
5810: 20 61 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65   a check to make
5820: 20 73 75 72 65 20 61 6c 6c 20 4f 52 20 74 65 72   sure all OR ter
5830: 6d 73 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  ms are candidate
5840: 73 20 66 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  s for optimizati
5850: 6f 6e 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  on..** In other 
5860: 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 74 72  words, return tr
5870: 75 65 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ue if a call to 
5880: 74 68 65 20 6f 72 54 65 72 6d 49 73 4f 70 74 43  the orTermIsOptC
5890: 61 6e 64 69 64 61 74 65 28 29 0a 2a 2a 20 61 62  andidate().** ab
58a0: 6f 76 65 20 72 65 74 75 72 6e 65 64 20 66 61 6c  ove returned fal
58b0: 73 65 20 62 75 74 20 69 74 20 69 73 20 6e 6f 74  se but it is not
58c0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 69   necessary to di
58d0: 73 71 75 61 6c 69 66 79 20 74 68 65 0a 2a 2a 20  squalify the.** 
58e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
58f0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
5900: 6f 72 69 67 69 6e 61 6c 20 4f 52 20 70 68 72 61  original OR phra
5910: 73 65 20 77 61 73 20 74 68 69 73 3a 0a 2a 2a 0a  se was this:.**.
5920: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d 34  **           a=4
5930: 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20 20    OR  a=11  OR  
5940: 61 3d 62 0a 2a 2a 0a 2a 2a 20 44 75 72 69 6e 67  a=b.**.** During
5950: 20 61 6e 61 6c 79 73 69 73 2c 20 74 68 65 20 74   analysis, the t
5960: 68 69 72 64 20 74 65 72 6d 20 67 65 74 73 20 66  hird term gets f
5970: 6c 69 70 70 65 64 20 61 72 6f 75 6e 64 20 61 6e  lipped around an
5980: 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 73  d duplicate.** s
5990: 6f 20 74 68 61 74 20 77 65 20 61 72 65 20 6c 65  o that we are le
59a0: 66 74 20 77 69 74 68 20 74 68 69 73 3a 0a 2a 2a  ft with this:.**
59b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 3d  .**           a=
59c0: 34 20 20 4f 52 20 20 61 3d 31 31 20 20 4f 52 20  4  OR  a=11  OR 
59d0: 20 61 3d 62 20 20 4f 52 20 20 62 3d 61 0a 2a 2a   a=b  OR  b=a.**
59e0: 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c 61  .** Since the la
59f0: 73 74 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65  st two terms are
5a00: 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f 6e 6c   duplicates, onl
5a10: 79 20 6f 6e 65 20 6f 66 20 74 68 65 6d 0a 2a 2a  y one of them.**
5a20: 20 68 61 73 20 74 6f 20 71 75 61 6c 69 66 79 20   has to qualify 
5a30: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  in order for the
5a40: 20 77 68 6f 6c 65 20 70 68 72 61 73 65 20 74 6f   whole phrase to
5a50: 20 71 75 61 6c 69 66 79 2e 20 20 57 68 65 6e 0a   qualify.  When.
5a60: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
5a70: 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 6b 6e  is called, we kn
5a80: 6f 77 20 74 68 61 74 20 70 4f 72 54 65 72 6d 20  ow that pOrTerm 
5a90: 64 69 64 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e  did not qualify.
5aa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5ab0: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
5ac0: 6f 20 73 65 65 20 69 66 20 70 4f 72 54 65 72 6d  o see if pOrTerm
5ad0: 20 68 61 73 20 61 20 64 75 70 6c 69 63 61 74 65   has a duplicate
5ae0: 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 71   that.** might q
5af0: 75 61 6c 69 66 79 2e 20 20 49 66 20 74 68 65 72  ualify.  If ther
5b00: 65 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  e is a duplicate
5b10: 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
5b20: 74 20 62 65 65 6e 0a 2a 2a 20 64 69 73 71 75 61  t been.** disqua
5b30: 6c 69 66 69 65 64 2c 20 74 68 65 6e 20 72 65 74  lified, then ret
5b40: 75 72 6e 20 74 72 75 65 2e 20 20 49 66 20 74 68  urn true.  If th
5b50: 65 72 65 20 61 72 65 20 6e 6f 20 64 75 70 6c 69  ere are no dupli
5b60: 63 61 74 65 73 2c 20 6f 72 0a 2a 2a 20 74 68 65  cates, or.** the
5b70: 20 64 75 70 6c 69 63 61 74 65 20 68 61 73 20 61   duplicate has a
5b80: 6c 73 6f 20 62 65 65 6e 20 64 69 73 71 75 61 6c  lso been disqual
5b90: 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 66 61  ified, return fa
5ba0: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
5bb0: 6e 74 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75  nt orTermHasOkDu
5bc0: 70 6c 69 63 61 74 65 28 57 68 65 72 65 43 6c 61  plicate(WhereCla
5bd0: 75 73 65 20 2a 70 4f 72 2c 20 57 68 65 72 65 54  use *pOr, WhereT
5be0: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 29 7b 0a 20  erm *pOrTerm){. 
5bf0: 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 66 6c   if( pOrTerm->fl
5c00: 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45  ags & TERM_COPIE
5c10: 44 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  D ){.    /* This
5c20: 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   is the original
5c30: 20 74 65 72 6d 2e 20 20 54 68 65 20 64 75 70 6c   term.  The dupl
5c40: 69 63 61 74 65 20 69 73 20 74 6f 20 74 68 65 20  icate is to the 
5c50: 6c 65 66 74 20 68 61 64 0a 20 20 20 20 2a 2a 20  left had.    ** 
5c60: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
5c70: 20 61 6e 61 6c 79 7a 65 64 20 61 6e 64 20 74 68   analyzed and th
5c80: 75 73 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  us has not yet b
5c90: 65 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64  een disqualified
5ca0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
5cb0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 4f  1;.  }.  if( (pO
5cc0: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
5cd0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 0a  ERM_VIRTUAL)!=0.
5ce0: 20 20 20 20 20 26 26 20 28 70 4f 72 2d 3e 61 5b       && (pOr->a[
5cf0: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
5d00: 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  ].flags & TERM_O
5d10: 52 5f 4f 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20  R_OK)!=0 ){.    
5d20: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 64 75 70  /* This is a dup
5d30: 6c 69 63 61 74 65 20 74 65 72 6d 2e 20 20 54 68  licate term.  Th
5d40: 65 20 6f 72 69 67 69 6e 61 6c 20 71 75 61 6c 69  e original quali
5d50: 66 69 65 64 20 73 6f 20 74 68 69 73 20 6f 6e 65  fied so this one
5d60: 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
5d70: 20 68 61 76 65 20 74 6f 2e 20 2a 2f 0a 20 20 20   have to. */.   
5d80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5d90: 20 2f 2a 20 54 68 69 73 20 69 73 20 65 69 74 68   /* This is eith
5da0: 65 72 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20 74  er a singleton t
5db0: 65 72 6d 20 6f 72 20 65 6c 73 65 20 69 74 20 69  erm or else it i
5dc0: 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 6f  s a duplicate fo
5dd0: 72 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  r.  ** which the
5de0: 20 6f 72 69 67 69 6e 61 6c 20 64 69 64 20 6e 6f   original did no
5df0: 74 20 71 75 61 6c 69 66 79 2e 20 20 45 69 74 68  t qualify.  Eith
5e00: 65 72 20 77 61 79 20 77 65 20 61 72 65 20 64 6f  er way we are do
5e10: 6e 65 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 65 74  ne for. */.  ret
5e20: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
5e30: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
5e40: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
5e50: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
5e60: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
5e70: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
5e80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5e90: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
5ea0: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
5eb0: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
5ec0: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
5ed0: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
5ee0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
5ef0: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
5f00: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
5f10: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
5f20: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
5f30: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
5f40: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
5f50: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
5f60: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
5f70: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
5f80: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
5f90: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
5fa0: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
5fb0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
5fc0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
5fd0: 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20 74 68  sion is of.** th
5fe0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
5ff0: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
6000: 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d 6e 73  nd Y are columns
6010: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
6020: 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  nal.** expressio
6030: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
6040: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
6050: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74   expression of t
6060: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
6070: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
6080: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
6090: 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65 64 20  se and analyzed 
60a0: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
60b0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
60c0: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
60d0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
60e0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
60f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
6100: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
6110: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
6120: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
6130: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
6140: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
6150: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
6160: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
6170: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
6180: 70 54 65 72 6d 3b 0a 20 20 45 78 70 72 4d 61 73  pTerm;.  ExprMas
6190: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 0a  kSet *pMaskSet;.
61a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
61b0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
61c0: 65 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70  eft;.  Bitmask p
61d0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 42 69 74 6d  rereqAll;.  Bitm
61e0: 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d  ask extraRight =
61f0: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65   0;.  int nPatte
6200: 72 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70  rn;.  int isComp
6210: 6c 65 74 65 3b 0a 20 20 69 6e 74 20 6e 6f 43 61  lete;.  int noCa
6220: 73 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  se;.  int op;.  
6230: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
6240: 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  pWC->pParse;.  s
6250: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6260: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
6270: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
6290: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
62a0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
62b0: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43    pMaskSet = pWC
62c0: 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->pMaskSet;.  pE
62d0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
62e0: 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  pr;.  prereqLeft
62f0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
6300: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
6310: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
6320: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
6330: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
6340: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
6350: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
6360: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
6370: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
6380: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
6390: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69  kSet, pExpr->pLi
63a0: 73 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  st).            
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
63c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
63d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
63e0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Expr->pSelect);.
63f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
6400: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
6410: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
6420: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
6430: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
6440: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
6450: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
6460: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
6470: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
6480: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
6490: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
64a0: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
64b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
64c0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
64d0: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
64e0: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
64f0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
6500: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
6510: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
6520: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
6530: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
6540: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
6550: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
6560: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
6590: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
65a0: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
65b0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
65c0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
65d0: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
65e0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
65f0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
6600: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
6610: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
6620: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
6630: 28 6f 70 29 20 26 26 20 28 70 54 65 72 6d 2d 3e  (op) && (pTerm->
6640: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 72  prereqRight & pr
6650: 65 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a  ereqLeft)==0 ){.
6660: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
6670: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
6680: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
6690: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
66a0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
66b0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
66c0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  {.      pTerm->l
66d0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
66e0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
66f0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75   pTerm->leftColu
6700: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
6710: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  umn;.      pTerm
6720: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
6730: 65 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a  eratorMask(op);.
6740: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52      }.    if( pR
6750: 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e  ight && pRight->
6760: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
6770: 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
6780: 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
6790: 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  pr *pDup;.      
67a0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
67b0: 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ursor>=0 ){.    
67c0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
67d0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
67e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
67f0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
6800: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
6810: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
6820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6830: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
6840: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
6850: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
6860: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
6870: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6880: 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f  pWC, pDup, TERM_
6890: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
68a0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69  AMIC);.        i
68b0: 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72  f( idxNew==0 ) r
68c0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
68d0: 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  New = &pWC->a[id
68e0: 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70  xNew];.        p
68f0: 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  New->iParent = i
6900: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
6910: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
6920: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
6930: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
6940: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65  = 1;.        pTe
6950: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
6960: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
6970: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
6980: 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  Dup = pExpr;.   
6990: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72       pNew = pTer
69a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
69b0: 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61   exprCommute(pPa
69c0: 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  rse, pDup);.    
69d0: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
69e0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
69f0: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
6a00: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
6a10: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
6a20: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
6a30: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
6a40: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
6a50: 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  = prereqLeft;.  
6a60: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
6a70: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
6a80: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
6a90: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
6aa0: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b  rMask(pDup->op);
6ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
6ac0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6ad0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
6ae0: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
6af0: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
6b00: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
6b10: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
6b20: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
6b30: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
6b40: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
6b50: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
6b60: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
6b70: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6b80: 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45  BETWEEN ){.    E
6b90: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6ba0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
6bb0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
6bc0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
6bd0: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
6be0: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
6bf0: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
6c00: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
6c10: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
6c20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
6c30: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
6c40: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
6c50: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
6c60: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
6c70: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 6f 70  lite3Expr(db, op
6c80: 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70  s[i], sqlite3Exp
6c90: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
6ca0: 70 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20  pLeft),.        
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6cd0: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
6ce0: 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a  [i].pExpr), 0);.
6cf0: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
6d00: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
6d10: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
6d20: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
6d30: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
6d40: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
6d50: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
6d60: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
6d70: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
6d80: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
6d90: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
6da0: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
6db0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
6dc0: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
6dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6de0: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
6df0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
6e00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6e10: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
6e20: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
6e30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6e40: 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d  UERY).  /* Attem
6e50: 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52  pt to convert OR
6e60: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
6e70: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
6e80: 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20 2a  ator so that.  *
6e90: 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65 20  * they can make 
6ea0: 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
6eb0: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
6ec0: 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70   **      x = exp
6ed0: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
6ee0: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
6ef0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
6f00: 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a  nverted into.  *
6f10: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 49 4e  *.  **      x IN
6f20: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
6f30: 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  pr3).  **.  ** T
6f40: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
6f50: 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74 65 64   must be omitted
6f60: 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55 45 52   if OMIT_SUBQUER
6f70: 59 20 69 73 20 64 65 66 69 6e 65 64 20 62 65 63  Y is defined bec
6f80: 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ause.  ** the co
6f90: 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65 20 74  mpiler for the t
6fa0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
6fb0: 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d 71 75  s part of sub-qu
6fc0: 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c  eries..  */.  el
6fd0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
6fe0: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69  ==TK_OR ){.    i
6ff0: 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69  nt ok;.    int i
7000: 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  , j;.    int iCo
7010: 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20  lumn, iCursor;. 
7020: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73     WhereClause s
7030: 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  Or;.    WhereTer
7040: 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20  m *pOrTerm;..   
7050: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
7060: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
7070: 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20  NAMIC)==0 );.   
7080: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
7090: 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72  (&sOr, pWC->pPar
70a0: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
70b0: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 73     whereSplit(&s
70c0: 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Or, pExpr, TK_OR
70d0: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
70e0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26 73 4f 72  zeAll(pSrc, &sOr
70f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
7100: 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 20  Or.nTerm>=2 );. 
7110: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 69 66     j = 0;.    if
7120: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7130: 65 64 20 29 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74  ed ) goto or_not
7140: 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 64  _possible;.    d
7150: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
7160: 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a   j<sOr.nTerm );.
7170: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
7180: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c  sOr.a[j].leftCol
7190: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73  umn;.      iCurs
71a0: 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65  or = sOr.a[j].le
71b0: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
71c0: 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b  ok = iCursor>=0;
71d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72  .      for(i=sOr
71e0: 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  .nTerm-1, pOrTer
71f0: 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26  m=sOr.a; i>=0 &&
7200: 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72   ok; i--, pOrTer
7210: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
7220: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
7230: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
7240: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72           goto or
7250: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20  _not_possible;. 
7260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7270: 20 69 66 28 20 6f 72 54 65 72 6d 49 73 4f 70 74   if( orTermIsOpt
7280: 43 61 6e 64 69 64 61 74 65 28 70 4f 72 54 65 72  Candidate(pOrTer
7290: 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  m, iCursor, iCol
72a0: 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  umn) ){.        
72b0: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
72c0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
72d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
72e0: 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70  ( orTermHasOkDup
72f0: 6c 69 63 61 74 65 28 26 73 4f 72 2c 20 70 4f 72  licate(&sOr, pOr
7300: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  Term) ){.       
7310: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
7320: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
7330: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7340: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20  .          ok = 
7350: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
7360: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
7370: 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a   !ok && (sOr.a[j
7380: 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d  ++].flags & TERM
7390: 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a  _COPIED)!=0 && j
73a0: 3c 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b  <2 );.    if( ok
73b0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   ){.      ExprLi
73c0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  st *pList = 0;. 
73d0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c       Expr *pNew,
73e0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 45 78   *pDup;.      Ex
73f0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr *pLeft = 0;. 
7400: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
7410: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
7420: 73 4f 72 2e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  sOr.a; i>=0; i--
7430: 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20  , pOrTerm++){.  
7440: 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65        if( (pOrTe
7450: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
7460: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
7470: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
7480: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
7490: 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d  rDup(db, pOrTerm
74a0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
74b0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
74c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
74d0: 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61  tAppend(pWC->pPa
74e0: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70  rse, pList, pDup
74f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  , 0);.        pL
7500: 65 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70  eft = pOrTerm->p
7510: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
7520: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
7530: 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  t( pLeft!=0 );. 
7540: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
7550: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7560: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Left);.      pNe
7570: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
7580: 64 62 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  db, TK_IN, pDup,
7590: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
75a0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
75b0: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
75c0: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
75d0: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
75e0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
75f0: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70   pNew->pList = p
7600: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64  List;.        id
7610: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
7620: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
7630: 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  ew, TERM_VIRTUAL
7640: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
7650: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
7660: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
7670: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  dxNew);.        
7680: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
7690: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
76a0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
76b0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
76c0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
76d0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
76e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
76f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
7700: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
7710: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
7720: 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69    }.or_not_possi
7730: 62 6c 65 3a 0a 20 20 20 20 77 68 65 72 65 43 6c  ble:.    whereCl
7740: 61 75 73 65 43 6c 65 61 72 28 26 73 4f 72 29 3b  auseClear(&sOr);
7750: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
7770: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
7780: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7790: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
77a0: 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f  TION.  /* Add co
77b0: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64  nstraints to red
77c0: 75 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73  uce the search s
77d0: 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f  pace on a LIKE o
77e0: 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72  r GLOB.  ** oper
77f0: 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ator..  **.  ** 
7800: 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f  A like pattern o
7810: 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49  f the form "x LI
7820: 4b 45 20 27 61 62 63 25 27 22 20 69 73 20 63 68  KE 'abc%'" is ch
7830: 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74  anged into const
7840: 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a  raints.  **.  **
7850: 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27 61 62            x>='ab
7860: 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41  c' AND x<'abd' A
7870: 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  ND x LIKE 'abc%'
7880: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
7890: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ast character of
78a0: 20 74 68 65 20 70 72 65 66 69 78 20 22 61 62 63   the prefix "abc
78b0: 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  " is incremented
78c0: 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a   to form the.  *
78d0: 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  * termination co
78e0: 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e 0a 20  ndition "abd".. 
78f0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69 6b 65   */.  if( isLike
7900: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
7910: 45 78 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c  Expr, &nPattern,
7920: 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e   &isComplete, &n
7930: 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78  oCase) ){.    Ex
7940: 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  pr *pLeft, *pRig
7950: 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53  ht;.    Expr *pS
7960: 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20  tr1, *pStr2;.   
7970: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
7980: 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20  , *pNewExpr2;.  
7990: 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69    int idxNew1, i
79a0: 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65  dxNew2;..    pLe
79b0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ft = pExpr->pLis
79c0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
79d0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
79e0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
79f0: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20  Expr;.    pStr1 
7a00: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7a10: 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47  Parse, TK_STRING
7a20: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7a30: 69 66 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20  if( pStr1 ){.   
7a40: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
7a50: 6f 70 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e  opy(db, &pStr1->
7a60: 74 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e  token, &pRight->
7a70: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53  token);.      pS
7a80: 74 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e  tr1->token.n = n
7a90: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70  Pattern;.      p
7aa0: 53 74 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50  Str1->flags = EP
7ab0: 5f 44 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d  _Dequoted;.    }
7ac0: 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c  .    pStr2 = sql
7ad0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7ae0: 70 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20  pStr1);.    if( 
7af0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7b00: 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
7b10: 20 2a 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65   *pC;.      asse
7b20: 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e  rt( pStr2->token
7b30: 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43  .dyn );.      pC
7b40: 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e   = (u8*)&pStr2->
7b50: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
7b60: 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  -1];.      c = *
7b70: 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  pC;.      if( no
7b80: 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Case ){.        
7b90: 69 66 28 20 63 3d 3d 27 40 27 20 29 20 69 73 43  if( c=='@' ) isC
7ba0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
7bb0: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
7bc0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
7bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
7be0: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
7bf0: 7d 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  }.    pNewExpr1 
7c00: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7c10: 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71  Parse, TK_GE, sq
7c20: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
7c30: 70 4c 65 66 74 29 2c 20 70 53 74 72 31 2c 20 30  pLeft), pStr1, 0
7c40: 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d  );.    idxNew1 =
7c50: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
7c60: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
7c70: 31 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  1, TERM_VIRTUAL|
7c80: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
7c90: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
7ca0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
7cb0: 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  1);.    pNewExpr
7cc0: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
7cd0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 20  (pParse, TK_LT, 
7ce0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7cf0: 62 2c 70 4c 65 66 74 29 2c 20 70 53 74 72 32 2c  b,pLeft), pStr2,
7d00: 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65 77 32   0);.    idxNew2
7d10: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
7d20: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78  sert(pWC, pNewEx
7d30: 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  pr2, TERM_VIRTUA
7d40: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
7d50: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
7d60: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
7d70: 65 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ew2);.    pTerm 
7d80: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
7d90: 6d 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f  m];.    if( isCo
7da0: 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  mplete ){.      
7db0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e  pWC->a[idxNew1].
7dc0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
7dd0: 6d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b  m;.      pWC->a[
7de0: 69 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74  idxNew2].iParent
7df0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
7e00: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
7e10: 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 2;.    }.  }.#
7e20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7e30: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
7e40: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64  ZATION */..#ifnd
7e50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7e60: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
7e70: 20 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20   Add a WO_MATCH 
7e80: 61 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74  auxiliary term t
7e90: 6f 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  o the constraint
7ea0: 20 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   set if the.  **
7eb0: 20 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73   current express
7ec0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
7ed0: 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43  rm:  column MATC
7ee0: 48 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69  H expr..  ** Thi
7ef0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
7f00: 20 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65   used by the xBe
7f10: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20  stIndex methods 
7f20: 6f 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  of.  ** virtual 
7f30: 74 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74  tables.  The nat
7f40: 69 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ive query optimi
7f50: 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74  zer does not att
7f60: 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20  empt.  ** to do 
7f70: 61 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41  anything with MA
7f80: 54 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  TCH functions.. 
7f90: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63   */.  if( isMatc
7fa0: 68 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29  hOfColumn(pExpr)
7fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e   ){.    int idxN
7fc0: 65 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ew;.    Expr *pR
7fd0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
7fe0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65    WhereTerm *pNe
7ff0: 77 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61  wTerm;.    Bitma
8000: 73 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c  sk prereqColumn,
8010: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20   prereqExpr;..  
8020: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
8030: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
8040: 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  xpr;.    pLeft =
8050: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
8060: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
8070: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
8080: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
8090: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
80a0: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
80b0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
80c0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
80d0: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
80e0: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
80f0: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
8100: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
8110: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
8120: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
8130: 62 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 30 2c 20  b, TK_MATCH, 0, 
8140: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8150: 62 2c 20 70 52 69 67 68 74 29 2c 20 30 29 3b 0a  b, pRight), 0);.
8160: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
8170: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
8180: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
8190: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
81a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
81b0: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
81c0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
81d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
81e0: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
81f0: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
8200: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
8210: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
8220: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
8230: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
8240: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
8250: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
8270: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
8280: 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
8290: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
82a0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
82b0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
82c0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
82d0: 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
82e0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
82f0: 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
8300: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
8310: 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
8320: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
8330: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8340: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8350: 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e   */..  /* Preven
8360: 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d  t ON clause term
8370: 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  s of a LEFT JOIN
8380: 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64   from being used
8390: 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61   to drive.  ** a
83a0: 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c  n index for tabl
83b0: 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
83c0: 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
83d0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
83e0: 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69  Right |= extraRi
83f0: 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ght;.}../*.** Re
8400: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 79  turn TRUE if any
8410: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
8420: 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b  ons in pList->a[
8430: 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f 6e 74 61  iFirst...] conta
8440: 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  in.** a referenc
8450: 65 20 74 6f 20 61 6e 79 20 74 61 62 6c 65 20 6f  e to any table o
8460: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 69 42  ther than the iB
8470: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ase table..*/.st
8480: 61 74 69 63 20 69 6e 74 20 72 65 66 65 72 65 6e  atic int referen
8490: 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 0a  cesOtherTables(.
84a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
84b0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t,          /* S
84c0: 65 61 72 63 68 20 65 78 70 72 65 73 73 69 6f 6e  earch expression
84d0: 73 20 69 6e 20 74 68 73 20 6c 69 73 74 20 2a 2f  s in ths list */
84e0: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
84f0: 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a 20  pMaskSet,    /* 
8500: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
8510: 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a  les to bitmaps *
8520: 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8540: 20 42 65 20 73 65 61 72 63 68 69 6e 67 20 77 69   Be searching wi
8550: 74 68 20 74 68 65 20 69 46 69 72 73 74 2d 74 68  th the iFirst-th
8560: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
8570: 20 69 6e 74 20 69 42 61 73 65 20 20 20 20 20 20   int iBase      
8580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
8590: 6e 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20  nore references 
85a0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
85b0: 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 61 6c  .){.  Bitmask al
85c0: 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d 61 73 6b  lowed = ~getMask
85d0: 28 70 4d 61 73 6b 53 65 74 2c 20 69 42 61 73 65  (pMaskSet, iBase
85e0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 46 69 72  );.  while( iFir
85f0: 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  st<pList->nExpr 
8600: 29 7b 0a 20 20 20 20 69 66 28 20 28 65 78 70 72  ){.    if( (expr
8610: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
8620: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 46  Set, pList->a[iF
8630: 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72 29 26 61  irst++].pExpr)&a
8640: 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b 0a 20 20  llowed)!=0 ){.  
8650: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8660: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8670: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
8680: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 63 69 64  is routine decid
8690: 65 73 20 69 66 20 70 49 64 78 20 63 61 6e 20 62  es if pIdx can b
86a0: 65 20 75 73 65 64 20 74 6f 20 73 61 74 69 73 66  e used to satisf
86b0: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a  y the ORDER BY.*
86c0: 2a 20 63 6c 61 75 73 65 2e 20 20 49 66 20 69 74  * clause.  If it
86d0: 20 63 61 6e 2c 20 69 74 20 72 65 74 75 72 6e 73   can, it returns
86e0: 20 31 2e 20 20 49 66 20 70 49 64 78 20 63 61 6e   1.  If pIdx can
86f0: 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 0a  not satisfy the.
8700: 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ** ORDER BY clau
8710: 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
8720: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a   returns 0..**.*
8730: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
8740: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8750: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
8760: 74 61 74 65 6d 65 6e 74 2e 20 20 70 54 61 62 20  tatement.  pTab 
8770: 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  is the.** left-m
8780: 6f 73 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ost table in the
8790: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
87a0: 74 68 61 74 20 73 61 6d 65 20 53 45 4c 45 43 54  that same SELECT
87b0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a   statement and.*
87c0: 2a 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  * the table has 
87d0: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
87e0: 6f 66 20 22 62 61 73 65 22 2e 20 20 70 49 64 78  of "base".  pIdx
87f0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
8800: 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43  pTab..**.** nEqC
8810: 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ol is the number
8820: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70   of columns of p
8830: 49 64 78 20 74 68 61 74 20 61 72 65 20 75 73 65  Idx that are use
8840: 64 20 61 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a  d as equality.**
8850: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 41   constraints.  A
8860: 6e 79 20 6f 66 20 74 68 65 73 65 20 63 6f 6c 75  ny of these colu
8870: 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69 73 73 69  mns may be missi
8880: 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45  ng from the ORDE
8890: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61  R BY.** clause a
88a0: 6e 64 20 74 68 65 20 6d 61 74 63 68 20 63 61 6e  nd the match can
88b0: 20 73 74 69 6c 6c 20 62 65 20 61 20 73 75 63 63   still be a succ
88c0: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74  ess..**.** All t
88d0: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
88e0: 52 20 42 59 20 74 68 61 74 20 6d 61 74 63 68 20  R BY that match 
88f0: 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65  against the inde
8900: 78 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  x must be either
8910: 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e  .** ASC or DESC.
8920: 20 20 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20    (Terms of the 
8930: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8940: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
8950: 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65  a UNIQUE.** inde
8960: 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  x do not need to
8970: 20 73 61 74 69 73 66 79 20 74 68 69 73 20 63 6f   satisfy this co
8980: 6e 73 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20  nstraint.)  The 
8990: 2a 70 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a  *pbRev value is.
89a0: 2a 2a 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  ** set to 1 if t
89b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
89c0: 73 65 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61  se is all DESC a
89d0: 6e 64 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  nd it is set to 
89e0: 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45  0 if.** the ORDE
89f0: 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61  R BY clause is a
8a00: 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69  ll ASC..*/.stati
8a10: 63 20 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49  c int isSortingI
8a20: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
8a30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8a40: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8a50: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b  xt */.  ExprMask
8a60: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
8a70: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
8a80: 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74 6f  table indices to
8a90: 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 49 6e   bitmaps */.  In
8aa0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
8ab0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
8ac0: 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
8ad0: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  g */.  int base,
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8af0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
8b00: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f  for the table to
8b10: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
8b20: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8b30: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
8b40: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
8b50: 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20  /.  int nEqCol, 
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8b70: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63  umber of index c
8b80: 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63  olumns with == c
8b90: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
8ba0: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
8bb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
8bc0: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
8bd0: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
8be0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
8c10: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
8c20: 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  der = 0;        
8c30: 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20        /* XOR of 
8c40: 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20  index and ORDER 
8c50: 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f  BY sort directio
8c60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  n */.  int nTerm
8c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8c80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8c90: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
8ca0: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  ms */.  struct E
8cb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
8cc0: 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72  erm;    /* A ter
8cd0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
8ce0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
8cf0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8d00: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
8d10: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
8d20: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
8d30: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
8d40: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
8d50: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
8d60: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
8d70: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
8d80: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
8d90: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
8da0: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
8db0: 74 20 69 6e 64 69 63 65 73 20 68 61 76 65 20 70  t indices have p
8dc0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67  Idx->nColumn reg
8dd0: 75 6c 61 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  ular columns plu
8de0: 73 0a 20 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74  s.  ** one addit
8df0: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e  ional column con
8e00: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69  taining the rowi
8e10: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 63 6f  d.  The rowid co
8e20: 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  lumn.  ** of the
8e30: 20 69 6e 64 65 78 20 69 73 20 61 6c 73 6f 20 61   index is also a
8e40: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
8e50: 61 67 61 69 6e 73 74 20 74 68 65 20 4f 52 44 45  against the ORDE
8e60: 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
8e70: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a  ..  */.  for(i=j
8e80: 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72  =0, pTerm=pOrder
8e90: 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26  By->a; j<nTerm &
8ea0: 26 20 69 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  & i<=pIdx->nColu
8eb0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  mn; i++){.    Ex
8ec0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
8ed0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
8ee0: 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
8ef0: 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20  BY pTerm */.    
8f00: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
8f10: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
8f20: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
8f30: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74  pExpr */.    int
8f40: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20   termSortOrder; 
8f50: 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f  /* Sort order fo
8f60: 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  r this term */. 
8f70: 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20     int iColumn; 
8f80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
8f90: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
8fa0: 69 6e 64 65 78 2e 20 20 2d 31 20 66 6f 72 20 72  index.  -1 for r
8fb0: 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
8fc0: 69 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 2f  iSortOrder;    /
8fd0: 2a 20 31 20 66 6f 72 20 44 45 53 43 2c 20 30 20  * 1 for DESC, 0 
8fe0: 66 6f 72 20 41 53 43 20 6f 6e 20 74 68 65 20 69  for ASC on the i
8ff0: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
9000: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
9010: 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65   *zColl; /* Name
9020: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   of the collatin
9030: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 69  g sequence for i
9040: 2d 74 68 20 69 6e 64 65 78 20 74 65 72 6d 20 2a  -th index term *
9050: 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  /..    pExpr = p
9060: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
9070: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
9080: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
9090: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61 73 65  pr->iTable!=base
90a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e   ){.      /* Can
90b0: 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e 64 65   not use an inde
90c0: 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69  x sort on anythi
90d0: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ng that is not a
90e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20   column in the. 
90f0: 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73       ** left-mos
9100: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 46  t table of the F
9110: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
9120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9130: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
9140: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
9150: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
9160: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9170: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  {.      pColl = 
9180: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
9190: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70     }.    if( i<p
91a0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
91b0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
91c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
91d0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ];.      if( iCo
91e0: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70 54 61 62  lumn==pIdx->pTab
91f0: 6c 65 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  le->iPKey ){.   
9200: 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d       iColumn = -
9210: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9220: 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49   iSortOrder = pI
9230: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
9240: 5d 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  ];.      zColl =
9250: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
9260: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9270: 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b     iColumn = -1;
9280: 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65  .      iSortOrde
9290: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 43 6f  r = 0;.      zCo
92a0: 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll = pColl->zNam
92b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
92c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21   pExpr->iColumn!
92d0: 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69  =iColumn || sqli
92e0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
92f0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20  ->zName, zColl) 
9300: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d  ){.      /* Term
9310: 20 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20   j of the ORDER 
9320: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
9330: 6f 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20  ot match column 
9340: 69 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  i of the index *
9350: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45  /.      if( i<nE
9360: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  qCol ){.        
9370: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
9380: 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f  olumn that is co
9390: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
93a0: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
93b0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  n.        ** ORD
93c0: 45 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74  ER BY term, that
93d0: 20 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67   is OK.  Just ig
93e0: 6e 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  nore that column
93f0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   of the index.  
9400: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9410: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9420: 20 7d 65 6c 73 65 20 69 66 28 20 69 3d 3d 70 49   }else if( i==pI
9430: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
9440: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9450: 63 6f 6c 75 6d 6e 20 69 20 69 73 20 74 68 65 20  column i is the 
9460: 72 6f 77 69 64 2e 20 20 41 6c 6c 20 6f 74 68 65  rowid.  All othe
9470: 72 20 74 65 72 6d 73 20 6d 61 74 63 68 2e 20 2a  r terms match. *
9480: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
9490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
94a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
94b0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69 6c  ndex column fail
94c0: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20 69  s to match and i
94d0: 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  s not constraine
94e0: 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20 20  d by ==.        
94f0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  ** then the inde
9500: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
9510: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6f   the ORDER BY co
9520: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20 20  nstraint..      
9530: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
9540: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
9550: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9560: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
9570: 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
9580: 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  rt( pTerm->sortO
9590: 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72 6d  rder==0 || pTerm
95a0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29  ->sortOrder==1 )
95b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
95c0: 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 69  ortOrder==0 || i
95d0: 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a  SortOrder==1 );.
95e0: 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64 65      termSortOrde
95f0: 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20 5e  r = iSortOrder ^
9600: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
9610: 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45 71  r;.    if( i>nEq
9620: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
9630: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d   termSortOrder!=
9640: 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  sortOrder ){.   
9650: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20       /* Indices 
9660: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
9670: 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   if all ORDER BY
9680: 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a   terms past the.
9690: 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c          ** equal
96a0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
96b0: 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44  are all either D
96c0: 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20  ESC or ASC. */. 
96d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
96e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
96f0: 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72  se{.      sortOr
9700: 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72  der = termSortOr
9710: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  der;.    }.    j
9720: 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b  ++;.    pTerm++;
9730: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
9740: 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63 65  <0 && !reference
9750: 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72  sOtherTables(pOr
9760: 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c  derBy, pMaskSet,
9770: 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20   j, base) ){.   
9780: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
9790: 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 74  exed column is t
97a0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61  he primary key a
97b0: 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d 61  nd everything ma
97c0: 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20 73  tches.      ** s
97d0: 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20 6f  o far and none o
97e0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
97f0: 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67 68  erms to the righ
9800: 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68 65  t reference othe
9810: 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  r.      ** table
9820: 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 74  s in the join, t
9830: 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75 72  hen we are assur
9840: 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ed that the inde
9850: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a 20  x can be used . 
9860: 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74 20       ** to sort 
9870: 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69 6d  because the prim
9880: 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71 75  ary key is uniqu
9890: 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f 66  e and so none of
98a0: 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 20   the other.     
98b0: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c 6c   ** columns will
98c0: 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65 72   make any differ
98d0: 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ence.      */.  
98e0: 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a 20      j = nTerm;. 
98f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62 52     }.  }..  *pbR
9900: 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d  ev = sortOrder!=
9910: 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65 72  0;.  if( j>=nTer
9920: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  m ){.    /* All 
9930: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
9940: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
9950: 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69 73   covered by this
9960: 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a 2a   index so.    **
9970: 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e 20   this index can 
9980: 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
9990: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ing. */.    retu
99a0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
99b0: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
99c0: 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49 64  E_None && i==pId
99d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  x->nColumn.     
99e0: 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f   && !referencesO
99f0: 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65  therTables(pOrde
9a00: 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a  rBy, pMaskSet, j
9a10: 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2f  , base) ){.    /
9a20: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
9a30: 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68 20  his index match 
9a40: 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20 74  some prefix of t
9a50: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
9a60: 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  se.    ** and th
9a70: 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51 55  e index is UNIQU
9a80: 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f  E and no terms o
9a90: 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  n the tail of th
9aa0: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
9ab0: 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 6e  * clause referen
9ac0: 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20  ce other tables 
9ad0: 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74  in a join.  If t
9ae0: 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65 20  his is all true 
9af0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
9b00: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
9b10: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 20  is superfluous. 
9b20: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
9b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
9b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
9b50: 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20  table to see if 
9b60: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
9b70: 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20  use in pOrderBy 
9b80: 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64  can be satisfied
9b90: 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69  .** by sorting i
9ba0: 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44  n order of ROWID
9bb0: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
9bc0: 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62  f so and set *pb
9bd0: 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75  Rev to be.** tru
9be0: 65 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f  e for reverse RO
9bf0: 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  WID and false fo
9c00: 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20  r forward ROWID 
9c10: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
9c20: 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52   int sortableByR
9c30: 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65  owid(.  int base
9c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9c50: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
9c60: 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65   for table to be
9c70: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70   sorted */.  Exp
9c80: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
9c90: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
9ca0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
9cb0: 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d   ExprMaskSet *pM
9cc0: 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70  askSet,  /* Mapp
9cd0: 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20  ing from tables 
9ce0: 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20  to bitmaps */.  
9cf0: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
9d00: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
9d10: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
9d20: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
9d30: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
9d40: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
9d50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
9d60: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
9d70: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
9d80: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
9d90: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
9da0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
9db0: 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43  e==base && p->iC
9dc0: 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26 26  olumn==-1.    &&
9dd0: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
9de0: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
9df0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c 20 62  , pMaskSet, 1, b
9e00: 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70 62 52  ase) ){.    *pbR
9e10: 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  ev = pOrderBy->a
9e20: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
9e30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9e40: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9e50: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
9e60: 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f  crude estimate o
9e70: 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20  f the logarithm 
9e80: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c  of the input val
9e90: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  ue..** The resul
9ea0: 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65  ts need not be e
9eb0: 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f  xact.  This is o
9ec0: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74  nly used for est
9ed0: 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  imating.** the t
9ee0: 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72  otal cost of per
9ef0: 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f  forming operatio
9f00: 6e 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20  ns with O(logN) 
9f10: 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63  or O(NlogN).** c
9f20: 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61  omplexity.  Beca
9f30: 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20  use N is just a 
9f40: 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20  guess, it is no 
9f50: 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66  great tragedy if
9f60: 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69  .** logN is a li
9f70: 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  ttle off..*/.sta
9f80: 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f  tic double estLo
9f90: 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64  g(double N){.  d
9fa0: 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a  ouble logN = 1;.
9fb0: 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b    double x = 10;
9fc0: 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b  .  while( N>x ){
9fd0: 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a  .    logN += 1;.
9fe0: 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d      x *= 10;.  }
9ff0: 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a  .  return logN;.
a000: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75  }../*.** Two rou
a010: 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69  tines for printi
a020: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
a030: 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64  f an sqlite3_ind
a040: 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ex_info.** struc
a050: 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20  ture.  Used for 
a060: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
a070: 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20  gging only.  If 
a080: 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54  neither.** SQLIT
a090: 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45  E_TEST or SQLITE
a0a0: 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e  _DEBUG are defin
a0b0: 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72  ed, then these r
a0c0: 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e  outines.** are n
a0d0: 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64  o-ops..*/.#if !d
a0e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a0f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
a100: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
a110: 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
a120: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
a130: 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  INPUTS(sqlite3_i
a140: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
a150: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
a160: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
a170: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
a180: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
a190: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
a1a0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a1b0: 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69  intf("  constrai
a1c0: 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74  nt[%d]: col=%d t
a1d0: 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75  ermid=%d op=%d u
a1e0: 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20  sabled=%d\n",.  
a1f0: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
a200: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
a210: 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  .iColumn,.      
a220: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b   p->aConstraint[
a230: 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a  i].iTermOffset,.
a240: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
a250: 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20  raint[i].op,.   
a260: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
a270: 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20  nt[i].usable);. 
a280: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
a290: 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  p->nOrderBy; i++
a2a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
a2b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
a2c0: 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64  erby[%d]: col=%d
a2d0: 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20   desc=%d\n",.   
a2e0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
a2f0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  >aOrderBy[i].iCo
a300: 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e  lumn,.       p->
a310: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  aOrderBy[i].desc
a320: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
a330: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f  void TRACE_IDX_O
a340: 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69  UTPUTS(sqlite3_i
a350: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
a360: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73   int i;.  if( !s
a370: 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
a380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
a390: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73  (i=0; i<p->nCons
a3a0: 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
a3b0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a3c0: 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64  intf("  usage[%d
a3d0: 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d  ]: argvIdx=%d om
a3e0: 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  it=%d\n",.      
a3f0: 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43   i,.       p->aC
a400: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
a410: 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20  ].argvIndex,.   
a420: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
a430: 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29  ntUsage[i].omit)
a440: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
a450: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
a460: 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69  xNum=%d\n", p->i
a470: 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65  dxNum);.  sqlite
a480: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
a490: 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d  idxStr=%s\n", p-
a4a0: 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69  >idxStr);.  sqli
a4b0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
a4c0: 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65    orderByConsume
a4d0: 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65  d=%d\n", p->orde
a4e0: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
a4f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
a500: 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43  tf("  estimatedC
a510: 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73  ost=%g\n", p->es
a520: 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a  timatedCost);.}.
a530: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
a540: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
a550: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
a560: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
a570: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
a580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
a590: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f  ALTABLE./*.** Co
a5a0: 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
a5b0: 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
a5c0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
a5d0: 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
a5e0: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
a5f0: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
a600: 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
a610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
a620: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
a630: 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
a640: 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
a650: 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
a660: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
a670: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
a680: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
a690: 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
a6a0: 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
a6b0: 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
a6c0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
a6d0: 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
a6e0: 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
a6f0: 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
a700: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
a710: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a720: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
a730: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
a740: 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
a750: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
a760: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
a770: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
a780: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
a790: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
a7a0: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
a7b0: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
a7c0: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
a7d0: 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
a7e0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
a7f0: 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
a800: 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
a810: 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
a820: 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
a830: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
a840: 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
a850: 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
a860: 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
a870: 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
a880: 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74 75  double bestVirtu
a890: 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  alIndex(.  Parse
a8a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a8c0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
a8d0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
a8e0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
a8f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
a900: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
a910: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
a920: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
a930: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
a940: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
a950: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
a960: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
a970: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
a980: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
a990: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
a9a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
a9b0: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
a9c0: 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79   /* The order by
a9d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a9e0: 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c 20   orderByUsable, 
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aa00: 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 6f  rue if we can po
aa10: 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a  tential sort */.
aa20: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
aa30: 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
aa40: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
aa50: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
aa60: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
aa70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
aa80: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
aa90: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
aaa0: 61 62 20 3d 20 70 54 61 62 2d 3e 70 56 74 61 62  ab = pTab->pVtab
aab0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
aac0: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
aad0: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
aae0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
aaf0: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
ab00: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
ab10: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
ab20: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
ab30: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
ab40: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
ab50: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
ab60: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
ab70: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
ab80: 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69  nt nOrderBy;.  i
ab90: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  nt rc;..  /* If 
aba0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
abb0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
abc0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
abd0: 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c  eviously.  ** al
abe0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74  located and init
abf0: 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69 73  ialized for this
ac00: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
ac10: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20 20  then allocate.  
ac20: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
ac30: 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20  e it now.  */.  
ac40: 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64  pIdxInfo = *ppId
ac50: 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64  xInfo;.  if( pId
ac60: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
ac70: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
ac80: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  ;.    int nTerm;
ac90: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
aca0: 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e  ("Recomputing in
acb0: 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e  dex info for %s.
acc0: 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ..\n", pTab->zNa
acd0: 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  me));..    /* Co
ace0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
acf0: 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52 45  f possible WHERE
ad00: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
ad10: 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20 20  nts referring.  
ad20: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69 72    ** to this vir
ad30: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
ad40: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
ad50: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
ad60: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
ad70: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
ad80: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
ad90: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
ada0: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
adb0: 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
adc0: 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  t( (pTerm->eOper
add0: 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70  ator&(pTerm->eOp
ade0: 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b  erator-1))==0 );
adf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ae00: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
ae10: 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
ae20: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
ae30: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
ae40: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
ae50: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
ae60: 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57  rator & (WO_IN|W
ae70: 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74  O_ISNULL) ) cont
ae80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72  inue;.      nTer
ae90: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
aea0: 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
aeb0: 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
aec0: 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
aed0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
aee0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
aef0: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
af00: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
af10: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
af20: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c  f.    ** the sql
af30: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
af40: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
af50: 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  /.    nOrderBy =
af60: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
af70: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
af80: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
af90: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
afa0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
afb0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
afc0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
afd0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
afe0: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
aff0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
b000: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
b010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b020: 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
b030: 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
b040: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
b050: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
b060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b070: 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
b080: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
b090: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
b0a0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  e.    */.    pId
b0b0: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
b0c0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
b0d0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
b0e0: 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66         + (sizeof
b110: 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69  (*pIdxCons) + si
b120: 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e  zeof(*pUsage))*n
b130: 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20  Term.           
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
b160: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
b170: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  y );.    if( pId
b180: 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
b190: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b1a0: 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f  g(pParse, "out o
b1b0: 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20  f memory");.    
b1c0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
b1d0: 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e    }.    *ppIdxIn
b1e0: 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a  fo = pIdxInfo;..
b1f0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
b200: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
b210: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
b220: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
b230: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  re contains.    
b240: 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
b250: 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
b260: 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
b270: 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
b280: 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67  rom.    ** chang
b290: 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
b2a0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
b2b0: 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
b2c0: 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69  rder to.    ** i
b2d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20  nitialize those 
b2e0: 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  fields..    */. 
b2f0: 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73     pIdxCons = (s
b300: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
b310: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29  dex_constraint*)
b320: 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pIdxInfo[1];.  
b330: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
b340: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
b350: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
b360: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
b370: 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73  .    pUsage = (s
b380: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
b390: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
b3a0: 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72  sage*)&pIdxOrder
b3b0: 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20  By[nOrderBy];.  
b3c0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
b3d0: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
b3e0: 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69  = nTerm;.    *(i
b3f0: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
b400: 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
b410: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
b420: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
b430: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
b440: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
b450: 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
b460: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
b470: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
b480: 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  y**)&pIdxInfo->a
b490: 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72  OrderBy = pIdxOr
b4a0: 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72  derBy;.    *(str
b4b0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
b4c0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
b4d0: 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
b4e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
b4f0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a          pUsage;.
b540: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  .    for(i=j=0, 
b550: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
b560: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
b570: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
b580: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
b590: 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
b5a0: 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
b5b0: 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
b5c0: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
b5d0: 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65  tor&(pTerm->eOpe
b5e0: 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a  rator-1))==0 );.
b5f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b600: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
b610: 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20  ==WO_IN );.     
b620: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
b630: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
b640: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
b650: 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
b660: 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
b670: 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69  _ISNULL) ) conti
b680: 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 64 78 43  nue;.      pIdxC
b690: 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
b6a0: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75   pTerm->leftColu
b6b0: 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f  mn;.      pIdxCo
b6c0: 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
b6d0: 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64  t = i;.      pId
b6e0: 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54  xCons[j].op = pT
b6f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a  erm->eOperator;.
b700: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72        /* The dir
b710: 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
b720: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
b730: 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
b740: 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
b750: 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e     ** the WO_ an
b760: 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  d SQLITE_INDEX_C
b770: 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73  ONSTRAINT_ codes
b780: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
b790: 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f   The.      ** fo
b7a0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
b7b0: 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
b7c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
b7d0: 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45  t( WO_EQ==SQLITE
b7e0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
b7f0: 54 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73  T_EQ );.      as
b800: 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c  sert( WO_LT==SQL
b810: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
b820: 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20  AINT_LT );.     
b830: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
b840: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
b850: 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
b860: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
b870: 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
b880: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b  CONSTRAINT_GT );
b890: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
b8a0: 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
b8b0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
b8c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b8d0: 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
b8e0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b8f0: 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
b900: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
b910: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
b920: 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_EQ|WO_LT|WO_LE
b930: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
b940: 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20  MATCH) );.      
b950: 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  j++;.    }.    f
b960: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
b970: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
b980: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
b990: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
b9a0: 70 72 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72  pr;.      pIdxOr
b9b0: 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e  derBy[i].iColumn
b9c0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
b9d0: 6e 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64  n;.      pIdxOrd
b9e0: 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70  erBy[i].desc = p
b9f0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
ba00: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
ba10: 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
ba20: 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69   point, the sqli
ba30: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
ba40: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70 49  tructure that pI
ba50: 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20  dxInfo points.  
ba60: 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20  ** to will have 
ba70: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
ba80: 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67 20  , either during 
ba90: 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
baa0: 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64  cation or.  ** d
bab0: 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72  uring some prior
bac0: 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f   invocation.  No
bad0: 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 74  w we just have t
bae0: 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a  o customize the.
baf0: 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20    ** details of 
bb00: 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65  pIdxInfo for the
bb10: 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
bb20: 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20  ion and pass it 
bb30: 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64  to.  ** xBestInd
bb40: 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ex..  */..  /* T
bb50: 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d  he module name m
bb60: 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 20  ust be defined. 
bb70: 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70 6f  Also, by this po
bb80: 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a 20  int there must. 
bb90: 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65 72   ** be a pointer
bba0: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
bbb0: 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 4f  tab structure. O
bbc0: 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73 71  therwise.  ** sq
bbd0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
bbe0: 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64 20  mnNames() would 
bbf0: 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20 74  have picked up t
bc00: 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a  he error. .  */.
bc10: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
bc20: 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70  azModuleArg && p
bc30: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
bc40: 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [0] );.  assert(
bc50: 20 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a   pVtab );.#if 0.
bc60: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61    if( pTab->pVta
bc70: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
bc80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bc90: 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d  se, "undefined m
bca0: 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62  odule %s for tab
bcb0: 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  le %s",.        
bcc0: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
bcd0: 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  g[0], pTab->zNam
bce0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
bcf0: 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  .0;.  }.#endif..
bd00: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
bd10: 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
bd20: 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
bd30: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
bd40: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
bd50: 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
bd60: 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
bd70: 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
bd80: 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
bd90: 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
bda0: 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
bdb0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
bdc0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
bdd0: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
bde0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
bdf0: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
be00: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
be10: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
be20: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
be30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
be40: 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
be50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
be60: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
be70: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
be80: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
be90: 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
bea0: 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
beb0: 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
bec0: 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
bed0: 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
bee0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
bef0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
bf00: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
bf10: 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
bf20: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
bf30: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
bf40: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
bf50: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
bf60: 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
bf70: 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
bf80: 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
bf90: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
bfa0: 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
bfb0: 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
bfc0: 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
bfd0: 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
bfe0: 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
bff0: 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
c000: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
c010: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
c020: 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
c030: 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
c040: 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
c050: 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
c060: 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
c070: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
c080: 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
c090: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
c0a0: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
c0b0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
c0c0: 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
c0d0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
c0e0: 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
c0f0: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
c100: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
c110: 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
c120: 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
c130: 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
c140: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
c150: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
c160: 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d  usable =  (pTerm
c170: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
c180: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20  notReady)==0;.  
c190: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  }.  memset(pUsag
c1a0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
c1b0: 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
c1c0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
c1d0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
c1e0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
c1f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c200: 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
c210: 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49  dxStr);.  }.  pI
c220: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
c230: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
c240: 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
c250: 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
c260: 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
c270: 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
c280: 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
c290: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
c2a0: 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
c2b0: 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b  E_BIG_DBL / 2.0;
c2c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
c2d0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
c2e0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
c2f0: 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f  ->nOrderBy && !o
c300: 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a  rderByUsable ){.
c310: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
c320: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
c330: 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69 64   0;.  }..  (void
c340: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
c350: 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  f(pParse->db);. 
c360: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
c370: 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
c380: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
c390: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
c3a0: 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b  NPUTS(pIdxInfo);
c3b0: 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70  .  rc = pVtab->p
c3c0: 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64  Module->xBestInd
c3d0: 65 78 28 70 56 74 61 62 2c 20 70 49 64 78 49 6e  ex(pVtab, pIdxIn
c3e0: 66 6f 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  fo);.  TRACE_IDX
c3f0: 5f 4f 55 54 50 55 54 53 28 70 49 64 78 49 6e 66  _OUTPUTS(pIdxInf
c400: 6f 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  o);.  (void)sqli
c410: 74 65 33 53 61 66 65 74 79 4f 6e 28 70 50 61 72  te3SafetyOn(pPar
c420: 73 65 2d 3e 64 62 29 3b 0a 0a 20 20 69 66 28 20  se->db);..  if( 
c430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c440: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c450: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
c460: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
c470: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
c480: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
c490: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
c4a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c4b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c4c0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
c4d0: 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65  Str(rc));.    }e
c4e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c4f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c500: 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e  e, "%s", pVtab->
c510: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a  zErrMsg);.    }.
c520: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
c530: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
c540: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
c550: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
c560: 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  g = 0;..  for(i=
c570: 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
c580: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
c590: 7b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 49  {.    if( !pIdxI
c5a0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
c5b0: 5b 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55  [i].usable && pU
c5c0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
c5d0: 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  x>0 ){.      sql
c5e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c5f0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
c600: 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74  "table %s: xBest
c610: 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20 61  Index returned a
c620: 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c  n invalid plan",
c630: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
c640: 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b       return 0.0;
c650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 28  .    }.  }..  *(
c660: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
c670: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
c680: 72 42 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  rBy;.  return pI
c690: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
c6a0: 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64 69 66 20  dCost;.}.#endif 
c6b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
c6c0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
c6d0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 62  /*.** Find the b
c6e0: 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 63  est index for ac
c6f0: 63 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63  cessing a partic
c700: 75 6c 61 72 20 74 61 62 6c 65 2e 20 20 52 65 74  ular table.  Ret
c710: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
c720: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2c 20 66   to the index, f
c730: 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
c740: 62 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65 78  be how the index
c750: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2c   should be used,
c760: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
c770: 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
c780: 72 61 69 6e 74 73 2c 20 61 6e 64 20 74 68 65 20  raints, and the 
c790: 22 63 6f 73 74 22 20 66 6f 72 20 74 68 69 73 20  "cost" for this 
c7a0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
c7b0: 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 69 6e 64   lowest cost ind
c7c0: 65 78 20 77 69 6e 73 2e 20 20 54 68 65 20 63 6f  ex wins.  The co
c7d0: 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  st is an estimat
c7e0: 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e 74 20  e of the amount 
c7f0: 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20 64 69  of.** CPU and di
c800: 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f 20 70  sk I/O need to p
c810: 72 6f 63 65 73 73 20 74 68 65 20 72 65 71 75 65  rocess the reque
c820: 73 74 20 75 73 69 6e 67 20 74 68 65 20 73 65 6c  st using the sel
c830: 65 63 74 65 64 20 69 6e 64 65 78 2e 0a 2a 2a 20  ected index..** 
c840: 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e 66  Factors that inf
c850: 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63 6c  luence cost incl
c860: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ude:.**.**    * 
c870: 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   The estimated n
c880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
c890: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  at will be retri
c8a0: 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20 20  eved.  (The.**  
c8b0: 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20 62       fewer the b
c8c0: 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20  etter.).**.**   
c8d0: 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
c8e0: 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74 20  ot sorting must 
c8f0: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  occur..**.**    
c900: 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  *  Whether or no
c910: 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  t there must be 
c920: 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70 73  separate lookups
c930: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
c940: 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74 68   index and in th
c950: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
c960: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61 73  .** If there was
c970: 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
c980: 6c 61 75 73 65 20 61 74 74 61 63 68 65 64 20 74  lause attached t
c990: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
c9a0: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61  he SELECT.** sta
c9b0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69  tement, then thi
c9c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
c9d0: 63 6f 6e 73 69 64 65 72 73 20 73 74 72 61 74 65  considers strate
c9e0: 67 69 65 73 20 75 73 69 6e 67 20 74 68 65 20 0a  gies using the .
c9f0: 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ** named index. 
ca00: 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 65  If one cannot be
ca10: 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
ca20: 20 72 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69   returned cost i
ca30: 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f  s.** SQLITE_BIG_
ca40: 44 42 4c 2e 20 49 66 20 61 20 73 74 72 61 74 65  DBL. If a strate
ca50: 67 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gy can be found 
ca60: 74 68 61 74 20 75 73 65 73 20 74 68 65 20 6e 61  that uses the na
ca70: 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a 20 74  med index, .** t
ca80: 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
ca90: 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20 74 68  calculated in th
caa0: 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a  e usual way..**.
cab0: 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e 44 45  ** If a NOT INDE
cac0: 58 45 44 20 63 6c 61 75 73 65 20 77 61 73 20 61  XED clause was a
cad0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
cae0: 61 62 6c 65 20 69 6e 20 74 68 65 20 53 45 4c 45  able in the SELE
caf0: 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  CT .** statement
cb00: 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78 65  , then no indexe
cb10: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
cb20: 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 73  . However, the s
cb30: 65 6c 65 63 74 65 64 20 0a 2a 2a 20 73 74 61 74  elected .** stat
cb40: 65 67 79 20 6d 61 79 20 73 74 69 6c 6c 20 74 61  egy may still ta
cb50: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
cb60: 74 68 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74  the tables built
cb70: 2d 69 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64  -in rowid.** ind
cb80: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  ex..*/.static do
cb90: 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28 0a  uble bestIndex(.
cba0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbc0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
cbd0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
cbe0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
cbf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
cc00: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
cc10: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
cc20: 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
cc30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
cc40: 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
cc50: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
cc60: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
cc70: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
cc80: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
cc90: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
cca0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
ccb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
ccc0: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
ccd0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70 49  */.  Index **ppI
cce0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
ccf0: 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65   /* Make *ppInde
cd00: 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62  x point to the b
cd10: 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  est index */.  i
cd20: 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20  nt *pFlags,     
cd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
cd40: 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62 69  t flags describi
cd50: 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20 69  ng this choice i
cd60: 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20 69  n *pFlags */.  i
cd70: 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20 20  nt *pnEq        
cd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
cd90: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
cda0: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
cdb0: 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ints here */.){.
cdc0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
cdd0: 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65 73  rm;.  Index *bes
cde0: 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  tIdx = 0;       
cdf0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
ce00: 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73 74  gives the lowest
ce10: 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62 6c   cost */.  doubl
ce20: 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20  e lowestCost;   
ce30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
ce40: 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73 74  st of using best
ce50: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73  Idx */.  int bes
ce60: 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  tFlags = 0;     
ce70: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
ce80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62 65  sociated with be
ce90: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
cea0: 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20  estNEq = 0;     
ceb0: 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 76         /* Best v
cec0: 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f 0a  alue for nEq */.
ced0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
cee0: 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
cef0: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
cf00: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
cf10: 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64  ccessed */.  Ind
cf20: 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
cf30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
cf40: 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
cf50: 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  uating */.  int 
cf60: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
cf70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
cf80: 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
cf90: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  se order */.  in
cfa0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
cfb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
cfc0: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
cfd0: 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69  th pProbe */.  i
cfe0: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
cff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d000: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
d010: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
d020: 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
d030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d040: 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   Mask of valid e
d050: 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
d060: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
d070: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
d080: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
d090: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20  ing pProbe */.. 
d0a0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65   WHERETRACE(("be
d0b0: 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20  stIndex: tbl=%s 
d0c0: 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c 6e 22  notReady=%llx\n"
d0d0: 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
d0e0: 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b  ame, notReady));
d0f0: 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20  .  lowestCost = 
d100: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
d110: 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
d120: 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
d130: 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e   if( pSrc->notIn
d140: 64 65 78 65 64 20 29 7b 0a 20 20 20 20 70 50 72  dexed ){.    pPr
d150: 6f 62 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  obe = 0;.  }..  
d160: 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
d170: 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20 61  has no indices a
d180: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
d190: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65  terms in the whe
d1a0: 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74  re.  ** clause t
d1b0: 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
d1c0: 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65 20   ROWID, then we 
d1d0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 62  will never be ab
d1e0: 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e  le to do.  ** an
d1f0: 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
d200: 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  n a full table s
d210: 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  can on this tabl
d220: 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 0a  e.  We might as.
d230: 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69 74    ** well put it
d240: 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a 6f   first in the jo
d250: 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74 20  in order.  That 
d260: 77 61 79 2c 20 70 65 72 68 61 70 73 20 69 74 20  way, perhaps it 
d270: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66 65  can be.  ** refe
d280: 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72 20  renced by other 
d290: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f  tables in the jo
d2a0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
d2b0: 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20 20  Probe==0 &&.    
d2c0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d2d0: 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
d2e0: 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f  Q|WO_IN|WO_LT|WO
d2f0: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  _LE|WO_GT|WO_GE,
d300: 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28 70  0)==0 &&.     (p
d310: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21 73  OrderBy==0 || !s
d320: 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69  ortableByRowid(i
d330: 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  Cur, pOrderBy, p
d340: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26 72  WC->pMaskSet, &r
d350: 65 76 29 29 20 29 7b 0a 20 20 20 20 2a 70 46 6c  ev)) ){.    *pFl
d360: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70  ags = 0;.    *pp
d370: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 2a  Index = 0;.    *
d380: 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 72 65  pnEq = 0;.    re
d390: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20  turn 0.0;.  }.. 
d3a0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
d3b0: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
d3c0: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  wid IN (...) con
d3d0: 73 74 72 61 69 6e 74 73 2e 20 49 66 20 74 68 65  straints. If the
d3e0: 72 65 20 77 61 73 0a 20 20 2a 2a 20 61 6e 20 49  re was.  ** an I
d3f0: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
d400: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
d410: 73 20 74 61 62 6c 65 2c 20 73 6b 69 70 20 74 68  s table, skip th
d420: 69 73 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  is step..  */.  
d430: 69 66 28 20 21 70 53 72 63 2d 3e 70 49 6e 64 65  if( !pSrc->pInde
d440: 78 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 20 3d  x ){.    pTerm =
d450: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d460: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
d470: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
d480: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  0);.    if( pTer
d490: 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  m ){.      Expr 
d4a0: 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 2a 70  *pExpr;.      *p
d4b0: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
d4c0: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48    bestFlags = WH
d4d0: 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20  ERE_ROWID_EQ;.  
d4e0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
d4f0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
d500: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
d510: 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77 61 79 73  owid== is always
d520: 20 74 68 65 20 62 65 73 74 20 70 69 63 6b 2e 20   the best pick. 
d530: 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72   Look no further
d540: 2e 20 20 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a  .  Because only.
d550: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e          ** a sin
d560: 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65 72  gle row is gener
d570: 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73 20  ated, output is 
d580: 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65 64  always in sorted
d590: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
d5a0: 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52    *pFlags = WHER
d5b0: 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45  E_ROWID_EQ | WHE
d5c0: 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  RE_UNIQUE;.     
d5d0: 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20     *pnEq = 1;.  
d5e0: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
d5f0: 28 28 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72  (("... best is r
d600: 6f 77 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20  owid\n"));.     
d610: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
d620: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
d630: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
d640: 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20  Expr)->pList!=0 
d650: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  ){.        /* Ro
d660: 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63  wid IN (LIST): c
d670: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
d680: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
d690: 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20  er of list.     
d6a0: 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20     ** elements. 
d6b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 6f 77 65   */.        lowe
d6c0: 73 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e  stCost = pExpr->
d6d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
d6e0: 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74        lowestCost
d6f0: 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73   *= estLog(lowes
d700: 74 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  tCost);.      }e
d710: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
d720: 52 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54  Rowid IN (SELECT
d730: 29 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e  ): cost is NlogN
d740: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
d750: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20  number of rows. 
d760: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
d770: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 69   result of the i
d780: 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20 57 65  nner select.  We
d790: 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
d7a0: 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20 20 20  estimate.       
d7b0: 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20 73   ** that value s
d7c0: 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67 75  o make a wild gu
d7d0: 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ess. */.        
d7e0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30  lowestCost = 200
d7f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d800: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
d810: 20 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20   rowid IN cost: 
d820: 25 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43  %.9g\n", lowestC
d830: 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  ost));.    }.  .
d840: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20      /* Estimate 
d850: 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74 61  the cost of a ta
d860: 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77 65  ble scan.  If we
d870: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
d880: 20 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 65 6e 74   many.    ** ent
d890: 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ries are in the 
d8a0: 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c  table, use 1 mil
d8b0: 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e  lion as a guess.
d8c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73 74  .    */.    cost
d8d0: 20 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f   = pProbe ? pPro
d8e0: 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  be->aiRowEst[0] 
d8f0: 3a 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20 57  : 1000000;.    W
d900: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
d910: 74 61 62 6c 65 20 73 63 61 6e 20 62 61 73 65 20  table scan base 
d920: 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63  cost: %.9g\n", c
d930: 6f 73 74 29 29 3b 0a 20 20 20 20 66 6c 61 67 73  ost));.    flags
d940: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   = WHERE_ROWID_R
d950: 41 4e 47 45 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ANGE;.  .    /* 
d960: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72  Check for constr
d970: 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65  aints on a range
d980: 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20   of rowids in a 
d990: 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 20 20  table scan..    
d9a0: 2a 2f 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  */.    pTerm = f
d9b0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
d9c0: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
d9d0: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
d9e0: 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
d9f0: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
da00: 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72       if( findTer
da10: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
da20: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
da30: 7c 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20  |WO_LE, 0) ){.  
da40: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
da50: 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
da60: 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20          cost /= 
da70: 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68 61  3;  /* Guess tha
da80: 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65 6c 69  t rowid<EXPR eli
da90: 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69 72  minates two-thir
daa0: 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a 20 20  ds or rows */.  
dab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dac0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
dad0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
dae0: 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30  , WO_GT|WO_GE, 0
daf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  ) ){.        fla
db00: 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f  gs |= WHERE_BTM_
db10: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 63  LIMIT;.        c
db20: 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75  ost /= 3;  /* Gu
db30: 65 73 73 20 74 68 61 74 20 72 6f 77 69 64 3e 45  ess that rowid>E
db40: 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74  XPR eliminates t
db50: 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72 6f 77  wo-thirds of row
db60: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
db70: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
db80: 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20  ... rowid range 
db90: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
dba0: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
dbb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dbc0: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20    flags = 0;.   
dbd0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
dbe0: 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64  the table scan d
dbf0: 6f 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20  oes not satisfy 
dc00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
dc10: 75 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20  use, increase.  
dc20: 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20 62 79    ** the cost by
dc30: 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20   NlogN to cover 
dc40: 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66 20 73  the expense of s
dc50: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  orting. */.    i
dc60: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
dc70: 20 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c       if( sortabl
dc80: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
dc90: 4f 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d  OrderBy, pWC->pM
dca0: 61 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b  askSet, &rev) ){
dcb0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
dcc0: 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c  = WHERE_ORDERBY|
dcd0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
dce0: 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  E;.        if( r
dcf0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
dd00: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  flags |= WHERE_R
dd10: 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
dd20: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
dd30: 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63         cost += c
dd40: 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
dd50: 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
dd60: 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
dd70: 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  ng increases cos
dd80: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
dd90: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
dda0: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 73 74    }.    if( cost
ddb0: 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20  <lowestCost ){. 
ddc0: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
ddd0: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 62 65  = cost;.      be
dde0: 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  stFlags = flags;
ddf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
de00: 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
de10: 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
de20: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
de30: 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
de40: 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
de50: 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
de60: 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
de70: 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
de80: 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
de90: 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
dea0: 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
deb0: 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
dec0: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
ded0: 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
dee0: 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
def0: 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
df00: 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
df10: 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
df20: 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
df30: 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
df40: 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
df50: 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
df60: 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20  = WO_EQ|WO_IN;. 
df70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65   }else{.    eqTe
df80: 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
df90: 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
dfa0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61    }..  /* Look a
dfb0: 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20  t each index..  
dfc0: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  */.  if( pSrc->p
dfd0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 70 50 72  Index ){.    pPr
dfe0: 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64  obe = pSrc->pInd
dff0: 65 78 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 20  ex;.  }.  for(; 
e000: 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 28  pProbe; pProbe=(
e010: 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 3f 20 30  pSrc->pIndex ? 0
e020: 20 3a 20 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74   : pProbe->pNext
e030: 29 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20  )){.    int i;  
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e060: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62  nter */.    doub
e070: 6c 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20  le inMultiplier 
e080: 3d 20 31 3b 0a 0a 20 20 20 20 57 48 45 52 45 54  = 1;..    WHERET
e090: 52 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78  RACE(("... index
e0a0: 20 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d   %s:\n", pProbe-
e0b0: 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f  >zName));..    /
e0c0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
e0d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
e0e0: 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
e0f0: 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 20 20  are satisfied.  
e100: 20 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63    ** by x=EXPR c
e110: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20  onstraints or x 
e120: 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61  IN (...) constra
e130: 69 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ints..    */.   
e140: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20   flags = 0;.    
e150: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62  for(i=0; i<pProb
e160: 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  e->nColumn; i++)
e170: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  {.      int j = 
e180: 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
e190: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  [i];.      pTerm
e1a0: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
e1b0: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
e1c0: 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
e1d0: 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69  pProbe);.      i
e1e0: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
e1f0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  eak;.      flags
e200: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
e210: 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _EQ;.      if( p
e220: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e230: 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
e240: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
e250: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
e260: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
e270: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
e280: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
e290: 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  pr->pSelect!=0 )
e2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75  {.          inMu
e2b0: 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a  ltiplier *= 25;.
e2c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e2d0: 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e  ( ALWAYS(pExpr->
e2e0: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
e2f0: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
e300: 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   *= pExpr->pList
e310: 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20 20  ->nExpr + 1;.   
e320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e330: 20 20 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d 20     }.    cost = 
e340: 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
e350: 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c 69  [i] * inMultipli
e360: 65 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d 75  er * estLog(inMu
e370: 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20 20 6e  ltiplier);.    n
e380: 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28 20  Eq = i;.    if( 
e390: 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21  pProbe->onError!
e3a0: 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c 61  =OE_None && (fla
e3b0: 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
e3c0: 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  N_IN)==0.       
e3d0: 20 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62 65    && nEq==pProbe
e3e0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
e3f0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
e400: 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  E_UNIQUE;.    }.
e410: 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28      WHERETRACE((
e420: 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69  "...... nEq=%d i
e430: 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d  nMult=%.9g cost=
e440: 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e 4d 75  %.9g\n",nEq,inMu
e450: 6c 74 69 70 6c 69 65 72 2c 63 6f 73 74 29 29 3b  ltiplier,cost));
e460: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  ..    /* Look fo
e470: 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  r range constrai
e480: 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nts.    */.    i
e490: 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  f( nEq<pProbe->n
e4a0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
e4b0: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
e4c0: 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20  aiColumn[nEq];. 
e4d0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
e4e0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
e4f0: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
e500: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
e510: 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b 0a  WO_GE, pProbe);.
e520: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 20        if( pTerm 
e530: 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  ){.        flags
e540: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
e550: 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20 20  _RANGE;.        
e560: 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43  if( findTerm(pWC
e570: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
e580: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
e590: 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20  , pProbe) ){.   
e5a0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
e5b0: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b  WHERE_TOP_LIMIT;
e5c0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20  .          cost 
e5d0: 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a  /= 3;.        }.
e5e0: 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64          if( find
e5f0: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
e600: 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
e610: 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65  GT|WO_GE, pProbe
e620: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
e630: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
e640: 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
e650: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20     cost /= 3;.  
e660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e670: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
e680: 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65  ... range reduce
e690: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
e6a0: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
e6b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e6c0: 20 41 64 64 20 74 68 65 20 61 64 64 69 74 69 6f   Add the additio
e6d0: 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  nal cost of sort
e6e0: 69 6e 67 20 69 66 20 74 68 61 74 20 69 73 20 61  ing if that is a
e6f0: 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a   factor..    */.
e700: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
e710: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
e720: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
e730: 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20  UMN_IN)==0 &&.  
e740: 20 20 20 20 20 20 20 20 20 69 73 53 6f 72 74 69           isSorti
e750: 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70  ngIndex(pParse,p
e760: 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72  WC->pMaskSet,pPr
e770: 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42  obe,iCur,pOrderB
e780: 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20  y,nEq,&rev) ){. 
e790: 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73         if( flags
e7a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e7b0: 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43   flags = WHERE_C
e7c0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20  OLUMN_RANGE;.   
e7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
e7e0: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52  lags |= WHERE_OR
e7f0: 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69  DERBY;.        i
e800: 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20  f( rev ){.      
e810: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
e820: 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  RE_REVERSE;.    
e830: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e840: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20  e{.        cost 
e850: 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63  += cost*estLog(c
e860: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 57 48  ost);.        WH
e870: 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e  ERETRACE((".....
e880: 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65 61  . orderby increa
e890: 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
e8a0: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
e8b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e8c0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
e8d0: 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61 77  if we can get aw
e8e0: 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a 75  ay with using ju
e8f0: 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  st the index wit
e900: 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65 72  hout.    ** ever
e910: 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61 62   reading the tab
e920: 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  le.  If that is 
e930: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 68  the case, then h
e940: 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  alve the.    ** 
e950: 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e 64  cost of this ind
e960: 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ex..    */.    i
e970: 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72 63  f( flags && pSrc
e980: 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28 42  ->colUsed < (((B
e990: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d  itmask)1)<<(BMS-
e9a0: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69 74  1)) ){.      Bit
e9b0: 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63  mask m = pSrc->c
e9c0: 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e  olUsed;.      in
e9d0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
e9e0: 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43  =0; j<pProbe->nC
e9f0: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
ea00: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 72       int x = pPr
ea10: 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  obe->aiColumn[j]
ea20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
ea30: 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
ea40: 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
ea50: 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
ea60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ea70: 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
ea80: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
ea90: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
eaa0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  .        cost /=
eab0: 20 32 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52   2;.        WHER
eac0: 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20  ETRACE(("...... 
ead0: 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65 73  idx-only reduces
eae0: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
eaf0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
eb00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
eb10: 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68 61  If this index ha
eb20: 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20 6c  s achieved the l
eb30: 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66 61  owest cost so fa
eb40: 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e 0a  r, then use it..
eb50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
eb60: 6c 61 67 73 20 26 26 20 63 6f 73 74 20 3c 20 6c  lags && cost < l
eb70: 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20  owestCost ){.   
eb80: 20 20 20 62 65 73 74 49 64 78 20 3d 20 70 50 72     bestIdx = pPr
eb90: 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73  obe;.      lowes
eba0: 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20  tCost = cost;.  
ebb0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
ebc0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65 73  flags;.      bes
ebd0: 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20  tNEq = nEq;.    
ebe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f  }.  }..  /* Repo
ebf0: 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73 75  rt the best resu
ec00: 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64  lt.  */.  *ppInd
ec10: 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20 20  ex = bestIdx;.  
ec20: 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65 73  WHERETRACE(("bes
ec30: 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63  t index is %s, c
ec40: 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d  ost=%.9g, flags=
ec50: 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  %x, nEq=%d\n",. 
ec60: 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3f         bestIdx ?
ec70: 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20   bestIdx->zName 
ec80: 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65  : "(none)", lowe
ec90: 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61 67  stCost, bestFlag
eca0: 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20 20  s, bestNEq));.  
ecb0: 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  *pFlags = bestFl
ecc0: 61 67 73 20 7c 20 65 71 54 65 72 6d 4d 61 73 6b  ags | eqTermMask
ecd0: 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73 74  ;.  *pnEq = best
ece0: 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c 6f  NEq;.  return lo
ecf0: 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a  westCost;.}.../*
ed00: 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65  .** Disable a te
ed10: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
ed20: 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c  clause.  Except,
ed30: 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20   do not disable 
ed40: 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69  the term.** if i
ed50: 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46  t controls a LEF
ed60: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64  T OUTER JOIN and
ed70: 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67   it did not orig
ed80: 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a  inate in the ON.
ed90: 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ** or USING clau
eda0: 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e  se of that join.
edb0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20  .**.** Consider 
edc0: 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f  the term t2.z='o
edd0: 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  k' in the follow
ede0: 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a  ing queries:.**.
edf0: 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54  **   (1)  SELECT
ee00: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
ee10: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
ee20: 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d  t2.x WHERE t2.z=
ee30: 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53  'ok'.**   (2)  S
ee40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
ee50: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
ee60: 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
ee70: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29  .z='ok'.**   (3)
ee80: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
ee90: 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e  t1, t2 WHERE t1.
eea0: 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d  a=t2.x AND t2.z=
eeb0: 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  'ok'.**.** The t
eec0: 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61  2.z='ok' is disa
eed0: 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28  bled in the in (
eee0: 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72  2) because it or
eef0: 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74  iginates.** in t
ef00: 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54  he ON clause.  T
ef10: 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62  he term is disab
ef20: 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75  led in (3) becau
ef30: 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72  se it is not par
ef40: 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f  t.** of a LEFT O
ef50: 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28  UTER JOIN.  In (
ef60: 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20  1), the term is 
ef70: 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a  not disabled..**
ef80: 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20  .** Disabling a 
ef90: 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74  term causes that
efa0: 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20   term to not be 
efb0: 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e  tested in the in
efc0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74  ner loop.** of t
efd0: 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c  he join.  Disabl
efe0: 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ing is an optimi
eff0: 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65  zation.  When te
f000: 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65  rms are satisfie
f010: 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c  d.** by indices,
f020: 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d   we disable them
f030: 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75   to prevent redu
f040: 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74  ndant tests in t
f050: 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70  he inner.** loop
f060: 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20  .  We would get 
f070: 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
f080: 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77  lts if nothing w
f090: 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65  ere ever disable
f0a0: 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20  d,.** but joins 
f0b0: 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
f0c0: 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20  le slower.  The 
f0d0: 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61  trick is to disa
f0e0: 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61  ble as much.** a
f0f0: 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74  s we can without
f100: 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d   disabling too m
f110: 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61  uch.  If we disa
f120: 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27  bled in (1), we'
f130: 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f  d get.** the wro
f140: 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20  ng answer.  See 
f150: 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
f160: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
f170: 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
f180: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72  el *pLevel, Wher
f190: 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20  eTerm *pTerm){. 
f1a0: 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20   if( pTerm.     
f1b0: 20 26 26 20 41 4c 57 41 59 53 28 28 70 54 65 72   && ALWAYS((pTer
f1c0: 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  m->flags & TERM_
f1d0: 43 4f 44 45 44 29 3d 3d 30 29 0a 20 20 20 20 20  CODED)==0).     
f1e0: 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65   && (pLevel->iLe
f1f0: 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70  ftJoin==0 || Exp
f200: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
f210: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
f220: 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20  omJoin)).  ){.  
f230: 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
f240: 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
f250: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
f260: 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
f270: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
f280: 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
f290: 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
f2a0: 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
f2b0: 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
f2c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f2d0: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
f2e0: 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
f2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
f300: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 74 68  ../*.** Apply th
f310: 65 20 61 66 66 69 6e 69 74 69 65 73 20 61 73 73  e affinities ass
f320: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
f330: 20 66 69 72 73 74 20 6e 20 63 6f 6c 75 6d 6e 73   first n columns
f340: 20 6f 66 20 69 6e 64 65 78 0a 2a 2a 20 70 49 64   of index.** pId
f350: 78 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20  x to the values 
f360: 69 6e 20 74 68 65 20 6e 20 72 65 67 69 73 74 65  in the n registe
f370: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  rs starting at b
f380: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
f390: 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
f3a0: 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
f3b0: 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
f3c0: 6e 74 20 6e 2c 20 49 6e 64 65 78 20 2a 70 49 64  nt n, Index *pId
f3d0: 78 29 7b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  x){.  if( n>0 ){
f3e0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
f3f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f400: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
f410: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f420: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66  eAddOp2(v, OP_Af
f430: 66 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29  finity, base, n)
f440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6e 64  ;.    sqlite3Ind
f450: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
f460: 20 70 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69   pIdx);.    sqli
f470: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
f480: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
f490: 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
f4a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
f4b0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
f4c0: 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
f4d0: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
f4e0: 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
f4f0: 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
f500: 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
f510: 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
f520: 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
f530: 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
f540: 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
f550: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
f560: 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
f570: 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
f580: 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
f590: 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
f5a0: 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
f5b0: 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
f5c0: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
f5d0: 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
f5e0: 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
f5f0: 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
f600: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
f610: 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
f620: 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
f630: 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
f640: 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
f650: 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
f660: 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
f670: 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
f680: 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
f690: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f6a0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
f6b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
f6c0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
f6d0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
f6e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
f6f0: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
f700: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
f710: 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76  vel, /* When lev
f720: 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
f730: 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
f740: 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
f750: 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
f760: 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
f770: 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
f780: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
f790: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
f7a0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
f7b0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
f7c0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
f7d0: 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
f7e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f7f0: 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
f800: 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
f810: 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
f820: 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
f830: 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  Q ){.    iReg = 
f840: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
f850: 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
f860: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
f870: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
f880: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
f890: 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
f8a0: 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
f8b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f8c0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
f8d0: 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
f8e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f8f0: 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
f900: 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
f910: 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
f920: 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
f930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
f940: 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
f950: 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
f960: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71  ;.    eType = sq
f970: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
f980: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b  (pParse, pX, 0);
f990: 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
f9a0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
f9b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f9c0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
f9d0: 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
f9e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 2e 2a 73 22  mment((v, "%.*s"
f9f0: 2c 20 70 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58  , pX->span.n, pX
fa00: 2d 3e 73 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20  ->span.z));.    
fa10: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 3d  if( pLevel->nIn=
fa20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
fa30: 65 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65  el->nxt = sqlite
fa40: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
fa50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65  );.    }.    pLe
fa60: 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  vel->nIn++;.    
fa70: 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20  pLevel->aInLoop 
fa80: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
fa90: 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d  ocOrFree(pParse-
faa0: 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  >db, pLevel->aIn
fab0: 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
fae0: 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
faf0: 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e  [0])*pLevel->nIn
fb00: 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65  );.    pIn = pLe
fb10: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  vel->aInLoop;.  
fb20: 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
fb30: 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
fb40: 2d 3e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  ->nIn - 1;.     
fb50: 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
fb60: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
fb70: 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
fb80: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
fb90: 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20 73 71 6c  n->topAddr = sql
fba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fbb0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
fbc0: 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
fbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
fbe0: 6e 2d 3e 74 6f 70 41 64 64 72 20 3d 20 73 71 6c  n->topAddr = sql
fbf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fc00: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
fc10: 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20  b, 0, iReg);.   
fc20: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
fc30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
fc40: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29  OP_IsNull, iReg)
fc50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fc60: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
fc70: 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
fc80: 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
fc90: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
fca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
fcb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
fcc0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
fcd0: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
fce0: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
fcf0: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
fd00: 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75  index.  The valu
fd10: 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
fd20: 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20  raints are left 
fd30: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
fd40: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
fd50: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
fd60: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
fd70: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
fd80: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
fd90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
fda0: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
fdb0: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
fdc0: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
fdd0: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
fde0: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
fdf0: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
fe00: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
fe10: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
fe20: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
fe30: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
fe40: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
fe50: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
fe60: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
fe70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
fe80: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
fe90: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
fea0: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
feb0: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
fec0: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
fed0: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
fee0: 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  left.** on the s
fef0: 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20  tack - a is the 
ff00: 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68  deepest and b th
ff10: 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a  e shallowest..**
ff20: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
ff30: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
ff40: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
ff50: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
ff60: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
ff70: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
ff80: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
ff90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
ffa0: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
ffb0: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
ffc0: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
ffd0: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
ffe0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  Mem memory cell.
fff0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10000 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
10010 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
10020 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
10030 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64  d puts.** the ad
10040 64 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65  dress of that me
10050 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65  mory cell in pLe
10060 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20  vel->iMem.  The 
10070 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
10080 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
10090 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d  will use pLevel-
100a0 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74  >iMem to store t
100b0 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
100c0 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
100d0 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
100e0 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
100f0 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
10100 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
10110 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
10120 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
10130 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
10140 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
10150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
10160 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
10170 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
10180 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10190 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
101a0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
101b0 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68  *pLevel,   /* Wh
101c0 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  ich nested loop 
101d0 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61  of the FROM we a
101e0 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57  re coding */.  W
101f0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
10200 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
10210 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69  E clause */.  Bi
10220 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
10230 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72      /* Which par
10240 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20  ts of FROM have 
10250 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64  not yet been cod
10260 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
10270 72 61 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  raReg         /*
10280 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
10290 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
102a0 6c 6f 63 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  locate */.){.  i
102b0 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
102c0 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a 20  >nEq;        /* 
102d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
102e0 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
102f0 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
10300 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
10310 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
10320 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
10330 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
10340 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
10350 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65  ex *pIdx = pLeve
10360 6c 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68  l->pIdx;   /* Th
10370 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
10380 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
10390 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
103a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
103b0 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ;   /* The curso
103c0 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  r of the table *
103d0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
103e0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
103f0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f    /* A single co
10400 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f  nstraint term */
10410 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10440 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
10450 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10460 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
10470 73 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  ster */..  /* Fi
10480 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
10490 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
104a0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
104b0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
104c0 20 20 2a 2a 20 57 65 20 61 6c 77 61 79 73 20 6e    ** We always n
104d0 65 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  eed at least one
104e0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
104f0 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  he loop terminat
10500 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  or.  ** value.  
10510 49 66 20 74 68 65 72 65 20 61 72 65 20 49 4e 20  If there are IN 
10520 6f 70 65 72 61 74 6f 72 73 20 77 65 27 6c 6c 20  operators we'll 
10530 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20 65 61 63  need one for eac
10540 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20 49 4e 20  h == or.  ** IN 
10550 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
10560 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  .  pLevel->iMem 
10570 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
10580 20 31 3b 0a 20 20 72 65 67 42 61 73 65 20 3d 20   1;.  regBase = 
10590 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 32  pParse->nMem + 2
105a0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
105b0 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20   += pLevel->nEq 
105c0 2b 20 32 20 2b 20 6e 45 78 74 72 61 52 65 67 3b  + 2 + nExtraReg;
105d0 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
105e0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
105f0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
10600 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
10610 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
10620 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
10630 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
10640 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  ;.    int k = pI
10650 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
10660 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
10670 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
10680 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
10690 65 76 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64  evel->flags, pId
106a0 78 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  x);.    if( NEVE
106b0 52 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72  R(pTerm==0) ) br
106c0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
106d0 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26   (pTerm->flags &
106e0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20   TERM_CODED)==0 
106f0 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65  );.    r1 = code
10700 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
10710 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
10720 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a  el, regBase+j);.
10730 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67 42      if( r1!=regB
10740 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 73  ase+j ){.      s
10750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10760 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
10770 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
10780 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
10790 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
107a0 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
107b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
107c0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
107d0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
107e0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
107f0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
10800 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
10810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10820 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10830 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a  sNull, regBase+j
10840 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a  , pLevel->brk);.
10850 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10860 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23  rn regBase;.}..#
10870 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10880 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
10890 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
108a0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
108b0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
108c0 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
108d0 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
108e0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
108f0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
10900 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
10910 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
10920 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
10930 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
10940 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
10950 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
10960 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
10970 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
10980 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
10990 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
109a0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
109b0 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
109c0 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
109d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
109e0 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
109f0 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
10a00 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
10a10 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  ITE_TEST */.../*
10a20 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
10a30 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
10a40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10a50 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
10a60 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
10a70 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
10a80 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
10a90 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
10aa0 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
10ab0 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
10ac0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
10ad0 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  _info *pInfo = p
10ae0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78  WInfo->a[i].pIdx
10af0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
10b00 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  pInfo ){.       
10b10 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
10b20 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
10b30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
10b40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10b50 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d   pInfo);.      }
10b60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10b70 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
10b80 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  nfo);.  }.}.../*
10b90 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
10ba0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
10bb0 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
10bc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
10bd0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
10be0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
10bf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
10c00 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
10c10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
10c20 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
10c30 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
10c40 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
10c50 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
10c60 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
10c70 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
10c80 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
10c90 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10ca0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
10cb0 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
10cc0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
10cd0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
10ce0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
10cf0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10d00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
10d10 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
10d20 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
10d30 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
10d40 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
10d50 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
10d60 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
10d70 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
10d80 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
10d90 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
10da0 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
10db0 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
10dc0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
10dd0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
10de0 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
10df0 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
10e00 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
10e10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
10e20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
10e30 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
10e40 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
10e50 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
10e60 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
10e70 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
10e80 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
10e90 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
10ea0 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
10eb0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
10ec0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
10ed0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
10ee0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
10ef0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
10f00 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
10f10 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
10f20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
10f30 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
10f40 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
10f50 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
10f60 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
10f70 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
10fa0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
10fb0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
10fe0 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
10ff0 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
11000 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
11010 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
11020 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
11030 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
11040 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
11050 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
11060 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
11070 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
11080 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
11090 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
110a0 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
110b0 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
110c0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
110d0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
110e0 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
110f0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
11100 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
11110 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
11120 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
11130 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
11140 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
11150 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
11160 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
11170 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
11180 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
11190 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
111a0 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
111b0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
111c0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
111d0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
111e0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
111f0 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
11200 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
11210 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
11220 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
11230 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
11240 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
11250 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
11260 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
11270 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
11280 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
11290 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
112a0 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
112b0 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
112c0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
112d0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
112e0 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
112f0 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
11300 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
11310 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
11320 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
11330 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
11340 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
11350 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
11360 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
11370 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
11380 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
11390 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
113a0 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
113b0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
113c0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
113d0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
113e0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
113f0 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
11400 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
11410 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
11420 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
11430 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
11440 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
11450 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
11460 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
11470 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
11480 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
11490 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
114a0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
114b0 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
114c0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
114d0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
114e0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
114f0 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
11500 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
11510 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
11520 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
11530 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
11540 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
11550 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
11560 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
11570 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
11580 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
11590 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
115a0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
115b0 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
115c0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
115d0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
115e0 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
115f0 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
11600 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
11610 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
11620 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
11630 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
11640 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
11650 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
11660 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
11670 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
11680 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
11690 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
116a0 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
116b0 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
116c0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
116d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
116e0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
116f0 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
11700 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
11710 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
11720 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
11730 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
11740 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
11750 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
11760 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
11770 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
11780 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
11790 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
117a0 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
117b0 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
117c0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
117d0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
117e0 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
117f0 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
11800 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61   *ppOrderBy is a
11810 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
11820 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11830 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
11840 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65  ement,.** if the
11850 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
11860 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
11870 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
11880 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
11890 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
118a0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
118b0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
118c0 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73  hen ppOrderBy is
118d0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
118e0 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  an index can be 
118f0 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  used so that the
11900 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20   natural output 
11910 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62  order of the tab
11920 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f  le.** scan is co
11930 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52  rrect for the OR
11940 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
11950 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69  hen that index i
11960 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70  s used and.** *p
11970 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20  pOrderBy is set 
11980 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69  to NULL.  This i
11990 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
119a0 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20  n that prevents 
119b0 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72  an.** unnecessar
119c0 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65  y sort of the re
119d0 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69  sult set if an i
119e0 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65  ndex appropriate
119f0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45   for the.** ORDE
11a00 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65  R BY clause alre
11a10 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ady exists..**.*
11a20 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63  * If the where c
11a30 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e  lause loops cann
11a40 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74  ot be arranged t
11a50 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f  o provide the co
11a60 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20  rrect.** output 
11a70 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
11a80 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e  *ppOrderBy is un
11a90 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72  changed..*/.Wher
11aa0 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
11ab0 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
11ac0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11ad0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
11ae0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
11af0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
11b00 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
11b10 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
11b20 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
11b30 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
11b40 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11b50 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
11b60 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42  rList **ppOrderB
11b70 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42  y, /* An ORDER B
11b80 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
11b90 4c 20 2a 2f 0a 20 20 75 38 20 77 66 6c 61 67 73  L */.  u8 wflags
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11bb0 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
11bc0 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
11bd0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
11be0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11c10 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  er */.  WhereInf
11c20 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
11c30 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d     /* Will becom
11c40 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
11c50 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
11c60 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ion */.  Vdbe *v
11c70 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11c80 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
11c90 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  al database engi
11ca0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c  ne */.  int brk,
11cb0 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 20   cont = 0;      
11cc0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20     /* Addresses 
11cd0 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64 65  used during code
11ce0 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
11cf0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
11d00 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  y;          /* C
11d10 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
11d20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e  not yet position
11d30 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  ed */.  WhereTer
11d40 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
11d50 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
11d60 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
11d70 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
11d80 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65 74  rMaskSet maskSet
11d90 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  ;       /* The e
11da0 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
11db0 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  et */.  WhereCla
11dc0 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
11dd0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11de0 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64 65  clause is divide
11df0 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65 72  d into these ter
11e00 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ms */.  struct S
11e10 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
11e20 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e  bItem;  /* A sin
11e30 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70  gle entry from p
11e40 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
11e50 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e70 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
11e80 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73  n the pWInfo lis
11e90 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
11ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11eb0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
11ec0 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75  unused FROM clau
11ed0 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  se element */.  
11ee0 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20  int andFlags;   
11ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e             /* AN
11f00 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  D-ed combination
11f10 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66   of all wc.a[].f
11f20 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
11f30 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
11f40 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11f50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
11f60 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
11f70 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  rBy = 0;..  /* T
11f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
11f90 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
11fa0 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
11fb0 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
11fc0 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
11fd0 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
11fe0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
11ff0 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
12000 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12010 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
12020 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
12030 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
12040 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
12050 20 20 69 66 28 20 70 70 4f 72 64 65 72 42 79 20    if( ppOrderBy 
12060 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
12070 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20 20  = *ppOrderBy;.  
12080 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  }..  /* Split th
12090 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
120a0 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
120b0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
120c0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
120d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
120e0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
120f0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
12100 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d    initMaskSet(&m
12110 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65  askSet);.  where
12120 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c 20  ClauseInit(&wc, 
12130 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53 65 74  pParse, &maskSet
12140 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
12150 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50  CodeConstants(pP
12160 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  arse, pWhere);. 
12170 20 77 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c   whereSplit(&wc,
12180 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29   pWhere, TK_AND)
12190 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.    .  /* Allo
121a0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
121b0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
121c0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
121d0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
121e0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
121f0 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20  ue..  */.  db = 
12200 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
12210 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
12220 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 20  MallocZero(db,  
12230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12240 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68         sizeof(Wh
12250 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c  ereInfo) + pTabL
12260 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66  ist->nSrc*sizeof
12270 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
12280 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
12290 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
122a0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
122b0 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
122c0 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69  >nLevel = pTabLi
122d0 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e  st->nSrc;.  pWIn
122e0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
122f0 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
12300 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
12310 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42  st;.  pWInfo->iB
12320 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
12330 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12340 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
12350 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
12360 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
12370 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
12380 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
12390 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
123a0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
123b0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
123c0 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  thru..  */.  if(
123d0 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61 62   pWhere && (pTab
123e0 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c  List->nSrc==0 ||
123f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
12400 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57  nstantNotJoin(pW
12410 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73 71  here)) ){.    sq
12420 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
12430 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c  (pParse, pWhere,
12440 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
12450 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
12460 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  LL);.    pWhere 
12470 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
12480 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
12490 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
124a0 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
124b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
124c0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61 73   **.  ** When as
124d0 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b 20  signing bitmask 
124e0 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20 63  values to FROM c
124f0 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20 69  lause cursors, i
12500 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 74  t must be.  ** t
12510 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66 20  he case that if 
12520 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b  X is the bitmask
12530 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46 52   for the N-th FR
12540 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
12550 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69 74  hen.  ** the bit
12560 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52 4f  mask for all FRO
12570 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  M clause terms t
12580 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  o the left of th
12590 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a 2a  e N-th term.  **
125a0 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e 20   is (X-1).   An 
125b0 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
125c0 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
125d0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 6e   a LEFT JOIN can
125e0 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45 78   use.  ** its Ex
125f0 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
12600 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e 64  le value to find
12610 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66 20   the bitmask of 
12620 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
12630 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e    ** of the join
12640 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20 6f  .  Subtracting o
12650 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  ne from the righ
12660 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b 20  t table bitmask 
12670 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69 74  gives a.  ** bit
12680 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
12690 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
126a0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e  of the join.  Kn
126b0 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73  owing the bitmas
126c0 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 74  k.  ** for all t
126d0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
126e0 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  t of a left join
126f0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
12700 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
12710 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
12720 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
12730 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
12740 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
12750 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
12760 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
12770 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20  def NDEBUG.  {. 
12780 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65     Bitmask toThe
12790 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  Left = 0;.    fo
127a0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
127b0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
127c0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
127d0 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
127e0 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  t, pTabList->a[i
127f0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
12800 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d    assert( (m-1)=
12810 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20  =toTheLeft );.  
12820 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d      toTheLeft |=
12830 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   m;.    }.  }.#e
12840 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  ndif..  /* Analy
12850 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
12860 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
12870 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
12880 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
12890 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
128a0 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
128b0 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
128c0 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
128d0 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
128e0 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
128f0 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
12900 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
12910 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
12920 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
12930 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
12940 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
12950 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
12960 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  cessed..  */.  e
12970 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54  xprAnalyzeAll(pT
12980 61 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20 20  abList, &wc);.  
12990 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
129a0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
129b0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
129c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73  ;.  }..  /* Chos
129d0 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  e the best index
129e0 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68   to use for each
129f0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
12a00 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
12a10 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66    ** This loop f
12a20 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ills in the foll
12a30 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20  owing fields:.  
12a40 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  **.  **   pWInfo
12a50 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20  ->a[].pIdx      
12a60 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65  The index to use
12a70 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20   for this level 
12a80 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a  of the loop..  *
12a90 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
12aa0 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f  flags     WHERE_
12ab0 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69  xxx flags associ
12ac0 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20  ated with pIdx. 
12ad0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
12ae0 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20  ].nEq       The 
12af0 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64  number of == and
12b00 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   IN constraints.
12b10 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
12b20 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69  [].iFrom     Whi
12b30 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  ch term of the F
12b40 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
12b50 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
12b60 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
12b70 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
12b80 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
12b90 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
12ba0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12bb0 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
12bc0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
12bd0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
12be0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
12bf0 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
12c00 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
12c10 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
12c20 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
12c30 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
12c40 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
12c50 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
12c60 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
12c70 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
12c80 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
12c90 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
12ca0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
12cb0 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
12cc0 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c    for(i=iFrom=0,
12cd0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
12ce0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
12cf0 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
12d00 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
12d10 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
12d20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
12d30 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
12d40 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
12d50 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
12d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12d70 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64  lags asssociated
12d80 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
12d90 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12db0 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
12dc0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
12dd0 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  */.    double co
12de0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
12df0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66     /* The cost f
12e00 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  or pIdx */.    i
12e10 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
12e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
12e30 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
12e40 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
12e50 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
12e60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
12e70 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
12e80 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
12e90 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73     int bestFlags
12ea0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
12eb0 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
12ec0 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
12ed0 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71  .    int bestNEq
12ee0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12ef0 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74   /* nEq associat
12f00 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
12f10 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  .    double lowe
12f20 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
12f30 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20   /* Cost of the 
12f40 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
12f50 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20   bestJ = 0;     
12f60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12f70 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
12f80 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12fa0 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
12fb0 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
12fc0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
12fd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12fe0 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69   /* True when fi
12ff0 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65  rst table is see
13000 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  n */.    sqlite3
13010 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
13020 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  dex; /* Current 
13030 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f  virtual index */
13040 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74  ..    lowestCost
13050 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
13060 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72  L;.    for(j=iFr
13070 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54  om, pTabItem=&pT
13080 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
13090 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
130a0 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29  j++, pTabItem++)
130b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f  {.      int doNo
130c0 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72  tReorder;  /* Tr
130d0 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ue if this table
130e0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72   should not be r
130f0 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20  eordered */..   
13100 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
13110 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
13120 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
13130 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
13140 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
13150 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
13160 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
13170 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
13180 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
13190 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
131a0 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
131b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
131c0 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
131d0 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
131e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
131f0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
13200 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
13210 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13220 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13230 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
13240 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
13250 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
13260 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
13270 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
13280 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d   = &pWInfo->a[j]
13290 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
132a0 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69     cost = bestVi
132b0 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
132c0 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
132d0 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
13300 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
13310 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
13340 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  IdxInfo);.      
13350 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
13360 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
13370 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a        pIndex = *
13380 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  ppIdxInfo;.     
13390 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
133a0 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79   pIndex->orderBy
133b0 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
133c0 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
133d0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
133e0 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   | WHERE_ORDERBY
133f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13400 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
13410 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20        nEq = 0;. 
13420 20 20 20 20 20 20 20 69 66 28 20 28 53 51 4c 49         if( (SQLI
13430 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c  TE_BIG_DBL/2.0)<
13440 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  cost ){.        
13450 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73    /* The cost is
13460 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
13470 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53  be larger than S
13480 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74  QLITE_BIG_DBL (t
13490 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
134a0 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20  inital value of 
134b0 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68  lowestCost in th
134c0 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69  is loop. If it i
134d0 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  s, then.        
134e0 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c    ** the (cost<l
134f0 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20  owestCost) test 
13500 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72  below will never
13510 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20   be true and.   
13520 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c         ** pLevel
13530 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76 65 72  ->pBestIdx never
13540 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
13550 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  */ .          co
13560 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47  st = (SQLITE_BIG
13570 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20  _DBL/2.0);.     
13580 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
13590 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b   .#endif.      {
135a0 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20  .        cost = 
135b0 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
135c0 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c  , &wc, pTabItem,
135d0 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
13600 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
13610 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20  erBy : 0,.      
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73     &pIdx, &flags
13640 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  , &nEq);.       
13650 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
13660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
13670 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29  ost<lowestCost )
13680 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  {.        once =
13690 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65   1;.        lowe
136a0 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
136b0 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
136c0 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73  Idx;.        bes
136d0 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
136e0 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20          bestNEq 
136f0 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62  = nEq;.        b
13700 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
13710 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49    pLevel->pBestI
13720 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  dx = pIndex;.   
13730 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
13740 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
13750 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  eak;.    }.    W
13760 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
13770 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74  Optimizer select
13780 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  s table %d for l
13790 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a  oop %d\n", bestJ
137a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  ,.           pLe
137b0 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b  vel-pWInfo->a));
137c0 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c  .    if( (bestFl
137d0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
137e0 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
137f0 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
13800 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
13810 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73  ags &= bestFlags
13820 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c  ;.    pLevel->fl
13830 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
13840 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64  .    pLevel->pId
13850 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70  x = pBest;.    p
13860 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73  Level->nEq = bes
13870 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tNEq;.    pLevel
13880 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20  ->aInLoop = 0;. 
13890 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
138a0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
138b0 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  t ){.      pLeve
138c0 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
138d0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
138e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
138f0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
13900 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
13910 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
13920 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
13930 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
13940 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
13950 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65  evel->iFrom = be
13960 73 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  stJ;..    /* Che
13970 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74  ck that if the t
13980 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20  able scanned by 
13990 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74  this loop iterat
139a0 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a  ion had an.    *
139b0 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
139c0 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
139d0 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d  it, that the nam
139e0 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  ed index is bein
139f0 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f  g.    ** used fo
13a00 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e  r the scan. If n
13a10 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63  ot, then query c
13a20 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66  ompilation has f
13a30 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65  ailed..    ** Re
13a40 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
13a50 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d     */.    pIdx =
13a60 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
13a70 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  tJ].pIndex;.    
13a80 61 73 73 65 72 74 28 20 21 70 49 64 78 20 7c 7c  assert( !pIdx ||
13a90 20 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 3d   !pBest || pIdx=
13aa0 3d 70 42 65 73 74 20 29 3b 0a 20 20 20 20 69 66  =pBest );.    if
13ab0 28 20 70 49 64 78 20 26 26 20 70 42 65 73 74 21  ( pIdx && pBest!
13ac0 3d 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  =pIdx ){.      s
13ad0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13ae0 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75  Parse, "cannot u
13af0 73 65 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 70  se index: %s", p
13b00 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Idx->zName);.   
13b10 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
13b20 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  inError;.    }. 
13b30 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
13b40 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
13b50 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
13b60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13b70 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79  total query only
13b80 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c   selects a singl
13b90 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20  e row, then the 
13ba0 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c  ORDER BY.  ** cl
13bb0 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61  ause is irreleva
13bc0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  nt..  */.  if( (
13bd0 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45  andFlags & WHERE
13be0 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70  _UNIQUE)!=0 && p
13bf0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
13c00 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
13c10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13c20 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
13c30 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
13c40 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
13c50 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
13c60 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
13c70 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
13c80 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
13c90 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
13ca0 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
13cb0 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
13cc0 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
13cd0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
13ce0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20  raints.  ** the 
13cf0 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64  statement to upd
13d00 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ate a single row
13d10 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13d20 20 28 77 66 6c 61 67 73 20 26 20 57 48 45 52 45   (wflags & WHERE
13d30 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
13d40 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  )==0 || pWInfo->
13d50 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20 20 69  nLevel==1 );.  i
13d60 66 28 20 28 77 66 6c 61 67 73 20 26 20 57 48 45  f( (wflags & WHE
13d70 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
13d80 45 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c  ED)!=0 && (andFl
13d90 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51  ags & WHERE_UNIQ
13da0 55 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57  UE)!=0 ){.    pW
13db0 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20  Info->okOnePass 
13dc0 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 1;.    pWInfo-
13dd0 3e 61 5b 30 5d 2e 66 6c 61 67 73 20 26 3d 20 7e  >a[0].flags &= ~
13de0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
13df0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
13e00 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
13e10 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
13e20 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
13e30 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
13e40 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
13e50 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
13e60 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
13e70 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
13e80 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
13e90 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
13ea0 74 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  to */.  for(i=0,
13eb0 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
13ec0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
13ed0 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
13ee0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
13ef0 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62  pTab;     /* Tab
13f00 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
13f10 20 20 49 6e 64 65 78 20 2a 70 49 78 3b 20 20 20    Index *pIx;   
13f20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64     /* Index used
13f30 20 74 6f 20 61 63 63 65 73 73 20 70 54 61 62 20   to access pTab 
13f40 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20  (if any) */.    
13f50 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
13f60 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
13f70 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
13f80 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
13f90 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20      int iIdxCur 
13fa0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
13fb0 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r;..#ifndef SQLI
13fc0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
13fd0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
13fe0 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
13ff0 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a      char *zMsg;.
14000 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
14010 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
14020 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
14030 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
14040 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
14050 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
14060 22 54 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65  "TABLE %s", pIte
14070 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
14080 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
14090 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  as ){.        zM
140a0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
140b0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
140c0 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
140d0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
140e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
140f0 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c  f( (pIx = pLevel
14100 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20  ->pIdx)!=0 ){.  
14110 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
14120 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
14130 20 7a 4d 73 67 2c 20 22 25 73 20 57 49 54 48 20   zMsg, "%s WITH 
14140 49 4e 44 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c  INDEX %s", zMsg,
14150 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pIx->zName);.  
14160 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
14170 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57  evel->flags & (W
14180 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
14190 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
141a0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
141b0 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
141c0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
141d0 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
141e0 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  EY", zMsg);.    
141f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14200 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14210 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20  ABLE.      else 
14220 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
14230 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  tIdx ){.        
14240 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
14250 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70  fo *pBestIdx = p
14260 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b  Level->pBestIdx;
14270 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
14280 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
14290 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
142a0 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
142b0 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e 69 64      pBestIdx->id
142e0 78 4e 75 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e  xNum, pBestIdx->
142f0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d  idxStr);.      }
14300 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
14310 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
14320 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20  & WHERE_ORDERBY 
14330 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
14340 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
14350 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
14360 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29  ORDER BY", zMsg)
14370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14390 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
143a0 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
143b0 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  m, 0, zMsg, P4_D
143c0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23  YNAMIC);.    }.#
143d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
143e0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
143f0 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
14400 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
14410 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
14420 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
14430 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62 20 3d  >pTab;.    iDb =
14440 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14450 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
14460 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
14470 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
14480 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
14490 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
144a0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
144b0 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
144c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
144d0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
144e0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74  f( pLevel->pBest
144f0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Idx ){.      int
14500 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
14510 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
14520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14530 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20  p4(v, OP_VOpen, 
14540 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20  iCur, 0, 0,.    
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
14570 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 34  )pTab->pVtab, P4
14580 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
14590 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
145a0 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
145b0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
145c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
145d0 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
145e0 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
145f0 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
14600 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
14610 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
14620 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
14630 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
14640 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69  ab, op);.      i
14650 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
14660 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e  ePass && pTab->n
14670 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d  Col<(sizeof(Bitm
14680 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20  ask)*8) ){.     
14690 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
146a0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
146b0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
146c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
146d0 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
146e0 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
146f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
14700 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
14710 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 2c  urrentAddr(v)-2,
14720 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   n);.        ass
14730 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43  ert( n<=pTab->nC
14740 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol );.      }.  
14750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
14760 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
14770 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
14780 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
14790 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
147a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62      pLevel->iTab
147b0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
147c0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28  iCursor;.    if(
147d0 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   (pIx = pLevel->
147e0 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20  pIdx)!=0 ){.    
147f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
14800 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
14810 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
14820 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  x);.      assert
14830 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  ( pIx->pSchema==
14840 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
14850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
14870 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c  etNumColumns, 0,
14880 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29   pIx->nColumn+1)
14890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
148a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
148b0 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75  OpenRead, iIdxCu
148c0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
148d0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
148e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
148f0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
14900 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
14910 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
14920 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e  v, "%s", pIx->zN
14930 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ame));.    }.   
14940 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
14950 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
14960 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49   iDb);.  }.  pWI
14970 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69  nfo->iTop = sqli
14980 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14990 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  dr(v);..  /* Gen
149a0 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
149b0 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
149c0 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
149d0 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
149e0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
149f0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
14a00 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
14a10 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
14a20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
14a30 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
14a40 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
14a50 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
14a60 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
14a70 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
14a80 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
14a90 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 69 6e 74 20  t j, k;.    int 
14aa0 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
14ab0 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68  >iCursor;  /* Th
14ac0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
14ad0 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
14ae0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
14af0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
14b00 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
14b10 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ing */.    int n
14b20 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt;           /*
14b30 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
14b40 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
14b50 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
14b60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
14b70 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Cur;       /* Th
14b80 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
14b90 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
14ba0 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65     int omitTable
14bb0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
14bc0 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
14bd0 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  x only */.    in
14be0 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
14bf0 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e   /* True if we n
14c00 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  eed to scan in r
14c10 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
14c20 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20  .    pTabItem = 
14c30 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
14c40 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
14c50 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
14c60 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
14c70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
14c80 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
14c90 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
14ca0 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70  r;.    bRev = (p
14cb0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
14cc0 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30  HERE_REVERSE)!=0
14cd0 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20  ;.    omitTable 
14ce0 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  = (pLevel->flags
14cf0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
14d00 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  Y)!=0;..    /* C
14d10 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
14d20 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
14d30 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
14d40 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  ructions.    ** 
14d50 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
14d60 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62  loop.  Jump to b
14d70 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  rk to break out 
14d80 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  of a loop..    *
14d90 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
14da0 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
14db0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
14dc0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
14dd0 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a    ** loop..    *
14de0 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68  *.    ** When th
14df0 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65  ere is an IN ope
14e00 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68  rator, we also h
14e10 61 76 65 20 61 20 22 6e 78 74 22 20 6c 61 62 65  ave a "nxt" labe
14e20 6c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 6d 65  l that.    ** me
14e30 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ans to continue 
14e40 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
14e50 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69   value combinati
14e60 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20 2a 2a  on.  When.    **
14e70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e   there are no IN
14e80 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
14e90 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  e constraints, t
14ea0 68 65 20 22 6e 78 74 22 20 6c 61 62 65 6c 0a 20  he "nxt" label. 
14eb0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d     ** is the sam
14ec0 65 20 61 73 20 22 62 72 6b 22 2e 0a 20 20 20 20  e as "brk"..    
14ed0 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70 4c 65  */.    brk = pLe
14ee0 76 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65 76 65  vel->brk = pLeve
14ef0 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74 65 33  l->nxt = sqlite3
14f00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14f10 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65  ;.    cont = pLe
14f20 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69  vel->cont = sqli
14f30 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14f40 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  (v);..    /* If 
14f50 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68  this is the righ
14f60 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
14f70 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c  T OUTER JOIN, al
14f80 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a  locate and.    *
14f90 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d  * initialize a m
14fa0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20  emory cell that 
14fb0 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20  records if this 
14fc0 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e  table matches an
14fd0 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20  y.    ** row of 
14fe0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
14ff0 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20  f the join..    
15000 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
15010 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  l->iFrom>0 && (p
15020 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74  TabItem[0].joint
15030 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
15040 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  0 ){.      pLeve
15050 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b  l->iLeftJoin = +
15060 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
15090 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
150a0 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
150b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
150c0 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
150d0 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
150e0 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  "));.    }..#ifn
150f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15100 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
15110 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65   if( pLevel->pBe
15120 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  stIdx ){.      /
15130 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20 74  * Case 0:  The t
15140 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61  able is a virtua
15150 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68  l-table.  Use th
15160 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e  e VFilter and VN
15170 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ext.      **    
15180 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73 20        to access 
15190 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20 20  the data..      
151a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
151b0 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20        int iReg; 
151c0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
151d0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
151e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
151f0 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49  dex_info *pBestI
15200 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65  dx = pLevel->pBe
15210 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74  stIdx;.      int
15220 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
15230 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72  BestIdx->nConstr
15240 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74 72 75  aint;.      stru
15250 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
15260 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
15270 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20 20 20  e *aUsage =.    
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
152b0 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  estIdx->aConstra
152c0 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 20 20  intUsage;.      
152d0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
152e0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
152f0 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69  raint *aConstrai
15300 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  nt =.           
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d         pBestIdx-
15340 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20  >aConstraint;.. 
15350 20 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69       iReg = sqli
15360 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
15370 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
15380 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20 70 50  int+2);.      pP
15390 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
153a0 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 66  Cache++;.      f
153b0 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
153c0 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
153d0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
153e0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
153f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b  nConstraint; k++
15400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15410 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49   aUsage[k].argvI
15420 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20  ndex==j ){.     
15430 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d         int iTerm
15440 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b   = aConstraint[k
15450 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ].iTermOffset;. 
15460 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
15470 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62  t( pParse->disab
15480 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b 0a 20 20  leColCache );.  
15490 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
154a0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
154b0 2c 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e 70 45  , wc.a[iTerm].pE
154c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65  xpr->pRight, iRe
154d0 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  g+j+1);.        
154e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
154f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15500 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
15510 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
15520 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15530 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
15540 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
15550 68 65 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  he );.      pPar
15560 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
15570 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 73 71 6c  che--;.      sql
15580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15590 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 42  , OP_Integer, pB
155a0 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  estIdx->idxNum, 
155b0 69 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  iReg);.      sql
155c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
155e0 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
155f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15600 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op4(v, OP_VFilte
15610 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 69 52  r, iCur, brk, iR
15620 65 67 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64  eg, pBestIdx->id
15630 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xStr,.          
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
15650 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  estIdx->needToFr
15660 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50  eeIdxStr ? P4_MP
15670 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
15680 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
15690 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
156a0 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
156b0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
156c0 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
156d0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
156e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
156f0 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
15700 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
15710 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e    if( aUsage[j].
15720 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  omit ){.        
15730 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
15740 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
15750 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
15760 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
15770 70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b 69 54  pLevel, &wc.a[iT
15780 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  erm]);.        }
15790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
157a0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56  Level->op = OP_V
157b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
157c0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
157d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
157e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
157f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15800 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
15810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15820 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
15830 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c    if( pLevel->fl
15840 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
15850 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a  D_EQ ){.      /*
15860 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
15870 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
15880 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
15890 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20 20   using an.      
158a0 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
158b0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
158c0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
158d0 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
158e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77     **          w
158f0 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74  e reference mult
15900 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20  iple rows using 
15910 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e  a "rowid IN (...
15920 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  )".      **     
15930 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e 0a       construct..
15940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
15950 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 69 6e 74  nt r1;.      int
15960 20 72 74 6d 70 20 3d 20 73 71 6c 69 74 65 33 47   rtmp = sqlite3G
15970 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15980 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
15990 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69   findTerm(&wc, i
159a0 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
159b0 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
159c0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
159d0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
159e0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
159f0 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  m->pExpr!=0 );. 
15a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
15a10 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
15a20 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73  iCur );.      as
15a30 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
15a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  =0 );.      r1 =
15a50 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
15a60 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
15a70 20 70 4c 65 76 65 6c 2c 20 72 74 6d 70 29 3b 0a   pLevel, rtmp);.
15a80 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76        nxt = pLev
15a90 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20 73  el->nxt;.      s
15aa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15ab0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
15ac0 2c 20 72 31 2c 20 6e 78 74 29 3b 0a 20 20 20 20  , r1, nxt);.    
15ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15ae0 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
15af0 73 74 73 2c 20 69 43 75 72 2c 20 6e 78 74 2c 20  sts, iCur, nxt, 
15b00 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
15b10 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15b20 28 70 50 61 72 73 65 2c 20 72 74 6d 70 29 3b 0a  (pParse, rtmp);.
15b30 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15b40 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
15b50 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
15b60 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65   OP_Noop;.    }e
15b70 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
15b80 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
15b90 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  WID_RANGE ){.   
15ba0 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
15bb0 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61  e have an inequa
15bc0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
15bd0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
15be0 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  D field..      *
15bf0 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74  /.      int test
15c00 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
15c10 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
15c20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
15c30 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a  pStart, *pEnd;..
15c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d        assert( om
15c50 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
15c60 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e      pStart = fin
15c70 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
15c80 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
15c90 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
15ca0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69 6e        pEnd = fin
15cb0 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
15cc0 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
15cd0 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a  O_LT|WO_LE, 0);.
15ce0 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29        if( bRev )
15cf0 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
15d00 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
15d10 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b    pStart = pEnd;
15d20 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20  .        pEnd = 
15d30 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
15d40 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20       if( pStart 
15d50 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
15d60 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
15d70 20 72 31 2c 20 72 65 67 46 72 65 65 31 3b 0a 20   r1, regFree1;. 
15d80 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74 61         pX = pSta
15d90 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rt->pExpr;.     
15da0 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
15db0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
15dc0 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74  rt( pStart->left
15dd0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
15de0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
15df0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
15e00 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
15e10 67 68 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  ght, &regFree1);
15e20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15e30 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15e40 5f 46 6f 72 63 65 49 6e 74 2c 20 72 31 2c 20 62  _ForceInt, r1, b
15e50 72 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rk, .           
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e70 20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20    pX->op==TK_LE 
15e80 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
15e90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15ea0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15eb0 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c 74  bRev ? OP_MoveLt
15ec0 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43   : OP_MoveGe, iC
15ed0 75 72 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20  ur, brk, r1);.  
15ee0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
15ef0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
15f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15f10 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15f20 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
15f30 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
15f40 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72  rm(pLevel, pStar
15f50 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
15f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52  VdbeAddOp2(v, bR
15f80 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
15f90 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
15fa0 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
15fb0 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a      if( pEnd ){.
15fc0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
15fd0 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
15fe0 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
15ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
16000 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
16010 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43  ert( pEnd->leftC
16020 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
16030 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
16040 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
16050 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  nMem;.        sq
16060 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16070 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
16080 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b  , pLevel->iMem);
16090 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d  .        if( pX-
160a0 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
160b0 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
160c0 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
160d0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
160e0 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20   OP_Ge;.        
160f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16100 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
16110 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
16120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16130 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
16140 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
16150 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
16160 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
16170 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
16180 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
16190 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
161a0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
161b0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
161c0 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
161d0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
161e0 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
161f0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
16200 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
16210 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16220 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
16230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16240 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43  (v, OP_Rowid, iC
16250 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  ur, r1);.       
16260 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41   /* sqlite3VdbeA
16270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
16280 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  y, pLevel->iMem,
16290 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20   0); */.        
162a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
162b0 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 70 4c 65  3(v, testOp, pLe
162c0 76 65 6c 2d 3e 69 4d 65 6d 2c 20 62 72 6b 2c 20  vel->iMem, brk, 
162d0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
162e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
162f0 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
16300 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f  UMERIC | SQLITE_
16310 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
16320 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
16330 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16340 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
16350 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
16360 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57  evel->flags & (W
16370 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
16380 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  E|WHERE_COLUMN_E
16390 51 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  Q) ){.      /* C
163a0 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75 73  ase 3: A scan us
163b0 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ing an index..  
163c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
163d0 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
163e0 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
163f0 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
16400 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
16410 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
16420 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
16430 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
16440 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
16450 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16460 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
16470 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
16480 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e   It may also con
16490 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20  tain.      **   
164a0 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74 79        inequality
164b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e 2c   constraints (>,
164c0 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e   <, >= or <=) on
164d0 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20 20   the indexed.   
164e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
164f0 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
16500 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
16510 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
16520 4f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 20  Only .      **  
16530 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
16540 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
16550 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
16560 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
16570 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  t.      **      
16580 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20     use the "==" 
16590 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f  and "IN" operato
165a0 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
165b0 20 69 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   if the .      *
165c0 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20  *         index 
165d0 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74  is on (x,y,z), t
165e0 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
165f0 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c  g clauses are al
16600 6c 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  l .      **     
16610 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
16620 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
16630 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a              x=5.
16640 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16650 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31 30      x=5 AND y=10
16660 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
16670 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
16680 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  0.      **      
16690 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
166a0 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 20  5 AND y<10.     
166b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
166c0 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a  =5 AND y=5 AND z
166d0 3c 3d 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20 20  <=10.      **.  
166e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
166f0 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
16700 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
16710 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
16720 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ly.      **     
16730 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
16740 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
16750 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
16760 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20 20  =5 AND z<10.    
16770 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
16780 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
16790 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
167a0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
167b0 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 20 20 2a  traints..      *
167c0 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68 65  *         If the
167d0 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61  re are no inequa
167e0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
167f0 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20  , then N is at. 
16800 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
16810 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 20  least one..     
16820 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
16830 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
16840 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
16850 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
16860 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ERE clause.     
16870 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73   **         cons
16880 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69  traints but an i
16890 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65 64  ndex is selected
168a0 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65   anyway, in orde
168b0 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
168c0 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65 20     to force the 
168d0 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f 20  output order to 
168e0 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f 52  conform to an OR
168f0 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a 2f  DER BY..      */
16900 20 20 0a 20 20 20 20 20 20 69 6e 74 20 61 53 74    .      int aSt
16910 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  artOp[] = {.    
16920 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 30      0,.        0
16930 2c 0a 20 20 20 20 20 20 20 20 4f 50 5f 52 65 77  ,.        OP_Rew
16940 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
16950 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
16960 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
16970 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
16980 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4c 61 73  /.        OP_Las
16990 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
169a0 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 3: (!start_con
169b0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
169c0 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20 2a  tEq &&   bRev) *
169d0 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76  /.        OP_Mov
169e0 65 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  eGt,           /
169f0 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 4: (start_cons
16a00 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
16a10 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
16a20 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76  /.        OP_Mov
16a30 65 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  eLt,           /
16a40 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
16a50 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
16a60 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
16a70 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76  /.        OP_Mov
16a80 65 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  eGe,           /
16a90 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
16aa0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
16ab0 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
16ac0 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f 76  /.        OP_Mov
16ad0 65 4c 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  eLe            /
16ae0 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 7: (start_cons
16af0 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
16b00 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
16b10 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  /.      };.     
16b20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20   int aEndOp[] = 
16b30 7b 0a 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 6f  {.        OP_Noo
16b40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16b50 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74  * 0: (!end_const
16b60 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20  raints) */.     
16b70 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20     OP_IdxGE,    
16b80 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65          /* 1: (e
16b90 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  nd_constraints &
16ba0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
16bb0 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20 20      OP_IdxLT    
16bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28           /* 2: (
16bd0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
16be0 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  && bRev) */.    
16bf0 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e    };.      int n
16c00 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  Eq = pLevel->nEq
16c10 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 69  ;.      int isMi
16c20 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  nQuery = 0;     
16c30 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
16c40 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
16c50 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20  SELECT min(x).. 
16c60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
16c70 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
16c80 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
16c90 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
16ca0 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
16cb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
16cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16cd0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72         /* Temp r
16ce0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
16cf0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
16d00 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a  geStart = 0;  /*
16d10 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
16d20 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
16d30 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 20 20 57  start */.      W
16d40 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
16d50 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
16d60 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
16d70 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
16d80 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  d */.      int s
16d90 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
16da0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16db0 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
16dc0 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
16dd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   */.      int en
16de0 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  dEq;            
16df0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
16e00 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73  f range end uses
16e10 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f   ==, >= or <= */
16e20 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
16e30 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
16e40 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
16e50 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
16e60 69 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ined */.      in
16e70 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
16e80 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 2f 2a 20 43 6f  lumn[nEq]; /* Co
16e90 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c  lumn for inequal
16ea0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
16eb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  */.      int nCo
16ec0 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
16ed0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16ee0 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
16ef0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rms */.      int
16f00 20 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47   op;..      /* G
16f10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
16f20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
16f30 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
16f40 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
16f50 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20     ** and store 
16f60 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
16f70 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20  ose terms in an 
16f80 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
16f90 72 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72  rs.      ** star
16fa0 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
16fb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16fc0 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
16fd0 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
16fe0 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26  Parse, pLevel, &
16ff0 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 32 29  wc, notReady, 2)
17000 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c  ;.      nxt = pL
17010 65 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20 20  evel->nxt;..    
17020 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f    /* If this loo
17030 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f  p satisfies a so
17040 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72  rt order (pOrder
17050 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74  By) request that
17060 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 70   .      ** was p
17070 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
17080 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
17090 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
170a0 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 20  n(x) ..." .     
170b0 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
170c0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
170d0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
170e0 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
170f0 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
17100 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   iteration. This
17110 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
17120 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e  first row return
17130 65 64 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  ed.      ** shou
17140 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e 55  ld not have a NU
17150 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  LL value stored 
17160 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d  in 'x'. If colum
17170 6e 20 27 78 27 20 69 73 0a 20 20 20 20 20 20 2a  n 'x' is.      *
17180 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20  * the first one 
17190 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71  after the nEq eq
171a0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
171b0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  ts in the index,
171c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 72  .      ** this r
171d0 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
171e0 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
171f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
17200 28 20 28 77 66 6c 61 67 73 26 57 48 45 52 45 5f  ( (wflags&WHERE_
17210 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
17220 20 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65         && (pLeve
17230 6c 2d 3e 66 6c 61 67 73 26 57 48 45 52 45 5f 4f  l->flags&WHERE_O
17240 52 44 45 52 42 59 29 0a 20 20 20 20 20 20 20 26  RDERBY).       &
17250 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
17260 3e 6e 45 71 29 0a 20 20 20 20 20 20 29 7b 0a 20  >nEq).      ){. 
17270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17280 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
17290 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
172a0 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61  ert( pOrderBy->a
172b0 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
172c0 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  mn==pIdx->aiColu
172d0 6d 6e 5b 6e 45 71 5d 20 29 3b 0a 20 20 20 20 20  mn[nEq] );.     
172e0 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20     isMinQuery = 
172f0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
17300 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
17310 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
17320 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
17330 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
17340 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
17350 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 20 20 2a   range. .      *
17360 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  /.      if( pLev
17370 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
17380 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
17390 20 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64         pRangeEnd
173a0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
173b0 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
173c0 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  dy, (WO_LT|WO_LE
173d0 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  ), pIdx);.      
173e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
173f0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
17400 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_BTM_LIMIT ){. 
17410 20 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61         pRangeSta
17420 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77  rt = findTerm(&w
17430 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  c, iCur, k, notR
17440 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f  eady, (WO_GT|WO_
17450 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  GE), pIdx);.    
17460 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
17470 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
17480 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63  reverse order sc
17490 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  an on an ascendi
174a0 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20  ng index, or.   
174b0 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20     ** a forward 
174c0 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20  order scan on a 
174d0 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
174e0 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68  , interchange th
174f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72  e .      ** star
17500 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73 20  t and end terms 
17510 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e 64  (pRangeStart and
17520 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20   pRangeEnd)..   
17530 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17540 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f  bRev==(pIdx->aSo
17550 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51  rtOrder[nEq]==SQ
17560 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a  LITE_SO_ASC) ){.
17570 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65          SWAP(Whe
17580 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
17590 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
175a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
175b0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
175c0 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67  geStart && pRang
175d0 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f  eStart->eOperato
175e0 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20  r & WO_LE );.   
175f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
17600 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
17610 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
17620 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
17630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
17640 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67  angeEnd && pRang
17650 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
17660 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
17670 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
17680 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e  eEnd && pRangeEn
17690 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
176a0 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73 74  O_GE );.      st
176b0 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
176c0 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
176d0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
176e0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
176f0 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20        endEq =   
17700 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
17710 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
17720 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
17730 45 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f  E);.      start_
17740 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
17750 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
17760 3e 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  >0;..      /* Se
17770 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
17780 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
17790 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
177a0 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  /.      nConstra
177b0 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  int = nEq;.     
177c0 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
177d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
177e0 64 63 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 69  dcc = pParse->di
177f0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b 0a 20  sableColCache;. 
17800 20 20 20 20 20 20 20 69 66 28 20 70 52 61 6e 67         if( pRang
17810 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eEnd ){.        
17820 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
17830 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20 20  eColCache++;.   
17840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
17850 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17860 50 61 72 73 65 2c 20 70 52 61 6e 67 65 53 74 61  Parse, pRangeSta
17870 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rt->pExpr->pRigh
17880 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
17890 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
178a0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
178b0 20 3d 20 64 63 63 3b 0a 20 20 20 20 20 20 20 20   = dcc;.        
178c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
178d0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
178e0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 78 74  regBase+nEq, nxt
178f0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e 73  );.        nCons
17900 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
17910 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e 51  }else if( isMinQ
17920 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  uery ){.        
17930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17940 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
17950 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
17960 20 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69         nConstrai
17970 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 74  nt++;.        st
17980 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  artEq = 0;.     
17990 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
179a0 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ints = 1;.      
179b0 7d 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c  }.      codeAppl
179c0 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  yAffinity(pParse
179d0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
179e0 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a 20  traint, pIdx);. 
179f0 20 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74       op = aStart
17a00 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  Op[(start_constr
17a10 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61  aints<<2) + (sta
17a20 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d  rtEq<<1) + bRev]
17a30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17a40 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  op!=0 );.      t
17a50 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
17a60 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 20 20  Rewind );.      
17a70 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17a80 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 74  _Last );.      t
17a90 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
17aa0 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20 20  MoveGt );.      
17ab0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
17ac0 5f 4d 6f 76 65 47 65 20 29 3b 0a 20 20 20 20 20  _MoveGe );.     
17ad0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17ae0 50 5f 4d 6f 76 65 4c 65 20 29 3b 0a 20 20 20 20  P_MoveLe );.    
17af0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17b00 4f 50 5f 4d 6f 76 65 4c 74 20 29 3b 0a 20 20 20  OP_MoveLt );.   
17b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17b20 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp4(v, op, iIdx
17b30 43 75 72 2c 20 6e 78 74 2c 20 72 65 67 42 61 73  Cur, nxt, regBas
17b40 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
17b50 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17b60 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43  TE_INT_TO_PTR(nC
17b70 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49  onstraint), P4_I
17b80 4e 54 33 32 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  NT32);..      /*
17b90 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20   Load the value 
17ba0 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69  for the inequali
17bb0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
17bc0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
17bd0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28        ** range (
17be0 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
17bf0 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61  /.      nConstra
17c00 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  int = nEq;.     
17c10 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29   if( pRangeEnd )
17c20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17c30 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
17c40 2c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  , pRangeEnd->pEx
17c50 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42  pr->pRight, regB
17c60 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
17c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17c80 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
17c90 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e  , regBase+nEq, n
17ca0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  xt);.        cod
17cb0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
17cc0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
17cd0 6e 45 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20 20  nEq+1, pIdx);.  
17ce0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
17cf0 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t++;.      }..  
17d00 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
17d10 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  e loop body */. 
17d20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
17d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17d40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
17d50 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
17d60 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72  the index cursor
17d70 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64   is past the end
17d80 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
17d90 2f 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45 6e  /.      op = aEn
17da0 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20 7c  dOp[(pRangeEnd |
17db0 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62 52  | nEq) * (1 + bR
17dc0 65 76 29 5d 3b 0a 20 20 20 20 20 20 74 65 73 74  ev)];.      test
17dd0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f  case( op==OP_Noo
17de0 70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  p );.      testc
17df0 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
17e00 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  E );.      testc
17e10 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
17e20 54 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  T );.      sqlit
17e30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17e40 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74  op, iIdxCur, nxt
17e50 2c 20 72 65 67 42 61 73 65 2c 0a 20 20 20 20 20  , regBase,.     
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f     SQLITE_INT_TO
17e80 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e 74  _PTR(nConstraint
17e90 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
17ea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17eb0 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71  hangeP5(v, endEq
17ec0 21 3d 62 52 65 76 29 3b 0a 0a 20 20 20 20 20 20  !=bRev);..      
17ed0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17ee0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
17ef0 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68  raints, check th
17f00 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  at the value.   
17f10 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62     ** of the tab
17f20 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  le column that t
17f30 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
17f40 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e  ntrains is not N
17f50 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  ULL..      ** If
17f60 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
17f70 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
17f80 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
17f90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
17fa0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
17fb0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
17fc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17fd0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
17fe0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
17ff0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18000 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
18010 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
18020 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  T );.      if( p
18030 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
18040 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c  WHERE_BTM_LIMIT|
18050 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
18060 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18070 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18080 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
18090 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20  Cur, nEq, r1);. 
180a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
180b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
180c0 73 4e 75 6c 6c 2c 20 72 31 2c 20 63 6f 6e 74 29  sNull, r1, cont)
180d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
180e0 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
180f0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
18100 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  quired */.      
18110 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29  if( !omitTable )
18120 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18140 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
18150 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Cur, r1);.      
18160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18170 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  Op3(v, OP_MoveGe
18180 2c 20 69 43 75 72 2c 20 30 2c 20 72 31 29 3b 20  , iCur, 0, r1); 
18190 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65 65   /* Deferred see
181a0 6b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  k */.      }.   
181b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
181c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
181d0 20 72 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   r1);..      /* 
181e0 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72  Record the instr
181f0 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74  uction used to t
18200 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
18210 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20  p. Disable .    
18220 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73    ** WHERE claus
18230 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64  e terms made red
18240 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e  undant by the in
18250 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a  dex range scan..
18260 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
18270 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
18280 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
18290 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
182a0 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
182b0 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
182c0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
182d0 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  geStart);.      
182e0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
182f0 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
18300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18310 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65   /* Case 4:  The
18320 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
18330 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
18340 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
18350 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
18360 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
18370 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  re table..      
18380 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
18390 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
183a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62  .      assert( b
183b0 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Rev==0 );.      
183c0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
183d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
183e0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
183f0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
18400 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
18410 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
18420 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29  wind, iCur, brk)
18430 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
18440 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
18450 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
18460 53 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20 20 20  STEP;.    }.    
18470 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
18480 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69  Mask(&maskSet, i
18490 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Cur);..    /* In
184a0 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
184b0 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
184c0 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
184d0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20  e completely.   
184e0 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
184f0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
18500 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
18510 20 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 0a    */.    k = 0;.
18520 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63      for(pTerm=wc
18530 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20  .a, j=wc.nTerm; 
18540 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
18550 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
18560 70 45 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pE;.      testca
18570 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  se( pTerm->flags
18580 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
18590 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
185a0 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  e( pTerm->flags 
185b0 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
185c0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
185d0 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  >flags & (TERM_V
185e0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
185f0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
18600 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
18610 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
18620 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74  Ready)!=0 ) cont
18630 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d  inue;.      pE =
18640 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
18650 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21       assert( pE!
18660 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
18670 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
18680 6e 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  n && !ExprHasPro
18690 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
186a0 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
186b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
186c0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
186d0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
186e0 65 20 2b 3d 20 6b 3b 0a 20 20 20 20 20 20 73 71  e += k;.      sq
186f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
18700 28 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e  (pParse, pE, con
18710 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
18720 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61  NULL);.      pPa
18730 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43  rse->disableColC
18740 61 63 68 65 20 2d 3d 20 6b 3b 0a 20 20 20 20 20  ache -= k;.     
18750 20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54   k = 1;.      pT
18760 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
18770 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
18780 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45  .    /* For a LE
18790 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67  FT OUTER JOIN, g
187a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
187b0 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68  t will record th
187c0 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20  e fact that.    
187d0 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
187e0 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74  row of the right
187f0 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68   table has match
18800 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  ed the left tabl
18810 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  e.  .    */.    
18820 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
18830 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  tJoin ){.      p
18840 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c  Level->top = sql
18850 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
18860 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
18870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18880 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
18890 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
188a0 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  oin);.      Vdbe
188b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
188c0 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
188d0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
188e0 74 65 33 45 78 70 72 43 6c 65 61 72 43 6f 6c 75  te3ExprClearColu
188f0 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
18900 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 29  pLevel->iTabCur)
18910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18920 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61  xprClearColumnCa
18930 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65 76  che(pParse, pLev
18940 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
18950 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63      for(pTerm=wc
18960 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54  .a, j=0; j<wc.nT
18970 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  erm; j++, pTerm+
18980 2b 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  +){.        test
18990 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61  case( pTerm->fla
189a0 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
189b0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  L );.        tes
189c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c  tcase( pTerm->fl
189d0 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
189e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
189f0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28  pTerm->flags & (
18a00 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
18a10 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
18a20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
18a30 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
18a40 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
18a50 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
18a60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
18a70 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20  erm->pExpr );.  
18a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18a90 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
18aa0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63   pTerm->pExpr, c
18ab0 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  ont, SQLITE_JUMP
18ac0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  IFNULL);.       
18ad0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
18ae0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
18af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18b00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18b10 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69  ST  /* For testi
18b20 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
18b30 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f   use only */.  /
18b40 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
18b50 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72  query plan infor
18b60 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
18b70 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20   current table. 
18b80 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65   ** and the inde
18b90 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
18ba0 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49   it (if any).  I
18bb0 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65  f the table itse
18bc0 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75  lf.  ** is not u
18bd0 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73  sed, its name is
18be0 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20   just '{}'.  If 
18bf0 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  no index is used
18c00 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
18c10 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d  is listed as "{}
18c20 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61  ".  If the prima
18c30 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74  ry key is used t
18c40 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61  he.  ** index na
18c50 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a  me is '*'..  */.
18c60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
18c70 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
18c80 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  ){.    char *z;.
18c90 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70      int n;.    p
18ca0 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
18cb0 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62 49  >a[i];.    pTabI
18cc0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
18cd0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
18ce0 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62 49  ];.    z = pTabI
18cf0 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
18d00 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
18d10 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
18d20 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73  zName;.    n = s
18d30 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66  trlen(z);.    if
18d40 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a  ( n+nQPlan < siz
18d50 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65 72  eof(sqlite3_quer
18d60 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20  y_plan)-10 ){.  
18d70 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
18d80 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
18d90 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
18da0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
18db0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
18dc0 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a  lan], "{}", 2);.
18dd0 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
18de0 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 2;.      }else
18df0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
18e00 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
18e10 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c  plan[nQPlan], z,
18e20 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   n);.        nQP
18e30 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
18e40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
18e50 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
18e60 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
18e70 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
18e80 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
18e90 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
18ea0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18eb0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
18ec0 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
18ed0 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  E );.    if( pLe
18ee0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48  vel->flags & (WH
18ef0 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45  ERE_ROWID_EQ|WHE
18f00 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20  RE_ROWID_RANGE) 
18f10 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18f20 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
18f30 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20  lan[nQPlan], "* 
18f40 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50  ", 2);.      nQP
18f50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
18f60 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
18f70 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
18f80 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
18f90 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
18fa0 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a  an], "{} ", 3);.
18fb0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
18fc0 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  3;.    }else{.  
18fd0 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70      n = strlen(p
18fe0 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61  Level->pIdx->zNa
18ff0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
19000 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
19010 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
19020 6c 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20  lan)-2 ){.      
19030 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
19040 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
19050 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49  lan], pLevel->pI
19060 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  dx->zName, n);. 
19070 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d         nQPlan +=
19080 20 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   n;.        sqli
19090 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
190a0 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
190b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
190c0 7d 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61  }.  while( nQPla
190d0 6e 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71  n>0 && sqlite3_q
190e0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
190f0 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]==' ' ){.    
19100 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
19110 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30  an[--nQPlan] = 0
19120 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
19130 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
19140 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e  n] = 0;.  nQPlan
19150 20 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20   = 0;.#endif /* 
19160 53 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54  SQLITE_TEST // T
19170 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
19180 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f  ging use only */
19190 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
191a0 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61  e continuation a
191b0 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68  ddress in the Wh
191c0 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
191d0 65 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c  e.  Then.  ** cl
191e0 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
191f0 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f  n..  */.  pWInfo
19200 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f  ->iContinue = co
19210 6e 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  nt;.  whereClaus
19220 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72  eClear(&wc);.  r
19230 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20  eturn pWInfo;.. 
19240 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19250 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
19260 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72  .whereBeginError
19270 3a 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43  :.  whereClauseC
19280 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65  lear(&wc);.  whe
19290 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
192a0 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
192b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
192c0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
192d0 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
192e0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
192f0 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
19300 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
19310 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
19320 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
19330 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
19340 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
19350 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
19360 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
19370 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
19380 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
19390 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
193a0 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
193b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
193c0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
193d0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
193e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
193f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19400 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
19410 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
19420 71 6c 69 74 65 33 45 78 70 72 43 6c 65 61 72 43  qlite3ExprClearC
19430 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
19440 65 2c 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d  e, -1);.  for(i=
19450 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  pTabList->nSrc-1
19460 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
19470 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
19480 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71  fo->a[i];.    sq
19490 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
194a0 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d  Label(v, pLevel-
194b0 3e 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  >cont);.    if( 
194c0 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e  pLevel->op!=OP_N
194d0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
194e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
194f0 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c  , pLevel->op, pL
19500 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
19510 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ->p2);.      sql
19520 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19530 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b  (v, pLevel->p5);
19540 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19550 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20  Level->nIn ){.  
19560 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
19570 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
19580 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
19590 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
195a0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78  el(v, pLevel->nx
195b0 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
195c0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e  pLevel->nIn, pIn
195d0 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  =&pLevel->aInLoo
195e0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
195f0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
19600 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
19610 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f  pHere(v, pIn->to
19620 70 41 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20  pAddr+1);.      
19630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19640 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
19650 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
19660 74 6f 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20  topAddr);.      
19670 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
19680 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f  pHere(v, pIn->to
19690 70 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20  pAddr-1);.      
196a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
196b0 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
196c0 2d 3e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20  ->aInLoop);.    
196d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
196e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
196f0 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20   pLevel->brk);. 
19700 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
19710 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
19720 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
19730 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
19740 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19750 5f 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e  _IfPos, pLevel->
19760 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
19770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19780 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
19790 77 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  w, pTabList->a[i
197a0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ].iCursor);.    
197b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49    if( pLevel->iI
197c0 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCur>=0 ){.    
197d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
197e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
197f0 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
19800 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
19810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19820 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19830 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f  o, 0, pLevel->to
19840 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
19850 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19860 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20   addr);.    }.  
19870 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65  }..  /* The "bre
19880 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72  ak" point is her
19890 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  e, just past the
198a0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65   end of the oute
198b0 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74  r loop..  ** Set
198c0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69   it..  */.  sqli
198d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
198e0 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69  bel(v, pWInfo->i
198f0 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c  Break);..  /* Cl
19900 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ose all of the c
19910 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65  ursors that were
19920 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
19930 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20  e3WhereBegin..  
19940 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
19950 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
19960 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
19970 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
19980 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
19990 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
199a0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
199b0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
199c0 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
199d0 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70  ab = pTabItem->p
199e0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
199f0 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
19a00 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
19a10 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
19a20 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
19a30 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
19a40 75 65 3b 0a 20 20 20 20 69 66 28 20 21 70 57 49  ue;.    if( !pWI
19a50 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26  nfo->okOnePass &
19a60 26 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  & (pLevel->flags
19a70 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
19a80 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
19a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19aa0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
19ab0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
19ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19ad0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20  pLevel->pIdx!=0 
19ae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19af0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19b00 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
19b10 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 7d 0a  iIdxCur);.    }.
19b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
19b30 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
19b40 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
19b50 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
19b60 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
19b70 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
19b80 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
19b90 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
19ba0 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
19bb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
19bc0 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
19bd0 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
19be0 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
19bf0 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
19c00 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
19c10 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
19c20 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
19c30 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
19c40 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
19c50 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
19c60 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
19c70 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
19c80 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
19c90 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
19ca0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
19cb0 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
19cc0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
19cd0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
19ce0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
19cf0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
19d00 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
19d10 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
19d20 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
19d30 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
19d40 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
19d50 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
19d60 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
19d70 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
19d80 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
19d90 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
19da0 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
19db0 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
19dc0 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
19dd0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
19de0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19df0 4c 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b 0a 20  Level->pIdx ){. 
19e00 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c       int k, j, l
19e10 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
19e20 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
19e30 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
19e40 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 20 20  el->pIdx;.      
19e50 69 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79  int useIndexOnly
19e60 20 3d 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73   = pLevel->flags
19e70 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
19e80 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  Y;..      assert
19e90 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20  ( pIdx!=0 );.   
19ea0 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
19eb0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
19ec0 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
19ed0 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
19ee0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19ef0 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
19f00 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
19f10 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
19f20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
19f30 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
19f40 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
19f50 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
19f60 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
19f70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
19f80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
19f90 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
19fa0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
19fb0 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
19fc0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
19fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19fe0 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
19ff0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
1a000 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
1a010 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
1a020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
1a050 73 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f  ssert(!useIndexO
1a060 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e  nly || j<pIdx->n
1a070 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
1a080 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1a090 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
1a0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
1a0b0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
1a0c0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
1a0d0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
1a0e0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
1a0f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a100 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1a110 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e  NullRow && useIn
1a120 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  dexOnly ){.     
1a130 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
1a140 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
1a150 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1a170 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
1a180 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
1a190 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
1a1a0 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.