/ Hex Artifact Content
Login

Artifact e4c40d224cc6931bece3a33b35bd6b6a8deade3f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 33 31  : where.c,v 1.31
0340: 37 20 32 30 30 38 2f 30 37 2f 31 32 20 31 34 3a  7 2008/07/12 14:
0350: 35 32 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a  52:20 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 70 45 78 70 72 29 20 2a 2f 0a 23  lete(pExpr) */.#
0ec0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 49 52 54  define TERM_VIRT
0ed0: 55 41 4c 20 20 20 20 30 78 30 32 20 20 20 2f 2a  UAL    0x02   /*
0ee0: 20 41 64 64 65 64 20 62 79 20 74 68 65 20 6f 70   Added by the op
0ef0: 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20 6e 6f 74  timizer.  Do not
0f00: 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   code */.#define
0f10: 20 54 45 52 4d 5f 43 4f 44 45 44 20 20 20 20 20   TERM_CODED     
0f20: 20 30 78 30 34 20 20 20 2f 2a 20 54 68 69 73 20   0x04   /* This 
0f30: 74 65 72 6d 20 69 73 20 61 6c 72 65 61 64 79 20  term is already 
0f40: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  coded */.#define
0f50: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 20 20 20   TERM_COPIED    
0f60: 20 30 78 30 38 20 20 20 2f 2a 20 48 61 73 20 61   0x08   /* Has a
0f70: 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65 66 69 6e   child */.#defin
0f80: 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20 20 20 20  e TERM_OR_OK    
0f90: 20 20 30 78 31 30 20 20 20 2f 2a 20 55 73 65 64    0x10   /* Used
0fa0: 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c 61 75 73   during OR-claus
0fb0: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
0fc0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
0fd0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
0fe0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68 6f  ing structure ho
0ff0: 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  lds all informat
1000: 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57  ion about a.** W
1010: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f  HERE clause.  Mo
1020: 73 74 6c 79 20 74 68 69 73 20 69 73 20 61 20 63  stly this is a c
1030: 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65  ontainer for one
1040: 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65 54 65   or more WhereTe
1050: 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  rms..*/.struct W
1060: 68 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 50  hereClause {.  P
1070: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
1080: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1090: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
10a0: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
10b0: 70 4d 61 73 6b 53 65 74 3b 20 20 20 2f 2a 20 4d  pMaskSet;   /* M
10c0: 61 70 70 69 6e 67 20 6f 66 20 74 61 62 6c 65 20  apping of table 
10d0: 69 6e 64 69 63 65 73 20 74 6f 20 62 69 74 6d 61  indices to bitma
10e0: 73 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  sks */.  int nTe
10f0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1110: 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  erms */.  int nS
1120: 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  lot;            
1130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1140: 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a  entries in a[] *
1150: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  /.  WhereTerm *a
1160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1170: 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72 69 62  Each a[] describ
1180: 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
1190: 20 57 48 45 52 45 20 63 6c 75 61 73 65 20 2a 2f   WHERE cluase */
11a0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74  .  WhereTerm aSt
11b0: 61 74 69 63 5b 31 30 5d 3b 20 20 20 2f 2a 20 49  atic[10];   /* I
11c0: 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70  nitial static sp
11d0: 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d  ace for a[] */.}
11e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
11f0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1200: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1210: 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 61  keeps track of a
1220: 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77   mapping.** betw
1230: 65 65 6e 20 56 44 42 45 20 63 75 72 73 6f 72 20  een VDBE cursor 
1240: 6e 75 6d 62 65 72 73 20 61 6e 64 20 62 69 74 73  numbers and bits
1250: 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 73   of the bitmasks
1260: 20 69 6e 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a   in WhereTerm..*
1270: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 63 75  *.** The VDBE cu
1280: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
1290: 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20   small integers 
12a0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a  contained in .**
12b0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43   SrcList_item.iC
12c0: 75 72 73 6f 72 20 61 6e 64 20 45 78 70 72 2e 69  ursor and Expr.i
12d0: 54 61 62 6c 65 20 66 69 65 6c 64 73 2e 20 20 46  Table fields.  F
12e0: 6f 72 20 61 6e 79 20 67 69 76 65 6e 20 57 48 45  or any given WHE
12f0: 52 45 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74  RE .** clause, t
1300: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1310: 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 67 69  s might not begi
1320: 6e 20 77 69 74 68 20 30 20 61 6e 64 20 74 68 65  n with 0 and the
1330: 79 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61  y might.** conta
1340: 69 6e 20 67 61 70 73 20 69 6e 20 74 68 65 20 6e  in gaps in the n
1350: 75 6d 62 65 72 69 6e 67 20 73 65 71 75 65 6e 63  umbering sequenc
1360: 65 2e 20 20 42 75 74 20 77 65 20 77 61 6e 74 20  e.  But we want 
1370: 74 6f 20 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a  to make maximum.
1380: 2a 2a 20 75 73 65 20 6f 66 20 74 68 65 20 62 69  ** use of the bi
1390: 74 73 20 69 6e 20 6f 75 72 20 62 69 74 6d 61 73  ts in our bitmas
13a0: 6b 73 2e 20 20 54 68 69 73 20 73 74 72 75 63 74  ks.  This struct
13b0: 75 72 65 20 70 72 6f 76 69 64 65 73 20 61 20 6d  ure provides a m
13c0: 61 70 70 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74  apping.** from t
13d0: 68 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  he sparse cursor
13e0: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
13f0: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
1400: 72 73 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  rs beginning.** 
1410: 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  with 0..**.** If
1420: 20 45 78 70 72 4d 61 73 6b 53 65 74 2e 69 78 5b   ExprMaskSet.ix[
1430: 41 5d 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74  A]==B it means t
1440: 68 61 74 20 54 68 65 20 41 2d 74 68 20 62 69 74  hat The A-th bit
1450: 20 6f 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a   of a Bitmask.**
1460: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42   corresponds VDB
1470: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1480: 42 2e 20 20 54 68 65 20 41 2d 74 68 20 62 69 74  B.  The A-th bit
1490: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73   of a bitmask is
14a0: 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   1<<A..**.** For
14b0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
14c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
14d0: 70 72 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68  pression used th
14e0: 65 73 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73  ese VDBE.** curs
14f0: 6f 72 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32  ors:  4, 5, 8, 2
1500: 39 2c 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e  9, 57, 73.  Then
1510: 20 74 68 65 20 20 45 78 70 72 4d 61 73 6b 53 65   the  ExprMaskSe
1520: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77  t structure.** w
1530: 6f 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63  ould map those c
1540: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e  ursor numbers in
1550: 74 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67  to bits 0 throug
1560: 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  h 5..**.** Note 
1570: 74 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67  that the mapping
1580: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1590: 69 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e  ily ordered.  In
15a0: 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20   the example.** 
15b0: 61 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69  above, the mappi
15c0: 6e 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65  ng might go like
15d0: 20 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d   this:  4->3, 5-
15e0: 3e 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c  >1, 8->2, 29->0,
15f0: 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34  .** 57->5, 73->4
1600: 2e 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39  .  Or one of 719
1610: 20 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69   other combinati
1620: 6f 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65  ons might be use
1630: 64 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d. It.** does no
1640: 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e  t really matter.
1650: 20 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74    What is import
1660: 61 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72  ant is that spar
1670: 73 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  se cursor.** num
1680: 62 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70  bers all get map
1690: 70 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d  ped into bit num
16a0: 62 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20  bers that begin 
16b0: 77 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61  with 0 and conta
16c0: 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a  in.** no gaps..*
16d0: 2f 0a 73 74 72 75 63 74 20 45 78 70 72 4d 61 73  /.struct ExprMas
16e0: 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20  kSet {.  int n; 
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1710: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
1720: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
1730: 69 6e 74 20 69 78 5b 73 69 7a 65 6f 66 28 42 69  int ix[sizeof(Bi
1740: 74 6d 61 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a  tmask)*8];    /*
1750: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
1760: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
1770: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61  };.../*.** Bitma
1780: 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72  sks for the oper
1790: 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63  ators that indic
17a0: 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65  es are able to e
17b0: 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f  xploit.  An.** O
17c0: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
17d0: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
17e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
17f0: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
1800: 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ** terms in the 
1810: 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f  where clause..*/
1820: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20  .#define WO_IN  
1830: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 4f 5f     1.#define WO_
1840: 45 51 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65  EQ     2.#define
1850: 20 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45   WO_LT     (WO_E
1860: 51 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29  Q<<(TK_LT-TK_EQ)
1870: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20  ).#define WO_LE 
1880: 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f      (WO_EQ<<(TK_
1890: 4c 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69  LE-TK_EQ)).#defi
18a0: 6e 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f  ne WO_GT     (WO
18b0: 5f 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45  _EQ<<(TK_GT-TK_E
18c0: 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47  Q)).#define WO_G
18d0: 45 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  E     (WO_EQ<<(T
18e0: 4b 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_GE-TK_EQ)).#de
18f0: 66 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 36  fine WO_MATCH  6
1900: 34 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e  4.#define WO_ISN
1910: 55 4c 4c 20 31 32 38 0a 0a 2f 2a 0a 2a 2a 20 56  ULL 128../*.** V
1920: 61 6c 75 65 20 66 6f 72 20 66 6c 61 67 73 20 72  alue for flags r
1930: 65 74 75 72 6e 65 64 20 62 79 20 62 65 73 74 49  eturned by bestI
1940: 6e 64 65 78 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  ndex().  .**.** 
1950: 54 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66  The least signif
1960: 69 63 61 6e 74 20 62 79 74 65 20 69 73 20 72 65  icant byte is re
1970: 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73 6b  served as a mask
1980: 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73 20   for WO_ values 
1990: 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68  above..** The Wh
19a0: 65 72 65 4c 65 76 65 6c 2e 66 6c 61 67 73 20 66  ereLevel.flags f
19b0: 69 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20  ield is usually 
19c0: 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f  set to WO_IN|WO_
19d0: 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a  EQ|WO_ISNULL..**
19e0: 20 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c   But if the tabl
19f0: 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  e is the right t
1a00: 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a  able of a left j
1a10: 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e  oin, WhereLevel.
1a20: 66 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74 20  flags.** is set 
1a30: 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e 20  to WO_IN|WO_EQ. 
1a40: 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c 2e   The WhereLevel.
1a50: 66 6c 61 67 73 20 66 69 65 6c 64 20 63 61 6e 20  flags field can 
1a60: 74 68 65 6e 20 62 65 20 75 73 65 64 20 61 73 0a  then be used as.
1a70: 2a 2a 20 74 68 65 20 22 6f 70 22 20 70 61 72 61  ** the "op" para
1a80: 6d 65 74 65 72 20 74 6f 20 66 69 6e 64 54 65 72  meter to findTer
1a90: 6d 20 77 68 65 6e 20 77 65 20 61 72 65 20 72 65  m when we are re
1aa0: 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c 69 74 79  solving equality
1ab0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a   constraints..**
1ac0: 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69   ISNULL constrai
1ad0: 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e 20 6e 6f  nts will then no
1ae0: 74 20 62 65 20 75 73 65 64 20 6f 6e 20 74 68 65  t be used on the
1af0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
1b00: 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69 6e 2e 20  a left.** join. 
1b10: 20 54 69 63 6b 65 74 73 20 23 32 31 37 37 20 61   Tickets #2177 a
1b20: 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a 23 64 65  nd #2189..*/.#de
1b30: 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44  fine WHERE_ROWID
1b40: 5f 45 51 20 20 20 20 20 30 78 30 30 30 31 30 30  _EQ     0x000100
1b50: 20 20 20 2f 2a 20 72 6f 77 69 64 3d 45 58 50 52     /* rowid=EXPR
1b60: 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28 2e 2e   or rowid IN (..
1b70: 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  .) */.#define WH
1b80: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
1b90: 20 30 78 30 30 30 32 30 30 20 20 20 2f 2a 20 72   0x000200   /* r
1ba0: 6f 77 69 64 3c 45 58 50 52 20 61 6e 64 2f 6f 72  owid<EXPR and/or
1bb0: 20 72 6f 77 69 64 3e 45 58 50 52 20 2a 2f 0a 23   rowid>EXPR */.#
1bc0: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c  define WHERE_COL
1bd0: 55 4d 4e 5f 45 51 20 20 20 20 30 78 30 30 31 30  UMN_EQ    0x0010
1be0: 30 30 20 20 20 2f 2a 20 78 3d 45 58 50 52 20 6f  00   /* x=EXPR o
1bf0: 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  r x IN (...) */.
1c00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
1c10: 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 32  LUMN_RANGE 0x002
1c20: 30 30 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20  000   /* x<EXPR 
1c30: 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a 2f  and/or x>EXPR */
1c40: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
1c50: 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30 30  OLUMN_IN    0x00
1c60: 34 30 30 30 20 20 20 2f 2a 20 78 20 49 4e 20 28  4000   /* x IN (
1c70: 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ...) */.#define 
1c80: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
1c90: 20 20 20 30 78 30 31 30 30 30 30 20 20 20 2f 2a     0x010000   /*
1ca0: 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45 58   x<EXPR or x<=EX
1cb0: 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  PR constraint */
1cc0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 42  .#define WHERE_B
1cd0: 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 32  TM_LIMIT    0x02
1ce0: 30 30 30 30 20 20 20 2f 2a 20 78 3e 45 58 50 52  0000   /* x>EXPR
1cf0: 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f 6e 73   or x>=EXPR cons
1d00: 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e  traint */.#defin
1d10: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
1d20: 20 20 20 20 20 30 78 30 38 30 30 30 30 20 20 20       0x080000   
1d30: 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c  /* Use index onl
1d40: 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a  y - omit table *
1d50: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1d60: 4f 52 44 45 52 42 59 20 20 20 20 20 20 30 78 31  ORDERBY      0x1
1d70: 30 30 30 30 30 20 20 20 2f 2a 20 4f 75 74 70 75  00000   /* Outpu
1d80: 74 20 77 69 6c 6c 20 61 70 70 65 61 72 20 69 6e  t will appear in
1d90: 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 2a   correct order *
1da0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1db0: 52 45 56 45 52 53 45 20 20 20 20 20 20 30 78 32  REVERSE      0x2
1dc0: 30 30 30 30 30 20 20 20 2f 2a 20 53 63 61 6e 20  00000   /* Scan 
1dd0: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
1de0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1df0: 45 5f 55 4e 49 51 55 45 20 20 20 20 20 20 20 30  E_UNIQUE       0
1e00: 78 34 30 30 30 30 30 20 20 20 2f 2a 20 53 65 6c  x400000   /* Sel
1e10: 65 63 74 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61  ects no more tha
1e20: 6e 20 6f 6e 65 20 72 6f 77 20 2a 2f 0a 23 64 65  n one row */.#de
1e30: 66 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55  fine WHERE_VIRTU
1e40: 41 4c 54 41 42 4c 45 20 30 78 38 30 30 30 30 30  ALTABLE 0x800000
1e50: 20 20 20 2f 2a 20 55 73 65 20 76 69 72 74 75 61     /* Use virtua
1e60: 6c 2d 74 61 62 6c 65 20 70 72 6f 63 65 73 73 69  l-table processi
1e70: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ng */../*.** Ini
1e80: 74 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c  tialize a preall
1e90: 6f 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75  ocated WhereClau
1ea0: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
1eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
1ec0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20  reClauseInit(.  
1ed0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1ee0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
1ef0: 57 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62  WhereClause to b
1f00: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  e initialized */
1f10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f20: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1f30: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1f40: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b  xt */.  ExprMask
1f50: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20  Set *pMaskSet   
1f60: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
1f70: 20 74 61 62 6c 65 20 69 6e 64 69 63 65 73 20 74   table indices t
1f80: 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f 0a 29 7b  o bitmasks */.){
1f90: 0a 20 20 70 57 43 2d 3e 70 50 61 72 73 65 20 3d  .  pWC->pParse =
1fa0: 20 70 50 61 72 73 65 3b 0a 20 20 70 57 43 2d 3e   pParse;.  pWC->
1fb0: 70 4d 61 73 6b 53 65 74 20 3d 20 70 4d 61 73 6b  pMaskSet = pMask
1fc0: 53 65 74 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  Set;.  pWC->nTer
1fd0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
1fe0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1ff0: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
2000: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
2010: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Static;.}../*.**
2020: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
2030: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2040: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
2050: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2060: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
2070: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
2080: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
2090: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
20a0: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
20b0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
20c0: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
20d0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
20e0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
20f0: 72 6d 20 2a 61 3b 0a 20 20 66 6f 72 28 69 3d 70  rm *a;.  for(i=p
2100: 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70  WC->nTerm-1, a=p
2110: 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d  WC->a; i>=0; i--
2120: 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , a++){.    if( 
2130: 61 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  a->flags & TERM_
2140: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
2150: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2160: 74 65 28 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20  te(a->pExpr);.  
2170: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
2180: 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74  C->a!=pWC->aStat
2190: 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ic ){.    sqlite
21a0: 33 5f 66 72 65 65 28 70 57 43 2d 3e 61 29 3b 0a  3_free(pWC->a);.
21b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
21c0: 20 61 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74   a new entries t
21d0: 6f 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  o the WhereClaus
21e0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 6e  e structure.  In
21f0: 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
2200: 61 74 65 64 0a 2a 2a 20 73 70 61 63 65 20 61 73  ated.** space as
2210: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
2220: 2a 20 49 66 20 74 68 65 20 66 6c 61 67 73 20 61  * If the flags a
2230: 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65 73  rgument includes
2240: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20 74   TERM_DYNAMIC, t
2250: 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  hen responsibili
2260: 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69 6e  ty.** for freein
2270: 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  g the expression
2280: 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62 79   p is assumed by
2290: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
22a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 57   object..**.** W
22b0: 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f  ARNING:  This ro
22c0: 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c  utine might real
22d0: 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65  locate the space
22e0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
22f0: 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41  * WhereTerms.  A
2300: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57  ll pointers to W
2310: 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64  hereTerms should
2320: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
2330: 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67  after.** calling
2340: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
2350: 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d 61  Such pointers ma
2360: 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69 7a  y be reinitializ
2370: 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69 6e  ed by referencin
2380: 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b  g.** the pWC->a[
2390: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
23a0: 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61 75  ic int whereClau
23b0: 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43 6c  seInsert(WhereCl
23c0: 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20  ause *pWC, Expr 
23d0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
23e0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
23f0: 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rm;.  int idx;. 
2400: 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e   if( pWC->nTerm>
2410: 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20  =pWC->nSlot ){. 
2420: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
2430: 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20  ld = pWC->a;.   
2440: 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65   pWC->a = sqlite
2450: 33 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  3Malloc( sizeof(
2460: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
2470: 6e 53 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69  nSlot*2 );.    i
2480: 66 28 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a  f( pWC->a==0 ){.
2490: 20 20 20 20 20 20 70 57 43 2d 3e 70 50 61 72 73        pWC->pPars
24a0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
24b0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  led = 1;.      i
24c0: 66 28 20 66 6c 61 67 73 20 26 20 54 45 52 4d 5f  f( flags & TERM_
24d0: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
24e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
24f0: 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  lete(p);.      }
2500: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  .      pWC->a = 
2510: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 72 65 74 75  pOld;.      retu
2520: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
2530: 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c 20 70  memcpy(pWC->a, p
2540: 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  Old, sizeof(pWC-
2550: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54 65 72  >a[0])*pWC->nTer
2560: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  m);.    if( pOld
2570: 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29  !=pWC->aStatic )
2580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2590: 66 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20  free(pOld);.    
25a0: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
25b0: 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65   *= 2;.  }.  pTe
25c0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
25d0: 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a   = pWC->nTerm];.
25e0: 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 3b 0a    pWC->nTerm++;.
25f0: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
2600: 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66 6c 61   p;.  pTerm->fla
2610: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70 54  gs = flags;.  pT
2620: 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  erm->pWC = pWC;.
2630: 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74    pTerm->iParent
2640: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
2650: 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  idx;.}../*.** Th
2660: 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74  is routine ident
2670: 69 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73  ifies subexpress
2680: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
2690: 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a  E clause where.*
26a0: 2a 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73  * each subexpres
26b0: 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
26c0: 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65  d by the AND ope
26d0: 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20 6f 74  rator or some ot
26e0: 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  her.** operator 
26f0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2700: 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e 20 20   op parameter.  
2710: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
2720: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 73 20  structure.** is 
2730: 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f 69 6e  filled with poin
2740: 74 65 72 73 20 74 6f 20 73 75 62 65 78 70 72 65  ters to subexpre
2750: 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65 78 61  ssions.  For exa
2760: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 57  mple:.**.**    W
2770: 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c 6f 27  HERE  a=='hello'
2780: 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 62 2c   AND coalesce(b,
2790: 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b 31 32  11)<10 AND (c+12
27a0: 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a 2a 2a  !=d OR c==22).**
27b0: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
27c0: 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f  ____/     \_____
27d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
27e0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
27f0: 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
2800: 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20 20 20   slot[0]        
2810: 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20 20 20      slot[1]     
2820: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 32            slot[2
2830: 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ].**.** The orig
2840: 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  inal WHERE claus
2850: 65 20 69 6e 20 70 45 78 70 72 20 69 73 20 75 6e  e in pExpr is un
2860: 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20 74 68  altered.  All th
2870: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
2880: 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f 74 5b  es is make slot[
2890: 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e 74 20  ] entries point 
28a0: 74 6f 20 73 75 62 73 74 72 75 63 74 75 72 65 20  to substructure 
28b0: 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a 2a 2a  within pExpr..**
28c0: 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65 76 69  .** In the previ
28d0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61 6e 64  ous sentence and
28e0: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 2c   in the diagram,
28f0: 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65 72 73   "slot[]" refers
2900: 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65 72 65   to.** the Where
2910: 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72 61 79  Clause.a[] array
2920: 2e 20 20 54 68 69 73 20 61 72 72 61 79 20 67 72  .  This array gr
2930: 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f  ows as needed to
2940: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20   contain.** all 
2950: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
2960: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  RE clause..*/.st
2970: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53  atic void whereS
2980: 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65  plit(WhereClause
2990: 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78   *pWC, Expr *pEx
29a0: 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69  pr, int op){.  i
29b0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
29c0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
29d0: 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20  r->op!=op ){.   
29e0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
29f0: 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30  rt(pWC, pExpr, 0
2a00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a10: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
2a20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70  pExpr->pLeft, op
2a30: 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  );.    whereSpli
2a40: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52  t(pWC, pExpr->pR
2a50: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
2a60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2a70: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
2a80: 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65   mask set.*/.#de
2a90: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
2aa0: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
2ab0: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
2ac0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2ad0: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
2ae0: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
2af0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
2b00: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
2b10: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
2b20: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
2b30: 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61  k getMask(ExprMa
2b40: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2b50: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2b60: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2b70: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
2b80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2b90: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
2ba0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
2bb0: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
2bc0: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
2bd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2bf0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
2c00: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
2c10: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  *.** There is on
2c20: 65 20 63 75 72 73 6f 72 20 70 65 72 20 74 61 62  e cursor per tab
2c30: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
2c40: 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75 6d 62  lause.  The numb
2c50: 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65 73 20  er of.** tables 
2c60: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2c70: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
2c80: 20 61 20 74 65 73 74 20 65 61 72 6c 79 20 69 6e   a test early in
2c90: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 57   the.** sqlite3W
2ca0: 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f 75 74  hereBegin() rout
2cb0: 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e 6f 77  ine.  So we know
2cc0: 20 74 68 61 74 20 74 68 65 20 70 4d 61 73 6b 53   that the pMaskS
2cd0: 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72 72 61  et->ix[].** arra
2ce0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  y will never ove
2cf0: 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  rflow..*/.static
2d00: 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b   void createMask
2d10: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2d20: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
2d30: 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  sor){.  assert( 
2d40: 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72  pMaskSet->n < Ar
2d50: 72 61 79 53 69 7a 65 28 70 4d 61 73 6b 53 65 74  raySize(pMaskSet
2d60: 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b  ->ix) );.  pMask
2d70: 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74  Set->ix[pMaskSet
2d80: 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72  ->n++] = iCursor
2d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2da0: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
2db0: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
2dc0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
2dd0: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
2de0: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
2df0: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
2e00: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
2e10: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
2e20: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
2e30: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
2e40: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
2e50: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
2e60: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
2e70: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
2e80: 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72  oked sqlite3Expr
2e90: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 6f  ResolveNames() o
2ea0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2eb0: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
2ec0: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
2ed0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
2ee0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2ef0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
2f00: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
2f10: 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  veNames() routin
2f20: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
2f30: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
2f40: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
2f50: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
2f60: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
2f70: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
2f80: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
2f90: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
2fa0: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  e table.  This r
2fb0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61 73 20  outine just has 
2fc0: 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 20  to.** translate 
2fd0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
2fe0: 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73 6b 20  rs into bitmask 
2ff0: 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20 61 6c  values and OR al
3000: 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b  l.** the bitmask
3010: 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 73  s together..*/.s
3020: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
3030: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
3040: 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 45  (ExprMaskSet*, E
3050: 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
3060: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65  c Bitmask exprSe
3070: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 45  lectTableUsage(E
3080: 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53 65 6c  xprMaskSet*, Sel
3090: 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20 42 69  ect*);.static Bi
30a0: 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55  tmask exprTableU
30b0: 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74  sage(ExprMaskSet
30c0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
30d0: 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20   *p){.  Bitmask 
30e0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20  mask = 0;.  if( 
30f0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3100: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
3110: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d  _COLUMN ){.    m
3120: 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d  ask = getMask(pM
3130: 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c  askSet, p->iTabl
3140: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  e);.    return m
3150: 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20  ask;.  }.  mask 
3160: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
3170: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52  (pMaskSet, p->pR
3180: 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  ight);.  mask |=
3190: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
31a0: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65  pMaskSet, p->pLe
31b0: 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65  ft);.  mask |= e
31c0: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
31d0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
31e0: 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  List);.  mask |=
31f0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
3200: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
3210: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  p->pSelect);.  r
3220: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
3230: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
3240: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
3250: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
3260: 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73 74 20  skSet, ExprList 
3270: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
3280: 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  ;.  Bitmask mask
3290: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 0;.  if( pLis
32a0: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
32b0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
32c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61  ; i++){.      ma
32d0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
32e0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
32f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
3300: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
3310: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74  eturn mask;.}.st
3320: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
3330: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
3340: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  e(ExprMaskSet *p
3350: 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63 74 20  MaskSet, Select 
3360: 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20  *pS){.  Bitmask 
3370: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 77 68 69 6c  mask = 0;.  whil
3380: 65 28 20 70 53 20 29 7b 0a 20 20 20 20 6d 61 73  e( pS ){.    mas
3390: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
33a0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
33b0: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  , pS->pEList);. 
33c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
33d0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
33e0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f  askSet, pS->pGro
33f0: 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  upBy);.    mask 
3400: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
3410: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
3420: 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  pS->pOrderBy);. 
3430: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
3440: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
3450: 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b  et, pS->pWhere);
3460: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
3470: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
3480: 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e  kSet, pS->pHavin
3490: 67 29 3b 0a 20 20 20 20 70 53 20 3d 20 70 53 2d  g);.    pS = pS-
34a0: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72  >pPrior;.  }.  r
34b0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f  eturn mask;.}../
34c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
34d0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70   if the given op
34e0: 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66  erator is one of
34f0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
3500: 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65  hat is.** allowe
3510: 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62  d for an indexab
3520: 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  le WHERE clause 
3530: 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77  term.  The allow
3540: 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ed operators are
3550: 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e  .** "=", "<", ">
3560: 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61  ", "<=", ">=", a
3570: 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74  nd "IN"..*/.stat
3580: 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70  ic int allowedOp
3590: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65  (int op){.  asse
35a0: 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20  rt( TK_GT>TK_EQ 
35b0: 26 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29  && TK_GT<TK_GE )
35c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
35d0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54  T>TK_EQ && TK_LT
35e0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
35f0: 72 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20  rt( TK_LE>TK_EQ 
3600: 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29  && TK_LE<TK_GE )
3610: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  ;.  assert( TK_G
3620: 45 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20  E==TK_EQ+4 );.  
3630: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
3640: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
3650: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 20 7c 7c 20  & op<=TK_GE) || 
3660: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 3b 0a 7d  op==TK_ISNULL;.}
3670: 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f  ../*.** Swap two
3680: 20 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65   objects of type
3690: 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53   T..*/.#define S
36a0: 57 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54  WAP(TYPE,A,B) {T
36b0: 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d  YPE t=A; A=B; B=
36c0: 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75  t;}../*.** Commu
36d0: 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  te a comparison 
36e0: 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65  operator.  Expre
36f0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
3700: 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61  rm "X op Y".** a
3710: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
3720: 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a  o "Y op X"..**.*
3730: 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  * If a collation
3740: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 73 73   sequence is ass
3750: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 69 74  ociated with eit
3760: 68 65 72 20 74 68 65 20 6c 65 66 74 20 6f 72 20  her the left or 
3770: 72 69 67 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66  right.** side of
3780: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c   the comparison,
3790: 20 69 74 20 72 65 6d 61 69 6e 73 20 61 73 73 6f   it remains asso
37a0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
37b0: 73 61 6d 65 20 73 69 64 65 20 61 66 74 65 72 0a  same side after.
37c0: 2a 2a 20 74 68 65 20 63 6f 6d 6d 75 74 61 74 69  ** the commutati
37d0: 6f 6e 2e 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74  on. So "Y collat
37e0: 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62  e NOCASE op X" b
37f0: 65 63 6f 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f  ecomes .** "X co
3800: 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f 70 20  llate NOCASE op 
3810: 59 22 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  Y". This is beca
3820: 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f  use any collatio
3830: 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a  n sequence on.**
3840: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 73   the left hand s
3850: 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  ide of a compari
3860: 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  son overrides an
3870: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
3880: 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68 65  ence .** attache
3890: 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  d to the right. 
38a0: 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65 61  For the same rea
38b0: 73 6f 6e 20 74 68 65 20 45 50 5f 45 78 70 43 6f  son the EP_ExpCo
38c0: 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73  llate flag.** is
38d0: 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a   not commuted..*
38e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
38f0: 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20 2a  prCommute(Expr *
3900: 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78  pExpr){.  u16 ex
3910: 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d  pRight = (pExpr-
3920: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
3930: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b   EP_ExpCollate);
3940: 0a 20 20 75 31 36 20 65 78 70 4c 65 66 74 20 3d  .  u16 expLeft =
3950: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
3960: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
3970: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
3980: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
3990: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
39a0: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
39b0: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
39c0: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
39d0: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
39e0: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72  >pColl);.  pExpr
39f0: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
3a00: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
3a10: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
3a20: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c  pCollate) | expL
3a30: 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  eft;.  pExpr->pL
3a40: 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  eft->flags = (pE
3a50: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
3a60: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
3a70: 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a  te) | expRight;.
3a80: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
3a90: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
3aa0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
3ab0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
3ac0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
3ad0: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
3ae0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3af0: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
3b00: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
3b10: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
3b20: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
3b30: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
3b40: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3b50: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
3b60: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
3b70: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
3b80: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
3b90: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
3ba0: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
3bb0: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
3bc0: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
3bd0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
3be0: 74 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  t operatorMask(i
3bf0: 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 63 3b  nt op){.  int c;
3c00: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
3c10: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
3c20: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
3c30: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
3c40: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
3c50: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
3c60: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
3c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20 57  }else{.    c = W
3c80: 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29  O_EQ<<(op-TK_EQ)
3c90: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3ca0: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
3cb0: 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b   c==WO_ISNULL );
3cc0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3cd0: 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e  K_IN || c==WO_IN
3ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3cf0: 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f  !=TK_EQ || c==WO
3d00: 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _EQ );.  assert(
3d10: 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d   op!=TK_LT || c=
3d20: 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65  =WO_LT );.  asse
3d30: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  rt( op!=TK_LE ||
3d40: 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61   c==WO_LE );.  a
3d50: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54  ssert( op!=TK_GT
3d60: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a   || c==WO_GT );.
3d70: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3d80: 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20  _GE || c==WO_GE 
3d90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
3da0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
3db0: 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  or a term in the
3dc0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
3dd0: 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  at is of the for
3de0: 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  m "X <op> <expr>
3df0: 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20  ".** where X is 
3e00: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
3e10: 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  he iColumn of ta
3e20: 62 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70  ble iCur and <op
3e30: 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74  > is one of.** t
3e40: 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f  he WO_xx operato
3e50: 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65  r codes specifie
3e60: 64 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61  d by the op para
3e70: 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  meter..** Return
3e80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3e90: 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20  e term.  Return 
3ea0: 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  0 if not found..
3eb0: 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54  */.static WhereT
3ec0: 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20  erm *findTerm(. 
3ed0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3ee0: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
3ef0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
3f00: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
3f10: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
3f20: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
3f30: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
3f40: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3f50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3f60: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3f70: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3f80: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3f90: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3fa0: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3fb0: 6b 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20  k */.  u16 op,  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fd0: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3fe0: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
3ff0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
4000: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
4010: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
4020: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
4030: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
4040: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
4050: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
4060: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65  .  int k;.  asse
4070: 72 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20  rt( iCur>=0 );. 
4080: 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
4090: 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, k=pWC->nTerm;
40a0: 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b   k; k--, pTerm++
40b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
40c0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
40d0: 75 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54  ur.       && (pT
40e0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
40f0: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a   & notReady)==0.
4100: 20 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d         && pTerm-
4110: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f  >leftColumn==iCo
4120: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20 28  lumn.       && (
4130: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
4140: 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29 7b   & op)!=0.    ){
4150: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 20  .      if( pIdx 
4160: 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
4170: 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor!=WO_ISNULL )
4180: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
4190: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
41a0: 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  r;.        CollS
41b0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
41c0: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a     char idxaff;.
41d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
41e0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
41f0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
4200: 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78  se;..        idx
4210: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
4220: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
4230: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
4240: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4250: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
4260: 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f  pX, idxaff) ) co
4270: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
4280: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
4290: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
42a0: 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20 66  uence required f
42b0: 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  rom an index for
42c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74  .        ** it t
42d0: 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20  o be useful for 
42e0: 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65  optimising expre
42f0: 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20  ssion pX. Store 
4300: 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
4310: 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c  value in variabl
4320: 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20  e pColl..       
4330: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
4340: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
4350: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
4360: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
4370: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
4380: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
4390: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
43a0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
43b0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
43c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
43d0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
43e0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
43f0: 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f  (j=0; pIdx->aiCo
4400: 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e  lumn[j]!=iColumn
4410: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4420: 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70    if( NEVER(j>=p
4430: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
4440: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
4450: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
4460: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4470: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  Coll->zName, pId
4480: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20  x->azColl[j]) ) 
4490: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
44a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
44b0: 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Term;.    }.  }.
44c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
44d0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
44e0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
44f0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53  id exprAnalyze(S
4500: 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c  rcList*, WhereCl
4510: 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  ause*, int);../*
4520: 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61  .** Call exprAna
4530: 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  lyze on all term
4540: 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61  s in a WHERE cla
4550: 75 73 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a  use.  .**.**.*/.
4560: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4570: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
4580: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4590: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
45a0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
45b0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
45c0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
45d0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
45e0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
45f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4600: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
4610: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
4620: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
4630: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
4640: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
4650: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
4660: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
4670: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
4680: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
4690: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
46a0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
46b0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
46c0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
46d0: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
46e0: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
46f0: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
4700: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
4710: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
4720: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
4730: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
4740: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
4750: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
4760: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
4770: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
4780: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
4790: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
47a0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
47b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
47c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
47d0: 62 61 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  base */.  Expr *
47e0: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
47f0: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
4800: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ion */.  int *pn
4810: 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75  Pattern,   /* Nu
4820: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64  mber of non-wild
4830: 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72  card prefix char
4840: 61 63 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  acters */.  int 
4850: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a  *pisComplete, /*
4860: 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c   True if the onl
4870: 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20  y wildcard is % 
4880: 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  in the last char
4890: 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  acter */.  int *
48a0: 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20  pnoCase      /* 
48b0: 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73  True if uppercas
48c0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
48d0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  to lowercase */.
48e0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
48f0: 2a 7a 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  *z;.  Expr *pRig
4900: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 45 78  ht, *pLeft;.  Ex
4910: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
4920: 20 69 6e 74 20 63 2c 20 63 6e 74 3b 0a 20 20 63   int c, cnt;.  c
4930: 68 61 72 20 77 63 5b 33 5d 3b 0a 20 20 43 6f 6c  har wc[3];.  Col
4940: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
4950: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 4c 69  if( !sqlite3IsLi
4960: 6b 65 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70  keFunction(db, p
4970: 45 78 70 72 2c 20 70 6e 6f 43 61 73 65 2c 20 77  Expr, pnoCase, w
4980: 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
4990: 20 30 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53   0;.  }.#ifdef S
49a0: 51 4c 49 54 45 5f 45 42 43 44 49 43 0a 20 20 69  QLITE_EBCDIC.  i
49b0: 66 28 20 2a 70 6e 6f 43 61 73 65 20 29 20 72 65  f( *pnoCase ) re
49c0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
49d0: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
49e0: 70 4c 69 73 74 3b 0a 20 20 70 52 69 67 68 74 20  pList;.  pRight 
49f0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
4a00: 78 70 72 3b 0a 20 20 69 66 28 20 70 52 69 67 68  xpr;.  if( pRigh
4a10: 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  t->op!=TK_STRING
4a20: 0a 20 20 20 26 26 20 28 70 52 69 67 68 74 2d 3e  .   && (pRight->
4a30: 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
4a40: 7c 7c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  || pRight->iColu
4a50: 6d 6e 21 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29  mn!=TK_STRING) )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4a70: 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c    }.  pLeft = pL
4a80: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
4a90: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
4aa0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
4ab0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4ac0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  .  pColl = pLeft
4ad0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72  ->pColl;.  asser
4ae0: 74 28 20 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70  t( pColl!=0 || p
4af0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  Left->iColumn==-
4b00: 31 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  1 );.  if( pColl
4b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
4b20: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65   collation is de
4b30: 66 69 6e 65 64 20 66 6f 72 20 74 68 65 20 52 4f  fined for the RO
4b40: 57 49 44 2e 20 20 55 73 65 20 74 68 65 20 64 65  WID.  Use the de
4b50: 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43  fault. */.    pC
4b60: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
4b70: 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  oll;.  }.  if( (
4b80: 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c  pColl->type!=SQL
4b90: 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20  ITE_COLL_BINARY 
4ba0: 7c 7c 20 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a  || *pnoCase) &&.
4bb0: 20 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79        (pColl->ty
4bc0: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
4bd0: 4e 4f 43 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43  NOCASE || !*pnoC
4be0: 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ase) ){.    retu
4bf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
4c00: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 64  te3DequoteExpr(d
4c10: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7a 20  b, pRight);.  z 
4c20: 3d 20 28 63 68 61 72 20 2a 29 70 52 69 67 68 74  = (char *)pRight
4c30: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74  ->token.z;.  cnt
4c40: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b   = 0;.  if( z ){
4c50: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
4c60: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
4c70: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
4c80: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
4c90: 20 63 6e 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20   cnt++; }.  }.  
4ca0: 69 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35  if( cnt==0 || 25
4cb0: 35 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b  5==(u8)z[cnt] ){
4cc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4cd0: 20 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74   }.  *pisComplet
4ce0: 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30  e = z[cnt]==wc[0
4cf0: 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30  ] && z[cnt+1]==0
4d00: 3b 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d  ;.  *pnPattern =
4d10: 20 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31   cnt;.  return 1
4d20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4d30: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
4d40: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
4d50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4d60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4d70: 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  E./*.** Check to
4d80: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
4d90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4da0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
4db0: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
4dc0: 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a   MATCH expr.**.*
4dd0: 2a 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20  * If it is then 
4de0: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66  return TRUE.  If
4df0: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c   not, return FAL
4e00: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
4e10: 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  t isMatchOfColum
4e20: 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  n(.  Expr *pExpr
4e30: 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68        /* Test th
4e40: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
4e50: 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
4e60: 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  pList;..  if( pE
4e70: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43  xpr->op!=TK_FUNC
4e80: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  TION ){.    retu
4e90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
4ea0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
4eb0: 35 20 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c 69  5 ||.       sqli
4ec0: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 6f 6e  te3StrNICmp((con
4ed0: 73 74 20 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  st char*)pExpr->
4ee0: 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c  token.z,"match",
4ef0: 35 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  5)!=0 ){.    ret
4f00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
4f10: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
4f20: 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  t;.  if( pList->
4f30: 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20  nExpr!=2 ){.    
4f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4f50: 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  if( pList->a[1].
4f60: 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f  pExpr->op != TK_
4f70: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
4f80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
4f90: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4fa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4fb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
4fc0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42  ./*.** If the pB
4fd0: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  ase expression o
4fe0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
4ff0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
5000: 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e  use of.** a join
5010: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
5020: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
5030: 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f  markings over to
5040: 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61   derived..*/.sta
5050: 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65  tic void transfe
5060: 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78  rJoinMarkings(Ex
5070: 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78  pr *pDerived, Ex
5080: 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44  pr *pBase){.  pD
5090: 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d  erived->flags |=
50a0: 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20   pBase->flags & 
50b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70  EP_FromJoin;.  p
50c0: 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a  Derived->iRightJ
50d0: 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65  oinTable = pBase
50e0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
50f0: 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  e;.}..#if !defin
5100: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
5110: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
5120: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
5130: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5140: 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  )./*.** Return T
5150: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5160: 20 74 65 72 6d 20 6f 66 20 61 6e 20 4f 52 20 63   term of an OR c
5170: 6c 61 75 73 65 20 63 61 6e 20 62 65 20 63 6f 6e  lause can be con
5180: 76 65 72 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  verted.** into a
5190: 6e 20 49 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  n IN clause.  Th
51a0: 65 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43  e iCursor and iC
51b0: 6f 6c 75 6d 6e 20 64 65 66 69 6e 65 20 74 68 65  olumn define the
51c0: 20 6c 65 66 74 2d 68 61 6e 64 0a 2a 2a 20 73 69   left-hand.** si
51d0: 64 65 20 6f 66 20 74 68 65 20 49 4e 20 63 6c 61  de of the IN cla
51e0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  use..**.** The c
51f0: 6f 6e 74 65 78 74 20 69 73 20 74 68 61 74 20 77  ontext is that w
5200: 65 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  e have multiple 
5210: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 65 71 75  OR-connected equ
5220: 61 6c 69 74 79 20 74 65 72 6d 73 0a 2a 2a 20 6c  ality terms.** l
5230: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
5240: 20 20 20 20 20 20 20 20 20 20 61 3d 3c 65 78 70            a=<exp
5250: 72 31 3e 20 4f 52 20 20 61 3d 3c 65 78 70 72 32  r1> OR  a=<expr2
5260: 3e 20 4f 52 20 62 3d 3c 65 78 70 72 33 3e 20 20  > OR b=<expr3>  
5270: 4f 52 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  OR ....**.** The
5280: 20 70 4f 72 54 65 72 6d 20 69 6e 70 75 74 20 74   pOrTerm input t
5290: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  o this routine c
52a0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20  orresponds to a 
52b0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 0a 2a  single term of.*
52c0: 2a 20 74 68 69 73 20 4f 52 20 63 6c 61 75 73 65  * this OR clause
52d0: 2e 20 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  .  In order for 
52e0: 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61  the term to be a
52f0: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 0a 2a   candidate for.*
5300: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20  * conversion to 
5310: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20  an IN operator, 
5320: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75  the following mu
5330: 73 74 20 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  st be true:.**.*
5340: 2a 20 20 20 20 20 2a 20 20 54 68 65 20 6c 65 66  *     *  The lef
5350: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
5360: 68 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  he term must be 
5370: 74 68 65 20 63 6f 6c 75 6d 6e 20 77 68 69 63 68  the column which
5380: 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 69 64  .**        is id
5390: 65 6e 74 69 66 69 65 64 20 62 79 20 69 43 75 72  entified by iCur
53a0: 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e  sor and iColumn.
53b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 49 66  .**.**     *  If
53c0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
53d0: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
53e0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
53f0: 61 66 66 69 6e 69 74 69 65 73 0a 2a 2a 20 20 20  affinities.**   
5400: 20 20 20 20 20 6f 66 20 62 6f 74 68 20 72 69 67       of both rig
5410: 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64 65  ht and left side
5420: 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20 74  s must be such t
5430: 68 61 74 20 6e 6f 20 74 79 70 65 0a 2a 2a 20 20  hat no type.**  
5440: 20 20 20 20 20 20 63 6f 6e 76 65 72 73 69 6f 6e        conversion
5450: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  s are required o
5460: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54  n the right.  (T
5470: 69 63 6b 65 74 20 23 32 32 34 39 29 0a 2a 2a 0a  icket #2249).**.
5480: 2a 2a 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68  ** If both of th
5490: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ese conditions a
54a0: 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 72 65  re true, then re
54b0: 74 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65  turn true.  Othe
54c0: 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
54d0: 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
54e0: 20 69 6e 74 20 6f 72 54 65 72 6d 49 73 4f 70 74   int orTermIsOpt
54f0: 43 61 6e 64 69 64 61 74 65 28 57 68 65 72 65 54  Candidate(WhereT
5500: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 2c 20 69 6e  erm *pOrTerm, in
5510: 74 20 69 43 75 72 73 6f 72 2c 20 69 6e 74 20 69  t iCursor, int i
5520: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 61  Column){.  int a
5530: 66 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74  ffLeft, affRight
5540: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 54  ;.  assert( pOrT
5550: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
5560: 57 4f 5f 45 51 20 29 3b 0a 20 20 69 66 28 20 70  WO_EQ );.  if( p
5570: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
5580: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
5590: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
55a0: 0a 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  .  if( pOrTerm->
55b0: 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  leftColumn!=iCol
55c0: 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  umn ){.    retur
55d0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 66 66 52 69  n 0;.  }.  affRi
55e0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
55f0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
5600: 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
5610: 29 3b 0a 20 20 69 66 28 20 61 66 66 52 69 67 68  );.  if( affRigh
5620: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
5630: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 66 66 4c  rn 1;.  }.  affL
5640: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
5650: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
5660: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
5670: 3b 0a 20 20 69 66 28 20 61 66 66 52 69 67 68 74  ;.  if( affRight
5680: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
5690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
56a0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
56b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
56c0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 74 65 72  if the given ter
56d0: 6d 20 6f 66 20 61 6e 20 4f 52 20 63 6c 61 75 73  m of an OR claus
56e0: 65 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  e can be ignored
56f0: 20 64 75 72 69 6e 67 0a 2a 2a 20 61 20 63 68 65   during.** a che
5700: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
5710: 61 6c 6c 20 4f 52 20 74 65 72 6d 73 20 61 72 65  all OR terms are
5720: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
5730: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
5740: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
5750: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
5760: 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6f 72  a call to the or
5770: 54 65 72 6d 49 73 4f 70 74 43 61 6e 64 69 64 61  TermIsOptCandida
5780: 74 65 28 29 0a 2a 2a 20 61 62 6f 76 65 20 72 65  te().** above re
5790: 74 75 72 6e 65 64 20 66 61 6c 73 65 20 62 75 74  turned false but
57a0: 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
57b0: 73 61 72 79 20 74 6f 20 64 69 73 71 75 61 6c 69  sary to disquali
57c0: 66 79 20 74 68 65 0a 2a 2a 20 6f 70 74 69 6d 69  fy the.** optimi
57d0: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  zation..**.** Su
57e0: 70 70 6f 73 65 20 74 68 65 20 6f 72 69 67 69 6e  ppose the origin
57f0: 61 6c 20 4f 52 20 70 68 72 61 73 65 20 77 61 73  al OR phrase was
5800: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
5810: 20 20 20 20 20 20 20 61 3d 34 20 20 4f 52 20 20         a=4  OR  
5820: 61 3d 31 31 20 20 4f 52 20 20 61 3d 62 0a 2a 2a  a=11  OR  a=b.**
5830: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 6e 61 6c 79  .** During analy
5840: 73 69 73 2c 20 74 68 65 20 74 68 69 72 64 20 74  sis, the third t
5850: 65 72 6d 20 67 65 74 73 20 66 6c 69 70 70 65 64  erm gets flipped
5860: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 75 70 6c   around and dupl
5870: 69 63 61 74 65 0a 2a 2a 20 73 6f 20 74 68 61 74  icate.** so that
5880: 20 77 65 20 61 72 65 20 6c 65 66 74 20 77 69 74   we are left wit
5890: 68 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  h this:.**.**   
58a0: 20 20 20 20 20 20 20 20 61 3d 34 20 20 4f 52 20          a=4  OR 
58b0: 20 61 3d 31 31 20 20 4f 52 20 20 61 3d 62 20 20   a=11  OR  a=b  
58c0: 4f 52 20 20 62 3d 61 0a 2a 2a 0a 2a 2a 20 53 69  OR  b=a.**.** Si
58d0: 6e 63 65 20 74 68 65 20 6c 61 73 74 20 74 77 6f  nce the last two
58e0: 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69   terms are dupli
58f0: 63 61 74 65 73 2c 20 6f 6e 6c 79 20 6f 6e 65 20  cates, only one 
5900: 6f 66 20 74 68 65 6d 0a 2a 2a 20 68 61 73 20 74  of them.** has t
5910: 6f 20 71 75 61 6c 69 66 79 20 69 6e 20 6f 72 64  o qualify in ord
5920: 65 72 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65  er for the whole
5930: 20 70 68 72 61 73 65 20 74 6f 20 71 75 61 6c 69   phrase to quali
5940: 66 79 2e 20 20 57 68 65 6e 0a 2a 2a 20 74 68 69  fy.  When.** thi
5950: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5960: 6c 65 64 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61  led, we know tha
5970: 74 20 70 4f 72 54 65 72 6d 20 64 69 64 20 6e 6f  t pOrTerm did no
5980: 74 20 71 75 61 6c 69 66 79 2e 0a 2a 2a 20 54 68  t qualify..** Th
5990: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
59a0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
59b0: 69 66 20 70 4f 72 54 65 72 6d 20 68 61 73 20 61  if pOrTerm has a
59c0: 20 64 75 70 6c 69 63 61 74 65 20 74 68 61 74 0a   duplicate that.
59d0: 2a 2a 20 6d 69 67 68 74 20 71 75 61 6c 69 66 79  ** might qualify
59e0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
59f0: 20 64 75 70 6c 69 63 61 74 65 20 74 68 61 74 20   duplicate that 
5a00: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
5a10: 0a 2a 2a 20 64 69 73 71 75 61 6c 69 66 69 65 64  .** disqualified
5a20: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 72  , then return tr
5a30: 75 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ue.  If there ar
5a40: 65 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 73 2c  e no duplicates,
5a50: 20 6f 72 0a 2a 2a 20 74 68 65 20 64 75 70 6c 69   or.** the dupli
5a60: 63 61 74 65 20 68 61 73 20 61 6c 73 6f 20 62 65  cate has also be
5a70: 65 6e 20 64 69 73 71 75 61 6c 69 66 69 65 64 2c  en disqualified,
5a80: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
5a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 72 54  /.static int orT
5aa0: 65 72 6d 48 61 73 4f 6b 44 75 70 6c 69 63 61 74  ermHasOkDuplicat
5ab0: 65 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  e(WhereClause *p
5ac0: 4f 72 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70  Or, WhereTerm *p
5ad0: 4f 72 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  OrTerm){.  if( p
5ae0: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  OrTerm->flags & 
5af0: 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20  TERM_COPIED ){. 
5b00: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
5b10: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e  e original term.
5b20: 20 20 54 68 65 20 64 75 70 6c 69 63 61 74 65 20    The duplicate 
5b30: 69 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 68  is to the left h
5b40: 61 64 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  ad.    ** has no
5b50: 74 20 79 65 74 20 62 65 65 6e 20 61 6e 61 6c 79  t yet been analy
5b60: 7a 65 64 20 61 6e 64 20 74 68 75 73 20 68 61 73  zed and thus has
5b70: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 64 69   not yet been di
5b80: 73 71 75 61 6c 69 66 69 65 64 2e 20 2a 2f 0a 20  squalified. */. 
5b90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5ba0: 0a 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d  .  if( (pOrTerm-
5bb0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  >flags & TERM_VI
5bc0: 52 54 55 41 4c 29 21 3d 30 0a 20 20 20 20 20 26  RTUAL)!=0.     &
5bd0: 26 20 28 70 4f 72 2d 3e 61 5b 70 4f 72 54 65 72  & (pOr->a[pOrTer
5be0: 6d 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61 67  m->iParent].flag
5bf0: 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21  s & TERM_OR_OK)!
5c00: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
5c10: 73 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  s is a duplicate
5c20: 20 74 65 72 6d 2e 20 20 54 68 65 20 6f 72 69 67   term.  The orig
5c30: 69 6e 61 6c 20 71 75 61 6c 69 66 69 65 64 20 73  inal qualified s
5c40: 6f 20 74 68 69 73 20 6f 6e 65 0a 20 20 20 20 2a  o this one.    *
5c50: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
5c60: 74 6f 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  to. */.    retur
5c70: 6e 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 1;.  }.  /* Th
5c80: 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 73  is is either a s
5c90: 69 6e 67 6c 65 74 6f 6e 20 74 65 72 6d 20 6f 72  ingleton term or
5ca0: 20 65 6c 73 65 20 69 74 20 69 73 20 61 20 64 75   else it is a du
5cb0: 70 6c 69 63 61 74 65 20 66 6f 72 0a 20 20 2a 2a  plicate for.  **
5cc0: 20 77 68 69 63 68 20 74 68 65 20 6f 72 69 67 69   which the origi
5cd0: 6e 61 6c 20 64 69 64 20 6e 6f 74 20 71 75 61 6c  nal did not qual
5ce0: 69 66 79 2e 20 20 45 69 74 68 65 72 20 77 61 79  ify.  Either way
5cf0: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 66 6f 72   we are done for
5d00: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
5d10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
5d20: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
5d30: 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51  IMIZATION && !SQ
5d40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5d50: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  RY */../*.** The
5d60: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
5d70: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
5d80: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
5d90: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
5da0: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
5db0: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
5dc0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
5dd0: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
5de0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
5df0: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
5e00: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
5e10: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
5e20: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
5e30: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
5e40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5e50: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
5e60: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
5e70: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
5e80: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
5e90: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
5ea0: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20  p> <expr>".  If 
5eb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
5ec0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
5ed0: 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72   "X <op> Y" wher
5ee0: 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61  e both X and Y a
5ef0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
5f00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
5f10: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
5f20: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e  nchanged and a n
5f30: 65 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65  ew virtual expre
5f40: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ssion of the for
5f50: 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20  m.** "Y <op> X" 
5f60: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
5f70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
5f80: 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61   analyzed separa
5f90: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
5fa0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
5fb0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
5fc0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
5fd0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5fe0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
5ff0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
6000: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
6010: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
6020: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
6030: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
6040: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
6050: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
6060: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
6070: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  .  ExprMaskSet *
6080: 70 4d 61 73 6b 53 65 74 3b 0a 20 20 45 78 70 72  pMaskSet;.  Expr
6090: 20 2a 70 45 78 70 72 3b 0a 20 20 42 69 74 6d 61   *pExpr;.  Bitma
60a0: 73 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20  sk prereqLeft;. 
60b0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
60c0: 6c 6c 3b 0a 20 20 42 69 74 6d 61 73 6b 20 65 78  ll;.  Bitmask ex
60d0: 74 72 61 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  traRight = 0;.  
60e0: 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  int nPattern;.  
60f0: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a  int isComplete;.
6100: 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a 20 20    int noCase;.  
6110: 69 6e 74 20 6f 70 3b 0a 20 20 50 61 72 73 65 20  int op;.  Parse 
6120: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
6130: 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
6140: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6150: 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
6160: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
6170: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6180: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
6190: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73  idxTerm];.  pMas
61a0: 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61 73  kSet = pWC->pMas
61b0: 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20  kSet;.  pExpr = 
61c0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
61d0: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
61e0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
61f0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
6200: 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  ft);.  op = pExp
6210: 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  r->op;.  if( op=
6220: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
6230: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
6240: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ght==0 );.    pT
6250: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
6260: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
6270: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
6280: 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 0a 20 20  pExpr->pList).  
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 20 20 20 7c 20 65 78 70 72 53 65          | exprSe
62b0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
62c0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
62d0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65 6c 73  pSelect);.  }els
62e0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
62f0: 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ULL ){.    pTerm
6300: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
6310: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
6320: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
6330: 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ht = exprTableUs
6340: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
6350: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
6360: 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20  }.  prereqAll = 
6370: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
6380: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b  MaskSet, pExpr);
6390: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
63a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
63b0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
63c0: 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65    Bitmask x = ge
63d0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
63e0: 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
63f0: 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65  nTable);.    pre
6400: 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20  reqAll |= x;.   
6410: 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d   extraRight = x-
6420: 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65  1;  /* ON clause
6430: 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62   terms may not b
6440: 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69  e used with an i
6450: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
6460: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
6470: 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  n left table of 
6480: 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69  a LEFT JOIN.  Ti
6490: 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20  cket #3015 */.  
64a0: 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  }.  pTerm->prere
64b0: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
64c0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  ;.  pTerm->leftC
64d0: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54  ursor = -1;.  pT
64e0: 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d  erm->iParent = -
64f0: 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  1;.  pTerm->eOpe
6500: 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28  rator = 0;.  if(
6510: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26   allowedOp(op) &
6520: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
6530: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
6540: 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  ft)==0 ){.    Ex
6550: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
6560: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 45 78  r->pLeft;.    Ex
6570: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
6580: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
6590: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
65a0: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
65b0: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
65c0: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
65d0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
65e0: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  ->leftColumn = p
65f0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
6600: 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
6610: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
6620: 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a  Mask(op);.    }.
6630: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26      if( pRight &
6640: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
6650: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
6660: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
6670: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  ;.      Expr *pD
6680: 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  up;.      if( pT
6690: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
66a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
66b0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
66c0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
66d0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
66e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
66f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6710: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6720: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
6730: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
6740: 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65   }.        idxNe
6750: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
6760: 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c  nsert(pWC, pDup,
6770: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
6780: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
6790: 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d       if( idxNew=
67a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
67b0: 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43       pNew = &pWC
67c0: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
67d0: 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65       pNew->iPare
67e0: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
67f0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
6800: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
6810: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e          pTerm->n
6820: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
6830: 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
6840: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
6850: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6860: 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70       pDup = pExp
6870: 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  r;.        pNew 
6880: 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = pTerm;.      }
6890: 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75  .      exprCommu
68a0: 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  te(pDup);.      
68b0: 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c  pLeft = pDup->pL
68c0: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
68d0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
68e0: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
68f0: 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f 6c     pNew->leftCol
6900: 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f  umn = pLeft->iCo
6910: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77  lumn;.      pNew
6920: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
6930: 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20  prereqLeft;.    
6940: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
6950: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
6960: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
6970: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
6980: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20  ask(pDup->op);. 
6990: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
69a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
69b0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
69c0: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
69d0: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
69e0: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
69f0: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
6a00: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
6a10: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
6a20: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
6a30: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 0a  EEN implements..
6a40: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
6a50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
6a60: 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45 78 70  TWEEN ){.    Exp
6a70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
6a80: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
6a90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74   int i;.    stat
6aa0: 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b  ic const u8 ops[
6ab0: 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c  ] = {TK_GE, TK_L
6ac0: 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E};.    assert( 
6ad0: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pList!=0 );.    
6ae0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
6af0: 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66  Expr==2 );.    f
6b00: 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
6b10: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
6b20: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69  NewExpr;.      i
6b30: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
6b40: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
6b50: 74 65 33 45 78 70 72 28 64 62 2c 20 6f 70 73 5b  te3Expr(db, ops[
6b60: 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  i], sqlite3ExprD
6b70: 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  up(db, pExpr->pL
6b80: 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  eft),.          
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
6bb0: 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
6bc0: 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a 20 20  ].pExpr), 0);.  
6bd0: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
6be0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
6bf0: 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45  WC, pNewExpr, TE
6c00: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
6c10: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
6c20: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
6c30: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a  , pWC, idxNew);.
6c40: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
6c50: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
6c60: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
6c70: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
6c80: 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  dxTerm;.    }.  
6c90: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
6ca0: 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  = 2;.  }.#endif 
6cb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
6cc0: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
6cd0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
6ce0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6cf0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
6d00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
6d10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6d20: 52 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74  RY).  /* Attempt
6d30: 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63   to convert OR-c
6d40: 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 69  onnected terms i
6d50: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
6d60: 6f 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  or so that.  ** 
6d70: 74 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75 73  they can make us
6d80: 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 45  e of indices.  E
6d90: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
6da0: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
6db0: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
6dc0: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 20   OR  x = expr3. 
6dd0: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
6de0: 65 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 0a  erted into.  **.
6df0: 20 20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28    **      x IN (
6e00: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
6e10: 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  3).  **.  ** Thi
6e20: 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  s optimization m
6e30: 75 73 74 20 62 65 20 6f 6d 69 74 74 65 64 20 69  ust be omitted i
6e40: 66 20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  f OMIT_SUBQUERY 
6e50: 69 73 20 64 65 66 69 6e 65 64 20 62 65 63 61 75  is defined becau
6e60: 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70  se.  ** the comp
6e70: 69 6c 65 72 20 66 6f 72 20 74 68 65 20 74 68 65  iler for the the
6e80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
6e90: 70 61 72 74 20 6f 66 20 73 75 62 2d 71 75 65 72  part of sub-quer
6ea0: 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ies..  */.  else
6eb0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
6ec0: 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74  TK_OR ){.    int
6ed0: 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20   ok;.    int i, 
6ee0: 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75  j;.    int iColu
6ef0: 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  mn, iCursor;.   
6f00: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 4f 72   WhereClause sOr
6f10: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
6f20: 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61  *pOrTerm;..    a
6f30: 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66  ssert( (pTerm->f
6f40: 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41  lags & TERM_DYNA
6f50: 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77  MIC)==0 );.    w
6f60: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
6f70: 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  sOr, pWC->pParse
6f80: 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20  , pMaskSet);.   
6f90: 20 77 68 65 72 65 53 70 6c 69 74 28 26 73 4f 72   whereSplit(&sOr
6fa0: 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b  , pExpr, TK_OR);
6fb0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
6fc0: 41 6c 6c 28 70 53 72 63 2c 20 26 73 4f 72 29 3b  All(pSrc, &sOr);
6fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 4f 72  .    assert( sOr
6fe0: 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 20 20 20  .nTerm>=2 );.   
6ff0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20   j = 0;.    if( 
7000: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7010: 20 29 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74 5f 70   ) goto or_not_p
7020: 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 64 6f 7b  ossible;.    do{
7030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
7040: 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20  <sOr.nTerm );.  
7050: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f      iColumn = sO
7060: 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d  r.a[j].leftColum
7070: 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72  n;.      iCursor
7080: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
7090: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b  Cursor;.      ok
70a0: 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20   = iCursor>=0;. 
70b0: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
70c0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
70d0: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
70e0: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
70f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
7100: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
7110: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
7120: 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e         goto or_n
7130: 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20  ot_possible;.   
7140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7150: 66 28 20 6f 72 54 65 72 6d 49 73 4f 70 74 43 61  f( orTermIsOptCa
7160: 6e 64 69 64 61 74 65 28 70 4f 72 54 65 72 6d 2c  ndidate(pOrTerm,
7170: 20 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 75 6d   iCursor, iColum
7180: 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
7190: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c  pOrTerm->flags |
71a0: 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20  = TERM_OR_OK;.  
71b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
71c0: 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70 6c 69  orTermHasOkDupli
71d0: 63 61 74 65 28 26 73 4f 72 2c 20 70 4f 72 54 65  cate(&sOr, pOrTe
71e0: 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rm) ){.         
71f0: 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20   pOrTerm->flags 
7200: 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a  &= ~TERM_OR_OK;.
7210: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7220: 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b           ok = 0;
7230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7240: 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 21   }.    }while( !
7250: 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b  ok && (sOr.a[j++
7260: 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ].flags & TERM_C
7270: 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a 3c 32  OPIED)!=0 && j<2
7280: 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b 20 29   );.    if( ok )
7290: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
72a0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
72b0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c 20 2a     Expr *pNew, *
72c0: 70 44 75 70 3b 0a 20 20 20 20 20 20 45 78 70 72  pDup;.      Expr
72d0: 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20   *pLeft = 0;.   
72e0: 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65     for(i=sOr.nTe
72f0: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f  rm-1, pOrTerm=sO
7300: 72 2e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  r.a; i>=0; i--, 
7310: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
7320: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
7330: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  ->flags & TERM_O
7340: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
7350: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 44 75  nue;.        pDu
7360: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
7370: 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e  up(db, pOrTerm->
7380: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
7390: 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
73a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
73b0: 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61 72 73  ppend(pWC->pPars
73c0: 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 2c 20  e, pList, pDup, 
73d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66  0);.        pLef
73e0: 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  t = pOrTerm->pEx
73f0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
7400: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
7410: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20   pLeft!=0 );.   
7420: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
7430: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
7440: 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ft);.      pNew 
7450: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
7460: 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30  , TK_IN, pDup, 0
7470: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7480: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
7490: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
74a0: 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e      transferJoin
74b0: 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70  Markings(pNew, p
74c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
74d0: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69  New->pList = pLi
74e0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
74f0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
7500: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
7510: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
7520: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
7530: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
7540: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
7550: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
7560: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
7570: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
7580: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
7590: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
75a0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
75b0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
75c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
75d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
75e0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
75f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f 72        }.    }.or
7600: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a 20  _not_possible:. 
7610: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c     whereClauseCl
7620: 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a 23  ear(&sOr);.  }.#
7630: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7640: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
7650: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
7660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
7670: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
7680: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
7690: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
76a0: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
76b0: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
76c0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
76d0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
76e0: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
76f0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
7700: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
7710: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
7720: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
7730: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
7740: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
7750: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
7760: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
7770: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
7780: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
7790: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
77a0: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
77b0: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
77c0: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
77d0: 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62  if( isLikeOrGlob
77e0: 28 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50 61  (db, pExpr, &nPa
77f0: 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65  ttern, &isComple
7800: 74 65 2c 20 26 6e 6f 43 61 73 65 29 20 29 7b 0a  te, &noCase) ){.
7810: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c      Expr *pLeft,
7820: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78   *pRight;.    Ex
7830: 70 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72  pr *pStr1, *pStr
7840: 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  2;.    Expr *pNe
7850: 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70  wExpr1, *pNewExp
7860: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e  r2;.    int idxN
7870: 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20  ew1, idxNew2;.. 
7880: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
7890: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
78a0: 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68 74 20  xpr;.    pRight 
78b0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
78c0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
78d0: 70 53 74 72 31 20 3d 20 73 71 6c 69 74 65 33 50  pStr1 = sqlite3P
78e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
78f0: 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29  STRING, 0, 0, 0)
7900: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 31 20  ;.    if( pStr1 
7910: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7920: 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
7930: 53 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52  Str1->token, &pR
7940: 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  ight->token);.  
7950: 20 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e      pStr1->token
7960: 2e 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20  .n = nPattern;. 
7970: 20 20 20 20 20 70 53 74 72 31 2d 3e 66 6c 61 67       pStr1->flag
7980: 73 20 3d 20 45 50 5f 44 65 71 75 6f 74 65 64 3b  s = EP_Dequoted;
7990: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 32  .    }.    pStr2
79a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
79b0: 70 28 64 62 2c 20 70 53 74 72 31 29 3b 0a 20 20  p(db, pStr1);.  
79c0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
79d0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
79e0: 20 75 38 20 63 2c 20 2a 70 43 3b 0a 20 20 20 20   u8 c, *pC;.    
79f0: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 32 2d    assert( pStr2-
7a00: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 3b 0a 20 20  >token.dyn );.  
7a10: 20 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70      pC = (u8*)&p
7a20: 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 7a 5b 6e 50  Str2->token.z[nP
7a30: 61 74 74 65 72 6e 2d 31 5d 3b 0a 20 20 20 20 20  attern-1];.     
7a40: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
7a50: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
7a60: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 40 27        if( c=='@'
7a70: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
7a80: 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  0;.        c = s
7a90: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7aa0: 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  er[c];.      }. 
7ab0: 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31       *pC = c + 1
7ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
7ad0: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50  Expr1 = sqlite3P
7ae0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
7af0: 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  GE, sqlite3ExprD
7b00: 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20 70 53  up(db,pLeft), pS
7b10: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64 78  tr1, 0);.    idx
7b20: 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75  New1 = whereClau
7b30: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
7b40: 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56 49  ewExpr1, TERM_VI
7b50: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
7b60: 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  IC);.    exprAna
7b70: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
7b80: 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
7b90: 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
7ba0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7bb0: 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45 78 70  K_LT, sqlite3Exp
7bc0: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20  rDup(db,pLeft), 
7bd0: 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69  pStr2, 0);.    i
7be0: 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c  dxNew2 = whereCl
7bf0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
7c00: 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f  pNewExpr2, TERM_
7c10: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
7c20: 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41  AMIC);.    exprA
7c30: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
7c40: 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
7c50: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
7c60: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
7c70: 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
7c80: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
7c90: 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
7ca0: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
7cb0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
7cc0: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
7cd0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
7ce0: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
7cf0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7d00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
7d10: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
7d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d30: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7d40: 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
7d50: 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
7d60: 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
7d70: 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
7d80: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
7d90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
7da0: 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
7db0: 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
7dc0: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
7dd0: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
7de0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
7df0: 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
7e00: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
7e10: 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
7e20: 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
7e30: 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
7e40: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
7e50: 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
7e60: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
7e70: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
7e80: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
7e90: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
7ea0: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
7eb0: 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
7ec0: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
7ed0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
7ee0: 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
7ef0: 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
7f00: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
7f10: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
7f20: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
7f30: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
7f40: 0a 20 20 20 20 70 72 65 72 65 71 45 78 70 72 20  .    prereqExpr 
7f50: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
7f60: 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69 67 68  (pMaskSet, pRigh
7f70: 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71 43 6f  t);.    prereqCo
7f80: 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62 6c 65  lumn = exprTable
7f90: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7fa0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20  pLeft);.    if( 
7fb0: 28 70 72 65 72 65 71 45 78 70 72 20 26 20 70 72  (prereqExpr & pr
7fc0: 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29  ereqColumn)==0 )
7fd0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
7fe0: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  ewExpr;.      pN
7ff0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
8000: 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41 54 43  Expr(db, TK_MATC
8010: 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  H, 0, sqlite3Exp
8020: 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 29  rDup(db, pRight)
8030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
8040: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
8050: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
8060: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
8070: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
8080: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
8090: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
80a0: 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
80b0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
80c0: 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20  = prereqExpr;.  
80d0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
80e0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
80f0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
8100: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 6f  pNewTerm->leftCo
8110: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
8120: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
8130: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
8140: 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
8150: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50 61     pNewTerm->iPa
8160: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
8170: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
8180: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
8190: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
81a0: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
81b0: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
81c0: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
81d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
81e0: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
81f0: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
8200: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8210: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8220: 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20  LTABLE */..  /* 
8230: 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73  Prevent ON claus
8240: 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46  e terms of a LEF
8250: 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e  T JOIN from bein
8260: 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a  g used to drive.
8270: 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f    ** an index fo
8280: 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  r tables to the 
8290: 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
82a0: 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e  ..  */.  pTerm->
82b0: 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65  prereqRight |= e
82c0: 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a  xtraRight;.}../*
82d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
82e0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78  if any of the ex
82f0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69  pressions in pLi
8300: 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d  st->a[iFirst...]
8310: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65   contain.** a re
8320: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74  ference to any t
8330: 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  able other than 
8340: 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e  the iBase table.
8350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8360: 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61  eferencesOtherTa
8370: 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74  bles(.  ExprList
8380: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
8390: 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72    /* Search expr
83a0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c  essions in ths l
83b0: 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73  ist */.  ExprMas
83c0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
83d0: 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
83e0: 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74  om tables to bit
83f0: 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46  maps */.  int iF
8400: 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
8410: 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68      /* Be search
8420: 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46 69  ing with the iFi
8430: 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f  rst-th expressio
8440: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  n */.  int iBase
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72   /* Ignore refer
8470: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
8480: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d  ble */.){.  Bitm
8490: 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67  ask allowed = ~g
84a0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
84b0: 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65   iBase);.  while
84c0: 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e  ( iFirst<pList->
84d0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28  nExpr ){.    if(
84e0: 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65   (exprTableUsage
84f0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74  (pMaskSet, pList
8500: 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45  ->a[iFirst++].pE
8510: 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30  xpr)&allowed)!=0
8520: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8530: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
8540: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
8550: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8560: 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78   decides if pIdx
8570: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
8580: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
8590: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  R BY.** clause. 
85a0: 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72   If it can, it r
85b0: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49  eturns 1.  If pI
85c0: 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  dx cannot satisf
85d0: 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  y the.** ORDER B
85e0: 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72  Y clause, this r
85f0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
8600: 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  ..**.** pOrderBy
8610: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
8620: 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45  clause from a SE
8630: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
8640: 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20   pTab is the.** 
8650: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
8660: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8670: 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20  se of that same 
8680: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8690: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c   and.** the tabl
86a0: 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e  e has a cursor n
86b0: 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e  umber of "base".
86c0: 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64    pIdx is an ind
86d0: 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a  ex on pTab..**.*
86e0: 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20  * nEqCol is the 
86f0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
8700: 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61  s of pIdx that a
8710: 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c  re used as equal
8720: 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
8730: 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73  ts.  Any of thes
8740: 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  e columns may be
8750: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68   missing from th
8760: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
8770: 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74  ause and the mat
8780: 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  ch can still be 
8790: 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  a success..**.**
87a0: 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   All terms of th
87b0: 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20  e ORDER BY that 
87c0: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
87d0: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
87e0: 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72  either.** ASC or
87f0: 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f   DESC.  (Terms o
8800: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
8810: 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20 65  lause past the e
8820: 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a  nd of a UNIQUE.*
8830: 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e  * index do not n
8840: 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  eed to satisfy t
8850: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29  his constraint.)
8860: 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c    The *pbRev val
8870: 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
8880: 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  1 if the ORDER B
8890: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
88a0: 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20 73  DESC and it is s
88b0: 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68  et to 0 if.** th
88c0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
88d0: 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f  e is all ASC..*/
88e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f  .static int isSo
88f0: 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61  rtingIndex(.  Pa
8900: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8910: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8920: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8930: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
8940: 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e 67  Set,  /* Mapping
8950: 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64 69   from table indi
8960: 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a  ces to bitmaps *
8970: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  he index we are 
89a0: 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  testing */.  int
89b0: 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20   base,          
89c0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
89d0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
89e0: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
89f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8a00: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
8a10: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
8a20: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
8a30: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
8a40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
8a50: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
8a60: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
8a70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a90: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
8aa0: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
8ab0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8ae0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
8af0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20  sortOrder = 0;  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58              /* X
8b10: 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20  OR of index and 
8b20: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69  ORDER BY sort di
8b30: 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  rection */.  int
8b40: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b60: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
8b70: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
8b80: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8b90: 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  em *pTerm;    /*
8ba0: 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   A term of the O
8bb0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
8bc0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
8bd0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
8be0: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
8bf0: 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20  y!=0 );.  nTerm 
8c00: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
8c10: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  r;.  assert( nTe
8c20: 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  rm>0 );..  /* Ma
8c30: 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tch terms of the
8c40: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8c50: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
8c60: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   of.  ** the ind
8c70: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  ex..  **.  ** No
8c80: 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  te that indices 
8c90: 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  have pIdx->nColu
8ca0: 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  mn regular colum
8cb0: 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65  ns plus.  ** one
8cc0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
8cd0: 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  mn containing th
8ce0: 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f  e rowid.  The ro
8cf0: 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  wid column.  ** 
8d00: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
8d10: 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20  also allowed to 
8d20: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
8d30: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20  e ORDER BY.  ** 
8d40: 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66  clause..  */.  f
8d50: 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d  or(i=j=0, pTerm=
8d60: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
8d70: 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d  Term && i<=pIdx-
8d80: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
8d90: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
8da0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
8db0: 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20  pression of the 
8dc0: 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a  ORDER BY pTerm *
8dd0: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  /.    CollSeq *p
8de0: 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20  Coll;    /* The 
8df0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
8e00: 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20  ce of pExpr */. 
8e10: 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f     int termSortO
8e20: 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72  rder; /* Sort or
8e30: 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72  der for this ter
8e40: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  m */.    int iCo
8e50: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54  lumn;       /* T
8e60: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he i-th column o
8e70: 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31  f the index.  -1
8e80: 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20   for rowid */.  
8e90: 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72    int iSortOrder
8ea0: 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45  ;    /* 1 for DE
8eb0: 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e  SC, 0 for ASC on
8ec0: 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   the i-th index 
8ed0: 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  term */.    cons
8ee0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f  t char *zColl; /
8ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
8f00: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8f10: 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20   for i-th index 
8f20: 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78  term */..    pEx
8f30: 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
8f40: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
8f50: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
8f60: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
8f70: 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  !=base ){.      
8f80: 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61  /* Can not use a
8f90: 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20  n index sort on 
8fa0: 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73  anything that is
8fb0: 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e   not a column in
8fc0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65   the.      ** le
8fd0: 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66  ft-most table of
8fe0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
8ff0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
9000: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
9010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9020: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
9030: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
9040: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
9050: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
9060: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
9070: 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  f( i<pIdx->nColu
9080: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c  mn ){.      iCol
9090: 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  umn = pIdx->aiCo
90a0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
90b0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
90c0: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
90d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75  ){.        iColu
90e0: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  mn = -1;.      }
90f0: 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65  .      iSortOrde
9100: 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  r = pIdx->aSortO
9110: 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a  rder[i];.      z
9120: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
9130: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  oll[i];.    }els
9140: 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  e{.      iColumn
9150: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f   = -1;.      iSo
9160: 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20  rtOrder = 0;.   
9170: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c     zColl = pColl
9180: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20  ->zName;.    }. 
9190: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
91a0: 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c  olumn!=iColumn |
91b0: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
91c0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pColl->zName, z
91d0: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f  Coll) ){.      /
91e0: 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20  * Term j of the 
91f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
9200: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63  does not match c
9210: 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69  olumn i of the i
9220: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
9230: 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i<nEqCol ){.  
9240: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69        /* If an i
9250: 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74  ndex column that
9260: 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
9270: 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d  by == fails to m
9280: 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20  atch an.        
9290: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
92a0: 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a  , that is OK.  J
92b0: 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20  ust ignore that 
92c0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
92d0: 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  dex.        */. 
92e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
92f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9300: 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   i==pIdx->nColum
9310: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
9320: 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69  Index column i i
9330: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c  s the rowid.  Al
9340: 6c 20 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61  l other terms ma
9350: 74 63 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tch. */.        
9360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
9370: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
9380: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
9390: 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68  n fails to match
93a0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73   and is not cons
93b0: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20  trained by ==.  
93c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
93d0: 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73  e index cannot s
93e0: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
93f0: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a   BY constraint..
9400: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9410: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
9420: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
9430: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f  ssert( pIdx->aSo
9440: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
9450: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
9460: 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  >sortOrder==0 ||
9470: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
9480: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
9490: 72 74 28 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d  rt( iSortOrder==
94a0: 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d  0 || iSortOrder=
94b0: 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f  =1 );.    termSo
94c0: 72 74 4f 72 64 65 72 20 3d 20 69 53 6f 72 74 4f  rtOrder = iSortO
94d0: 72 64 65 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f  rder ^ pTerm->so
94e0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28  rtOrder;.    if(
94f0: 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20   i>nEqCol ){.   
9500: 20 20 20 69 66 28 20 74 65 72 6d 53 6f 72 74 4f     if( termSortO
9510: 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72 20  rder!=sortOrder 
9520: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
9530: 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62  dices can only b
9540: 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f 52  e used if all OR
9550: 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61 73  DER BY terms pas
9560: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
9570: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
9580: 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65 69  aints are all ei
9590: 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53 43  ther DESC or ASC
95a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  . */.        ret
95b0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
95c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
95d0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 74 65 72 6d  sortOrder = term
95e0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  SortOrder;.    }
95f0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54  .    j++;.    pT
9600: 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69  erm++;.    if( i
9610: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 72 65 66  Column<0 && !ref
9620: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
9630: 65 73 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61  es(pOrderBy, pMa
9640: 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20  skSet, j, base) 
9650: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
9660: 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  he indexed colum
9670: 6e 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  n is the primary
9680: 20 6b 65 79 20 61 6e 64 20 65 76 65 72 79 74 68   key and everyth
9690: 69 6e 67 20 6d 61 74 63 68 65 73 0a 20 20 20 20  ing matches.    
96a0: 20 20 2a 2a 20 73 6f 20 66 61 72 20 61 6e 64 20    ** so far and 
96b0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45  none of the ORDE
96c0: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 74 68  R BY terms to th
96d0: 65 20 72 69 67 68 74 20 72 65 66 65 72 65 6e 63  e right referenc
96e0: 65 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  e other.      **
96f0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
9700: 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20 61 72 65  oin, then we are
9710: 20 61 73 73 75 72 65 64 20 74 68 61 74 20 74 68   assured that th
9720: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
9730: 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  sed .      ** to
9740: 20 73 6f 72 74 20 62 65 63 61 75 73 65 20 74 68   sort because th
9750: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73  e primary key is
9760: 20 75 6e 69 71 75 65 20 61 6e 64 20 73 6f 20 6e   unique and so n
9770: 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  one of the other
9780: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
9790: 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20  s will make any 
97a0: 64 69 66 66 65 72 65 6e 63 65 0a 20 20 20 20 20  difference.     
97b0: 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54   */.      j = nT
97c0: 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  erm;.    }.  }..
97d0: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
97e0: 72 64 65 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a  rder!=0;.  if( j
97f0: 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f  >=nTerm ){.    /
9800: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
9810: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
9820: 73 65 20 61 72 65 20 63 6f 76 65 72 65 64 20 62  se are covered b
9830: 79 20 74 68 69 73 20 69 6e 64 65 78 20 73 6f 0a  y this index so.
9840: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 6e 64 65      ** this inde
9850: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
9860: 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  r sorting. */.  
9870: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9880: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
9890: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
98a0: 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  i==pIdx->nColumn
98b0: 0a 20 20 20 20 20 20 26 26 20 21 72 65 66 65 72  .      && !refer
98c0: 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73  encesOtherTables
98d0: 28 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b  (pOrderBy, pMask
98e0: 53 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b  Set, j, base) ){
98f0: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d  .    /* All term
9900: 73 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 20  s of this index 
9910: 6d 61 74 63 68 20 73 6f 6d 65 20 70 72 65 66 69  match some prefi
9920: 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  x of the ORDER B
9930: 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
9940: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73  and the index is
9950: 20 55 4e 49 51 55 45 20 61 6e 64 20 6e 6f 20 74   UNIQUE and no t
9960: 65 72 6d 73 20 6f 6e 20 74 68 65 20 74 61 69 6c  erms on the tail
9970: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
9980: 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 72  .    ** clause r
9990: 65 66 65 72 65 6e 63 65 20 6f 74 68 65 72 20 74  eference other t
99a0: 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e  ables in a join.
99b0: 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6c 6c    If this is all
99c0: 20 74 72 75 65 20 74 68 65 6e 0a 20 20 20 20 2a   true then.    *
99d0: 2a 20 74 68 65 20 6f 72 64 65 72 20 62 79 20 63  * the order by c
99e0: 6c 61 75 73 65 20 69 73 20 73 75 70 65 72 66 6c  lause is superfl
99f0: 75 6f 75 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74  uous. */.    ret
9a00: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
9a10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
9a20: 43 68 65 63 6b 20 74 61 62 6c 65 20 74 6f 20 73  Check table to s
9a30: 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52 20  ee if the ORDER 
9a40: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70 4f 72  BY clause in pOr
9a50: 64 65 72 42 79 20 63 61 6e 20 62 65 20 73 61 74  derBy can be sat
9a60: 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72  isfied.** by sor
9a70: 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 6f 66  ting in order of
9a80: 20 52 4f 57 49 44 2e 20 20 52 65 74 75 72 6e 20   ROWID.  Return 
9a90: 74 72 75 65 20 69 66 20 73 6f 20 61 6e 64 20 73  true if so and s
9aa0: 65 74 20 2a 70 62 52 65 76 20 74 6f 20 62 65 0a  et *pbRev to be.
9ab0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 72 65 76 65  ** true for reve
9ac0: 72 73 65 20 52 4f 57 49 44 20 61 6e 64 20 66 61  rse ROWID and fa
9ad0: 6c 73 65 20 66 6f 72 20 66 6f 72 77 61 72 64 20  lse for forward 
9ae0: 52 4f 57 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a  ROWID order..*/.
9af0: 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 61  static int sorta
9b00: 62 6c 65 42 79 52 6f 77 69 64 28 0a 20 20 69 6e  bleByRowid(.  in
9b10: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
9b20: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
9b30: 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65  number for table
9b40: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
9b50: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
9b60: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68  derBy,     /* Th
9b70: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9b80: 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53  e */.  ExprMaskS
9b90: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 2f  et *pMaskSet,  /
9ba0: 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  * Mapping from t
9bb0: 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70 73  ables to bitmaps
9bc0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9be0: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
9bf0: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
9c00: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a  .){.  Expr *p;..
9c10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
9c20: 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
9c30: 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t( pOrderBy->nEx
9c40: 70 72 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f  pr>0 );.  p = pO
9c50: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
9c60: 70 72 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  pr;.  if( p->op=
9c70: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
9c80: 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 20 26 26  >iTable==base &&
9c90: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a   p->iColumn==-1.
9ca0: 20 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63      && !referenc
9cb0: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f  esOtherTables(pO
9cc0: 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74  rderBy, pMaskSet
9cd0: 2c 20 31 2c 20 62 61 73 65 29 20 29 7b 0a 20 20  , 1, base) ){.  
9ce0: 20 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65    *pbRev = pOrde
9cf0: 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  rBy->a[0].sortOr
9d00: 64 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  der;.    return 
9d10: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
9d20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  0;.}../*.** Prep
9d30: 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69  are a crude esti
9d40: 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61  mate of the loga
9d50: 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70  rithm of the inp
9d60: 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  ut value..** The
9d70: 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f   results need no
9d80: 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69  t be exact.  Thi
9d90: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
9da0: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a  or estimating.**
9db0: 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20   the total cost 
9dc0: 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70  of performing op
9dd0: 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f 28  erations with O(
9de0: 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e  logN) or O(NlogN
9df0: 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e  ).** complexity.
9e00: 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a    Because N is j
9e10: 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20  ust a guess, it 
9e20: 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67  is no great trag
9e30: 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69  edy if.** logN i
9e40: 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a  s a little off..
9e50: 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65  */.static double
9e60: 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e   estLog(double N
9e70: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e  ){.  double logN
9e80: 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78   = 1;.  double x
9e90: 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20   = 10;.  while( 
9ea0: 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20  N>x ){.    logN 
9eb0: 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31  += 1;.    x *= 1
9ec0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9ed0: 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  logN;.}../*.** T
9ee0: 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  wo routines for 
9ef0: 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e  printing the con
9f00: 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74  tent of an sqlit
9f10: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a  e3_index_info.**
9f20: 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65   structure.  Use
9f30: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
9f40: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
9f50: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a  .  If neither.**
9f60: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20   SQLITE_TEST or 
9f70: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65  SQLITE_DEBUG are
9f80: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
9f90: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a  hese routines.**
9fa0: 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a   are no-ops..*/.
9fb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9fc0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
9fd0: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
9fe0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
9ff0: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
a000: 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71 6c  E_IDX_INPUTS(sql
a010: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a020: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
a030: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
a040: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
a050: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
a060: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
a070: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
a080: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63 6f  ebugPrintf("  co
a090: 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f  nstraint[%d]: co
a0a0: 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20 6f  l=%d termid=%d o
a0b0: 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64 5c  p=%d usabled=%d\
a0c0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
a0d0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
a0e0: 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a  int[i].iColumn,.
a0f0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
a100: 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
a110: 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e  fset,.       p->
a120: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f  aConstraint[i].o
a130: 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  p,.       p->aCo
a140: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
a150: 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  le);.  }.  for(i
a160: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42  =0; i<p->nOrderB
a170: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  y; i++){.    sql
a180: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
a190: 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20  "  orderby[%d]: 
a1a0: 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e  col=%d desc=%d\n
a1b0: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
a1c0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
a1d0: 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  i].iColumn,.    
a1e0: 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69     p->aOrderBy[i
a1f0: 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73  ].desc);.  }.}.s
a200: 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43 45  tatic void TRACE
a210: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71 6c  _IDX_OUTPUTS(sql
a220: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
a230: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
a240: 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65 72  if( !sqlite3Wher
a250: 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e 3b  eTrace ) return;
a260: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
a270: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
a280: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
a290: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75 73  ebugPrintf("  us
a2a0: 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64 78  age[%d]: argvIdx
a2b0: 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a  =%d omit=%d\n",.
a2c0: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
a2d0: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
a2e0: 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
a2f0: 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  x,.       p->aCo
a300: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
a310: 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71  .omit);.  }.  sq
a320: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
a330: 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22  ("  idxNum=%d\n"
a340: 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  , p->idxNum);.  
a350: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
a360: 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73 5c  tf("  idxStr=%s\
a370: 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a  n", p->idxStr);.
a380: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
a390: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79 43  intf("  orderByC
a3a0: 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70  onsumed=%d\n", p
a3b0: 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
a3c0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  d);.  sqlite3Deb
a3d0: 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74 69  ugPrintf("  esti
a3e0: 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c  matedCost=%g\n",
a3f0: 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73   p->estimatedCos
a400: 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66  t);.}.#else.#def
a410: 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ine TRACE_IDX_IN
a420: 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20  PUTS(A).#define 
a430: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
a440: 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  S(A).#endif..#if
a450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a460: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
a470: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a480: 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61  best index for a
a490: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
a4a0: 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74 20 69  **.** The best i
a4b0: 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74 65 64  ndex is computed
a4c0: 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
a4d0: 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ex method of the
a4e0: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c   virtual.** tabl
a4f0: 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69 73 20  e module.  This 
a500: 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61 6c 6c  routine is reall
a510: 79 20 6a 75 73 74 20 61 20 77 72 61 70 70 65 72  y just a wrapper
a520: 20 74 68 61 74 20 73 65 74 73 20 75 70 0a 2a 2a   that sets up.**
a530: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
a540: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
a550: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  e that is used t
a560: 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 77 69  o communicate wi
a570: 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  th.** xBestIndex
a580: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69  ..**.** In a joi
a590: 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  n, this routine 
a5a0: 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65 64 20  might be called 
a5b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 66  multiple times f
a5c0: 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 76  or the.** same v
a5d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
a5e0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a5f0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
a600: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
a610: 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 6e  d initialized on
a620: 20 74 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63   the first invoc
a630: 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ation and reused
a640: 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   on all subseque
a650: 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e  nt.** invocation
a660: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
a670: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
a680: 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75 73 65  ture is also use
a690: 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65 20 69  d when.** code i
a6a0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 61  s generated to a
a6b0: 63 63 65 73 73 20 74 68 65 20 76 69 72 74 75 61  ccess the virtua
a6c0: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 77 68  l table.  The wh
a6d0: 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28 29 20  ereInfoDelete() 
a6e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61 6b 65  .** routine take
a6f0: 73 20 63 61 72 65 20 6f 66 20 66 72 65 65 69 6e  s care of freein
a700: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  g the sqlite3_in
a710: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
a720: 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76 65 72  re after.** ever
a730: 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69 73 68  ybody has finish
a740: 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 73  ed with it..*/.s
a750: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65 73  tatic double bes
a760: 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
a770: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
a7a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
a7b0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
a7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a7d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
a7e0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
a7f0: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20  st_item *pSrc,  
a800: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
a810: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
a820: 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
a830: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
a840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
a850: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
a860: 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
a870: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
a880: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
a890: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
a8a0: 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
a8b0: 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79 55 73  .  int orderByUs
a8c0: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
a8d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
a8e0: 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20 73 6f  can potential so
a8f0: 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rt */.  sqlite3_
a900: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
a910: 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65 78 20  dxInfo /* Index 
a920: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
a930: 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78  ed to xBestIndex
a940: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
a950: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61  pTab = pSrc->pTa
a960: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
a970: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
a980: 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
a990: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
a9a0: 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
a9b0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
a9c0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
a9d0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
a9e0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
a9f0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
aa00: 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
aa10: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
aa20: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
aa30: 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  int nOrderBy;.  
aa40: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66  int rc;..  /* If
aa50: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
aa60: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
aa70: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  e has not been p
aa80: 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  reviously.  ** a
aa90: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69  llocated and ini
aaa0: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69  tialized for thi
aab0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  s virtual table,
aac0: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20   then allocate. 
aad0: 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69   ** and initiali
aae0: 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20  ze it now.  */. 
aaf0: 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49   pIdxInfo = *ppI
ab00: 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
ab10: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
ab20: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
ab30: 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  m;.    int nTerm
ab40: 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
ab50: 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69  (("Recomputing i
ab60: 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73  ndex info for %s
ab70: 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e  ...\n", pTab->zN
ab80: 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ame));..    /* C
ab90: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
aba0: 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48 45 52  of possible WHER
abb0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
abc0: 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67 0a 20  ints referring. 
abd0: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69     ** to this vi
abe0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
abf0: 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30     for(i=nTerm=0
ac00: 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
ac10: 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
ac20: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
ac30: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
ac40: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
ac50: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
ac60: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
ac70: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ac80: 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  r&(pTerm->eOpera
ac90: 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  tor-1))==0 );.  
aca0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
acb0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
acc0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 74  WO_IN );.      t
acd0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
ace0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
acf0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 69 66  NULL );.      if
ad00: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
ad10: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49  or & (WO_IN|WO_I
ad20: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
ad30: 65 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b  e;.      nTerm++
ad40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ad50: 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
ad60: 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
ad70: 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
ad80: 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
ad90: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
ada0: 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  e then allocate 
adb0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f  space for the aO
adc0: 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20  rderBy part of. 
add0: 20 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65     ** the sqlite
ade0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
adf0: 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
ae00: 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b     nOrderBy = 0;
ae10: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
ae20: 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  y ){.      for(i
ae30: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
ae40: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
ae50: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
ae60: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
ae70: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
ae80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
ae90: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
aea0: 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
aeb0: 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
aec0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
aed0: 20 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79   if( i==pOrderBy
aee0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
aef0: 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f     nOrderBy = pO
af00: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
af10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
af20: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
af30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
af40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20  info structure. 
af50: 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e     */.    pIdxIn
af60: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
af70: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
af80: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
af90: 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
afc0: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
afd0: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
afe0: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
b000: 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64   sizeof(*pIdxOrd
b010: 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29  erBy)*nOrderBy )
b020: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
b030: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  fo==0 ){.      s
b040: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b050: 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d  Parse, "out of m
b060: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 72  emory");.      r
b070: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d  eturn 0.0;.    }
b080: 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20  .    *ppIdxInfo 
b090: 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20  = pIdxInfo;..   
b0a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
b0b0: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
b0c0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
b0d0: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
b0e0: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20  contains.    ** 
b0f0: 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74  many fields that
b100: 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22 63   are declared "c
b110: 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74  onst" to prevent
b120: 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d   xBestIndex from
b130: 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  .    ** changing
b140: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
b150: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
b160: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
b170: 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74  r to.    ** init
b180: 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65  ialize those fie
b190: 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lds..    */.    
b1a0: 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75  pIdxCons = (stru
b1b0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
b1c0: 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49  _constraint*)&pI
b1d0: 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70  dxInfo[1];.    p
b1e0: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
b1f0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
b200: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
b210: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
b220: 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72 75    pUsage = (stru
b230: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
b240: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
b250: 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b  e*)&pIdxOrderBy[
b260: 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a  nOrderBy];.    *
b270: 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
b280: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e  >nConstraint = n
b290: 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a  Term;.    *(int*
b2a0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
b2b0: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
b2c0: 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71  .    *(struct sq
b2d0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
b2e0: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
b2f0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
b300: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20  = pIdxCons;.    
b310: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
b320: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a  _index_orderby**
b330: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  )&pIdxInfo->aOrd
b340: 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72  erBy = pIdxOrder
b350: 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74  By;.    *(struct
b360: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
b370: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
b380: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
b390: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20       pUsage;..  
b3f0: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
b400: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
b410: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
b420: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
b430: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
b440: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
b450: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
b460: 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
b470: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54  m->eOperator&(pT
b480: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31  erm->eOperator-1
b490: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ))==0 );.      t
b4a0: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
b4b0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
b4c0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b4d0: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
b4e0: 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
b4f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
b500: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
b510: 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_IN|WO_ISNULL
b520: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
b530: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
b540: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
b550: 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  >leftColumn;.   
b560: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
b570: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
b580: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
b590: 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f  ].op = pTerm->eO
b5a0: 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 2f  perator;.      /
b5b0: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
b5c0: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
b5d0: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
b5e0: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
b5f0: 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
b600: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
b610: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
b620: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
b630: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
b640: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
b650: 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20   asserts verify 
b660: 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
b670: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45      assert( WO_E
b680: 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  Q==SQLITE_INDEX_
b690: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b  CONSTRAINT_EQ );
b6a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57  .      assert( W
b6b0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
b6c0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
b6d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b6e0: 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_LE==SQLITE_
b6f0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
b700: 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _LE );.      ass
b710: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
b720: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b730: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20  INT_GT );.      
b740: 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53  assert( WO_GE==S
b750: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
b760: 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20  TRAINT_GE );.   
b770: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
b780: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
b790: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
b7a0: 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CH );.      asse
b7b0: 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
b7c0: 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
b7d0: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
b7e0: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
b7f0: 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  );.      j++;.  
b800: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
b810: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
b820: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b830: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
b840: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
b850: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
b860: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ].iColumn = pExp
b870: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
b880: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
b890: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
b8a0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
b8b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
b8c0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
b8d0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
b8e0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
b8f0: 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20  e that pIdxInfo 
b900: 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77  points.  ** to w
b910: 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ill have been in
b920: 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65  itialized, eithe
b930: 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  r during the cur
b940: 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
b950: 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73  or.  ** during s
b960: 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  ome prior invoca
b970: 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75  tion.  Now we ju
b980: 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f  st have to custo
b990: 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65  mize the.  ** de
b9a0: 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66  tails of pIdxInf
b9b0: 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  o for the curren
b9c0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
b9d0: 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a   pass it to.  **
b9e0: 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a   xBestIndex..  *
b9f0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75  /..  /* The modu
ba00: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
ba10: 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62  defined. Also, b
ba20: 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  y this point the
ba30: 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  re must.  ** be 
ba40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
ba50: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
ba60: 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
ba70: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69  e.  ** sqlite3Vi
ba80: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
ba90: 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69  () would have pi
baa0: 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f  cked up the erro
bab0: 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  r. .  */.  asser
bac0: 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  t( pTab->azModul
bad0: 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a  eArg && pTab->az
bae0: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a  ModuleArg[0] );.
baf0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
bb00: 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a 20  pVtab );.#if 0. 
bb10: 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62   if( pTab->pVtab
bb20: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
bb30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
bb40: 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f  e, "undefined mo
bb50: 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c  dule %s for tabl
bb60: 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  e %s",.        p
bb70: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
bb80: 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  [0], pTab->zName
bb90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e  );.    return 0.
bba0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
bbb0: 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e   /* Set the aCon
bbc0: 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
bbd0: 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74   fields and init
bbe0: 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a  ialize all .  **
bbf0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
bc00: 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  s to zero..  **.
bc10: 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74    ** aConstraint
bc20: 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75  [].usable is tru
bc30: 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  e for constraint
bc40: 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  s where the righ
bc50: 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65  t-hand.  ** side
bc60: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72   contains only r
bc70: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62  eferences to tab
bc80: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
bc90: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
bca0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f   ** table.  In o
bcb0: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
bcc0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
bcd0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
bce0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
bcf0: 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a    column = expr.
bd00: 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65    **.  ** and we
bd10: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
bd20: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
bd30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63   constraint on c
bd40: 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f  olumn is .  ** o
bd50: 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c  nly valid if all
bd60: 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63   tables referenc
bd70: 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72  ed in expr occur
bd80: 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
bd90: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
bda0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
bdb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
bdc0: 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61  aConstraints[] a
bdd0: 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e  rray contains en
bde0: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f  tries for all co
bdf0: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f  nstraints.  ** o
be00: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
be10: 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20 77  ble.  That way w
be20: 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63  e only have to c
be30: 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20  ompute it once. 
be40: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
be50: 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20  we might try to 
be60: 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e  pick the best in
be70: 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  dex multiple tim
be80: 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63  es..  ** For eac
be90: 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69 63  h attempt at pic
bea0: 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74  king an index, t
beb0: 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c  he order of tabl
bec0: 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a  es in the.  ** j
bed0: 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66  oin might be dif
bee0: 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76  ferent so we hav
bef0: 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  e to recompute t
bf00: 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20  he usable flag. 
bf10: 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20   ** each time.. 
bf20: 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d   */.  pIdxCons =
bf30: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
bf40: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
bf50: 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  nt**)&pIdxInfo->
bf60: 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  aConstraint;.  p
bf70: 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
bf80: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
bf90: 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ge;.  for(i=0; i
bfa0: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
bfb0: 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
bfc0: 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20  xCons++){.    j 
bfd0: 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72  = pIdxCons->iTer
bfe0: 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65  mOffset;.    pTe
bff0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b  rm = &pWC->a[j];
c000: 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75  .    pIdxCons->u
c010: 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d  sable =  (pTerm-
c020: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
c030: 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20 7d  otReady)==0;.  }
c040: 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
c050: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
c060: 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d  ge[0])*pIdxInfo-
c070: 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20  >nConstraint);. 
c080: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
c090: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
c0a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
c0b0: 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
c0c0: 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64  xStr);.  }.  pId
c0d0: 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
c0e0: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
c0f0: 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
c100: 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
c110: 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70  eIdxStr = 0;.  p
c120: 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
c130: 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
c140: 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
c150: 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
c160: 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a  _BIG_DBL / 2.0;.
c170: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64    nOrderBy = pId
c180: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b  xInfo->nOrderBy;
c190: 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
c1a0: 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72  >nOrderBy && !or
c1b0: 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20  derByUsable ){. 
c1c0: 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49     *(int*)&pIdxI
c1d0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
c1e0: 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69 64 29  0;.  }..  (void)
c1f0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66  sqlite3SafetyOff
c200: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
c210: 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42 65  WHERETRACE(("xBe
c220: 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e  stIndex for %s\n
c230: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
c240: 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  ;.  TRACE_IDX_IN
c250: 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a  PUTS(pIdxInfo);.
c260: 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70 56 74    rc = pTab->pVt
c270: 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65  ab->pModule->xBe
c280: 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e 70 56  stIndex(pTab->pV
c290: 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  tab, pIdxInfo);.
c2a0: 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
c2b0: 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a 20  UTS(pIdxInfo);. 
c2c0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
c2d0: 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64  fetyOn(pParse->d
c2e0: 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  b);..  for(i=0; 
c2f0: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
c300: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
c310: 20 20 20 69 66 28 20 21 70 49 64 78 49 6e 66 6f     if( !pIdxInfo
c320: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
c330: 2e 75 73 61 62 6c 65 20 26 26 20 70 55 73 61 67  .usable && pUsag
c340: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30  e[i].argvIndex>0
c350: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c360: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c370: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61  , .          "ta
c380: 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64  ble %s: xBestInd
c390: 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69  ex returned an i
c3a0: 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54  nvalid plan", pT
c3b0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
c3c0: 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20    return 0.0;.  
c3d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
c3e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c3f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c400: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
c410: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
c420: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
c430: 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20      }else {.    
c440: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c450: 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
c460: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
c470: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
c480: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
c490: 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
c4a0: 64 65 72 42 79 3b 0a 0a 20 20 72 65 74 75 72 6e  derBy;..  return
c4b0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
c4c0: 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e 64  atedCost;.}.#end
c4d0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c4e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
c4f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  /../*.** Find th
c500: 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
c510: 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61 72   accessing a par
c520: 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 20  ticular table.  
c530: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
c540: 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64 65 78  .** to the index
c550: 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64 65 73  , flags that des
c560: 63 72 69 62 65 20 68 6f 77 20 74 68 65 20 69 6e  cribe how the in
c570: 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 75 73  dex should be us
c580: 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65  ed, the.** numbe
c590: 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f  r of equality co
c5a0: 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20 74  nstraints, and t
c5b0: 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20 74 68  he "cost" for th
c5c0: 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  is index..**.** 
c5d0: 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  The lowest cost 
c5e0: 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54 68 65  index wins.  The
c5f0: 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69   cost is an esti
c600: 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75  mate of the amou
c610: 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64  nt of.** CPU and
c620: 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74   disk I/O need t
c630: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65  o process the re
c640: 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20  quest using the 
c650: 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 2e 0a  selected index..
c660: 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74 20  ** Factors that 
c670: 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69  influence cost i
c680: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
c690: 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74 65   *  The estimate
c6a0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
c6b0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
c6c0: 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a  trieved.  (The.*
c6d0: 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74 68  *       fewer th
c6e0: 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a  e better.).**.**
c6f0: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
c700: 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75  r not sorting mu
c710: 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20  st occur..**.** 
c720: 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72     *  Whether or
c730: 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20   not there must 
c740: 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b  be separate look
c750: 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ups in the.**   
c760: 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e      index and in
c770: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
c780: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  .**.*/.static do
c790: 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28 0a  uble bestIndex(.
c7a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7c0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
c7d0: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
c7e0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
c800: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
c810: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
c820: 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
c830: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
c840: 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
c850: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
c860: 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
c870: 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
c880: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
c890: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
c8a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
c8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c8c0: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
c8d0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70 49  */.  Index **ppI
c8e0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
c8f0: 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64 65   /* Make *ppInde
c900: 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62  x point to the b
c910: 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  est index */.  i
c920: 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20  nt *pFlags,     
c930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
c940: 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62 69  t flags describi
c950: 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20 69  ng this choice i
c960: 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20 69  n *pFlags */.  i
c970: 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20 20  nt *pnEq        
c980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
c990: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
c9a0: 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
c9b0: 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ints here */.){.
c9c0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
c9d0: 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65 73  rm;.  Index *bes
c9e0: 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  tIdx = 0;       
c9f0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
ca00: 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73 74  gives the lowest
ca10: 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62 6c   cost */.  doubl
ca20: 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20  e lowestCost;   
ca30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
ca40: 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73 74  st of using best
ca50: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73  Idx */.  int bes
ca60: 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  tFlags = 0;     
ca70: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73       /* Flags as
ca80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62 65  sociated with be
ca90: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
caa0: 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20  estNEq = 0;     
cab0: 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 76         /* Best v
cac0: 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f 0a  alue for nEq */.
cad0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72    int iCur = pSr
cae0: 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
caf0: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
cb00: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
cb10: 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64  ccessed */.  Ind
cb20: 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20  ex *pProbe;     
cb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
cb40: 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c  ndex we are eval
cb50: 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  uating */.  int 
cb60: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
cb70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
cb80: 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
cb90: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e  se order */.  in
cba0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
cbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
cbc0: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
cbd0: 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 69  th pProbe */.  i
cbe0: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
cbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cc00: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
cc10: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
cc20: 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b    int eqTermMask
cc30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
cc40: 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   Mask of valid e
cc50: 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
cc60: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f  s */.  double co
cc70: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
cc80: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73     /* Cost of us
cc90: 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20  ing pProbe */.. 
cca0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65   WHERETRACE(("be
ccb0: 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20  stIndex: tbl=%s 
ccc0: 6e 6f 74 52 65 61 64 79 3d 25 6c 6c 78 5c 6e 22  notReady=%llx\n"
ccd0: 2c 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e  , pSrc->pTab->zN
cce0: 61 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b  ame, notReady));
ccf0: 0a 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20  .  lowestCost = 
cd00: 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
cd10: 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d    pProbe = pSrc-
cd20: 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a  >pTab->pIndex;..
cd30: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
cd40: 65 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  e has no indices
cd50: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
cd60: 6f 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77  o terms in the w
cd70: 68 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65  here.  ** clause
cd80: 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
cd90: 68 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77  he ROWID, then w
cda0: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
cdb0: 61 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20  able to do.  ** 
cdc0: 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
cdd0: 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65  han a full table
cde0: 20 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61   scan on this ta
cdf0: 62 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61  ble.  We might a
ce00: 73 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20  s.  ** well put 
ce10: 69 74 20 66 69 72 73 74 20 69 6e 20 74 68 65 20  it first in the 
ce20: 6a 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61  join order.  Tha
ce30: 74 20 77 61 79 2c 20 70 65 72 68 61 70 73 20 69  t way, perhaps i
ce40: 74 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65  t can be.  ** re
ce50: 66 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65  ferenced by othe
ce60: 72 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  r tables in the 
ce70: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
ce80: 20 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20   pProbe==0 &&.  
ce90: 20 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c     findTerm(pWC,
cea0: 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f   iCur, -1, 0, WO
ceb0: 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c  _EQ|WO_IN|WO_LT|
cec0: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
ced0: 45 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  E,0)==0 &&.     
cee0: 28 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  (pOrderBy==0 || 
cef0: 21 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64  !sortableByRowid
cf00: 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c  (iCur, pOrderBy,
cf10: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20   pWC->pMaskSet, 
cf20: 26 72 65 76 29 29 20 29 7b 0a 20 20 20 20 2a 70  &rev)) ){.    *p
cf30: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a  Flags = 0;.    *
cf40: 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  ppIndex = 0;.   
cf50: 20 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20   *pnEq = 0;.    
cf60: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a  return 0.0;.  }.
cf70: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
cf80: 61 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  a rowid=EXPR or 
cf90: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63  rowid IN (...) c
cfa0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
cfb0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
cfc0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
cfd0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
cfe0: 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69  Q|WO_IN, 0);.  i
cff0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
d000: 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
d010: 20 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20   *ppIndex = 0;. 
d020: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57     bestFlags = W
d030: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20  HERE_ROWID_EQ;. 
d040: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
d050: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
d060: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ){.      /* Rowi
d070: 64 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68  d== is always th
d080: 65 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f  e best pick.  Lo
d090: 6f 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20  ok no further.  
d0a0: 42 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20  Because only.   
d0b0: 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72     ** a single r
d0c0: 6f 77 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c  ow is generated,
d0d0: 20 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61 79   output is alway
d0e0: 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
d0f0: 72 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61  r */.      *pFla
d100: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
d110: 5f 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51  _EQ | WHERE_UNIQ
d120: 55 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20  UE;.      *pnEq 
d130: 3d 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45  = 1;.      WHERE
d140: 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73 74  TRACE(("... best
d150: 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a   is rowid\n"));.
d160: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30        return 0.0
d170: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d180: 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  (pExpr = pTerm->
d190: 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30  pExpr)->pList!=0
d1a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77   ){.      /* Row
d1b0: 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f  id IN (LIST): co
d1c0: 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72  st is NlogN wher
d1d0: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
d1e0: 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20  r of list.      
d1f0: 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f  ** elements.  */
d200: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
d210: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
d220: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 6c  ->nExpr;.      l
d230: 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73 74  owestCost *= est
d240: 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29 3b  Log(lowestCost);
d250: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d260: 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53    /* Rowid IN (S
d270: 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20  ELECT): cost is 
d280: 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73  NlogN where N is
d290: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
d2a0: 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ows.      ** in 
d2b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
d2c0: 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20  e inner select. 
d2d0: 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20   We have no way 
d2e0: 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20  to estimate.    
d2f0: 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20    ** that value 
d300: 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67  so make a wild g
d310: 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6c  uess. */.      l
d320: 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30 3b  owestCost = 200;
d330: 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
d340: 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69  TRACE(("... rowi
d350: 64 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c  d IN cost: %.9g\
d360: 6e 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29  n", lowestCost))
d370: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69  ;.  }..  /* Esti
d380: 6d 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66  mate the cost of
d390: 20 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20   a table scan.  
d3a0: 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  If we do not kno
d3b0: 77 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20  w how many.  ** 
d3c0: 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 74  entries are in t
d3d0: 68 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20  he table, use 1 
d3e0: 6d 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65  million as a gue
d3f0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20  ss..  */.  cost 
d400: 3d 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62  = pProbe ? pProb
d410: 65 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a  e->aiRowEst[0] :
d420: 20 31 30 30 30 30 30 30 3b 0a 20 20 57 48 45 52   1000000;.  WHER
d430: 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62  ETRACE(("... tab
d440: 6c 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73  le scan base cos
d450: 74 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  t: %.9g\n", cost
d460: 29 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48  ));.  flags = WH
d470: 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b  ERE_ROWID_RANGE;
d480: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
d490: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
d4a0: 61 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64  a range of rowid
d4b0: 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61  s in a table sca
d4c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20  n..  */.  pTerm 
d4d0: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
d4e0: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
d4f0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  dy, WO_LT|WO_LE|
d500: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
d510: 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a  .  if( pTerm ){.
d520: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
d530: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
d540: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
d550: 57 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20  WO_LE, 0) ){.   
d560: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
d570: 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
d580: 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f     cost /= 3;  /
d590: 2a 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77  * Guess that row
d5a0: 69 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74  id<EXPR eliminat
d5b0: 65 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72  es two-thirds or
d5c0: 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20   rows */.    }. 
d5d0: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
d5e0: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
d5f0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57  otReady, WO_GT|W
d600: 4f 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20  O_GE, 0) ){.    
d610: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
d620: 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
d630: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a    cost /= 3;  /*
d640: 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69   Guess that rowi
d650: 64 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65  d>EXPR eliminate
d660: 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20  s two-thirds of 
d670: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  rows */.    }.  
d680: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
d690: 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72  .. rowid range r
d6a0: 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25  educes cost to %
d6b0: 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a  .9g\n", cost));.
d6c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
d6d0: 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gs = 0;.  }..  /
d6e0: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73  * If the table s
d6f0: 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74  can does not sat
d700: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
d710: 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61  Y clause, increa
d720: 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74  se.  ** the cost
d730: 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76   by NlogN to cov
d740: 65 72 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f  er the expense o
d750: 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20  f sorting. */.  
d760: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
d770: 20 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65      if( sortable
d780: 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f  ByRowid(iCur, pO
d790: 72 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61  rderBy, pWC->pMa
d7a0: 73 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b 0a  skSet, &rev) ){.
d7b0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
d7c0: 48 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45  HERE_ORDERBY|WHE
d7d0: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a  RE_ROWID_RANGE;.
d7e0: 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
d7f0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
d800: 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b  = WHERE_REVERSE;
d810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
d820: 73 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b  se{.      cost +
d830: 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f  = cost*estLog(co
d840: 73 74 29 3b 0a 20 20 20 20 20 20 57 48 45 52 45  st);.      WHERE
d850: 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74  TRACE(("... sort
d860: 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f  ing increases co
d870: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
d880: 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ost));.    }.  }
d890: 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65  .  if( cost<lowe
d8a0: 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f  stCost ){.    lo
d8b0: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
d8c0: 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d  .    bestFlags =
d8d0: 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f   flags;.  }..  /
d8e0: 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
d8f0: 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
d900: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
d910: 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
d920: 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
d930: 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
d940: 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
d950: 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
d960: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
d970: 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
d980: 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
d990: 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
d9a0: 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
d9b0: 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
d9c0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
d9d0: 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
d9e0: 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
d9f0: 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
da00: 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
da10: 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65   (pSrc->jointype
da20: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
da30: 7b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  {.    eqTermMask
da40: 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
da50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54    }else{.    eqT
da60: 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c  ermMask = WO_EQ|
da70: 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b  WO_IN|WO_ISNULL;
da80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
da90: 61 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20  at each index.. 
daa0: 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f   */.  for(; pPro
dab0: 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
dac0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
dad0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
daf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
db00: 20 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74     double inMult
db10: 69 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20  iplier = 1;..   
db20: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
db30: 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20  . index %s:\n", 
db40: 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pProbe->zName));
db50: 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
db60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
db70: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
db80: 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  x that are satis
db90: 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78  fied.    ** by x
dba0: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
dbb0: 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  s or x IN (...) 
dbc0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
dbd0: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
dbe0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
dbf0: 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  i<pProbe->nColum
dc00: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
dc10: 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
dc20: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
dc30: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
dc40: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
dc50: 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72   notReady, eqTer
dc60: 6d 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a  mMask, pProbe);.
dc70: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
dc80: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
dc90: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
dca0: 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
dcb0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
dcc0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
dcd0: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
dce0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
dcf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c  Expr;.        fl
dd00: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
dd10: 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20  UMN_IN;.        
dd20: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
dd30: 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct!=0 ){.       
dd40: 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20     inMultiplier 
dd50: 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d  *= 25;.        }
dd60: 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
dd70: 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
dd80: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c  .          inMul
dd90: 74 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72  tiplier *= pExpr
dda0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  ->pList->nExpr +
ddb0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ddc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ddd0: 63 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  cost = pProbe->a
dde0: 69 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d  iRowEst[i] * inM
ddf0: 75 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c  ultiplier * estL
de00: 6f 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29  og(inMultiplier)
de10: 3b 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20  ;.    nEq = i;. 
de20: 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f     if( pProbe->o
de30: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
de40: 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52  && (flags & WHER
de50: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a  E_COLUMN_IN)==0.
de60: 20 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d           && nEq=
de70: 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  =pProbe->nColumn
de80: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
de90: 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
dea0: 0a 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45  .    }.    WHERE
deb0: 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e  TRACE(("...... n
dec0: 45 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39  Eq=%d inMult=%.9
ded0: 67 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 6e  g cost=%.9g\n",n
dee0: 45 71 2c 69 6e 4d 75 6c 74 69 70 6c 69 65 72 2c  Eq,inMultiplier,
def0: 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  cost));..    /* 
df00: 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65 20 63  Look for range c
df10: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
df20: 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
df30: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
df40: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
df50: 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
df60: 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72  nEq];.      pTer
df70: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
df80: 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
df90: 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
dfa0: 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50  |WO_GT|WO_GE, pP
dfb0: 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69 66 28  robe);.      if(
dfc0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20   pTerm ){.      
dfd0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
dfe0: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20  _COLUMN_RANGE;. 
dff0: 20 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54         if( findT
e000: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
e010: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
e020: 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29  T|WO_LE, pProbe)
e030: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
e040: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
e050: 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
e060: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20    cost /= 3;.   
e070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
e080: 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c  f( findTerm(pWC,
e090: 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
e0a0: 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c  dy, WO_GT|WO_GE,
e0b0: 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
e0c0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
e0d0: 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
e0e0: 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f            cost /
e0f0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 3;.        }. 
e100: 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43         WHERETRAC
e110: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65  E(("...... range
e120: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
e130: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
e140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e150: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
e160: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20  additional cost 
e170: 6f 66 20 73 6f 72 74 69 6e 67 20 69 66 20 74 68  of sorting if th
e180: 61 74 20 69 73 20 61 20 66 61 63 74 6f 72 2e 0a  at is a factor..
e190: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
e1a0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
e1b0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
e1c0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d  ERE_COLUMN_IN)==
e1d0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
e1e0: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  isSortingIndex(p
e1f0: 50 61 72 73 65 2c 70 57 43 2d 3e 70 4d 61 73 6b  Parse,pWC->pMask
e200: 53 65 74 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c  Set,pProbe,iCur,
e210: 70 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65  pOrderBy,nEq,&re
e220: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  v) ){.        if
e230: 28 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20  ( flags==0 ){.  
e240: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20          flags = 
e250: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
e260: 47 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  GE;.        }.  
e270: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
e280: 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20  HERE_ORDERBY;.  
e290: 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b        if( rev ){
e2a0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
e2b0: 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53   |= WHERE_REVERS
e2c0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
e2d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2e0: 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65    cost += cost*e
e2f0: 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20  stLog(cost);.   
e300: 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
e310: 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72 62 79  ("...... orderby
e320: 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74 20   increases cost 
e330: 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74  to %.9g\n", cost
e340: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
e350: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
e360: 74 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e  to see if we can
e370: 20 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75   get away with u
e380: 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
e390: 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20  dex without.    
e3a0: 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20  ** ever reading 
e3b0: 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74  the table.  If t
e3c0: 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
e3d0: 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68 65 0a   then halve the.
e3e0: 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 74      ** cost of t
e3f0: 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  his index..    *
e400: 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  /.    if( flags 
e410: 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  && pSrc->colUsed
e420: 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   < (((Bitmask)1)
e430: 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
e440: 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
e450: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  pSrc->colUsed;. 
e460: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
e470: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 72    for(j=0; j<pPr
e480: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  obe->nColumn; j+
e490: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
e4a0: 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  x = pProbe->aiCo
e4b0: 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
e4c0: 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a   if( x<BMS-1 ){.
e4d0: 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e            m &= ~
e4e0: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78  (((Bitmask)1)<<x
e4f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e500: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
e510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
e520: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
e530: 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  X_ONLY;.        
e540: 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20 20 20  cost /= 2;.     
e550: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
e560: 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20  ...... idx-only 
e570: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
e580: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
e590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e5a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
e5b0: 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65  ndex has achieve
e5c0: 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
e5d0: 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75  t so far, then u
e5e0: 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
e5f0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 26 20 63    if( flags && c
e600: 6f 73 74 20 3c 20 6c 6f 77 65 73 74 43 6f 73 74  ost < lowestCost
e610: 20 29 7b 0a 20 20 20 20 20 20 62 65 73 74 49 64   ){.      bestId
e620: 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20  x = pProbe;.    
e630: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63    lowestCost = c
e640: 6f 73 74 3b 0a 20 20 20 20 20 20 62 65 73 74 46  ost;.      bestF
e650: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
e660: 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45      bestNEq = nE
e670: 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  q;.    }.  }..  
e680: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65  /* Report the be
e690: 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20  st result.  */. 
e6a0: 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74   *ppIndex = best
e6b0: 49 64 78 3b 0a 20 20 57 48 45 52 45 54 52 41 43  Idx;.  WHERETRAC
e6c0: 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20 69  E(("best index i
e6d0: 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67 2c  s %s, cost=%.9g,
e6e0: 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d 25   flags=%x, nEq=%
e6f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62 65  d\n",.        be
e700: 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78 2d  stIdx ? bestIdx-
e710: 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65 29  >zName : "(none)
e720: 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20 62  ", lowestCost, b
e730: 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e 45  estFlags, bestNE
e740: 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20 3d  q));.  *pFlags =
e750: 20 62 65 73 74 46 6c 61 67 73 20 7c 20 65 71 54   bestFlags | eqT
e760: 65 72 6d 4d 61 73 6b 3b 0a 20 20 2a 70 6e 45 71  ermMask;.  *pnEq
e770: 20 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65   = bestNEq;.  re
e780: 74 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b  turn lowestCost;
e790: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  .}.../*.** Disab
e7a0: 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  le a term in the
e7b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
e7c0: 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64  Except, do not d
e7d0: 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a  isable the term.
e7e0: 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c  ** if it control
e7f0: 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  s a LEFT OUTER J
e800: 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e  OIN and it did n
e810: 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
e820: 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49  the ON.** or USI
e830: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  NG clause of tha
e840: 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f  t join..**.** Co
e850: 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20  nsider the term 
e860: 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65  t2.z='ok' in the
e870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69   following queri
e880: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  es:.**.**   (1) 
e890: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e8a0: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
e8b0: 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52  N t1.a=t2.x WHER
e8c0: 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  E t2.z='ok'.**  
e8d0: 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (2)  SELECT * F
e8e0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
e8f0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
e900: 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
e910: 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20  *   (3)  SELECT 
e920: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  * FROM t1, t2 WH
e930: 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e  ERE t1.a=t2.x AN
e940: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a  D t2.z='ok'.**.*
e950: 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20  * The t2.z='ok' 
e960: 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
e970: 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73  he in (2) becaus
e980: 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a  e it originates.
e990: 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61  ** in the ON cla
e9a0: 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69  use.  The term i
e9b0: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33  s disabled in (3
e9c0: 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  ) because it is 
e9d0: 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61  not part.** of a
e9e0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
e9f0: 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74  .  In (1), the t
ea00: 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62  erm is not disab
ea10: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62  led..**.** Disab
ea20: 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73  ling a term caus
ea30: 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20  es that term to 
ea40: 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e  not be tested in
ea50: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
ea60: 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ** of the join. 
ea70: 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e   Disabling is an
ea80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
ea90: 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73  When terms are s
eaa0: 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69  atisfied.** by i
eab0: 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62  ndices, we disab
eac0: 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65  le them to preve
ead0: 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73  nt redundant tes
eae0: 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a  ts in the inner.
eaf0: 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75  ** loop.  We wou
eb00: 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65  ld get the corre
eb10: 63 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f  ct results if no
eb20: 74 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20  thing were ever 
eb30: 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74  disabled,.** but
eb40: 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e   joins might run
eb50: 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
eb60: 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20  .  The trick is 
eb70: 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75  to disable as mu
eb80: 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20  ch.** as we can 
eb90: 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e  without disablin
eba0: 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20  g too much.  If 
ebb0: 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  we disabled in (
ebc0: 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20  1), we'd get.** 
ebd0: 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72  the wrong answer
ebe0: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38  .  See ticket #8
ebf0: 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  13..*/.static vo
ec00: 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57  id disableTerm(W
ec10: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
ec20: 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  l, WhereTerm *pT
ec30: 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
ec40: 6d 0a 20 20 20 20 20 20 26 26 20 41 4c 57 41 59  m.      && ALWAY
ec50: 53 28 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  S((pTerm->flags 
ec60: 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
ec70: 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  ).      && (pLev
ec80: 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30  el->iLeftJoin==0
ec90: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
eca0: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
ecb0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a  , EP_FromJoin)).
ecc0: 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e    ){.    pTerm->
ecd0: 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  flags |= TERM_CO
ece0: 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
ecf0: 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
ed00: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
ed10: 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
ed20: 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
ed30: 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
ed40: 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
ed50: 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
ed60: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
ed70: 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
ed80: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ed90: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
eda0: 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
edb0: 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
edc0: 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6e 20  ith the first n 
edd0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 69 6e 64 65 78  columns of index
ede0: 0a 2a 2a 20 70 49 64 78 20 74 6f 20 74 68 65 20  .** pIdx to the 
edf0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e 20  values in the n 
ee00: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
ee10: 6e 67 20 61 74 20 62 61 73 65 2e 0a 2a 2f 0a 73  ng at base..*/.s
ee20: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
ee30: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
ee40: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
ee50: 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 49 6e 64  base, int n, Ind
ee60: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
ee70: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 56 64 62 65   n>0 ){.    Vdbe
ee80: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ee90: 64 62 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dbe;.    assert(
eea0: 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c   v!=0 );.    sql
eeb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
eec0: 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62  , OP_Affinity, b
eed0: 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  ase, n);.    sql
eee0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
eef0: 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 20  yStr(v, pIdx);. 
ef00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ef10: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ef20: 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
ef30: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  n);.  }.}.../*.*
ef40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ef50: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
ef60: 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
ef70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
ef80: 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
ef90: 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
efa0: 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
efb0: 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
efc0: 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
efd0: 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
efe0: 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
eff0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
f000: 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
f010: 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
f020: 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
f030: 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
f040: 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
f050: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f060: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
f070: 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
f080: 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
f090: 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
f0a0: 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
f0b0: 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
f0c0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
f0d0: 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
f0e0: 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
f0f0: 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
f100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
f110: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
f120: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f130: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
f140: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f150: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f160: 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
f170: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
f180: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
f190: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
f1a0: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57  el *pLevel, /* W
f1b0: 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
f1c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
f1d0: 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
f1e0: 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
f1f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
f200: 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
f210: 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
f220: 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
f230: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
f240: 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
f250: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f260: 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f280: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
f290: 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
f2a0: 69 66 28 20 69 54 61 72 67 65 74 3c 3d 30 20 29  if( iTarget<=0 )
f2b0: 7b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61  {.    iReg = iTa
f2c0: 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33 47 65  rget = sqlite3Ge
f2d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f2e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 58 2d 3e  ;.  }.  if( pX->
f2f0: 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20  op==TK_EQ ){.   
f300: 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
f310: 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
f320: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
f330: 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
f340: 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
f350: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
f360: 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
f370: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f380: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
f390: 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
f3a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f3b0: 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
f3c0: 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
f3d0: 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
f3e0: 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
f3f0: 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73  p *pIn;..    ass
f400: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
f410: 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
f420: 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
f430: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
f440: 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
f450: 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61   pX, 0);.    iTa
f460: 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  b = pX->iTable;.
f470: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f480: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
f490: 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
f4a0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f4b0: 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70  , "%.*s", pX->sp
f4c0: 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a  an.n, pX->span.z
f4d0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ));.    if( pLev
f4e0: 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  el->nIn==0 ){.  
f4f0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 20      pLevel->nxt 
f500: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f510: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
f520: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  .    pLevel->nIn
f530: 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ++;.    pLevel->
f540: 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  aInLoop = sqlite
f550: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
f560: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
f570: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  vel->aInLoop,.  
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d    sizeof(pLevel-
f5b0: 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65  >aInLoop[0])*pLe
f5c0: 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 70  vel->nIn);.    p
f5d0: 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  In = pLevel->aIn
f5e0: 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
f5f0: 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
f600: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d 20  = pLevel->nIn - 
f610: 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
f620: 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
f630: 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
f640: 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
f650: 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64        pIn->topAd
f660: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f670: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
f680: 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
f690: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f6a0: 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41 64        pIn->topAd
f6b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
f6c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
f6d0: 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52  umn, iTab, 0, iR
f6e0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
f6f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f700: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
f710: 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65  l, iReg);.    }e
f720: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
f730: 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  l->nIn = 0;.    
f740: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
f750: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
f760: 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74  l, pTerm);.  ret
f770: 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
f780: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f790: 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
f7a0: 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
f7b0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
f7c0: 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  r an.** index.  
f7d0: 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  The values for a
f7e0: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ll constraints a
f7f0: 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  re left on the s
f800: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
f810: 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
f820: 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
f830: 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
f840: 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
f850: 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
f860: 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
f870: 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
f880: 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
f890: 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
f8a0: 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
f8b0: 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
f8c0: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
f8d0: 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
f8e0: 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
f8f0: 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
f900: 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
f910: 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
f920: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
f930: 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
f940: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
f950: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
f960: 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
f970: 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
f980: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
f990: 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
f9a0: 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20  will be left.** 
f9b0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61  on the stack - a
f9c0: 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74 20   is the deepest 
f9d0: 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f  and b the shallo
f9e0: 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  west..**.** In t
f9f0: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
fa00: 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
fa10: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
fa20: 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
fa30: 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
fa40: 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
fa50: 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
fa60: 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
fa70: 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
fa80: 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
fa90: 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
faa0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
fab0: 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ry cell..**.** T
fac0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
fad0: 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
fae0: 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
faf0: 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a   cell and puts.*
fb00: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
fb10: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
fb20: 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  l in pLevel->iMe
fb30: 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68 61  m.  The code tha
fb40: 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
fb50: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
fb60: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f   pLevel->iMem to
fb70: 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
fb80: 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
fb90: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
fba0: 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
fbb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
fbc0: 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
fbd0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
fbe0: 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
fbf0: 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
fc00: 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
fc10: 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  .** use..*/.stat
fc20: 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
fc30: 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
fc40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fc50: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
fc60: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
fc70: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
fc80: 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
fc90: 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
fca0: 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
fcb0: 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  g */.  WhereClau
fcc0: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20  se *pWC,     /* 
fcd0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
fce0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
fcf0: 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57  tReady,     /* W
fd00: 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52  hich parts of FR
fd10: 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  OM have not yet 
fd20: 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20  been coded */.  
fd30: 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 20 20  int nExtraReg   
fd40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fd50: 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65  of extra registe
fd60: 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  rs to allocate *
fd70: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  /.){.  int nEq =
fd80: 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20   pLevel->nEq;   
fd90: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
fda0: 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
fdb0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
fdc0: 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  de */.  Vdbe *v 
fdd0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
fde0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
fdf0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
fe00: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
fe10: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
fe20: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b   = pLevel->pIdx;
fe30: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
fe40: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
fe50: 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
fe60: 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  t iCur = pLevel-
fe70: 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54  >iTabCur;   /* T
fe80: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
fe90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
fea0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
feb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
fec0: 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
fed0: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a   term */.  int j
fee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ff00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
ff10: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ff30: 61 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ase register */.
ff40: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
ff50: 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79   how many memory
ff60: 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e   cells we will n
ff70: 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74  eed then allocat
ff80: 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20  e them..  ** We 
ff90: 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c  always need at l
ffa0: 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f  east one used to
ffb0: 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20   store the loop 
ffc0: 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20  terminator.  ** 
ffd0: 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65  value.  If there
ffe0: 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   are IN operator
fff0: 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65  s we'll need one
10000 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a   for each == or.
10010 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69    ** IN constrai
10020 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65  nt..  */.  pLeve
10030 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
10040 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 72 65  ->nMem + 1;.  re
10050 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
10060 6e 4d 65 6d 20 2b 20 32 3b 0a 20 20 70 50 61 72  nMem + 2;.  pPar
10070 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76  se->nMem += pLev
10080 65 6c 2d 3e 6e 45 71 20 2b 20 32 20 2b 20 6e 45  el->nEq + 2 + nE
10090 78 74 72 61 52 65 67 3b 0a 0a 20 20 2f 2a 20 45  xtraReg;..  /* E
100a0 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
100b0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
100c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
100d0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
100e0 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
100f0 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
10100 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
10110 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
10120 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
10130 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
10140 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
10150 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 66 6c  eady, pLevel->fl
10160 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ags, pIdx);.    
10170 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d  if( NEVER(pTerm=
10180 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =0) ) break;.   
10190 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
101a0 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
101b0 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  DED)==0 );.    r
101c0 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
101d0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
101e0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42  rm, pLevel, regB
101f0 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20  ase+j);.    if( 
10200 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b  r1!=regBase+j ){
10210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10220 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
10230 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
10240 65 2b 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+j);.    }.    
10250 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
10260 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10270 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
10280 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
10290 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
102a0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
102b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
102c0 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
102d0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))==0 ){.      s
102e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
102f0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
10300 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
10310 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  ->brk);.    }.  
10320 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61  }.  return regBa
10330 73 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  se;.}..#if defin
10340 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
10350 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
10360 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  ing variable hol
10370 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69  ds a text descri
10380 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70  ption of query p
10390 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lan generated.**
103a0 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
103b0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
103c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
103d0 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57    Each call to W
103e0 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65  hereBegin.** ove
103f0 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
10400 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f  ious.  This info
10410 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
10420 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a  for testing and.
10430 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  ** analysis only
10440 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
10450 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53  3_query_plan[BMS
10460 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74  *2*40];  /* Text
10470 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
10480 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61  static int nQPla
10490 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
104a0 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
104b0 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f   slow in _query_
104c0 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69  plan[] */..#endi
104d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
104e0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   */.../*.** Free
104f0 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
10500 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
10510 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
10520 72 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ree(WhereInfo *p
10530 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57  WInfo){.  if( pW
10540 49 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  Info ){.    int 
10550 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
10560 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
10570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
10580 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10590 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f   *pInfo = pWInfo
105a0 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[i].pIdxInfo;
105b0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
105c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
105d0 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  rt( pInfo->needT
105e0 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29  oFreeIdxStr==0 )
105f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10600 33 5f 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20  3_free(pInfo);. 
10610 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57   sqlite3_free(pW
10630 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  Info);.  }.}.../
10640 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
10650 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
10660 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
10670 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
10680 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
10690 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
106a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
106b0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
106c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
106d0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
106e0 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
106f0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
10700 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
10710 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
10720 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
10730 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
10740 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
10750 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
10760 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
10770 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
10780 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
10790 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
107a0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
107b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
107c0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
107d0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
107e0 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
107f0 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
10800 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
10810 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
10820 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
10830 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
10840 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
10850 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
10860 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
10870 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
10880 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
10890 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
108a0 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
108b0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
108c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
108d0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
108e0 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
108f0 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
10900 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
10910 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
10920 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
10930 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
10940 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
10950 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
10960 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
10970 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
10980 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
10990 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
109a0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
109b0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
109c0 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
109d0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
109e0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
109f0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
10a00 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
10a10 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
10a20 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
10a50 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
10a60 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
10a90 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
10aa0 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
10ab0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
10ac0 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
10ad0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
10ae0 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
10af0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
10b00 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
10b10 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
10b20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
10b30 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
10b40 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
10b50 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
10b60 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
10b70 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
10b80 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
10b90 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
10ba0 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
10bb0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
10bc0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
10bd0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
10be0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
10bf0 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
10c00 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
10c10 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
10c20 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
10c30 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
10c40 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
10c50 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
10c60 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
10c70 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
10c80 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
10c90 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
10ca0 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
10cb0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
10cc0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
10cd0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
10ce0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
10cf0 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
10d00 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
10d10 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10d20 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
10d30 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
10d40 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
10d50 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
10d60 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
10d70 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
10d80 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
10d90 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
10da0 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
10db0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
10dc0 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
10dd0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
10de0 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
10df0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
10e00 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
10e10 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
10e20 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
10e30 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
10e40 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
10e50 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
10e60 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
10e70 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
10e80 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
10e90 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
10ea0 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
10eb0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
10ec0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
10ed0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
10ee0 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
10ef0 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
10f00 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
10f10 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
10f20 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
10f30 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
10f40 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
10f50 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
10f60 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
10f70 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
10f80 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
10f90 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
10fa0 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
10fb0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
10fc0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
10fd0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
10fe0 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
10ff0 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
11000 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
11010 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
11020 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
11030 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
11040 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
11050 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
11060 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
11070 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
11080 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
11090 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
110a0 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
110b0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
110c0 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
110d0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
110e0 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
110f0 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
11100 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
11110 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
11120 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
11130 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
11140 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
11150 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
11160 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
11170 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
11180 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
11190 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
111a0 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
111b0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
111c0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
111d0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
111e0 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
111f0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
11200 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
11210 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
11220 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
11230 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
11240 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
11250 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
11260 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
11270 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
11280 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
11290 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
112a0 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
112b0 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
112c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
112d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
112e0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
112f0 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68  tement,.** if th
11300 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
11310 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
11320 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
11330 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
11340 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
11350 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
11360 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
11370 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69  then ppOrderBy i
11380 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
11390 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
113a0 20 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68   used so that th
113b0 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74  e natural output
113c0 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61   order of the ta
113d0 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63  ble.** scan is c
113e0 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f  orrect for the O
113f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
11400 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20  then that index 
11410 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a  is used and.** *
11420 70 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74  ppOrderBy is set
11430 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20   to NULL.  This 
11440 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
11450 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  on that prevents
11460 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61   an.** unnecessa
11470 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72  ry sort of the r
11480 65 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20  esult set if an 
11490 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74  index appropriat
114a0 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44  e for the.** ORD
114b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72  ER BY clause alr
114c0 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  eady exists..**.
114d0 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20  ** If the where 
114e0 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e  clause loops can
114f0 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20  not be arranged 
11500 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63  to provide the c
11510 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74  orrect.** output
11520 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65   order, then the
11530 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75   *ppOrderBy is u
11540 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65  nchanged..*/.Whe
11550 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57  reInfo *sqlite3W
11560 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72  hereBegin(.  Par
11570 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11580 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
11590 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
115a0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
115b0 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
115c0 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62   all tables to b
115d0 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45  e scanned */.  E
115e0 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
115f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11600 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
11610 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72  prList **ppOrder
11620 42 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  By, /* An ORDER 
11630 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  BY clause, or NU
11640 4c 4c 20 2a 2f 0a 20 20 75 38 20 77 66 6c 61 67  LL */.  u8 wflag
11650 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
11660 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
11670 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
11680 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
11690 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116c0 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
116d0 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
116e0 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
116f0 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
11700 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
11710 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
11720 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11730 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
11740 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
11750 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ine */.  int brk
11760 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  , cont = 0;     
11770 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
11780 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64   used during cod
11790 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
117a0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
117b0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
117c0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
117d0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
117e0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ned */.  WhereTe
117f0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
11800 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
11810 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
11820 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
11830 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
11840 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t;       /* The 
11850 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
11860 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
11870 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
11880 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11890 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64   clause is divid
118a0 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65  ed into these te
118b0 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
118c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
118d0 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
118e0 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
118f0 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
11900 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
11910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11920 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
11930 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
11940 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
11950 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
11960 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11970 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
11980 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
11990 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
119b0 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
119c0 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e  n of all wc.a[].
119d0 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
119e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
119f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11a00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
11a10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
11a20 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11a30 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
11a40 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
11a50 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
11a60 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
11a70 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
11a80 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
11a90 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
11aa0 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
11ab0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11ac0 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
11ad0 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
11ae0 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
11af0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11b00 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72 42 79  .  if( ppOrderBy
11b10 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
11b20 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20   = *ppOrderBy;. 
11b30 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74   }..  /* Split t
11b40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11b50 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
11b60 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
11b70 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
11b80 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
11b90 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
11ba0 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
11bb0 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26  .  initMaskSet(&
11bc0 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  maskSet);.  wher
11bd0 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c  eClauseInit(&wc,
11be0 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53 65   pParse, &maskSe
11bf0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
11c00 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
11c10 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
11c20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 77 63    whereSplit(&wc
11c30 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44  , pWhere, TK_AND
11c40 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c  );.    .  /* All
11c50 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
11c60 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
11c70 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
11c80 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
11c90 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
11ca0 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d  lue..  */.  db =
11cb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
11cc0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
11cd0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11ce0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
11cf0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57          sizeof(W
11d00 68 65 72 65 49 6e 66 6f 29 20 2b 20 70 54 61 62  hereInfo) + pTab
11d10 4c 69 73 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f  List->nSrc*sizeo
11d20 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
11d30 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11d40 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
11d50 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d  to whereBeginNoM
11d60 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  em;.  }.  pWInfo
11d70 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c  ->nLevel = pTabL
11d80 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49  ist->nSrc;.  pWI
11d90 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
11da0 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
11db0 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
11dc0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ist;.  pWInfo->i
11dd0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
11de0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11df0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
11e00 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
11e10 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
11e20 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
11e30 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
11e40 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
11e50 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
11e60 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
11e70 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
11e80 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61  ( pWhere && (pTa
11e90 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c  bList->nSrc==0 |
11ea0 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
11eb0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
11ec0 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
11ed0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
11ee0 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
11ef0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
11f00 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
11f10 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
11f20 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
11f30 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
11f40 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
11f50 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
11f60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
11f70 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
11f80 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
11f90 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
11fa0 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
11fb0 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
11fc0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
11fd0 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
11fe0 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
11ff0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
12000 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
12010 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
12020 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
12030 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
12040 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
12050 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
12060 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
12070 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
12080 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
12090 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
120a0 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
120b0 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
120c0 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
120d0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
120e0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
120f0 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
12100 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
12110 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
12120 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
12130 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
12140 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
12150 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
12160 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
12170 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
12180 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
12190 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
121a0 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
121b0 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
121c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
121d0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
121e0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74   i++){.    creat
121f0 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  eMask(&maskSet, 
12200 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
12210 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
12220 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
12230 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
12240 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
12250 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
12260 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
12270 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
12280 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53  = getMask(&maskS
12290 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
122a0 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
122b0 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
122c0 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
122d0 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
122e0 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
122f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
12300 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
12310 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
12320 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
12330 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
12340 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
12350 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
12360 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
12370 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
12380 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
12390 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
123a0 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
123b0 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
123c0 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
123d0 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
123e0 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
123f0 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
12400 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
12410 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
12420 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
12430 54 61 62 4c 69 73 74 2c 20 26 77 63 29 3b 0a 20  TabList, &wc);. 
12440 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
12450 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
12460 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65  o whereBeginNoMe
12470 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  m;.  }..  /* Cho
12480 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
12490 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
124a0 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
124b0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
124c0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
124d0 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
124e0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
124f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
12500 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
12510 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
12520 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
12530 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
12540 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12550 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45  .flags     WHERE
12560 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
12570 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
12580 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
12590 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
125a0 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
125b0 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
125c0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
125d0 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
125e0 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  en term of the F
125f0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65  ROM clause is be
12600 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20  ing coded.  **  
12610 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61   pWInfo->a[].iTa
12620 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  bCur   The VDBE 
12630 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64  cursor for the d
12640 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20  atabase table.  
12650 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12660 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56  .iIdxCur   The V
12670 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
12680 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20  he index.  **.  
12690 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
126a0 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68  o figures out th
126b0 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20  e nesting order 
126c0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
126d0 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73   FROM.  ** claus
126e0 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  e..  */.  notRea
126f0 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
12700 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70  ;.  pTabItem = p
12710 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c  TabList->a;.  pL
12720 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
12730 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e  ;.  andFlags = ~
12740 30 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  0;.  WHERETRACE(
12750 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
12760 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a  Start ***\n"));.
12770 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c    for(i=iFrom=0,
12780 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
12790 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
127a0 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
127b0 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ++){.    Index *
127c0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
127d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f       /* Index fo
127e0 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61 74 20  r FROM table at 
127f0 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20  pTabItem */.    
12800 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
12810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12820 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74 65 64  lags asssociated
12830 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20   with pIdx */.  
12840 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12860 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   Number of == or
12870 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
12880 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 63 6f  */.    double co
12890 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
128a0 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 66     /* The cost f
128b0 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  or pIdx */.    i
128c0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
128d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
128e0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46  r looping over F
128f0 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ROM tables */.  
12900 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
12910 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
12920 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
12930 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
12940 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73     int bestFlags
12950 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
12960 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74  * Flags associat
12970 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
12980 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e 45 71  .    int bestNEq
12990 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
129a0 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69 61 74   /* nEq associat
129b0 65 64 20 77 69 74 68 20 70 42 65 73 74 20 2a 2f  ed with pBest */
129c0 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65  .    double lowe
129d0 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  stCost;         
129e0 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68 65 20   /* Cost of the 
129f0 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  pBest */.    int
12a00 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20 20 20   bestJ = 0;     
12a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12a20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20  value of j */.  
12a30 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20    Bitmask m;    
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a50 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66   Bitmask value f
12a60 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f  or j or bestJ */
12a70 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
12a80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12a90 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 66 69   /* True when fi
12aa0 72 73 74 20 74 61 62 6c 65 20 69 73 20 73 65 65  rst table is see
12ab0 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  n */.    sqlite3
12ac0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
12ad0 64 65 78 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  dex; /* Current 
12ae0 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 2a 2f  virtual index */
12af0 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74  ..    lowestCost
12b00 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
12b10 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46 72  L;.    for(j=iFr
12b20 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54  om, pTabItem=&pT
12b30 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c  abList->a[j]; j<
12b40 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
12b50 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29  j++, pTabItem++)
12b60 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f  {.      int doNo
12b70 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54 72  tReorder;  /* Tr
12b80 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ue if this table
12b90 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72   should not be r
12ba0 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20 20  eordered */..   
12bb0 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20     doNotReorder 
12bc0 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f  =  (pTabItem->jo
12bd0 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
12be0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b  T|JT_CROSS))!=0;
12bf0 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
12c00 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
12c10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
12c20 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
12c30 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
12c40 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
12c50 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
12c60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12c70 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
12c80 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
12c90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12ca0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
12cb0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
12cc0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12cd0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12ce0 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
12cf0 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
12d00 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
12d10 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
12d20 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
12d30 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d   = &pWInfo->a[j]
12d40 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
12d50 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69     cost = bestVi
12d60 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
12d70 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
12d80 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
12db0 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
12dc0 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 70                pp
12df0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  IdxInfo);.      
12e00 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
12e10 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20  VIRTUALTABLE;.  
12e20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 2a        pIndex = *
12e30 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  ppIdxInfo;.     
12e40 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26     if( pIndex &&
12e50 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42 79   pIndex->orderBy
12e60 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20  Consumed ){.    
12e70 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
12e80 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
12e90 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   | WHERE_ORDERBY
12ea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12eb0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
12ec0 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20        nEq = 0;. 
12ed0 20 20 20 20 20 20 20 69 66 28 20 28 53 51 4c 49         if( (SQLI
12ee0 54 45 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3c  TE_BIG_DBL/2.0)<
12ef0 63 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  cost ){.        
12f00 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73    /* The cost is
12f10 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
12f20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53  be larger than S
12f30 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74  QLITE_BIG_DBL (t
12f40 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
12f50 69 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20  inital value of 
12f60 6c 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68  lowestCost in th
12f70 69 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69  is loop. If it i
12f80 73 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  s, then.        
12f90 20 20 2a 2a 20 74 68 65 20 28 63 6f 73 74 3c 6c    ** the (cost<l
12fa0 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20  owestCost) test 
12fb0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72  below will never
12fc0 20 62 65 20 74 72 75 65 20 61 6e 64 0a 20 20 20   be true and.   
12fd0 20 20 20 20 20 20 20 2a 2a 20 70 4c 65 76 65 6c         ** pLevel
12fe0 2d 3e 70 42 65 73 74 49 64 78 20 6e 65 76 65 72  ->pBestIdx never
12ff0 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
13000 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 63 6f  */ .          co
13010 73 74 20 3d 20 28 53 51 4c 49 54 45 5f 42 49 47  st = (SQLITE_BIG
13020 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20 20 20 20 20  _DBL/2.0);.     
13030 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
13040 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b   .#endif.      {
13050 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20  .        cost = 
13060 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
13070 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c  , &wc, pTabItem,
13080 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 28 69 3d 3d 30 20 26 26 20 70 70 4f      (i==0 && ppO
130b0 72 64 65 72 42 79 29 20 3f 20 2a 70 70 4f 72 64  rderBy) ? *ppOrd
130c0 65 72 42 79 20 3a 20 30 2c 0a 20 20 20 20 20 20  erBy : 0,.      
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 26 70 49 64 78 2c 20 26 66 6c 61 67 73     &pIdx, &flags
130f0 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20 20 20 20  , &nEq);.       
13100 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20   pIndex = 0;.   
13110 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
13120 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29  ost<lowestCost )
13130 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  {.        once =
13140 20 31 3b 0a 20 20 20 20 20 20 20 20 6c 6f 77 65   1;.        lowe
13150 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
13160 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
13170 49 64 78 3b 0a 20 20 20 20 20 20 20 20 62 65 73  Idx;.        bes
13180 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  tFlags = flags;.
13190 20 20 20 20 20 20 20 20 62 65 73 74 4e 45 71 20          bestNEq 
131a0 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20 20 20 62  = nEq;.        b
131b0 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20  estJ = j;.      
131c0 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49    pLevel->pBestI
131d0 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  dx = pIndex;.   
131e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
131f0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72  oNotReorder ) br
13200 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 57  eak;.    }.    W
13210 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20  HERETRACE(("*** 
13220 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63 74  Optimizer select
13230 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  s table %d for l
13240 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a  oop %d\n", bestJ
13250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  ,.           pLe
13260 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b  vel-pWInfo->a));
13270 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c  .    if( (bestFl
13280 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
13290 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
132a0 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
132b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
132c0 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73  ags &= bestFlags
132d0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c  ;.    pLevel->fl
132e0 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
132f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64  .    pLevel->pId
13300 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70  x = pBest;.    p
13310 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73  Level->nEq = bes
13320 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tNEq;.    pLevel
13330 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20  ->aInLoop = 0;. 
13340 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
13350 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
13360 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  t ){.      pLeve
13370 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
13380 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
13390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
133a0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
133b0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
133c0 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
133d0 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
133e0 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
133f0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
13400 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65  evel->iFrom = be
13410 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45  stJ;.  }.  WHERE
13420 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
13430 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20 2a  mizer Finished *
13440 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 49  **\n"));..  /* I
13450 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
13460 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61  y only selects a
13470 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65   single row, the
13480 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  n the ORDER BY. 
13490 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72   ** clause is ir
134a0 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20  relevant..  */. 
134b0 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26   if( (andFlags &
134c0 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
134d0 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29  0 && ppOrderBy )
134e0 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79  {.    *ppOrderBy
134f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13500 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
13510 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
13520 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
13530 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
13540 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
13550 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
13560 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
13570 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
13580 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
13590 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
135a0 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
135b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
135c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
135d0 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
135e0 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
135f0 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
13600 73 73 65 72 74 28 20 28 77 66 6c 61 67 73 20 26  ssert( (wflags &
13610 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
13620 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
13630 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
13640 29 3b 0a 20 20 69 66 28 20 28 77 66 6c 61 67 73  );.  if( (wflags
13650 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
13660 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26 20  _DESIRED)!=0 && 
13670 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
13680 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b 0a  E_UNIQUE)!=0 ){.
13690 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e      pWInfo->okOn
136a0 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20 70  ePass = 1;.    p
136b0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 66 6c 61 67  WInfo->a[0].flag
136c0 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
136d0 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
136e0 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
136f0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
13700 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
13710 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
13720 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
13730 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
13740 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
13750 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
13760 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
13770 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
13780 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f  ier Goto */.  fo
13790 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
137a0 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
137b0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
137c0 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
137d0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
137e0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
137f0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13800 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  Ix;      /* Inde
13810 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  x used to access
13820 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20 2a   pTab (if any) *
13830 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
13840 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13850 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
13860 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
13870 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  ex */.    int iI
13880 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
13890 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64 65  iIdxCur;..#ifnde
138a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
138b0 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50  PLAIN.    if( pP
138c0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
138d0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
138e0 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75  zMsg;.      stru
138f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
13900 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
13910 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
13920 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67  rom];.      zMsg
13930 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
13940 66 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22  f(db, "TABLE %s"
13950 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
13960 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
13970 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
13980 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
13990 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
139a0 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  z AS %s", zMsg, 
139b0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
139c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
139d0 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
139e0 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
139f0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
13a00 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13a10 25 7a 20 57 49 54 48 20 49 4e 44 45 58 20 25 73  %z WITH INDEX %s
13a20 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e  ", zMsg, pIx->zN
13a30 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
13a40 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
13a50 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
13a60 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
13a70 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
13a80 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
13a90 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
13aa0 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20  z USING PRIMARY 
13ab0 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  KEY", zMsg);.   
13ac0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13ad0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13ae0 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73 65  TABLE.      else
13af0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65   if( pLevel->pBe
13b00 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  stIdx ){.       
13b10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
13b20 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20  nfo *pBestIdx = 
13b30 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
13b40 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  ;.        zMsg =
13b50 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13b60 64 62 2c 20 22 25 7a 20 56 49 52 54 55 41 4c 20  db, "%z VIRTUAL 
13b70 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25  TABLE INDEX %d:%
13b80 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20  s", zMsg,.      
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
13ba0 65 73 74 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20  estIdx->idxNum, 
13bb0 70 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72  pBestIdx->idxStr
13bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
13bd0 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  f.      if( pLev
13be0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
13bf0 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20  E_ORDERBY ){.   
13c00 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
13c10 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
13c20 25 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d  %z ORDER BY", zM
13c30 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
13c40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13c50 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
13c60 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69  in, i, pLevel->i
13c70 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  From, 0, zMsg, P
13c80 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
13c90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13ca0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
13cb0 2a 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  */.    pTabItem 
13cc0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
13cd0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
13ce0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
13cf0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
13d00 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
13d10 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
13d20 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
13d30 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ma);.    if( pTa
13d40 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54  b->isEphem || pT
13d50 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
13d60 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
13d70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13d80 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
13d90 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64   pLevel->pBestId
13da0 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  x ){.      int i
13db0 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
13dc0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73  iCursor;.      s
13dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13de0 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43  (v, OP_VOpen, iC
13df0 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ur, 0, 0,.      
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70    (const char*)p
13e20 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 34 5f 56  Tab->pVtab, P4_V
13e30 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  TAB);.    }else.
13e40 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28  #endif.    if( (
13e50 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
13e60 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
13e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
13e80 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  op = pWInfo->okO
13e90 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e  nePass ? OP_Open
13ea0 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52  Write : OP_OpenR
13eb0 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ead;.      sqlit
13ec0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
13ed0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
13ee0 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
13ef0 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  , op);.      if(
13f00 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
13f10 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
13f20 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  l<(sizeof(Bitmas
13f30 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20  k)*8) ){.       
13f40 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
13f50 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
13f60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
13f70 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
13f80 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
13f90 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
13fa0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
13fb0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
13fc0 72 65 6e 74 41 64 64 72 28 76 29 2d 32 2c 20 6e  rentAddr(v)-2, n
13fd0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
13fe0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
13ff0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
14000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
14010 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
14020 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
14030 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
14040 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
14050 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
14060 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
14070 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28  ursor;.    if( (
14080 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
14090 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
140a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
140b0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
140c0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
140d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
140e0 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
140f0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
14100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14110 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
14120 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 70  NumColumns, 0, p
14130 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a  Ix->nColumn+1);.
14140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14150 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
14160 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c  enRead, iIdxCur,
14170 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c   pIx->tnum, iDb,
14180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14190 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
141a0 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
141b0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
141c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
141d0 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d   "%s", pIx->zNam
141e0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  e));.    }.    s
141f0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
14200 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
14210 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
14220 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
14230 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14240 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  (v);..  /* Gener
14250 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
14260 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
14270 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
14280 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
14290 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
142a0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
142b0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
142c0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
142d0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
142e0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
142f0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
14300 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
14310 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
14320 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
14330 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
14340 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20  j;.    int iCur 
14350 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
14360 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  sor;  /* The VDB
14370 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
14380 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e   table */.    In
14390 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
143a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
143b0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
143c0 2f 0a 20 20 20 20 69 6e 74 20 6e 78 74 3b 20 20  /.    int nxt;  
143d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
143e0 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e  e to jump to con
143f0 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
14400 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20  ext IN case */. 
14410 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20     int iIdxCur; 
14420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
14430 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
14440 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
14450 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20  t omitTable;    
14460 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75   /* True if we u
14470 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c  se the index onl
14480 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52 65  y */.    int bRe
14490 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  v;          /* T
144a0 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  rue if we need t
144b0 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73  o scan in revers
144c0 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20  e order */..    
144d0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
144e0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
144f0 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72  iFrom];.    iCur
14500 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
14510 72 73 6f 72 3b 0a 20 20 20 20 70 49 64 78 20 3d  rsor;.    pIdx =
14520 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20   pLevel->pIdx;. 
14530 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
14540 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
14550 20 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c    bRev = (pLevel
14560 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
14570 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 20  REVERSE)!=0;.   
14580 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c   omitTable = (pL
14590 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
145a0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
145b0 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
145c0 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
145d0 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
145e0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
145f0 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ons.    ** for t
14600 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
14610 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f    Jump to brk to
14620 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20   break out of a 
14630 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d  loop..    ** Jum
14640 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
14650 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
14660 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
14670 6e 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  n of the.    ** 
14680 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  loop..    **.   
14690 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
146a0 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
146b0 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
146c0 20 22 6e 78 74 22 20 6c 61 62 65 6c 20 74 68 61   "nxt" label tha
146d0 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74  t.    ** means t
146e0 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
146f0 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75  the next IN valu
14700 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20  e combination.  
14710 57 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  When.    ** ther
14720 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
14730 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
14740 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 6e  straints, the "n
14750 78 74 22 20 6c 61 62 65 6c 0a 20 20 20 20 2a 2a  xt" label.    **
14760 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
14770 22 62 72 6b 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  "brk"..    */.  
14780 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e    brk = pLevel->
14790 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78  brk = pLevel->nx
147a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
147b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
147c0 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
147d0 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
147e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
147f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
14800 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
14810 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
14820 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
14830 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69  e and.    ** ini
14840 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
14850 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
14860 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
14870 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20   matches any.   
14880 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
14890 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
148a0 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   join..    */.  
148b0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
148c0 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
148d0 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
148e0 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
148f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
14900 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72  eftJoin = ++pPar
14910 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
14920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14930 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
14940 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
14950 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64  tJoin);.      Vd
14960 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
14970 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
14980 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
14990 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
149a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
149b0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
149c0 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
149d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
149e0 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20  e 0:  The table 
149f0 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62  is a virtual-tab
14a00 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69  le.  Use the VFi
14a10 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20  lter and VNext. 
14a20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
14a30 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
14a40 61 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ata..      */.  
14a50 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
14a60 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
14a70 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
14a80 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 20  VFilter */.     
14a90 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14aa0 6e 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20  nfo *pBestIdx = 
14ab0 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78  pLevel->pBestIdx
14ac0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e  ;.      int nCon
14ad0 73 74 72 61 69 6e 74 20 3d 20 70 42 65 73 74 49  straint = pBestI
14ae0 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  dx->nConstraint;
14af0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 71  .      struct sq
14b00 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14b10 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55  traint_usage *aU
14b20 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14b60 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  x->aConstraintUs
14b70 61 67 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  age;.      const
14b80 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
14b90 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
14ba0 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a   *aConstraint =.
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e    pBestIdx->aCon
14bf0 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20  straint;..      
14c00 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  iReg = sqlite3Ge
14c10 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
14c20 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32  e, nConstraint+2
14c30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
14c40 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
14c50 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ++;.      for(j=
14c60 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e  1; j<=nConstrain
14c70 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
14c80 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
14c90 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
14ca0 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
14cb0 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
14cc0 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d  ge[k].argvIndex=
14cd0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
14ce0 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43    int iTerm = aC
14cf0 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65  onstraint[k].iTe
14d00 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
14d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14d20 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
14d30 43 61 63 68 65 20 29 3b 0a 20 20 20 20 20 20 20  Cache );.       
14d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14d50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63 2e  Code(pParse, wc.
14d60 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e  a[iTerm].pExpr->
14d70 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31  pRight, iReg+j+1
14d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14d90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14da0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14db0 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
14dc0 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
14dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
14de0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
14df0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 20 29 3b  sableColCache );
14e00 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14e10 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14e30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e40 49 6e 74 65 67 65 72 2c 20 70 42 65 73 74 49 64  Integer, pBestId
14e50 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  x->idxNum, iReg)
14e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e80 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
14e90 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  eg+1);.      sql
14ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14eb0 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43  , OP_VFilter, iC
14ec0 75 72 2c 20 62 72 6b 2c 20 69 52 65 67 2c 20 70  ur, brk, iReg, p
14ed0 42 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 2c  BestIdx->idxStr,
14ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ef0 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14f00 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
14f10 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  Str ? P4_MPRINTF
14f20 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
14f30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
14f40 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
14f50 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73  rse, iReg, nCons
14f60 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20  traint+2);.     
14f70 20 70 42 65 73 74 49 64 78 2d 3e 6e 65 65 64 54   pBestIdx->needT
14f80 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
14f90 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
14fa0 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
14fb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
14fc0 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20   aUsage[j].omit 
14fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
14fe0 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74 72   iTerm = aConstr
14ff0 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
15000 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 64  set;.          d
15010 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
15020 6c 2c 20 26 77 63 2e 61 5b 69 54 65 72 6d 5d 29  l, &wc.a[iTerm])
15030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15040 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
15050 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
15060 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
15070 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
15080 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c  pLevel->p2 = sql
15090 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
150a0 64 64 72 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  ddr(v);.    }els
150b0 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
150c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
150d0 41 42 4c 45 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ABLE */..    if(
150e0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
150f0 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
15100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
15110 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   1:  We can dire
15120 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
15130 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
15140 67 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20  g an.      **   
15150 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
15160 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
15170 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
15180 6c 64 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a  ld.  Or.      **
15190 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66            we ref
151a0 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20  erence multiple 
151b0 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f  rows using a "ro
151c0 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20  wid IN (...)".  
151d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
151e0 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20  construct..     
151f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
15200 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
15210 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43  findTerm(&wc, iC
15220 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
15230 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
15240 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15250 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
15260 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
15270 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ->pExpr!=0 );.  
15280 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
15290 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
152a0 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Cur );.      ass
152b0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
152c0 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
152d0 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
152e0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
152f0 70 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 20  pLevel, 0);.    
15300 20 20 6e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e    nxt = pLevel->
15310 6e 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nxt;.      sqlit
15320 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15330 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31  OP_MustBeInt, r1
15340 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 73 71  , nxt);.      sq
15350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15360 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
15370 20 69 43 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b   iCur, nxt, r1);
15380 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
15390 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
153a0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
153b0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
153c0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
153d0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52  >flags & WHERE_R
153e0 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20  OWID_RANGE ){.  
153f0 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
15400 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
15410 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
15420 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
15430 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  ID field..      
15440 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73  */.      int tes
15450 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  tOp = OP_Noop;. 
15460 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
15470 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
15480 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a  *pStart, *pEnd;.
15490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
154a0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
154b0 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 66 69       pStart = fi
154c0 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
154d0 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
154e0 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b  WO_GT|WO_GE, 0);
154f0 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 66 69  .      pEnd = fi
15500 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
15510 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
15520 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29 3b  WO_LT|WO_LE, 0);
15530 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20  .      if( bRev 
15540 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
15550 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
15560 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
15570 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d  ;.        pEnd =
15580 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
15590 20 20 20 20 20 20 69 66 28 20 70 53 74 61 72 74        if( pStart
155a0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
155b0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e   *pX;.        in
155c0 74 20 72 31 2c 20 72 65 67 46 72 65 65 31 3b 0a  t r1, regFree1;.
155d0 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74          pX = pSt
155e0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
155f0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
15600 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
15610 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
15620 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
15630 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
15640 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
15650 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  p(pParse, pX->pR
15660 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 31 29  ight, &regFree1)
15670 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15680 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15690 50 5f 46 6f 72 63 65 49 6e 74 2c 20 72 31 2c 20  P_ForceInt, r1, 
156a0 62 72 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  brk, .          
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45     pX->op==TK_LE
156d0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
156e0 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
156f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15700 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76 65 4c   bRev ? OP_MoveL
15710 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69  t : OP_MoveGe, i
15720 43 75 72 2c 20 62 72 6b 2c 20 72 31 29 3b 0a 20  Cur, brk, r1);. 
15730 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
15740 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
15750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
15760 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15770 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
15780 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
15790 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
157a0 72 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rt);.      }else
157b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
157c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
157d0 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
157e0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
157f0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20   brk);.      }. 
15800 20 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b       if( pEnd ){
15810 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
15820 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  X;.        pX = 
15830 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pEnd->pExpr;.   
15840 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
15850 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
15860 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
15870 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
15880 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
15890 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
158a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73  >nMem;.        s
158b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
158c0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
158d0 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29  t, pLevel->iMem)
158e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
158f0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
15900 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
15910 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
15920 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
15930 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20  : OP_Ge;.       
15940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15950 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
15960 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
15970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15980 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
15990 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
159a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
159b0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
159c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
159d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
159e0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
159f0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
15a00 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
15a10 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
15a20 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
15a30 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
15a40 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
15a50 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
15a60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15a70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
15a80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a90 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
15aa0 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Cur, r1);.      
15ab0 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
15ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
15ad0 70 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  py, pLevel->iMem
15ae0 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  , 0); */.       
15af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15b00 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20 70 4c  p3(v, testOp, pL
15b10 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 62 72 6b 2c  evel->iMem, brk,
15b20 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
15b30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15b40 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  5(v, SQLITE_AFF_
15b50 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45  NUMERIC | SQLITE
15b60 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
15b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15b80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15b90 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
15ba0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
15bb0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
15bc0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15bd0 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  GE|WHERE_COLUMN_
15be0 45 51 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  EQ) ){.      /* 
15bf0 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
15c00 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
15c10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
15c20 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45           The WHE
15c30 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f  RE clause may co
15c40 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f  ntain zero or mo
15c50 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20  re equality .   
15c60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65     **         te
15c70 72 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e  rms ("==" or "IN
15c80 22 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61  " operators) tha
15c90 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e  t refer to the N
15ca0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15cb0 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75    left-most colu
15cc0 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
15cd0 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f  . It may also co
15ce0 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 20  ntain.      **  
15cf0 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
15d00 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
15d10 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
15d20 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
15d30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
15d40 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
15d50 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
15d60 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
15d70 20 4f 6e 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20   Only .      ** 
15d80 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
15d90 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
15da0 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
15db0 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
15dc0 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
15dd0 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
15de0 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
15df0 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
15e00 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 20 20  , if the .      
15e10 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65 78  **         index
15e20 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20   is on (x,y,z), 
15e30 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
15e40 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20 61  ng clauses are a
15e50 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ll .      **    
15e60 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a       optimized:.
15e70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15e80 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
15e90 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
15ea0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
15eb0 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  0.      **      
15ec0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
15ed0 31 30 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  10.      **     
15ee0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
15ef0 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  >5 AND y<10.    
15f00 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
15f10 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
15f20 7a 3c 3d 31 30 0a 20 20 20 20 20 20 2a 2a 0a 20  z<=10.      **. 
15f30 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15f40 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66  The z<10 term of
15f50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
15f60 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f  annot be used, o
15f70 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nly.      **    
15f80 20 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72       the x=5 ter
15f90 6d 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  m:.      **.    
15fa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
15fb0 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
15fc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
15fd0 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20         N may be 
15fe0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
15ff0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
16000 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 20 20  straints..      
16010 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
16020 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
16030 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
16040 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
16050 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
16060 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20   least one..    
16070 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
16080 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
16090 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
160a0 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
160b0 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
160c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
160d0 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
160e0 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
160f0 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
16100 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  er.      **     
16110 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
16120 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
16130 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
16140 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a  RDER BY..      *
16150 2f 20 20 0a 20 20 20 20 20 20 69 6e 74 20 61 53  /  .      int aS
16160 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  tartOp[] = {.   
16170 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
16180 30 2c 0a 20 20 20 20 20 20 20 20 4f 50 5f 52 65  0,.        OP_Re
16190 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  wind,           
161a0 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 2: (!start_co
161b0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
161c0 72 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20  rtEq &&  !bRev) 
161d0 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4c 61  */.        OP_La
161e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
161f0 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
16200 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
16210 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
16220 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
16230 76 65 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  veGt,           
16240 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
16250 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
16260 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
16270 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
16280 76 65 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20  veLt,           
16290 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 5: (start_con
162a0 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
162b0 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
162c0 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
162d0 76 65 47 65 2c 20 20 20 20 20 20 20 20 20 20 20  veGe,           
162e0 2f 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 6: (start_con
162f0 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
16300 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
16310 2a 2f 0a 20 20 20 20 20 20 20 20 4f 50 5f 4d 6f  */.        OP_Mo
16320 76 65 4c 65 20 20 20 20 20 20 20 20 20 20 20 20  veLe            
16330 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 7: (start_con
16340 73 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74  straints  &&  st
16350 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20  artEq &&  bRev) 
16360 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  */.      };.    
16370 20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d    int aEndOp[] =
16380 20 7b 0a 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f   {.        OP_No
16390 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
163a0 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
163b0 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
163c0 20 20 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20      OP_IdxGE,   
163d0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
163e0 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
163f0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
16400 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 20 20 20       OP_IdxLT   
16410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20            /* 2: 
16420 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
16430 20 26 26 20 62 52 65 76 29 20 2a 2f 0a 20 20 20   && bRev) */.   
16440 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
16450 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
16460 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  q;.      int isM
16470 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20 20 20  inQuery = 0;    
16480 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
16490 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
164a0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e   SELECT min(x)..
164b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
164c0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
164d0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
164e0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
164f0 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
16500 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
16510 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16520 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
16530 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
16540 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
16550 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20 2f  ngeStart = 0;  /
16560 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
16570 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
16580 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 20 20   start */.      
16590 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
165a0 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
165b0 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
165c0 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
165d0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nd */.      int 
165e0 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
165f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16600 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
16610 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
16620 3d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  = */.      int e
16630 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
16640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16650 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
16660 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
16670 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  /.      int star
16680 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20  t_constraints;  
16690 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
166a0 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72   range is constr
166b0 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  ained */.      i
166c0 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
166d0 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 2f 2a 20 43  olumn[nEq]; /* C
166e0 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61  olumn for inequa
166f0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
16700 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   */.      int nC
16710 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
16720 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16730 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74   of constraint t
16740 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  erms */.      in
16750 74 20 6f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t op;..      /* 
16760 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16770 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
16780 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
16790 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
167a0 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
167b0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
167c0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
167d0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
167e0 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ers.      ** sta
167f0 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
16800 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16810 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41   regBase = codeA
16820 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
16830 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20  pParse, pLevel, 
16840 26 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 32  &wc, notReady, 2
16850 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d 20 70  );.      nxt = p
16860 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 0a 20 20 20  Level->nxt;..   
16870 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f     /* If this lo
16880 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20 73  op satisfies a s
16890 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65  ort order (pOrde
168a0 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68 61  rBy) request tha
168b0 74 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  t .      ** was 
168c0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
168d0 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65  unction to imple
168e0 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d  ment a "SELECT m
168f0 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20  in(x) ..." .    
16900 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
16910 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
16920 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
16930 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
16940 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c        ** a singl
16950 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69  e iteration. Thi
16960 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
16970 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72   first row retur
16980 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  ned.      ** sho
16990 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
169a0 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
169b0 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
169c0 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 20 20  mn 'x' is.      
169d0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  ** the first one
169e0 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20 65   after the nEq e
169f0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
16a00 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
16a10 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  ,.      ** this 
16a20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
16a30 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
16a40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
16a50 66 28 20 28 77 66 6c 61 67 73 26 57 48 45 52 45  f( (wflags&WHERE
16a60 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
16a70 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  .       && (pLev
16a80 65 6c 2d 3e 66 6c 61 67 73 26 57 48 45 52 45 5f  el->flags&WHERE_
16a90 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 20 20  ORDERBY).       
16aa0 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  && (pIdx->nColum
16ab0 6e 3e 6e 45 71 29 0a 20 20 20 20 20 20 29 7b 0a  n>nEq).      ){.
16ac0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16ad0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
16ae0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
16af0 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
16b00 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  a[0].pExpr->iCol
16b10 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
16b20 75 6d 6e 5b 6e 45 71 5d 20 29 3b 0a 20 20 20 20  umn[nEq] );.    
16b30 20 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d      isMinQuery =
16b40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
16b50 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69     /* Find any i
16b60 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
16b70 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74  aint terms for t
16b80 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
16b90 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68   .      ** of th
16ba0 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 20 20  e range. .      
16bb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  */.      if( pLe
16bc0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
16bd0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
16be0 20 20 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e          pRangeEn
16bf0 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63  d = findTerm(&wc
16c00 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
16c10 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  ady, (WO_LT|WO_L
16c20 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  E), pIdx);.     
16c30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65   }.      if( pLe
16c40 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
16c50 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
16c60 20 20 20 20 20 20 20 20 70 52 61 6e 67 65 53 74          pRangeSt
16c70 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  art = findTerm(&
16c80 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  wc, iCur, k, not
16c90 52 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f  Ready, (WO_GT|WO
16ca0 5f 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20  _GE), pIdx);.   
16cb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
16cc0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
16cd0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
16ce0 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
16cf0 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
16d00 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64      ** a forward
16d10 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61   order scan on a
16d20 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
16d30 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74  x, interchange t
16d40 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  he .      ** sta
16d50 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
16d60 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
16d70 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
16d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16d90 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53   bRev==(pIdx->aS
16da0 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
16db0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b  QLITE_SO_ASC) ){
16dc0 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 57 68  .        SWAP(Wh
16dd0 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
16de0 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
16df0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
16e00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
16e10 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
16e20 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
16e30 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
16e40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
16e50 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
16e60 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
16e70 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  tor & WO_GE );. 
16e80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16e90 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e  RangeEnd && pRan
16ea0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
16eb0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
16ec0 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
16ed0 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
16ee0 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
16ef0 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 73  WO_GE );.      s
16f00 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65  tartEq = !pRange
16f10 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53  Start || pRangeS
16f20 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
16f30 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
16f40 0a 20 20 20 20 20 20 65 6e 64 45 71 20 3d 20 20  .      endEq =  
16f50 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70   !pRangeEnd || p
16f60 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
16f70 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
16f80 47 45 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74  GE);.      start
16f90 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
16fa0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
16fb0 71 3e 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  q>0;..      /* S
16fc0 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
16fd0 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
16fe0 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
16ff0 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  */.      nConstr
17000 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
17010 20 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72    if( pRangeStar
17020 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
17030 20 64 63 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   dcc = pParse->d
17040 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3b 0a  isableColCache;.
17050 20 20 20 20 20 20 20 20 69 66 28 20 70 52 61 6e          if( pRan
17060 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  geEnd ){.       
17070 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62     pParse->disab
17080 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20 20  leColCache++;.  
17090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
170a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
170b0 70 50 61 72 73 65 2c 20 70 52 61 6e 67 65 53 74  pParse, pRangeSt
170c0 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  art->pExpr->pRig
170d0 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29  ht, regBase+nEq)
170e0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
170f0 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68  ->disableColCach
17100 65 20 3d 20 64 63 63 3b 0a 20 20 20 20 20 20 20  e = dcc;.       
17110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17120 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
17130 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 78   regBase+nEq, nx
17140 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6e  t);.        nCon
17150 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
17160 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
17170 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 20  Query ){.       
17180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17190 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
171a0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
171b0 20 20 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61          nConstra
171c0 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  int++;.        s
171d0 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
171e0 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72      start_constr
171f0 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  aints = 1;.     
17200 20 7d 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70   }.      codeApp
17210 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
17220 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
17230 73 74 72 61 69 6e 74 2c 20 70 49 64 78 29 3b 0a  straint, pIdx);.
17240 20 20 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72        op = aStar
17250 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74  tOp[(start_const
17260 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74  raints<<2) + (st
17270 61 72 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76  artEq<<1) + bRev
17280 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
17290 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   op!=0 );.      
172a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
172b0 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 20  _Rewind );.     
172c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
172d0 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  P_Last );.      
172e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
172f0 5f 4d 6f 76 65 47 74 20 29 3b 0a 20 20 20 20 20  _MoveGt );.     
17300 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
17310 50 5f 4d 6f 76 65 47 65 20 29 3b 0a 20 20 20 20  P_MoveGe );.    
17320 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17330 4f 50 5f 4d 6f 76 65 4c 65 20 29 3b 0a 20 20 20  OP_MoveLe );.   
17340 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17350 3d 4f 50 5f 4d 6f 76 65 4c 74 20 29 3b 0a 20 20  =OP_MoveLt );.  
17360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17370 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20 69 49 64  ddOp4(v, op, iId
17380 78 43 75 72 2c 20 6e 78 74 2c 20 72 65 67 42 61  xCur, nxt, regBa
17390 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
173b0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
173c0 43 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f  Constraint), P4_
173d0 49 4e 54 33 32 29 3b 0a 0a 20 20 20 20 20 20 2f  INT32);..      /
173e0 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
173f0 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
17400 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
17410 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
17420 0a 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  .      ** range 
17430 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
17440 2a 2f 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72  */.      nConstr
17450 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
17460 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
17470 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17480 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
17490 65 2c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45  e, pRangeEnd->pE
174a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 72 65 67  xpr->pRight, reg
174b0 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
174c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
174d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
174e0 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20  l, regBase+nEq, 
174f0 6e 78 74 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  nxt);.        co
17500 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
17510 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
17520 20 6e 45 71 2b 31 2c 20 70 49 64 78 29 3b 0a 20   nEq+1, pIdx);. 
17530 20 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69         nConstrai
17540 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nt++;.      }.. 
17550 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
17560 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  he loop body */.
17570 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
17580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
17590 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
175a0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
175b0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
175c0 72 20 69 73 20 70 61 73 74 20 74 68 65 20 65 6e  r is past the en
175d0 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  d of the range. 
175e0 2a 2f 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 45  */.      op = aE
175f0 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
17600 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
17610 52 65 76 29 5d 3b 0a 20 20 20 20 20 20 74 65 73  Rev)];.      tes
17620 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f  tcase( op==OP_No
17630 6f 70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  op );.      test
17640 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
17650 47 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GE );.      test
17660 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
17670 4c 54 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LT );.      sqli
17680 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17690 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78   op, iIdxCur, nx
176a0 74 2c 20 72 65 67 42 61 73 65 2c 0a 20 20 20 20  t, regBase,.    
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
176d0 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e  O_PTR(nConstrain
176e0 74 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  t), P4_INT32);. 
176f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17700 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
17710 71 21 3d 62 52 65 76 29 3b 0a 0a 20 20 20 20 20  q!=bRev);..     
17720 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
17730 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
17740 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74  traints, check t
17750 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20  hat the value.  
17760 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
17770 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ble column that 
17780 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
17790 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20  ontrains is not 
177a0 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2a 20 49  NULL..      ** I
177b0 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f  f it is, jump to
177c0 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
177d0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ion of the loop.
177e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
177f0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17800 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17820 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
17830 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
17840 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17850 65 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  e( pLevel->flags
17860 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
17870 49 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IT );.      if( 
17880 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
17890 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
178a0 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
178b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
178c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
178d0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
178e0 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a  xCur, nEq, r1);.
178f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17910 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 63 6f 6e 74  IsNull, r1, cont
17920 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
17930 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
17940 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
17950 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20  equired */.     
17960 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
17970 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17990 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
179a0 78 43 75 72 2c 20 72 31 29 3b 0a 20 20 20 20 20  xCur, r1);.     
179b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
179c0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  dOp3(v, OP_MoveG
179d0 65 2c 20 69 43 75 72 2c 20 30 2c 20 72 31 29 3b  e, iCur, 0, r1);
179e0 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73 65    /* Deferred se
179f0 65 6b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ek */.      }.  
17a00 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17a10 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17a20 2c 20 72 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  , r1);..      /*
17a30 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
17a40 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
17a50 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
17a60 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
17a70 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75     ** WHERE clau
17a80 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65  se terms made re
17a90 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69  dundant by the i
17aa0 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e  ndex range scan.
17ab0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17ac0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
17ad0 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
17ae0 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  _Next;.      pLe
17af0 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
17b00 72 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  r;.      disable
17b10 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61  Term(pLevel, pRa
17b20 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ngeStart);.     
17b30 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
17b40 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
17b50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17b60 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68    /* Case 4:  Th
17b70 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
17b80 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
17b90 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
17ba0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
17bb0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
17bc0 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  ire table..     
17bd0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
17be0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
17bf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17c00 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20  bRev==0 );.     
17c10 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
17c20 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  _Next;.      pLe
17c30 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
17c40 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
17c50 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
17c60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17c70 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b  ewind, iCur, brk
17c80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74  );.    }.    not
17c90 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73  Ready &= ~getMas
17ca0 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75 72  k(&maskSet, iCur
17cb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
17cc0 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65  t code to test e
17cd0 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69  very subexpressi
17ce0 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63  on that can be c
17cf0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20 2a 2a  ompletely.    **
17d00 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
17d10 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
17d20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  of tables..    *
17d30 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d  /.    for(pTerm=
17d40 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d  wc.a, j=wc.nTerm
17d50 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72  ; j>0; j--, pTer
17d60 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  m++){.      Expr
17d70 20 2a 70 45 3b 0a 20 20 20 20 20 20 74 65 73 74   *pE;.      test
17d80 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61  case( pTerm->fla
17d90 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
17da0 4c 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  L );.      testc
17db0 61 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67  ase( pTerm->flag
17dc0 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
17dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
17de0 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
17df0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
17e00 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
17e10 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
17e20 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
17e30 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f  otReady)!=0 ) co
17e40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
17e50 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
17e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17e70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  E!=0 );.      if
17e80 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
17e90 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73 50  oin && !ExprHasP
17ea0 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
17eb0 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
17ec0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17ee0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
17ef0 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c  Parse, pE, cont,
17f00 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
17f10 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
17f20 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
17f30 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20  CODED;.    }..  
17f40 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54 20    /* For a LEFT 
17f50 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65  OUTER JOIN, gene
17f60 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
17f70 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ill record the f
17f80 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  act that.    ** 
17f90 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77  at least one row
17fa0 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
17fb0 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20  ble has matched 
17fc0 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20  the left table. 
17fd0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
17fe0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
17ff0 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  in ){.      pLev
18000 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65  el->top = sqlite
18010 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18020 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
18030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18040 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
18050 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
18060 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
18070 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
18080 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
18090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
180a0 45 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43  ExprClearColumnC
180b0 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c 65  ache(pParse, pLe
180c0 76 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20  vel->iTabCur);. 
180d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
180e0 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65  ClearColumnCache
180f0 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d  (pParse, pLevel-
18100 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20  >iIdxCur);.     
18110 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c   for(pTerm=wc.a,
18120 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d   j=0; j<wc.nTerm
18130 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
18140 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
18150 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  e( pTerm->flags 
18160 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
18170 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
18180 73 65 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  se( pTerm->flags
18190 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
181a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
181b0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
181c0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
181d0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
181e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
181f0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
18200 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
18210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
18220 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
18230 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
18240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
18250 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
18260 65 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74  erm->pExpr, cont
18270 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
18280 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ULL);.        pT
18290 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
182a0 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20  RM_CODED;.      
182b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  }.    }.  }..#if
182c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20  def SQLITE_TEST 
182d0 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20   /* For testing 
182e0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
182f0 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52  e only */.  /* R
18300 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65  ecord in the que
18310 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74  ry plan informat
18320 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75  ion about the cu
18330 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a  rrent table.  **
18340 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75   and the index u
18350 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74  sed to access it
18360 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74   (if any).  If t
18370 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a  he table itself.
18380 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64    ** is not used
18390 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75  , its name is ju
183a0 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20  st '{}'.  If no 
183b0 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20  index is used.  
183c0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  ** the index is 
183d0 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20  listed as "{}". 
183e0 20 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   If the primary 
183f0 6b 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a  key is used the.
18400 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20    ** index name 
18410 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66  is '*'..  */.  f
18420 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
18430 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
18440 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
18450 20 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76   int n;.    pLev
18460 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
18470 69 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d  i];.    pTabItem
18480 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
18490 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
184a0 20 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d      z = pTabItem
184b0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66  ->zAlias;.    if
184c0 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61  ( z==0 ) z = pTa
184d0 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  bItem->pTab->zNa
184e0 6d 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c  me;.    n = strl
184f0 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  en(z);.    if( n
18500 2b 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66  +nQPlan < sizeof
18510 28 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  (sqlite3_query_p
18520 6c 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20  lan)-10 ){.     
18530 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61   if( pLevel->fla
18540 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
18550 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  NLY ){.        m
18560 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
18570 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
18580 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b 0a 20 20 20  ], "{}", 2);.   
18590 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
185a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
185b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
185c0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
185d0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29  n[nQPlan], z, n)
185e0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
185f0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   += n;.      }. 
18600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
18610 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
18620 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
18630 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
18640 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
18650 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20  RE_ROWID_EQ );. 
18660 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65     testcase( pLe
18670 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
18680 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29  RE_ROWID_RANGE )
18690 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
186a0 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45  ->flags & (WHERE
186b0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
186c0 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
186d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
186e0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
186f0 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
18700 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
18710 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
18720 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64   if( pLevel->pId
18730 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  x==0 ){.      me
18740 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  mcpy(&sqlite3_qu
18750 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
18760 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20  , "{} ", 3);.   
18770 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
18780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18790 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76   n = strlen(pLev
187a0 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  el->pIdx->zName)
187b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
187c0 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
187d0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
187e0 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  )-2 ){.        m
187f0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
18800 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
18810 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  ], pLevel->pIdx-
18820 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
18830 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b      nQPlan += n;
18840 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18850 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
18860 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
18870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18880 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30   while( nQPlan>0
18890 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65 72   && sqlite3_quer
188a0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d  y_plan[nQPlan-1]
188b0 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71 6c  ==' ' ){.    sql
188c0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
188d0 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  --nQPlan] = 0;. 
188e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75 65   }.  sqlite3_que
188f0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20  ry_plan[nQPlan] 
18900 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20  = 0;.  nQPlan = 
18910 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
18920 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73 74  ITE_TEST // Test
18930 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
18940 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  g use only */.. 
18950 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 63   /* Record the c
18960 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64 72  ontinuation addr
18970 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  ess in the Where
18980 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
18990 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e   Then.  ** clean
189a0 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a   up and return..
189b0 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69    */.  pWInfo->i
189c0 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b  Continue = cont;
189d0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
189e0 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65 74 75  ear(&wc);.  retu
189f0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
18a00 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
18a10 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
18a20 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20  ereBeginNoMem:. 
18a30 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
18a40 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65 49  r(&wc);.  whereI
18a50 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  nfoFree(pWInfo);
18a60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
18a70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
18a80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
18a90 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
18aa0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
18ab0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
18ac0 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
18ad0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
18ae0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
18af0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
18b00 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62   *pWInfo){.  Vdb
18b10 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  e *v = pWInfo->p
18b20 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18b30 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
18b40 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
18b50 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
18b60 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
18b70 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ist;..  /* Gener
18b80 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
18b90 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
18ba0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6c 65    sqlite3ExprCle
18bb0 61 72 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 57  arColumnCache(pW
18bc0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 2d 31  Info->pParse, -1
18bd0 29 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c  );.  for(i=pTabL
18be0 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  ist->nSrc-1; i>=
18bf0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65  0; i--){.    pLe
18c00 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
18c10 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [i];.    sqlite3
18c20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18c30 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74  (v, pLevel->cont
18c40 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
18c50 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
18c60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18c70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
18c80 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
18c90 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
18ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18cb0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20  pLevel->nIn ){. 
18cc0 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f       struct InLo
18cd0 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69  op *pIn;.      i
18ce0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt j;.      sqli
18cf0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18d00 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e  bel(v, pLevel->n
18d10 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  xt);.      for(j
18d20 3d 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49  =pLevel->nIn, pI
18d30 6e 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f  n=&pLevel->aInLo
18d40 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d  op[j-1]; j>0; j-
18d50 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20  -, pIn--){.     
18d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
18d70 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74  mpHere(v, pIn->t
18d80 6f 70 41 64 64 72 2b 31 29 3b 0a 20 20 20 20 20  opAddr+1);.     
18d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18da0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
18db0 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
18dc0 3e 74 6f 70 41 64 64 72 29 3b 0a 20 20 20 20 20  >topAddr);.     
18dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
18de0 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74  mpHere(v, pIn->t
18df0 6f 70 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20  opAddr-1);.     
18e00 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
18e10 5f 66 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61 49  _free(pLevel->aI
18e20 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  nLoop);.    }.  
18e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18e40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
18e50 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69  vel->brk);.    i
18e60 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
18e70 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  Join ){.      in
18e80 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
18e90 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
18ea0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
18eb0 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
18ec0 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 73 71  tJoin);.      sq
18ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18ee0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
18ef0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
18f00 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
18f10 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
18f20 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
18f30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18f40 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
18f50 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
18f60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f80 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18f90 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a  , pLevel->top);.
18fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18fb0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
18fc0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
18fd0 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
18fe0 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
18ff0 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
19000 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
19010 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
19020 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
19030 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19040 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
19050 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  k);..  /* Close 
19060 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
19070 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
19080 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
19090 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
190a0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
190b0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
190c0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
190d0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
190e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
190f0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20  _item *pTabItem 
19100 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
19110 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
19120 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
19130 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
19140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
19150 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
19160 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c  pTab->isEphem ||
19170 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
19180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
19190 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  f( !pWInfo->okOn
191a0 65 50 61 73 73 20 26 26 20 28 70 4c 65 76 65 6c  ePass && (pLevel
191b0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
191c0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
191d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
191e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
191f0 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
19200 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
19210 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
19220 49 64 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx!=0 ){.      
19230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19240 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
19250 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
19260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
19270 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
19280 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
19290 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
192a0 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
192b0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
192c0 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65  index in prefere
192d0 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nce to the table
192e0 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69  . Sometimes, thi
192f0 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  s means.    ** t
19300 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65  he table need ne
19310 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ver be read from
19320 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66  . This is a perf
19330 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20  ormance boost,. 
19340 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62     ** as the vdb
19350 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e  e level waits un
19360 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73  til the table is
19370 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74   read before act
19380 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65  ually.    ** see
19390 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63  king the table c
193a0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63  ursor to the rec
193b0 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ord correspondin
193c0 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
193d0 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
193e0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
193f0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
19400 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
19410 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
19420 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
19430 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
19440 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
19450 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
19460 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
19470 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
19480 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
19490 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
194a0 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
194b0 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
194c0 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
194d0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
194e0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
194f0 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
19500 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
19510 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
19520 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
19530 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49    if( pLevel->pI
19540 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  dx ){.      int 
19550 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20  k, j, last;.    
19560 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
19570 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
19580 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b   = pLevel->pIdx;
19590 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65 49 6e  .      int useIn
195a0 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76 65 6c  dexOnly = pLevel
195b0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
195c0 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20  IDX_ONLY;..     
195d0 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
195e0 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20   );.      pOp = 
195f0 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
19600 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  (v, pWInfo->iTop
19610 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20  );.      last = 
19620 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19630 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
19640 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69   for(k=pWInfo->i
19650 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  Top; k<last; k++
19660 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
19670 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
19680 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
19690 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
196a0 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
196b0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
196c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
196d0 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
196e0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
196f0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
19700 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  p2==pIdx->aiColu
19710 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  mn[j] ){.       
19720 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
19730 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
19740 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
19750 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
19760 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
19780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19790 20 20 20 20 20 20 61 73 73 65 72 74 28 21 75 73        assert(!us
197a0 65 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c  eIndexOnly || j<
197b0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
197c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
197d0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
197e0 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
197f0 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
19800 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
19810 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
19820 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
19830 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  wid;.        }el
19840 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
19850 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26  de==OP_NullRow &
19860 26 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29  & useIndexOnly )
19870 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
19880 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
19890 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
198a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
198b0 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
198c0 75 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49  up.  */.  whereI
198d0 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  nfoFree(pWInfo);
198e0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.