/ Hex Artifact Content
Login

Artifact 67245bb73fd9cc04ee7796a0f358d4910c45cfe9:


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 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 74  d reference.*/.t
04c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
04d0: 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65 43  ereClause WhereC
04e0: 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20 73  lause;.typedef s
04f0: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
0500: 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74 3b  et WhereMaskSet;
0510: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0520: 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65 72  WhereOrInfo Wher
0530: 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65 66  eOrInfo;.typedef
0540: 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e 64   struct WhereAnd
0550: 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e 66  Info WhereAndInf
0560: 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  o;.typedef struc
0570: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68 65  t WhereLevel Whe
0580: 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66  reLevel;.typedef
0590: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
05a0: 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79 70  p WhereLoop;.typ
05b0: 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72  edef struct Wher
05c0: 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68 3b  ePath WherePath;
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54  WhereTerm WhereT
05f0: 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  erm;.typedef str
0600: 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  uct WhereLoopBui
0610: 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42 75  lder WhereLoopBu
0620: 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20 73  ilder;.typedef s
0630: 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e 20  truct WhereScan 
0640: 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65 64  WhereScan;.typed
0650: 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4f  ef struct WhereO
0660: 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f 73  rCost WhereOrCos
0670: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
0680: 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68 65  t WhereOrSet Whe
0690: 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a 20  reOrSet;../*.** 
06a0: 43 6f 73 74 20 58 20 69 73 20 74 72 61 63 6b 65  Cost X is tracke
06b0: 64 20 61 73 20 31 30 2a 6c 6f 67 32 28 58 29 20  d as 10*log2(X) 
06c0: 73 74 6f 72 65 64 20 69 6e 20 61 20 31 36 2d 62  stored in a 16-b
06d0: 69 74 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65  it integer.  The
06e0: 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 63 6f 73 74  .** maximum cost
06f0: 20 66 6f 72 20 6f 72 64 69 6e 61 72 79 20 74 61   for ordinary ta
0700: 62 6c 65 73 20 69 73 20 36 34 2a 28 32 2a 2a 36  bles is 64*(2**6
0710: 33 29 20 77 68 69 63 68 20 62 65 63 6f 6d 65 73  3) which becomes
0720: 20 36 39 30 30 2e 0a 2a 2a 20 28 56 69 72 74 75   6900..** (Virtu
0730: 61 6c 20 74 61 62 6c 65 73 20 63 61 6e 20 72 65  al tables can re
0740: 74 75 72 6e 20 61 20 6c 61 72 67 65 72 20 63 6f  turn a larger co
0750: 73 74 2c 20 62 75 74 20 6c 65 74 27 73 20 61 73  st, but let's as
0760: 73 75 6d 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  sume they do not
0770: 2e 29 0a 2a 2a 20 53 6f 20 61 6c 6c 20 63 6f 73  .).** So all cos
0780: 74 73 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ts can be stored
0790: 20 69 6e 20 61 20 31 36 2d 62 69 74 20 75 6e 73   in a 16-bit uns
07a0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 77 69  igned integer wi
07b0: 74 68 6f 75 74 20 72 69 73 6b 0a 2a 2a 20 6f 66  thout risk.** of
07c0: 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   overflow..**.**
07d0: 20 43 6f 73 74 73 20 61 72 65 20 65 73 74 69 6d   Costs are estim
07e0: 61 74 65 73 2c 20 73 6f 20 64 6f 6e 27 74 20 67  ates, so don't g
07f0: 6f 20 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61  o to the computa
0800: 74 69 6f 6e 61 6c 20 74 72 6f 75 62 6c 65 20 74  tional trouble t
0810: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 31 30 2a  o compute.** 10*
0820: 6c 6f 67 32 28 58 29 20 65 78 61 63 74 6c 79 2e  log2(X) exactly.
0830: 20 20 49 6e 73 74 65 61 64 2c 20 61 20 63 6c 6f    Instead, a clo
0840: 73 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 75  se estimate is u
0850: 73 65 64 2e 20 20 41 6e 79 20 76 61 6c 75 65 20  sed.  Any value 
0860: 6f 66 0a 2a 2a 20 58 3c 3d 31 20 69 73 20 73 74  of.** X<=1 is st
0870: 6f 72 65 64 20 61 73 20 30 2e 20 20 58 3d 32 20  ored as 0.  X=2 
0880: 69 73 20 31 30 2e 20 20 58 3d 33 20 69 73 20 31  is 10.  X=3 is 1
0890: 36 2e 20 20 58 3d 31 30 30 30 20 69 73 20 39 39  6.  X=1000 is 99
08a0: 2e 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  . etc..**.** The
08b0: 20 74 6f 6f 6c 2f 77 68 65 72 65 63 6f 73 74 74   tool/wherecostt
08c0: 65 73 74 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  est.c source fil
08d0: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 63  e implements a c
08e0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67  ommand-line prog
08f0: 72 61 6d 0a 2a 2a 20 74 68 61 74 20 77 69 6c 6c  ram.** that will
0900: 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65 65 6e   convert between
0910: 20 57 68 65 72 65 43 6f 73 74 20 74 6f 20 69 6e   WhereCost to in
0920: 74 65 67 65 72 73 20 61 6e 64 20 64 6f 20 61 64  tegers and do ad
0930: 64 69 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 6d 75  dition and.** mu
0940: 6c 74 69 70 6c 69 63 61 74 69 6f 6e 20 6f 6e 20  ltiplication on 
0950: 57 68 65 72 65 43 6f 73 74 20 76 61 6c 75 65 73  WhereCost values
0960: 2e 20 20 54 68 61 74 20 63 6f 6d 6d 61 6e 64 2d  .  That command-
0970: 6c 69 6e 65 20 70 72 6f 67 72 61 6d 20 69 73 20  line program is 
0980: 61 0a 2a 2a 20 75 73 65 66 75 6c 20 75 74 69 6c  a.** useful util
0990: 69 74 79 20 74 6f 20 68 61 76 65 20 61 72 6f 75  ity to have arou
09a0: 6e 64 20 77 68 65 6e 20 77 6f 72 6b 69 6e 67 20  nd when working 
09b0: 77 69 74 68 20 74 68 69 73 20 6d 6f 64 75 6c 65  with this module
09c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e 73  ..*/.typedef uns
09d0: 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20  igned short int 
09e0: 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f 2a 0a 2a  WhereCost;../*.*
09f0: 2a 20 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f  * This object co
0a00: 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69  ntains informati
0a10: 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  on needed to imp
0a20: 6c 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  lement a single 
0a30: 6e 65 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70 20 69  nested.** loop i
0a40: 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  n WHERE clause..
0a50: 2a 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74 20 74  **.** Contrast t
0a60: 68 69 73 20 6f 62 6a 65 63 74 20 77 69 74 68 20  his object with 
0a70: 57 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68 69 73  WhereLoop.  This
0a80: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
0a90: 73 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  s the.** impleme
0aa0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
0ab0: 6f 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  oop.  WhereLoop 
0ac0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 61 6c  describes the al
0ad0: 67 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68 69 73  gorithm..** This
0ae0: 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
0af0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0b00: 65 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c 67 6f  e WhereLoop algo
0b10: 72 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f 66 0a  rithm as one of.
0b20: 2a 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74 73 2e  ** its elements.
0b30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65 72 65  .**.** The Where
0b40: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74  Info object cont
0b50: 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  ains a single in
0b60: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
0b70: 62 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65 61 63  bject for.** eac
0b80: 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
0b90: 4f 4d 20 63 6c 61 75 73 65 20 28 77 68 69 63 68  OM clause (which
0ba0: 20 69 73 20 74 6f 20 73 61 79 2c 20 66 6f 72 20   is to say, for 
0bb0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  each of the.** n
0bc0: 65 73 74 65 64 20 6c 6f 6f 70 73 20 61 73 20 69  ested loops as i
0bd0: 6d 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20 54 68  mplemented).  Th
0be0: 65 20 6f 72 64 65 72 20 6f 66 20 57 68 65 72 65  e order of Where
0bf0: 4c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 64 65  Level objects de
0c00: 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68 65 20  termines.** the 
0c10: 6c 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72 64 65  loop nested orde
0c20: 72 2c 20 77 69 74 68 20 57 68 65 72 65 49 6e 66  r, with WhereInf
0c30: 6f 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74 68 65  o.a[0] being the
0c40: 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64 0a   outer loop and.
0c50: 2a 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 57  ** WhereInfo.a[W
0c60: 68 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c 2d  hereInfo.nLevel-
0c70: 31 5d 20 62 65 69 6e 67 20 74 68 65 20 69 6e 6e  1] being the inn
0c80: 65 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72 75  er loop..*/.stru
0c90: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 7b 0a  ct WhereLevel {.
0ca0: 20 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69 6e 3b    int iLeftJoin;
0cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
0cc0: 79 20 63 65 6c 6c 20 75 73 65 64 20 74 6f 20 69  y cell used to i
0cd0: 6d 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20 4f 55  mplement LEFT OU
0ce0: 54 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69 6e  TER JOIN */.  in
0cf0: 74 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20  t iTabCur;      
0d00: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
0d10: 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 61  cursor used to a
0d20: 63 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20  ccess the table 
0d30: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
0d40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
0d50: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73  e VDBE cursor us
0d60: 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 49 64  ed to access pId
0d70: 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  x */.  int addrB
0d80: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rk;          /* 
0d90: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
0da0: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ak out of the lo
0db0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
0dc0: 4e 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Nxt;          /*
0dd0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 74   Jump here to st
0de0: 61 72 74 20 74 68 65 20 6e 65 78 74 20 49 4e 20  art the next IN 
0df0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  combination */. 
0e00: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
0e10: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
0e20: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
0e30: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 6c 6f  with the next lo
0e40: 6f 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  op cycle */.  in
0e50: 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20  t addrFirst;    
0e60: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 73      /* First ins
0e70: 74 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e 74 65  truction of inte
0e80: 72 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f 6f 70  rior of the loop
0e90: 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b 20   */.  u8 iFrom; 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0eb0: 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  hich entry in th
0ec0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
0ed0: 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20 20 20  .  u8 op, p5;   
0ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
0ef0: 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74 68 65  de and P5 of the
0f00: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65 6e 64   opcode that end
0f10: 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  s the loop */.  
0f20: 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20 20 20  int p1, p2;     
0f30: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64        /* Operand
0f40: 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  s of the opcode 
0f50: 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74 68 65  used to ends the
0f60: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f 6e   loop */.  union
0f70: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
0f80: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
0f90: 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  that depends on 
0fa0: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
0fb0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a  */.    struct {.
0fc0: 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20 20        int nIn;  
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0fe0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
0ff0: 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a 2f   in aInLoop[] */
1000: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
1010: 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20 20 69  Loop {.        i
1020: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
1030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1040: 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  E cursor used by
1050: 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
1060: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
1070: 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20 20 20   addrInTop;     
1080: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
1090: 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  e IN loop */.   
10a0: 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f 70       u8 eEndLoop
10b0: 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Op;         /* I
10c0: 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f  N Loop terminato
10d0: 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50  r. OP_Next or OP
10e0: 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20 20 7d  _Prev */.      }
10f0: 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20 20   *aInLoop;      
1100: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1110: 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e  ion about each n
1120: 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61 74 6f  ested IN operato
1130: 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20 20  r */.    } in;  
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1150: 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57 4c 6f  * Used when pWLo
1160: 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1170: 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20 20  E_IN_ABLE */.   
1180: 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64 78 3b   Index *pCovidx;
1190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
11a0: 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  le covering inde
11b0: 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c 54  x for WHERE_MULT
11c0: 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  I_OR */.  } u;. 
11d0: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
11e0: 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20 54  p *pWLoop;  /* T
11f0: 68 65 20 73 65 6c 65 63 74 65 64 20 57 68 65 72  he selected Wher
1200: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1210: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  };../*.** Each i
1220: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1230: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
1240: 73 20 61 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66  s an algorithm f
1250: 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 6f 6e  or evaluating on
1260: 65 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 61 20 6a  e.** term of a j
1270: 6f 69 6e 2e 20 20 45 76 65 72 79 20 74 65 72 6d  oin.  Every term
1280: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1290: 75 73 65 20 77 69 6c 6c 20 68 61 76 65 20 61 74  use will have at
12a0: 20 6c 65 61 73 74 0a 2a 2a 20 6f 6e 65 20 63 6f   least.** one co
12b0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
12c0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 28 75 6e  eLoop object (un
12d0: 6c 65 73 73 20 49 4e 44 45 58 45 44 20 42 59 20  less INDEXED BY 
12e0: 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 70  constraints.** p
12f0: 72 65 76 65 6e 74 20 61 20 71 75 65 72 79 20 73  revent a query s
1300: 6f 6c 75 74 69 6f 6e 20 2d 20 77 68 69 63 68 20  olution - which 
1310: 69 73 20 61 6e 20 65 72 72 6f 72 29 20 61 6e 64  is an error) and
1320: 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20 74   many terms of t
1330: 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
1340: 65 20 77 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74  e will have mult
1350: 69 70 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  iple WhereLoop o
1360: 62 6a 65 63 74 73 2c 20 65 61 63 68 20 64 65 73  bjects, each des
1370: 63 72 69 62 69 6e 67 20 61 0a 2a 2a 20 70 6f 74  cribing a.** pot
1380: 65 6e 74 69 61 6c 20 77 61 79 20 6f 66 20 69 6d  ential way of im
1390: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 20  plementing that 
13a0: 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
13b0: 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a  , together with.
13c0: 2a 2a 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ** dependencies 
13d0: 61 6e 64 20 63 6f 73 74 20 65 73 74 69 6d 61 74  and cost estimat
13e0: 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 65  es for using the
13f0: 20 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69 74 68   chosen algorith
1400: 6d 2e 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 70  m..**.** Query p
1410: 6c 61 6e 6e 69 6e 67 20 63 6f 6e 73 69 73 74 73  lanning consists
1420: 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 75 70 20   of building up 
1430: 61 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20  a collection of 
1440: 74 68 65 73 65 20 57 68 65 72 65 4c 6f 6f 70 0a  these WhereLoop.
1450: 2a 2a 20 6f 62 6a 65 63 74 73 2c 20 74 68 65 6e  ** objects, then
1460: 20 63 6f 6d 70 75 74 69 6e 67 20 61 20 70 61 72   computing a par
1470: 74 69 63 75 6c 61 72 20 73 65 71 75 65 6e 63 65  ticular sequence
1480: 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
1490: 6a 65 63 74 73 2c 20 77 69 74 68 0a 2a 2a 20 6f  jects, with.** o
14a0: 6e 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ne WhereLoop obj
14b0: 65 63 74 20 70 65 72 20 46 52 4f 4d 20 63 6c 61  ect per FROM cla
14c0: 75 73 65 20 74 65 72 6d 2c 20 74 68 61 74 20 73  use term, that s
14d0: 61 74 69 73 66 79 20 61 6c 6c 20 64 65 70 65 6e  atisfy all depen
14e0: 64 65 6e 63 69 65 73 0a 2a 2a 20 61 6e 64 20 74  dencies.** and t
14f0: 68 61 74 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65  hat minimize the
1500: 20 6f 76 65 72 61 6c 6c 20 63 6f 73 74 2e 0a 2a   overall cost..*
1510: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
1520: 6f 70 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 70  op {.  Bitmask p
1530: 72 65 72 65 71 3b 20 20 20 20 20 20 20 2f 2a 20  rereq;       /* 
1540: 42 69 74 6d 61 73 6b 20 6f 66 20 6f 74 68 65 72  Bitmask of other
1550: 20 6c 6f 6f 70 73 20 74 68 61 74 20 6d 75 73 74   loops that must
1560: 20 72 75 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20   run first */.  
1570: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 65 6c 66  Bitmask maskSelf
1580: 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  ;     /* Bitmask
1590: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 74 61 62   identifying tab
15a0: 6c 65 20 69 54 61 62 20 2a 2f 0a 23 69 66 64 65  le iTab */.#ifde
15b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
15c0: 20 63 68 61 72 20 63 49 64 3b 20 20 20 20 20 20   char cId;      
15d0: 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c         /* Symbol
15e0: 69 63 20 49 44 20 6f 66 20 74 68 69 73 20 6c 6f  ic ID of this lo
15f0: 6f 70 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  op for debugging
1600: 20 75 73 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20   use */.#endif. 
1610: 20 75 38 20 69 54 61 62 3b 20 20 20 20 20 20 20   u8 iTab;       
1620: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
1630: 6f 6e 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  on in FROM claus
1640: 65 20 6f 66 20 74 61 62 6c 65 20 66 6f 72 20 74  e of table for t
1650: 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 38  his loop */.  u8
1660: 20 69 53 6f 72 74 49 64 78 3b 20 20 20 20 20 20   iSortIdx;      
1670: 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 69      /* Sorting i
1680: 6e 64 65 78 20 6e 75 6d 62 65 72 2e 20 20 30 3d  ndex number.  0=
1690: 3d 4e 6f 6e 65 20 2a 2f 0a 20 20 57 68 65 72 65  =None */.  Where
16a0: 43 6f 73 74 20 72 53 65 74 75 70 3b 20 20 20 20  Cost rSetup;    
16b0: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 73 65 74   /* One-time set
16c0: 75 70 20 63 6f 73 74 20 28 65 78 3a 20 63 72 65  up cost (ex: cre
16d0: 61 74 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  ate transient in
16e0: 64 65 78 29 20 2a 2f 0a 20 20 57 68 65 72 65 43  dex) */.  WhereC
16f0: 6f 73 74 20 72 52 75 6e 3b 20 20 20 20 20 20 20  ost rRun;       
1700: 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e 6e 69  /* Cost of runni
1710: 6e 67 20 65 61 63 68 20 6c 6f 6f 70 20 2a 2f 0a  ng each loop */.
1720: 20 20 57 68 65 72 65 43 6f 73 74 20 6e 4f 75 74    WhereCost nOut
1730: 3b 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d  ;       /* Estim
1740: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f  ated number of o
1750: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20  utput rows */.  
1760: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75  union {.    stru
1770: 63 74 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  ct {            
1780: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
1790: 6e 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 62  n for internal b
17a0: 74 72 65 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tree tables */. 
17b0: 20 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20       int nEq;   
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17d0: 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
17e0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
17f0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1800: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  ndex;         /*
1810: 20 49 6e 64 65 78 20 75 73 65 64 2c 20 6f 72 20   Index used, or 
1820: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 20 62 74  NULL */.    } bt
1830: 72 65 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ree;.    struct 
1840: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1850: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  /* Information f
1860: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
1870: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
1880: 64 78 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  dxNum;          
1890: 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
18a0: 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6e 65  r */.      u8 ne
18b0: 65 64 46 72 65 65 3b 20 20 20 20 20 20 20 20 20  edFree;         
18c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 71 6c    /* True if sql
18d0: 69 74 65 33 5f 66 72 65 65 28 69 64 78 53 74 72  ite3_free(idxStr
18e0: 29 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ) is needed */. 
18f0: 20 20 20 20 20 75 38 20 69 73 4f 72 64 65 72 65       u8 isOrdere
1900: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
1910: 72 75 65 20 69 66 20 73 61 74 69 73 66 69 65 73  rue if satisfies
1920: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20   ORDER BY */.   
1930: 20 20 20 75 31 36 20 6f 6d 69 74 4d 61 73 6b 3b     u16 omitMask;
1940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
1950: 6d 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f  ms that may be o
1960: 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  mitted */.      
1970: 63 68 61 72 20 2a 69 64 78 53 74 72 3b 20 20 20  char *idxStr;   
1980: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1990: 69 64 65 6e 74 69 66 69 65 72 20 73 74 72 69 6e  identifier strin
19a0: 67 20 2a 2f 0a 20 20 20 20 7d 20 76 74 61 62 3b  g */.    } vtab;
19b0: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 77 73  .  } u;.  u32 ws
19c0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
19d0: 2f 2a 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  /* WHERE_* flags
19e0: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
19f0: 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20 6e 4c  plan */.  u16 nL
1a00: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1a10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1a20: 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d 5b 5d  ries in aLTerm[]
1a30: 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 77 68 65 72   */.  /**** wher
1a40: 65 4c 6f 6f 70 58 66 65 72 28 29 20 63 6f 70 69  eLoopXfer() copi
1a50: 65 73 20 66 69 65 6c 64 73 20 61 62 6f 76 65 20  es fields above 
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 20 64 65 66 69 6e  *******/.# defin
1a80: 65 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45  e WHERE_LOOP_XFE
1a90: 52 5f 53 5a 20 6f 66 66 73 65 74 6f 66 28 57 68  R_SZ offsetof(Wh
1aa0: 65 72 65 4c 6f 6f 70 2c 6e 4c 53 6c 6f 74 29 0a  ereLoop,nLSlot).
1ab0: 20 20 75 31 36 20 6e 4c 53 6c 6f 74 3b 20 20 20    u16 nLSlot;   
1ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ad0: 72 20 6f 66 20 73 6c 6f 74 73 20 61 6c 6c 6f 63  r of slots alloc
1ae0: 61 74 65 64 20 66 6f 72 20 61 4c 54 65 72 6d 5b  ated for aLTerm[
1af0: 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  ] */.  WhereTerm
1b00: 20 2a 2a 61 4c 54 65 72 6d 3b 20 20 20 2f 2a 20   **aLTerm;   /* 
1b10: 57 68 65 72 65 54 65 72 6d 73 20 75 73 65 64 20  WhereTerms used 
1b20: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1b30: 70 4e 65 78 74 4c 6f 6f 70 3b 20 2f 2a 20 4e 65  pNextLoop; /* Ne
1b40: 78 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  xt WhereLoop obj
1b50: 65 63 74 20 69 6e 20 74 68 65 20 57 68 65 72 65  ect in the Where
1b60: 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  Clause */.  Wher
1b70: 65 54 65 72 6d 20 2a 61 4c 54 65 72 6d 53 70 61  eTerm *aLTermSpa
1b80: 63 65 5b 34 5d 3b 20 20 2f 2a 20 49 6e 69 74 69  ce[4];  /* Initi
1b90: 61 6c 20 61 4c 54 65 72 6d 5b 5d 20 73 70 61 63  al aLTerm[] spac
1ba0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 69 73  e */.};../* This
1bb0: 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 74 68   object holds th
1bc0: 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1bd0: 61 6e 64 20 74 68 65 20 63 6f 73 74 20 6f 66 20  and the cost of 
1be0: 72 75 6e 6e 69 6e 67 20 61 0a 2a 2a 20 73 75 62  running a.** sub
1bf0: 71 75 65 72 79 20 6f 6e 20 6f 6e 65 20 6f 70 65  query on one ope
1c00: 72 61 6e 64 20 6f 66 20 61 6e 20 4f 52 20 6f 70  rand of an OR op
1c10: 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 57 48  erator in the WH
1c20: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 53  ERE clause..** S
1c30: 65 65 20 57 68 65 72 65 4f 72 53 65 74 20 66 6f  ee WhereOrSet fo
1c40: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1c50: 6f 72 6d 61 74 69 6f 6e 20 0a 2a 2f 0a 73 74 72  ormation .*/.str
1c60: 75 63 74 20 57 68 65 72 65 4f 72 43 6f 73 74 20  uct WhereOrCost 
1c70: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  {.  Bitmask prer
1c80: 65 71 3b 20 20 20 20 20 2f 2a 20 50 72 65 72 65  eq;     /* Prere
1c90: 71 75 69 73 69 74 65 73 20 2a 2f 0a 20 20 57 68  quisites */.  Wh
1ca0: 65 72 65 43 6f 73 74 20 72 52 75 6e 3b 20 20 20  ereCost rRun;   
1cb0: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 72 75 6e    /* Cost of run
1cc0: 6e 69 6e 67 20 74 68 69 73 20 73 75 62 71 75 65  ning this subque
1cd0: 72 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  ry */.  WhereCos
1ce0: 74 20 6e 4f 75 74 3b 20 20 20 20 20 2f 2a 20 4e  t nOut;     /* N
1cf0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73  umber of outputs
1d00: 20 66 6f 72 20 74 68 69 73 20 73 75 62 71 75 65   for this subque
1d10: 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ry */.};../* The
1d20: 20 57 68 65 72 65 4f 72 53 65 74 20 6f 62 6a 65   WhereOrSet obje
1d30: 63 74 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f  ct holds a set o
1d40: 66 20 70 6f 73 73 69 62 6c 65 20 57 68 65 72 65  f possible Where
1d50: 4f 72 43 6f 73 74 73 20 74 68 61 74 0a 2a 2a 20  OrCosts that.** 
1d60: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
1d70: 65 20 73 75 62 71 75 65 72 79 28 73 29 20 6f 66  e subquery(s) of
1d80: 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63 65   OR-clause proce
1d90: 73 73 69 6e 67 2e 20 20 41 74 20 6d 6f 73 74 0a  ssing.  At most.
1da0: 2a 2a 20 66 61 76 6f 72 61 62 6c 65 20 4e 5f 4f  ** favorable N_O
1db0: 52 5f 43 4f 53 54 20 65 6c 65 6d 65 6e 74 73 20  R_COST elements 
1dc0: 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2f  are retained..*/
1dd0: 0a 23 64 65 66 69 6e 65 20 4e 5f 4f 52 5f 43 4f  .#define N_OR_CO
1de0: 53 54 20 33 0a 73 74 72 75 63 74 20 57 68 65 72  ST 3.struct Wher
1df0: 65 4f 72 53 65 74 20 7b 0a 20 20 75 31 36 20 6e  eOrSet {.  u16 n
1e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e20: 20 6f 66 20 76 61 6c 69 64 20 61 5b 5d 20 65 6e   of valid a[] en
1e30: 74 72 69 65 73 20 2a 2f 0a 20 20 57 68 65 72 65  tries */.  Where
1e40: 4f 72 43 6f 73 74 20 61 5b 4e 5f 4f 52 5f 43 4f  OrCost a[N_OR_CO
1e50: 53 54 5d 3b 20 20 20 2f 2a 20 53 65 74 20 6f 66  ST];   /* Set of
1e60: 20 62 65 73 74 20 63 6f 73 74 73 20 2a 2f 0a 7d   best costs */.}
1e70: 3b 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  ;.../* Forward d
1e80: 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6d 65  eclaration of me
1e90: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1ea0: 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  int whereLoopRes
1eb0: 69 7a 65 28 73 71 6c 69 74 65 33 2a 2c 20 57 68  ize(sqlite3*, Wh
1ec0: 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e 74 29 3b 0a  ereLoop*, int);.
1ed0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  ./*.** Each inst
1ee0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1ef0: 65 63 74 20 68 6f 6c 64 73 20 61 20 73 65 71 75  ect holds a sequ
1f00: 65 6e 63 65 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ence of WhereLoo
1f10: 70 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 74 68 61  p objects.** tha
1f20: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 73 6f 6d 65  t implement some
1f30: 20 6f 72 20 61 6c 6c 20 6f 66 20 61 20 71 75 65   or all of a que
1f40: 72 79 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ry plan..**.** T
1f50: 68 69 6e 6b 20 6f 66 20 65 61 63 68 20 57 68 65  hink of each Whe
1f60: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 61 73  reLoop object as
1f70: 20 61 20 6e 6f 64 65 20 69 6e 20 61 20 67 72 61   a node in a gra
1f80: 70 68 20 77 69 74 68 20 61 72 63 73 0a 2a 2a 20  ph with arcs.** 
1f90: 73 68 6f 77 69 6e 67 20 64 65 70 65 6e 64 65 6e  showing dependen
1fa0: 63 65 73 20 61 6e 64 20 63 6f 73 74 73 20 66 6f  ces and costs fo
1fb0: 72 20 74 72 61 76 65 6c 6c 69 6e 67 20 62 65 74  r travelling bet
1fc0: 77 65 65 6e 20 6e 6f 64 65 73 2e 20 20 28 54 68  ween nodes.  (Th
1fd0: 61 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 61 20 63  at is.** not a c
1fe0: 6f 6d 70 6c 65 74 65 6c 79 20 61 63 63 75 72 61  ompletely accura
1ff0: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62  te description b
2000: 65 63 61 75 73 65 20 57 68 65 72 65 4c 6f 6f 70  ecause WhereLoop
2010: 20 63 6f 73 74 73 20 61 72 65 20 61 0a 2a 2a 20   costs are a.** 
2020: 76 65 63 74 6f 72 2c 20 6e 6f 74 20 61 20 73 63  vector, not a sc
2030: 61 6c 61 72 2c 20 61 6e 64 20 62 65 63 61 75 73  alar, and becaus
2040: 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 61 72  e dependences ar
2050: 65 20 6d 61 6e 79 2d 74 6f 2d 6f 6e 65 2c 20 6e  e many-to-one, n
2060: 6f 74 0a 2a 2a 20 6f 6e 65 2d 74 6f 2d 6f 6e 65  ot.** one-to-one
2070: 20 61 73 20 61 72 65 20 67 72 61 70 68 20 6e 6f   as are graph no
2080: 64 65 73 2e 20 20 42 75 74 20 69 74 20 69 73 20  des.  But it is 
2090: 61 20 75 73 65 66 75 6c 20 76 69 73 75 61 6c 69  a useful visuali
20a0: 7a 61 74 69 6f 6e 20 61 69 64 2e 29 0a 2a 2a 20  zation aid.).** 
20b0: 54 68 65 6e 20 61 20 57 68 65 72 65 50 61 74 68  Then a WherePath
20c0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 70 61 74   object is a pat
20d0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 67 72  h through the gr
20e0: 61 70 68 20 74 68 61 74 20 76 69 73 69 74 73 20  aph that visits 
20f0: 73 6f 6d 65 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f  some.** or all o
2100: 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2110: 6f 62 6a 65 63 74 73 20 6f 6e 63 65 2e 0a 2a 2a  objects once..**
2120: 0a 2a 2a 20 54 68 65 20 22 73 6f 6c 76 65 72 22  .** The "solver"
2130: 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
2140: 6e 67 20 74 68 65 20 4e 20 62 65 73 74 20 57 68  ng the N best Wh
2150: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 73 20  erePath objects 
2160: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 31 2e 20  of length.** 1. 
2170: 20 54 68 65 6e 20 75 73 69 6e 67 20 74 68 6f 73   Then using thos
2180: 65 20 61 73 20 61 20 62 61 73 69 73 20 74 6f 20  e as a basis to 
2190: 63 6f 6d 70 75 74 65 20 74 68 65 20 4e 20 62 65  compute the N be
21a0: 73 74 20 57 68 65 72 65 50 61 74 68 20 6f 62 6a  st WherePath obj
21b0: 65 63 74 73 0a 2a 2a 20 6f 66 20 6c 65 6e 67 74  ects.** of lengt
21c0: 68 20 32 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  h 2.  And so for
21d0: 74 68 20 75 6e 74 69 6c 20 74 68 65 20 6c 65 6e  th until the len
21e0: 67 74 68 20 6f 66 20 57 68 65 72 65 50 61 74 68  gth of WherePath
21f0: 73 20 65 71 75 61 6c 73 20 74 68 65 0a 2a 2a 20  s equals the.** 
2200: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 73 20  number of nodes 
2210: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2220: 73 65 2e 20 20 54 68 65 20 62 65 73 74 20 28 6c  se.  The best (l
2230: 6f 77 65 73 74 20 63 6f 73 74 29 20 57 68 65 72  owest cost) Wher
2240: 65 50 61 74 68 0a 2a 2a 20 61 74 20 74 68 65 20  ePath.** at the 
2250: 65 6e 64 20 69 73 20 74 68 65 20 63 68 6f 6f 73  end is the choos
2260: 65 6e 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  en query plan..*
2270: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 50 61  /.struct WherePa
2280: 74 68 20 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  th {.  Bitmask m
2290: 61 73 6b 4c 6f 6f 70 3b 20 20 20 20 20 2f 2a 20  askLoop;     /* 
22a0: 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 57  Bitmask of all W
22b0: 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22c0: 20 69 6e 20 74 68 69 73 20 70 61 74 68 20 2a 2f   in this path */
22d0: 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4c 6f  .  Bitmask revLo
22e0: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 61 4c 6f 6f  op;      /* aLoo
22f0: 70 5b 5d 73 20 74 68 61 74 20 73 68 6f 75 6c 64  p[]s that should
2300: 20 62 65 20 72 65 76 65 72 73 65 64 20 66 6f 72   be reversed for
2310: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 57   ORDER BY */.  W
2320: 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 3b 20 20  hereCost nRow;  
2330: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
2340: 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
2350: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
2360: 69 73 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65  is path */.  Whe
2370: 72 65 43 6f 73 74 20 72 43 6f 73 74 3b 20 20 20  reCost rCost;   
2380: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 6f 73 74     /* Total cost
2390: 20 6f 66 20 74 68 69 73 20 70 61 74 68 20 2a 2f   of this path */
23a0: 0a 20 20 75 38 20 69 73 4f 72 64 65 72 65 64 3b  .  u8 isOrdered;
23b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23c0: 20 69 66 20 74 68 69 73 20 70 61 74 68 20 73 61   if this path sa
23d0: 74 69 73 66 69 65 73 20 4f 52 44 45 52 20 42 59  tisfies ORDER BY
23e0: 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
23f0: 65 64 56 61 6c 69 64 3b 20 20 20 20 2f 2a 20 54  edValid;    /* T
2400: 72 75 65 20 69 66 20 74 68 65 20 69 73 4f 72 64  rue if the isOrd
2410: 65 72 65 64 20 66 69 65 6c 64 20 69 73 20 76 61  ered field is va
2420: 6c 69 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  lid */.  WhereLo
2430: 6f 70 20 2a 2a 61 4c 6f 6f 70 3b 20 20 20 20 2f  op **aLoop;    /
2440: 2a 20 41 72 72 61 79 20 6f 66 20 57 68 65 72 65  * Array of Where
2450: 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 69 6d 70  Loop objects imp
2460: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 70  lementing this p
2470: 61 74 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ath */.};../*.**
2480: 20 54 68 65 20 71 75 65 72 79 20 67 65 6e 65 72   The query gener
2490: 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61 72 72  ator uses an arr
24a0: 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65 73 20  ay of instances 
24b0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
24c0: 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69 74 20  e to.** help it 
24d0: 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75 62 65  analyze the sube
24e0: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
24f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
2500: 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a 20 63   Each WHERE.** c
2510: 6c 61 75 73 65 20 73 75 62 65 78 70 72 65 73 73  lause subexpress
2520: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
2530: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
2540: 20 62 79 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   by AND operator
2550: 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c 79 2c 20 6f  s,.** usually, o
2560: 72 20 73 6f 6d 65 74 69 6d 65 73 20 73 75 62 65  r sometimes sube
2570: 78 70 72 65 73 73 69 6f 6e 73 20 73 65 70 61 72  xpressions separ
2580: 61 74 65 64 20 62 79 20 4f 52 2e 0a 2a 2a 0a 2a  ated by OR..**.*
2590: 2a 20 41 6c 6c 20 57 68 65 72 65 54 65 72 6d 73  * All WhereTerms
25a0: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 20 69   are collected i
25b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65  nto a single Whe
25c0: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
25d0: 72 65 2e 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c  re.  .** The fol
25e0: 6c 6f 77 69 6e 67 20 69 64 65 6e 74 69 74 79 20  lowing identity 
25f0: 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  holds:.**.**    
2600: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 70 57      WhereTerm.pW
2610: 43 2d 3e 61 5b 57 68 65 72 65 54 65 72 6d 2e 69  C->a[WhereTerm.i
2620: 64 78 5d 20 3d 3d 20 57 68 65 72 65 54 65 72 6d  dx] == WhereTerm
2630: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65  .**.** When a te
2640: 72 6d 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  rm is of the for
2650: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
2660: 20 20 20 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78        X <op> <ex
2670: 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  pr>.**.** where 
2680: 58 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  X is a column na
2690: 6d 65 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  me and <op> is o
26a0: 6e 65 20 6f 66 20 63 65 72 74 61 69 6e 20 6f 70  ne of certain op
26b0: 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e  erators,.** then
26c0: 20 57 68 65 72 65 54 65 72 6d 2e 6c 65 66 74 43   WhereTerm.leftC
26d0: 75 72 73 6f 72 20 61 6e 64 20 57 68 65 72 65 54  ursor and WhereT
26e0: 65 72 6d 2e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  erm.u.leftColumn
26f0: 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a 20 63   record the.** c
2700: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 6e 64  ursor number and
2710: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 66   column number f
2720: 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65 72 6d  or X.  WhereTerm
2730: 2e 65 4f 70 65 72 61 74 6f 72 20 72 65 63 6f 72  .eOperator recor
2740: 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20 75  ds.** the <op> u
2750: 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20 65  sing a bitmask e
2760: 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64 20  ncoding defined 
2770: 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77 2e  by WO_xxx below.
2780: 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66 20    The.** use of 
2790: 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69  a bitmask encodi
27a0: 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61  ng for the opera
27b0: 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  tor allows us to
27c0: 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63 6b   search.** quick
27d0: 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68 61  ly for terms tha
27e0: 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20 73  t match any of s
27f0: 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
2800: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
2810: 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 6d 69  * A WhereTerm mi
2820: 67 68 74 20 61 6c 73 6f 20 62 65 20 74 77 6f 20  ght also be two 
2830: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
2840: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52   connected by OR
2850: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
2860: 28 74 31 2e 58 20 3c 6f 70 3e 20 3c 65 78 70 72  (t1.X <op> <expr
2870: 3e 29 20 4f 52 20 28 74 31 2e 59 20 3c 6f 70 3e  >) OR (t1.Y <op>
2880: 20 3c 65 78 70 72 3e 29 20 4f 52 20 2e 2e 2e 2e   <expr>) OR ....
2890: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 73  .**.** In this s
28a0: 65 63 6f 6e 64 20 63 61 73 65 2c 20 77 74 46 6c  econd case, wtFl
28b0: 61 67 20 61 73 20 74 68 65 20 54 45 52 4d 5f 4f  ag as the TERM_O
28c0: 52 49 4e 46 4f 20 73 65 74 20 61 6e 64 20 65 4f  RINFO set and eO
28d0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a  perator==WO_OR.*
28e0: 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 54  * and the WhereT
28f0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 66 69  erm.u.pOrInfo fi
2900: 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 75  eld points to au
2910: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
2920: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  ion that.** is c
2930: 6f 6c 6c 65 63 74 65 64 20 61 62 6f 75 74 20 74  ollected about t
2940: 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 65  he.**.** If a te
2950: 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  rm in the WHERE 
2960: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
2970: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
2980: 74 68 65 20 74 77 6f 20 70 72 65 76 69 6f 75 73  the two previous
2990: 0a 2a 2a 20 63 61 74 65 67 6f 72 69 65 73 2c 20  .** categories, 
29a0: 74 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 3d 3d  then eOperator==
29b0: 30 2e 20 20 54 68 65 20 57 68 65 72 65 54 65 72  0.  The WhereTer
29c0: 6d 2e 70 45 78 70 72 20 66 69 65 6c 64 20 69 73  m.pExpr field is
29d0: 20 73 74 69 6c 6c 20 73 65 74 0a 2a 2a 20 74 6f   still set.** to
29e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 75   the original su
29f0: 62 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74  bexpression cont
2a00: 65 6e 74 20 61 6e 64 20 77 74 46 6c 61 67 73 20  ent and wtFlags 
2a10: 69 73 20 73 65 74 20 75 70 20 61 70 70 72 6f 70  is set up approp
2a20: 72 69 61 74 65 6c 79 0a 2a 2a 20 62 75 74 20 6e  riately.** but n
2a30: 6f 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 69  o other fields i
2a40: 6e 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 20  n the WhereTerm 
2a50: 6f 62 6a 65 63 74 20 61 72 65 20 6d 65 61 6e 69  object are meani
2a60: 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ngful..**.** Whe
2a70: 6e 20 65 4f 70 65 72 61 74 6f 72 21 3d 30 2c 20  n eOperator!=0, 
2a80: 70 72 65 72 65 71 52 69 67 68 74 20 61 6e 64 20  prereqRight and 
2a90: 70 72 65 72 65 71 41 6c 6c 20 72 65 63 6f 72 64  prereqAll record
2aa0: 20 73 65 74 73 20 6f 66 20 63 75 72 73 6f 72 20   sets of cursor 
2ab0: 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62 75 74 20  numbers,.** but 
2ac0: 74 68 65 79 20 64 6f 20 73 6f 20 69 6e 64 69 72  they do so indir
2ad0: 65 63 74 6c 79 2e 20 20 41 20 73 69 6e 67 6c 65  ectly.  A single
2ae0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74   WhereMaskSet st
2af0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c 61 74  ructure translat
2b00: 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  es.** cursor num
2b10: 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20 61 6e  ber into bits an
2b20: 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 64  d the translated
2b30: 20 62 69 74 20 69 73 20 73 74 6f 72 65 64 20 69   bit is stored i
2b40: 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a 2a 20  n the prereq.** 
2b50: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74 72 61  fields.  The tra
2b60: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73 65 64  nslation is used
2b70: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 78   in order to max
2b80: 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62 65 72  imize the number
2b90: 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68 61 74   of.** bits that
2ba0: 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61 20 42   will fit in a B
2bb0: 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56 44 42  itmask.  The VDB
2bc0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2bd0: 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73 70 72   might be.** spr
2be0: 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74 68 65  ead out over the
2bf0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
2c00: 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65 78 61  tegers.  For exa
2c10: 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73 6f 72  mple, the cursor
2c20: 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  .** numbers migh
2c30: 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20 31 30  t be 3, 8, 9, 10
2c40: 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20 61 6e  , 20, 23, 41, an
2c50: 64 20 34 35 2e 20 20 54 68 65 20 57 68 65 72 65  d 45.  The Where
2c60: 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e 73  MaskSet.** trans
2c70: 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61 72  lates these spar
2c80: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
2c90: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
2ca0: 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 62  ve integers.** b
2cb0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 20  eginning with 0 
2cc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
2cd0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 62   the best possib
2ce0: 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61 76  le use of the av
2cf0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73 20  ailable.** bits 
2d00: 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e 20  in the Bitmask. 
2d10: 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61 6d   So, in the exam
2d20: 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 63  ple above, the c
2d30: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a 2a  ursor numbers.**
2d40: 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64   would be mapped
2d50: 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20 30   into integers 0
2d60: 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a 2a   through 7..**.*
2d70: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2d80: 74 65 72 6d 73 20 69 6e 20 61 20 6a 6f 69 6e 20  terms in a join 
2d90: 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68  is limited by th
2da0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2db0: 0a 2a 2a 20 69 6e 20 70 72 65 72 65 71 52 69 67  .** in prereqRig
2dc0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
2dd0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
2de0: 73 20 36 34 20 62 69 74 73 2c 20 68 65 6e 63 65  s 64 bits, hence
2df0: 20 53 51 4c 69 74 65 0a 2a 2a 20 69 73 20 6f 6e   SQLite.** is on
2e00: 6c 79 20 61 62 6c 65 20 74 6f 20 70 72 6f 63 65  ly able to proce
2e10: 73 73 20 6a 6f 69 6e 73 20 77 69 74 68 20 36 34  ss joins with 64
2e20: 20 6f 72 20 66 65 77 65 72 20 74 61 62 6c 65 73   or fewer tables
2e30: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
2e40: 65 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a  eTerm {.  Expr *
2e50: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
2e60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e70: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
2e80: 6e 20 74 68 61 74 20 69 73 20 74 68 69 73 20 74  n that is this t
2e90: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  erm */.  int iPa
2ea0: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
2eb0: 20 2f 2a 20 44 69 73 61 62 6c 65 20 70 57 43 2d   /* Disable pWC-
2ec0: 3e 61 5b 69 50 61 72 65 6e 74 5d 20 77 68 65 6e  >a[iParent] when
2ed0: 20 74 68 69 73 20 74 65 72 6d 20 64 69 73 61 62   this term disab
2ee0: 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 66  led */.  int lef
2ef0: 74 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  tCursor;        
2f00: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
2f10: 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c 6f 70  r of X in "X <op
2f20: 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20 20 75  > <expr>" */.  u
2f30: 6e 69 6f 6e 20 7b 0a 20 20 20 20 69 6e 74 20 6c  nion {.    int l
2f40: 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  eftColumn;      
2f50: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
2f60: 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20 3c  ber of X in "X <
2f70: 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a 20  op> <expr>" */. 
2f80: 20 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a     WhereOrInfo *
2f90: 70 4f 72 49 6e 66 6f 3b 20 20 20 2f 2a 20 45 78  pOrInfo;   /* Ex
2fa0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
2fb0: 69 66 20 28 65 4f 70 65 72 61 74 6f 72 20 26 20  if (eOperator & 
2fc0: 57 4f 5f 4f 52 29 21 3d 30 20 2a 2f 0a 20 20 20  WO_OR)!=0 */.   
2fd0: 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70   WhereAndInfo *p
2fe0: 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78 74 72  AndInfo; /* Extr
2ff0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 66  a information if
3000: 20 28 65 4f 70 65 72 61 74 6f 72 26 20 57 4f 5f   (eOperator& WO_
3010: 41 4e 44 29 21 3d 30 20 2a 2f 0a 20 20 7d 20 75  AND)!=0 */.  } u
3020: 3b 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  ;.  u16 eOperato
3030: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
3040: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
3050: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
3060: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
3070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
3080: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
3090: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
30a0: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
30b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30c0: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
30d0: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
30e0: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
30f0: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
3100: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
3110: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
3120: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
3130: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
3140: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
3150: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
3160: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
3170: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
3180: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
3190: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
31a0: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
31b0: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
31c0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
31d0: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
31e0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
31f0: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
3200: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
3210: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
3220: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
3230: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
3240: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
3250: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
3260: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3270: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
3280: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
3290: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
32a0: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
32b0: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
32c0: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
32d0: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
32e0: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
32f0: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3300: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
3310: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
3320: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
3330: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
3340: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
3350: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
3360: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3370: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
3380: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
3390: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
33a0: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
33b0: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
33c0: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
33d0: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
33e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
33f0: 0a 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f  .#  define TERM_
3400: 56 4e 55 4c 4c 20 20 20 20 30 78 38 30 20 20 20  VNULL    0x80   
3410: 2f 2a 20 4d 61 6e 75 66 61 63 74 75 72 65 64 20  /* Manufactured 
3420: 78 3e 4e 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c  x>NULL or x<=NUL
3430: 4c 20 74 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a  L term */.#else.
3440: 23 20 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  #  define TERM_V
3450: 4e 55 4c 4c 20 20 20 20 30 78 30 30 20 20 20 2f  NULL    0x00   /
3460: 2a 20 44 69 73 61 62 6c 65 64 20 69 66 20 6e 6f  * Disabled if no
3470: 74 20 75 73 69 6e 67 20 73 74 61 74 33 20 2a 2f  t using stat3 */
3480: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
3490: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
34a0: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
34b0: 63 74 20 69 73 20 75 73 65 64 20 61 73 20 61 6e  ct is used as an
34c0: 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   iterator for lo
34d0: 63 61 74 69 6e 67 0a 2a 2a 20 74 65 72 6d 73 20  cating.** terms 
34e0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
34f0: 75 73 65 20 74 68 61 74 20 61 72 65 20 75 73 65  use that are use
3500: 66 75 6c 20 74 6f 20 74 68 65 20 71 75 65 72 79  ful to the query
3510: 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72   planner..*/.str
3520: 75 63 74 20 57 68 65 72 65 53 63 61 6e 20 7b 0a  uct WhereScan {.
3530: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
3540: 4f 72 69 67 57 43 3b 20 20 20 20 20 20 2f 2a 20  OrigWC;      /* 
3550: 4f 72 69 67 69 6e 61 6c 2c 20 69 6e 6e 65 72 6d  Original, innerm
3560: 6f 73 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  ost WhereClause 
3570: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
3580: 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20   *pWC;          
3590: 2f 2a 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  /* WhereClause c
35a0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 73  urrently being s
35b0: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  canned */.  char
35c0: 20 2a 7a 43 6f 6c 6c 4e 61 6d 65 3b 20 20 20 20   *zCollName;    
35d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
35e0: 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ed collating seq
35f0: 75 65 6e 63 65 2c 20 69 66 20 6e 6f 74 20 4e 55  uence, if not NU
3600: 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 69 64 78  LL */.  char idx
3610: 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
3620: 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 74 63 68     /* Must match
3630: 20 74 68 69 73 20 61 66 66 69 6e 69 74 79 2c 20   this affinity, 
3640: 69 66 20 7a 43 6f 6c 6c 4e 61 6d 65 21 3d 4e 55  if zCollName!=NU
3650: 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  LL */.  unsigned
3660: 20 63 68 61 72 20 6e 45 71 75 69 76 3b 20 20 20   char nEquiv;   
3670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3680: 65 6e 74 72 69 65 73 20 69 6e 20 61 45 71 75 69  entries in aEqui
3690: 76 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  v[] */.  unsigne
36a0: 64 20 63 68 61 72 20 69 45 71 75 69 76 3b 20 20  d char iEquiv;  
36b0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
36c0: 65 64 20 73 6c 6f 74 20 69 6e 20 61 45 71 75 69  ed slot in aEqui
36d0: 76 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d  v[] */.  u32 opM
36e0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
36f0: 20 20 20 20 2f 2a 20 41 63 63 65 70 74 61 62 6c      /* Acceptabl
3700: 65 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  e operators */. 
3710: 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
3720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3730: 65 73 75 6d 65 20 73 63 61 6e 6e 69 6e 67 20 61  esume scanning a
3740: 74 20 74 68 69 73 2d 3e 70 57 43 2d 3e 61 5b 74  t this->pWC->a[t
3750: 68 69 73 2d 3e 6b 5d 20 2a 2f 0a 20 20 69 6e 74  his->k] */.  int
3760: 20 61 45 71 75 69 76 5b 32 32 5d 3b 20 20 20 20   aEquiv[22];    
3770: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
3780: 72 2c 43 6f 6c 75 6d 6e 20 70 61 69 72 73 20 66  r,Column pairs f
3790: 6f 72 20 65 71 75 69 76 61 6c 65 6e 63 65 20 63  or equivalence c
37a0: 6c 61 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lasses */.};../*
37b0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
37c0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37d0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
37e0: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
37f0: 20 61 62 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52   about a.** WHER
3800: 45 20 63 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c  E clause.  Mostl
3810: 79 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 74  y this is a cont
3820: 61 69 6e 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72  ainer for one or
3830: 20 6d 6f 72 65 20 57 68 65 72 65 54 65 72 6d 73   more WhereTerms
3840: 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 6c 61 6e 61 74  ..**.** Explanat
3850: 69 6f 6e 20 6f 66 20 70 4f 75 74 65 72 3a 20 20  ion of pOuter:  
3860: 46 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75  For a WHERE clau
3870: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  se of the form.*
3880: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
3890: 20 41 4e 44 20 28 28 62 20 41 4e 44 20 63 29 20   AND ((b AND c) 
38a0: 4f 52 20 28 64 20 41 4e 44 20 65 29 29 20 41 4e  OR (d AND e)) AN
38b0: 44 20 66 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  D f.**.** There 
38c0: 61 72 65 20 73 65 70 61 72 61 74 65 20 57 68 65  are separate Whe
38d0: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 73  reClause objects
38e0: 20 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 63   for the whole c
38f0: 6c 61 75 73 65 20 61 6e 64 20 66 6f 72 0a 2a 2a  lause and for.**
3900: 20 74 68 65 20 73 75 62 63 6c 61 75 73 65 73 20   the subclauses 
3910: 22 28 62 20 41 4e 44 20 63 29 22 20 61 6e 64 20  "(b AND c)" and 
3920: 22 28 64 20 41 4e 44 20 65 29 22 2e 20 20 54 68  "(d AND e)".  Th
3930: 65 20 70 4f 75 74 65 72 20 66 69 65 6c 64 20 6f  e pOuter field o
3940: 66 20 74 68 65 0a 2a 2a 20 73 75 62 63 6c 61 75  f the.** subclau
3950: 73 65 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ses points to th
3960: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62  e WhereClause ob
3970: 6a 65 63 74 20 66 6f 72 20 74 68 65 20 77 68 6f  ject for the who
3980: 6c 65 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  le clause..*/.st
3990: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
39a0: 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a   {.  WhereInfo *
39b0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 2f 2a  pWInfo;       /*
39c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
39d0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
39e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
39f0: 65 20 2a 70 4f 75 74 65 72 3b 20 20 20 20 20 2f  e *pOuter;     /
3a00: 2a 20 4f 75 74 65 72 20 63 6f 6e 6a 75 6e 63 74  * Outer conjunct
3a10: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6f 70 3b 20  ion */.  u8 op; 
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 2f 2a 20 53 70 6c 69 74 20 6f 70 65 72 61    /* Split opera
3a40: 74 6f 72 2e 20 20 54 4b 5f 41 4e 44 20 6f 72 20  tor.  TK_AND or 
3a50: 54 4b 5f 4f 52 20 2a 2f 0a 20 20 69 6e 74 20 6e  TK_OR */.  int n
3a60: 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
3a70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3a80: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
3a90: 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
3aa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ab0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d  f entries in a[]
3ac0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
3ad0: 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *a;            /
3ae0: 2a 20 45 61 63 68 20 61 5b 5d 20 64 65 73 63 72  * Each a[] descr
3af0: 69 62 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ibes a term of t
3b00: 68 65 20 57 48 45 52 45 20 63 6c 75 61 73 65 20  he WHERE cluase 
3b10: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
3b20: 51 4c 49 54 45 5f 53 4d 41 4c 4c 5f 53 54 41 43  QLITE_SMALL_STAC
3b30: 4b 29 0a 20 20 57 68 65 72 65 54 65 72 6d 20 61  K).  WhereTerm a
3b40: 53 74 61 74 69 63 5b 31 5d 3b 20 20 20 20 2f 2a  Static[1];    /*
3b50: 20 49 6e 69 74 69 61 6c 20 73 74 61 74 69 63 20   Initial static 
3b60: 73 70 61 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f  space for a[] */
3b70: 0a 23 65 6c 73 65 0a 20 20 57 68 65 72 65 54 65  .#else.  WhereTe
3b80: 72 6d 20 61 53 74 61 74 69 63 5b 38 5d 3b 20 20  rm aStatic[8];  
3b90: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61    /* Initial sta
3ba0: 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61 5b  tic space for a[
3bb0: 5d 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  ] */.#endif.};..
3bc0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  /*.** A WhereTer
3bd0: 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f 72  m with eOperator
3be0: 3d 3d 57 4f 5f 4f 52 20 68 61 73 20 69 74 73 20  ==WO_OR has its 
3bf0: 75 2e 70 4f 72 49 6e 66 6f 20 70 6f 69 6e 74 65  u.pOrInfo pointe
3c00: 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61 20 64 79  r set to.** a dy
3c10: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
3c20: 74 65 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ted instance of 
3c30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3c40: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
3c50: 63 74 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 7b  ct WhereOrInfo {
3c60: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 77  .  WhereClause w
3c70: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  c;          /* D
3c80: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 69 6e 74  ecomposition int
3c90: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
3ca0: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
3cb0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  e;       /* Bitm
3cc0: 61 73 6b 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78  ask of all index
3cd0: 61 62 6c 65 20 74 61 62 6c 65 73 20 69 6e 20 74  able tables in t
3ce0: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 7d 3b 0a  he clause */.};.
3cf0: 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65  ./*.** A WhereTe
3d00: 72 6d 20 77 69 74 68 20 65 4f 70 65 72 61 74 6f  rm with eOperato
3d10: 72 3d 3d 57 4f 5f 41 4e 44 20 68 61 73 20 69 74  r==WO_AND has it
3d20: 73 20 75 2e 70 41 6e 64 49 6e 66 6f 20 70 6f 69  s u.pAndInfo poi
3d30: 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a 20 61  nter set to.** a
3d40: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
3d50: 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63 65 20  ocated instance 
3d60: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3d70: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3d80: 74 72 75 63 74 20 57 68 65 72 65 41 6e 64 49 6e  truct WhereAndIn
3d90: 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  fo {.  WhereClau
3da0: 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20 20  se wc;          
3db0: 2f 2a 20 54 68 65 20 73 75 62 65 78 70 72 65 73  /* The subexpres
3dc0: 73 69 6f 6e 20 62 72 6f 6b 65 6e 20 6f 75 74 20  sion broken out 
3dd0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3de0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3df0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3e00: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
3e10: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
3e20: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
3e30: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
3e40: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
3e50: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
3e60: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
3e70: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
3e80: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
3e90: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
3ea0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
3eb0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
3ec0: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
3ed0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
3ee0: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
3ef0: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
3f00: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
3f10: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
3f20: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
3f30: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
3f40: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
3f50: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
3f60: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
3f70: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
3f80: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
3f90: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
3fa0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
3fb0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
3fc0: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
3fd0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
3fe0: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
3ff0: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
4000: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
4010: 2a 20 49 66 20 57 68 65 72 65 4d 61 73 6b 53 65  * If WhereMaskSe
4020: 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65  t.ix[A]==B it me
4030: 61 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74  ans that The A-t
4040: 68 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61  h bit of a Bitma
4050: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
4060: 73 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  s VDBE cursor nu
4070: 6d 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74  mber B.  The A-t
4080: 68 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61  h bit of a bitma
4090: 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a  sk is 1<<A..**.*
40a0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  * For example, i
40b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
40c0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  se expression us
40d0: 65 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a  ed these VDBE.**
40e0: 20 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c   cursors:  4, 5,
40f0: 20 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20   8, 29, 57, 73. 
4100: 20 54 68 65 6e 20 74 68 65 20 20 57 68 65 72 65   Then the  Where
4110: 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
4120: 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74  e.** would map t
4130: 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  hose cursor numb
4140: 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20  ers into bits 0 
4150: 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a  through 5..**.**
4160: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d   Note that the m
4170: 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  apping is not ne
4180: 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65  cessarily ordere
4190: 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70  d.  In the examp
41a0: 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65  le.** above, the
41b0: 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67   mapping might g
41c0: 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d  o like this:  4-
41d0: 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20  >3, 5->1, 8->2, 
41e0: 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c  29->0,.** 57->5,
41f0: 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20   73->4.  Or one 
4200: 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d  of 719 other com
4210: 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  binations might 
4220: 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64  be used. It.** d
4230: 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d  oes not really m
4240: 61 74 74 65 72 2e 20 20 57 68 61 74 20 69 73 20  atter.  What is 
4250: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
4260: 74 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a  t sparse cursor.
4270: 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67  ** numbers all g
4280: 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62  et mapped into b
4290: 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20  it numbers that 
42a0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
42b0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67   contain.** no g
42c0: 61 70 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  aps..*/.struct W
42d0: 68 65 72 65 4d 61 73 6b 53 65 74 20 7b 0a 20 20  hereMaskSet {.  
42e0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 4e 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67   Number of assig
4310: 6e 65 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65  ned cursor value
4320: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 42 4d  s */.  int ix[BM
4330: 53 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S];             
4340: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61       /* Cursor a
4350: 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20  ssigned to each 
4360: 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  bit */.};../*.**
4370: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   This object is 
4380: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
4390: 61 70 70 65 72 20 68 6f 6c 64 69 6e 67 20 61 6c  apper holding al
43a0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  l information ne
43b0: 65 64 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e 73 74  eded.** to const
43c0: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ruct WhereLoop o
43d0: 62 6a 65 63 74 73 20 66 6f 72 20 61 20 70 61 72  bjects for a par
43e0: 74 69 63 75 6c 61 72 20 71 75 65 72 79 2e 0a 2a  ticular query..*
43f0: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  /.struct WhereLo
4400: 6f 70 42 75 69 6c 64 65 72 20 7b 0a 20 20 57 68  opBuilder {.  Wh
4410: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
4420: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4430: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
4440: 73 20 57 48 45 52 45 20 2a 2f 0a 20 20 57 68 65  s WHERE */.  Whe
4450: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
4460: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
4470: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a  clause terms */.
4480: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4490: 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 4f  erBy;       /* O
44a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
44b0: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
44c0: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
44d0: 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
44e0: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72  oop */.  WhereOr
44f0: 53 65 74 20 2a 70 4f 72 53 65 74 3b 20 20 20 20  Set *pOrSet;    
4500: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 62 65 73     /* Record bes
4510: 74 20 6c 6f 6f 70 73 20 68 65 72 65 2c 20 69 66  t loops here, if
4520: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a   not NULL */.};.
4530: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45  ./*.** The WHERE
4540: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
4550: 6e 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ng routine has t
4560: 77 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a  wo halves.  The.
4570: 2a 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f  ** first part do
4580: 65 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  es the start of 
4590: 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61  the WHERE loop a
45a0: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  nd the second.**
45b0: 20 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74   half does the t
45c0: 61 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45  ail of the WHERE
45d0: 20 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61   loop.  An insta
45e0: 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73  nce of.** this s
45f0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
4600: 72 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  rned by the firs
4610: 74 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65  t half and passe
4620: 64 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  d.** into the se
4630: 63 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76  cond half to giv
4640: 65 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74  e some continuit
4650: 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  y..**.** An inst
4660: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
4670: 65 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f  ect holds the co
4680: 6d 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20  mplete state of 
4690: 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61  the query.** pla
46a0: 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  nner..*/.struct 
46b0: 57 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61  WhereInfo {.  Pa
46c0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
46e0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
46f0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4700: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
4710: 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  bList;        /*
4720: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
4730: 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
4740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
4750: 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  rBy;       /* Th
4760: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
4770: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  e or NULL */.  E
4780: 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74  xprList *pResult
4790: 53 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73 75  Set;     /* Resu
47a0: 6c 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43 54  lt set. DISTINCT
47b0: 20 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68 65   operates on the
47c0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  se */.  WhereLoo
47d0: 70 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20  p *pLoops;      
47e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
47f0: 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
4800: 74 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ts */.  Bitmask 
4810: 72 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  revMask;        
4820: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44    /* Mask of ORD
4830: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
4840: 20 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67 20   need reversing 
4850: 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 6e  */.  WhereCost n
4860: 52 6f 77 4f 75 74 3b 20 20 20 20 20 20 20 20 2f  RowOut;        /
4870: 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  * Estimated numb
4880: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
4890: 73 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  s */.  u16 wctrl
48a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
48b0: 20 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69 6e   /* Flags origin
48c0: 61 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73  ally passed to s
48d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
48e0: 28 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61  () */.  u8 bOBSa
48f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4900: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73 61    /* ORDER BY sa
4910: 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63  tisfied by indic
4920: 65 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65  es */.  u8 okOne
4930: 50 61 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Pass;           
4940: 20 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f    /* Ok to use o
4950: 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
4960: 6d 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45 4c  m for UPDATE/DEL
4970: 45 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65  ETE */.  u8 unte
4980: 73 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20 20  stedTerms;      
4990: 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48     /* Not all WH
49a0: 45 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c 76  ERE terms resolv
49b0: 65 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70  ed by outer loop
49c0: 20 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69 6e   */.  u8 eDistin
49d0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ct;             
49e0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
49f0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76  ERE_DISTINCT_* v
4a00: 61 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20  alues below */. 
4a10: 20 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20   u8 nLevel;     
4a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4a30: 6d 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 6c  mber of nested l
4a40: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f  oop */.  int iTo
4a50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
4a60: 20 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20 62     /* The very b
4a70: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
4a80: 57 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20  WHERE loop */.  
4a90: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20  int iContinue;  
4aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4ab0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4ac0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 65 63  ue with next rec
4ad0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  ord */.  int iBr
4ae0: 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  eak;            
4af0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4b00: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
4b10: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
4b20: 74 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  t savedNQueryLoo
4b30: 70 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72 73  p;      /* pPars
4b40: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75  e->nQueryLoop ou
4b50: 74 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20  tside the WHERE 
4b60: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d  loop */.  WhereM
4b70: 61 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74 3b  askSet sMaskSet;
4b80: 20 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f      /* Map curso
4b90: 72 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74  r numbers to bit
4ba0: 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65  masks */.  Where
4bb0: 43 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20 20  Clause sWC;     
4bc0: 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
4bd0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45  ition of the WHE
4be0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
4bf0: 68 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20  hereLevel a[1]; 
4c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
4c10: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
4c20: 63 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20  ch nest loop in 
4c30: 57 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  WHERE */.};../*.
4c40: 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20  ** Bitmasks for 
4c50: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e  the operators on
4c60: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
4c70: 74 73 2e 20 20 54 68 65 73 65 20 61 72 65 20 61  ts.  These are a
4c80: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20  ll.** operators 
4c90: 74 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74 65  that are of inte
4ca0: 72 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 72  rest to the quer
4cb0: 79 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a  y planner.  An.*
4cc0: 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74  * OR-ed combinat
4cd0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c  ion of these val
4ce0: 75 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  ues can be used 
4cf0: 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66  when searching f
4d00: 6f 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  or.** particular
4d10: 20 57 68 65 72 65 54 65 72 6d 73 20 77 69 74 68   WhereTerms with
4d20: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
4d30: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  ..*/.#define WO_
4d40: 49 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65  IN     0x001.#de
4d50: 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30  fine WO_EQ     0
4d60: 78 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x002.#define WO_
4d70: 4c 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  LT     (WO_EQ<<(
4d80: 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_LT-TK_EQ)).#d
4d90: 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20  efine WO_LE     
4da0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54  (WO_EQ<<(TK_LE-T
4db0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
4dc0: 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_GT     (WO_EQ<
4dd0: 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a  <(TK_GT-TK_EQ)).
4de0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20  #define WO_GE   
4df0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45    (WO_EQ<<(TK_GE
4e00: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
4e10: 20 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30   WO_MATCH  0x040
4e20: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55  .#define WO_ISNU
4e30: 4c 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65  LL 0x080.#define
4e40: 20 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30   WO_OR     0x100
4e50: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72         /* Two or
4e60: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
4e70: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66  ed terms */.#def
4e80: 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78  ine WO_AND    0x
4e90: 32 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  200       /* Two
4ea0: 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e   or more AND-con
4eb0: 6e 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a  nected terms */.
4ec0: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56  #define WO_EQUIV
4ed0: 20 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a    0x400       /*
4ee0: 20 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d   Of the form A==
4ef0: 42 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20  B, both columns 
4f00: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
4f10: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
4f20: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
4f30: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
4f40: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
4f50: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
4f60: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
4f70: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
4f80: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
4f90: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
4fa0: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
4fb0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
4fc0: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
4fd0: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
4fe0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
4ff0: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62  definitions of b
5000: 69 74 73 20 69 6e 20 74 68 65 20 57 68 65 72 65  its in the Where
5010: 4c 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69 65  Loop.wsFlags fie
5020: 6c 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74 69  ld..** The parti
5030: 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
5040: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61 63  n of bits in eac
5050: 68 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70  h WhereLoop help
5060: 20 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65   to.** determine
5070: 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 74   the algorithm t
5080: 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72 65  hat WhereLoop re
5090: 70 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65  presents..*/.#de
50a0: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
50b0: 4e 5f 45 51 20 20 20 20 30 78 30 30 30 30 30 30  N_EQ    0x000000
50c0: 30 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f  01  /* x=EXPR */
50d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
50e0: 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30  OLUMN_RANGE 0x00
50f0: 30 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50  000002  /* x<EXP
5100: 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20  R and/or x>EXPR 
5110: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5120: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78  _COLUMN_IN    0x
5130: 30 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49  00000004  /* x I
5140: 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69  N (...) */.#defi
5150: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
5160: 4e 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38  NULL  0x00000008
5170: 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a    /* x IS NULL *
5180: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5190: 43 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30  CONSTRAINT   0x0
51a0: 30 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20  000000f  /* Any 
51b0: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c  of the WHERE_COL
51c0: 55 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a  UMN_xxx values *
51d0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
51e0: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
51f0: 30 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58  0000010  /* x<EX
5200: 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f  PR or x<=EXPR co
5210: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
5220: 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  ine WHERE_BTM_LI
5230: 4d 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32  MIT    0x0000002
5240: 30 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20  0  /* x>EXPR or 
5250: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
5260: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
5270: 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20  ERE_BOTH_LIMIT  
5280: 20 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20   0x00000030  /* 
5290: 42 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20  Both x>EXPR and 
52a0: 78 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e  x<EXPR */.#defin
52b0: 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  e WHERE_IDX_ONLY
52c0: 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20       0x00000040 
52d0: 20 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e   /* Use index on
52e0: 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20  ly - omit table 
52f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
5300: 5f 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78  _IPK          0x
5310: 30 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69  00000100  /* x i
5320: 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  s the INTEGER PR
5330: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65  IMARY KEY */.#de
5340: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58  fine WHERE_INDEX
5350: 45 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32  ED      0x000002
5360: 30 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70  00  /* WhereLoop
5370: 2e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  .u.btree.pIndex 
5380: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66  is valid */.#def
5390: 69 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41  ine WHERE_VIRTUA
53a0: 4c 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30  LTABLE 0x0000040
53b0: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
53c0: 75 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20  u.vtab is valid 
53d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
53e0: 5f 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78  _IN_ABLE      0x
53f0: 30 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c  00000800  /* Abl
5400: 65 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20  e to support an 
5410: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23  IN operator */.#
5420: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45  define WHERE_ONE
5430: 52 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30  ROW       0x0000
5440: 31 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73  1000  /* Selects
5450: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
5460: 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  e row */.#define
5470: 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20   WHERE_MULTI_OR 
5480: 20 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20      0x00002000  
5490: 2f 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74  /* OR using mult
54a0: 69 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a  iple indices */.
54b0: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 55  #define WHERE_AU
54c0: 54 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30  TO_INDEX   0x000
54d0: 30 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61  04000  /* Uses a
54e0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
54f0: 78 20 2a 2f 0a 0a 0a 2f 2a 20 43 6f 6e 76 65 72  x */.../* Conver
5500: 74 20 61 20 57 68 65 72 65 43 6f 73 74 20 76 61  t a WhereCost va
5510: 6c 75 65 20 28 31 30 20 74 69 6d 65 73 20 6c 6f  lue (10 times lo
5520: 67 32 28 58 29 29 20 69 6e 74 6f 20 69 74 73 20  g2(X)) into its 
5530: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 58 2e  integer value X.
5540: 0a 2a 2a 20 41 20 72 6f 75 67 68 20 61 70 70 72  .** A rough appr
5550: 6f 78 69 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  oximation is use
5560: 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65  d.  The value re
5570: 74 75 72 6e 65 64 20 69 73 20 6e 6f 74 20 65 78  turned is not ex
5580: 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  act..*/.static u
5590: 36 34 20 77 68 65 72 65 43 6f 73 74 54 6f 49 6e  64 whereCostToIn
55a0: 74 28 57 68 65 72 65 43 6f 73 74 20 78 29 7b 0a  t(WhereCost x){.
55b0: 20 20 75 36 34 20 6e 3b 0a 20 20 69 66 28 20 78    u64 n;.  if( x
55c0: 3c 31 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  <10 ) return 1;.
55d0: 20 20 6e 20 3d 20 78 25 31 30 3b 0a 20 20 78 20    n = x%10;.  x 
55e0: 2f 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 3e 3d  /= 10;.  if( n>=
55f0: 35 20 29 20 6e 20 2d 3d 20 32 3b 0a 20 20 65 6c  5 ) n -= 2;.  el
5600: 73 65 20 69 66 28 20 6e 3e 3d 31 20 29 20 6e 20  se if( n>=1 ) n 
5610: 2d 3d 20 31 3b 0a 20 20 69 66 28 20 78 3e 3d 33  -= 1;.  if( x>=3
5620: 20 29 20 72 65 74 75 72 6e 20 28 6e 2b 38 29 3c   ) return (n+8)<
5630: 3c 28 78 2d 33 29 3b 0a 20 20 72 65 74 75 72 6e  <(x-3);.  return
5640: 20 28 6e 2b 38 29 3e 3e 28 33 2d 78 29 3b 0a 7d   (n+8)>>(3-x);.}
5650: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5660: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
5670: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
5680: 77 73 20 66 72 6f 6d 20 61 20 57 48 45 52 45 20  ws from a WHERE 
5690: 63 6c 61 75 73 65 0a 2a 2f 0a 75 36 34 20 73 71  clause.*/.u64 sq
56a0: 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
56b0: 52 6f 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e  RowCount(WhereIn
56c0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
56d0: 65 74 75 72 6e 20 77 68 65 72 65 43 6f 73 74 54  eturn whereCostT
56e0: 6f 49 6e 74 28 70 57 49 6e 66 6f 2d 3e 6e 52 6f  oInt(pWInfo->nRo
56f0: 77 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wOut);.}../*.** 
5700: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  Return one of th
5710: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5720: 5f 78 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f  _xxxxx values to
5730: 20 69 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68   indicate how th
5740: 69 73 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  is.** WHERE clau
5750: 73 65 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75  se returns outpu
5760: 74 73 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ts for DISTINCT 
5770: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69  processing..*/.i
5780: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
5790: 73 44 69 73 74 69 6e 63 74 28 57 68 65 72 65 49  sDistinct(WhereI
57a0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
57b0: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65  return pWInfo->e
57c0: 44 69 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a  Distinct;.}../*.
57d0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
57e0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
57f0: 73 65 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20  se returns rows 
5800: 69 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  in ORDER BY orde
5810: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  r..** Return FAL
5820: 53 45 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  SE if the output
5830: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72   needs to be sor
5840: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
5850: 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
5860: 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
5870: 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  nfo){.  return p
5880: 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 21 3d 30  WInfo->bOBSat!=0
5890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
58a0: 6e 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65  n the VDBE addre
58b0: 73 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a  ss or label to j
58c0: 75 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20  ump to in order 
58d0: 74 6f 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69  to continue.** i
58e0: 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20  mmediately with 
58f0: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
5900: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
5910: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
5920: 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
5930: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
5940: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
5950: 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b  Info->iContinue;
5960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5970: 20 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73   the VDBE addres
5980: 73 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75  s or label to ju
5990: 6d 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74  mp to in order t
59a0: 6f 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f  o break.** out o
59b0: 66 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a  f a WHERE loop..
59c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
59d0: 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68  ereBreakLabel(Wh
59e0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
59f0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66  {.  return pWInf
5a00: 6f 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  o->iBreak;.}../*
5a10: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
5a20: 69 66 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  if an UPDATE or 
5a30: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
5a40: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 64 69 72   can operate dir
5a50: 65 63 74 6c 79 20 6f 6e 0a 2a 2a 20 74 68 65 20  ectly on.** the 
5a60: 72 6f 77 69 64 73 20 72 65 74 75 72 6e 65 64 20  rowids returned 
5a70: 62 79 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  by a WHERE claus
5a80: 65 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  e.  Return FALSE
5a90: 20 69 66 20 64 6f 69 6e 67 20 61 6e 0a 2a 2a 20   if doing an.** 
5aa0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
5ab0: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 73 75   might change su
5ac0: 62 73 65 71 75 65 6e 74 20 57 48 45 52 45 20 63  bsequent WHERE c
5ad0: 6c 61 75 73 65 20 72 65 73 75 6c 74 73 2e 0a 2a  lause results..*
5ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
5af0: 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68 65 72  reOkOnePass(Wher
5b00: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
5b10: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
5b20: 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a 7d 0a 0a 2f  >okOnePass;.}../
5b30: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 6f  *.** Move the co
5b40: 6e 74 65 6e 74 20 6f 66 20 70 53 72 63 20 69 6e  ntent of pSrc in
5b50: 74 6f 20 70 44 65 73 74 0a 2a 2f 0a 73 74 61 74  to pDest.*/.stat
5b60: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72 4d  ic void whereOrM
5b70: 6f 76 65 28 57 68 65 72 65 4f 72 53 65 74 20 2a  ove(WhereOrSet *
5b80: 70 44 65 73 74 2c 20 57 68 65 72 65 4f 72 53 65  pDest, WhereOrSe
5b90: 74 20 2a 70 53 72 63 29 7b 0a 20 20 70 44 65 73  t *pSrc){.  pDes
5ba0: 74 2d 3e 6e 20 3d 20 70 53 72 63 2d 3e 6e 3b 0a  t->n = pSrc->n;.
5bb0: 20 20 6d 65 6d 63 70 79 28 70 44 65 73 74 2d 3e    memcpy(pDest->
5bc0: 61 2c 20 70 53 72 63 2d 3e 61 2c 20 70 44 65 73  a, pSrc->a, pDes
5bd0: 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28 70 44 65 73  t->n*sizeof(pDes
5be0: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d 0a 0a 2f 2a  t->a[0]));.}../*
5bf0: 0a 2a 2a 20 54 72 79 20 74 6f 20 69 6e 73 65 72  .** Try to inser
5c00: 74 20 61 20 6e 65 77 20 70 72 65 72 65 71 75 69  t a new prerequi
5c10: 73 69 74 65 2f 63 6f 73 74 20 65 6e 74 72 79 20  site/cost entry 
5c20: 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65 4f 72  into the WhereOr
5c30: 53 65 74 20 70 53 65 74 2e 0a 2a 2a 0a 2a 2a 20  Set pSet..**.** 
5c40: 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6d 69  The new entry mi
5c50: 67 68 74 20 6f 76 65 72 77 72 69 74 65 20 61 6e  ght overwrite an
5c60: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2c   existing entry,
5c70: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
5c80: 2a 2a 20 61 70 70 65 6e 64 65 64 2c 20 6f 72 20  ** appended, or 
5c90: 69 74 20 6d 69 67 68 74 20 62 65 20 64 69 73 63  it might be disc
5ca0: 61 72 64 65 64 2e 20 20 44 6f 20 77 68 61 74 65  arded.  Do whate
5cb0: 76 65 72 20 69 73 20 74 68 65 20 72 69 67 68 74  ver is the right
5cc0: 20 74 68 69 6e 67 0a 2a 2a 20 73 6f 20 74 68 61   thing.** so tha
5cd0: 74 20 70 53 65 74 20 6b 65 65 70 73 20 74 68 65  t pSet keeps the
5ce0: 20 4e 5f 4f 52 5f 43 4f 53 54 20 62 65 73 74 20   N_OR_COST best 
5cf0: 65 6e 74 72 69 65 73 20 73 65 65 6e 20 73 6f 20  entries seen so 
5d00: 66 61 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  far..*/.static i
5d10: 6e 74 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74  nt whereOrInsert
5d20: 28 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a  (.  WhereOrSet *
5d30: 70 53 65 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  pSet,      /* Th
5d40: 65 20 57 68 65 72 65 4f 72 53 65 74 20 74 6f 20  e WhereOrSet to 
5d50: 62 65 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  be updated */.  
5d60: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 2c 20  Bitmask prereq, 
5d70: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71         /* Prereq
5d80: 75 69 73 69 74 65 73 20 6f 66 20 74 68 65 20 6e  uisites of the n
5d90: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 57 68  ew entry */.  Wh
5da0: 65 72 65 43 6f 73 74 20 72 52 75 6e 2c 20 20 20  ereCost rRun,   
5db0: 20 20 20 20 20 2f 2a 20 52 75 6e 2d 63 6f 73 74       /* Run-cost
5dc0: 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
5dd0: 79 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  y */.  WhereCost
5de0: 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 2f 2a   nOut         /*
5df0: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   Number of outpu
5e00: 74 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  ts for the new e
5e10: 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ntry */.){.  u16
5e20: 20 69 3b 0a 20 20 57 68 65 72 65 4f 72 43 6f 73   i;.  WhereOrCos
5e30: 74 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 70 53  t *p;.  for(i=pS
5e40: 65 74 2d 3e 6e 2c 20 70 3d 70 53 65 74 2d 3e 61  et->n, p=pSet->a
5e50: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 2b 2b 29  ; i>0; i--, p++)
5e60: 7b 0a 20 20 20 20 69 66 28 20 72 52 75 6e 3c 3d  {.    if( rRun<=
5e70: 70 2d 3e 72 52 75 6e 20 26 26 20 28 70 72 65 72  p->rRun && (prer
5e80: 65 71 20 26 20 70 2d 3e 70 72 65 72 65 71 29 3d  eq & p->prereq)=
5e90: 3d 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20  =prereq ){.     
5ea0: 20 67 6f 74 6f 20 77 68 65 72 65 4f 72 49 6e 73   goto whereOrIns
5eb0: 65 72 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  ert_done;.    }.
5ec0: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3c      if( p->rRun<
5ed0: 3d 72 52 75 6e 20 26 26 20 28 70 2d 3e 70 72 65  =rRun && (p->pre
5ee0: 72 65 71 20 26 20 70 72 65 72 65 71 29 3d 3d 70  req & prereq)==p
5ef0: 2d 3e 70 72 65 72 65 71 20 29 7b 0a 20 20 20 20  ->prereq ){.    
5f00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
5f10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74  }.  }.  if( pSet
5f20: 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53 54 20 29 7b  ->n<N_OR_COST ){
5f30: 0a 20 20 20 20 70 20 3d 20 26 70 53 65 74 2d 3e  .    p = &pSet->
5f40: 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d 3b 0a 20 20  a[pSet->n++];.  
5f50: 20 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74    p->nOut = nOut
5f60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5f70: 20 3d 20 70 53 65 74 2d 3e 61 3b 0a 20 20 20 20   = pSet->a;.    
5f80: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 53 65 74 2d  for(i=1; i<pSet-
5f90: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  >n; i++){.      
5fa0: 69 66 28 20 70 2d 3e 72 52 75 6e 3e 70 53 65 74  if( p->rRun>pSet
5fb0: 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20 29 20 70 20  ->a[i].rRun ) p 
5fc0: 3d 20 70 53 65 74 2d 3e 61 20 2b 20 69 3b 0a 20  = pSet->a + i;. 
5fd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
5fe0: 72 52 75 6e 3c 3d 72 52 75 6e 20 29 20 72 65 74  rRun<=rRun ) ret
5ff0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 77 68 65 72 65  urn 0;.  }.where
6000: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3a 0a 20  OrInsert_done:. 
6010: 20 70 2d 3e 70 72 65 72 65 71 20 3d 20 70 72 65   p->prereq = pre
6020: 72 65 71 3b 0a 20 20 70 2d 3e 72 52 75 6e 20 3d  req;.  p->rRun =
6030: 20 72 52 75 6e 3b 0a 20 20 69 66 28 20 70 2d 3e   rRun;.  if( p->
6040: 6e 4f 75 74 3e 6e 4f 75 74 20 29 20 70 2d 3e 6e  nOut>nOut ) p->n
6050: 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a 20 20 72 65  Out = nOut;.  re
6060: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
6070: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 70 72   Initialize a pr
6080: 65 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65  eallocated Where
6090: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
60a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
60b0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
60c0: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
60d0: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pWC,        /* 
60e0: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
60f0: 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  to be initialize
6100: 64 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  d */.  WhereInfo
6110: 20 2a 70 57 49 6e 66 6f 20 20 20 20 20 20 20 20   *pWInfo        
6120: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 70 72 6f  /* The WHERE pro
6130: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
6140: 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 57 49  */.){.  pWC->pWI
6150: 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20  nfo = pWInfo;.  
6160: 70 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 30 3b  pWC->pOuter = 0;
6170: 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20  .  pWC->nTerm = 
6180: 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  0;.  pWC->nSlot 
6190: 3d 20 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d  = ArraySize(pWC-
61a0: 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43  >aStatic);.  pWC
61b0: 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74  ->a = pWC->aStat
61c0: 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  ic;.}../* Forwar
61d0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
61e0: 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
61f0: 43 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72  ClauseClear(Wher
6200: 65 43 6c 61 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a  eClause*);../*.*
6210: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c  * Deallocate all
6220: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
6230: 65 64 20 77 69 74 68 20 61 20 57 68 65 72 65 4f  ed with a WhereO
6240: 72 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rInfo object..*/
6250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6260: 72 65 4f 72 49 6e 66 6f 44 65 6c 65 74 65 28 73  reOrInfoDelete(s
6270: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
6280: 65 4f 72 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77  eOrInfo *p){.  w
6290: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
62a0: 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74  &p->wc);.  sqlit
62b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
62c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
62d0: 63 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  cate all memory 
62e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
62f0: 61 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 6f  a WhereAndInfo o
6300: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
6310: 20 76 6f 69 64 20 77 68 65 72 65 41 6e 64 49 6e   void whereAndIn
6320: 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  foDelete(sqlite3
6330: 20 2a 64 62 2c 20 57 68 65 72 65 41 6e 64 49 6e   *db, WhereAndIn
6340: 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 43  fo *p){.  whereC
6350: 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e 77  lauseClear(&p->w
6360: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  c);.  sqlite3DbF
6370: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
6380: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
6390: 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  a WhereClause st
63a0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57 68  ructure.  The Wh
63b0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
63c0: 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69 73  ure.** itself is
63d0: 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68 69   not freed.  Thi
63e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
63f0: 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65 72   inverse of wher
6400: 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a 2a  eClauseInit()..*
6410: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
6420: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 57  ereClauseClear(W
6430: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
6440: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
6450: 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 73 71 6c  reTerm *a;.  sql
6460: 69 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e  ite3 *db = pWC->
6470: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
6480: 64 62 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d  db;.  for(i=pWC-
6490: 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d  >nTerm-1, a=pWC-
64a0: 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61  >a; i>=0; i--, a
64b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
64c0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 44  wtFlags & TERM_D
64d0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
64e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
64f0: 65 28 64 62 2c 20 61 2d 3e 70 45 78 70 72 29 3b  e(db, a->pExpr);
6500: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
6510: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
6520: 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20  _ORINFO ){.     
6530: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
6540: 74 65 28 64 62 2c 20 61 2d 3e 75 2e 70 4f 72 49  te(db, a->u.pOrI
6550: 6e 66 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nfo);.    }else 
6560: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
6570: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 20 29 7b   TERM_ANDINFO ){
6580: 0a 20 20 20 20 20 20 77 68 65 72 65 41 6e 64 49  .      whereAndI
6590: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
65a0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 29 3b 0a 20 20  >u.pAndInfo);.  
65b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57    }.  }.  if( pW
65c0: 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74  C->a!=pWC->aStat
65d0: 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ic ){.    sqlite
65e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 43 2d  3DbFree(db, pWC-
65f0: 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  >a);.  }.}../*.*
6600: 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 6e  * Add a single n
6610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 65 6e 74  ew WhereTerm ent
6620: 72 79 20 74 6f 20 74 68 65 20 57 68 65 72 65 43  ry to the WhereC
6630: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
6640: 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 57 68 65  ..** The new Whe
6650: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  reTerm object is
6660: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 66 72 6f   constructed fro
6670: 6d 20 45 78 70 72 20 70 20 61 6e 64 20 77 69 74  m Expr p and wit
6680: 68 20 77 74 46 6c 61 67 73 2e 0a 2a 2a 20 54 68  h wtFlags..** Th
6690: 65 20 69 6e 64 65 78 20 69 6e 20 70 57 43 2d 3e  e index in pWC->
66a0: 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 77 20 57  a[] of the new W
66b0: 68 65 72 65 54 65 72 6d 20 69 73 20 72 65 74 75  hereTerm is retu
66c0: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
66d0: 0a 2a 2a 20 30 20 69 73 20 72 65 74 75 72 6e 65  .** 0 is returne
66e0: 64 20 69 66 20 74 68 65 20 6e 65 77 20 57 68 65  d if the new Whe
66f0: 72 65 54 65 72 6d 20 63 6f 75 6c 64 20 6e 6f 74  reTerm could not
6700: 20 62 65 20 61 64 64 65 64 20 64 75 65 20 74 6f   be added due to
6710: 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c   a memory.** all
6720: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2e 20 20  ocation error.  
6730: 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  The memory alloc
6740: 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 77 69  ation failure wi
6750: 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20 69  ll be recorded i
6760: 6e 0a 2a 2a 20 74 68 65 20 64 62 2d 3e 6d 61 6c  n.** the db->mal
6770: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 73  locFailed flag s
6780: 6f 20 74 68 61 74 20 68 69 67 68 65 72 2d 6c 65  o that higher-le
6790: 76 65 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  vel functions ca
67a0: 6e 20 64 65 74 65 63 74 20 69 74 2e 0a 2a 2a 0a  n detect it..**.
67b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
67c0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68  will increase th
67d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 57  e size of the pW
67e0: 43 2d 3e 61 5b 5d 20 61 72 72 61 79 20 61 73 20  C->a[] array as 
67f0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
6800: 20 49 66 20 74 68 65 20 77 74 46 6c 61 67 73 20   If the wtFlags 
6810: 61 72 67 75 6d 65 6e 74 20 69 6e 63 6c 75 64 65  argument include
6820: 73 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 2c 20  s TERM_DYNAMIC, 
6830: 74 68 65 6e 20 72 65 73 70 6f 6e 73 69 62 69 6c  then responsibil
6840: 69 74 79 0a 2a 2a 20 66 6f 72 20 66 72 65 65 69  ity.** for freei
6850: 6e 67 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ng the expressio
6860: 6e 20 70 20 69 73 20 61 73 73 75 6d 65 64 20 62  n p is assumed b
6870: 79 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73  y the WhereClaus
6880: 65 20 6f 62 6a 65 63 74 20 70 57 43 2e 0a 2a 2a  e object pWC..**
6890: 20 54 68 69 73 20 69 73 20 74 72 75 65 20 65 76   This is true ev
68a0: 65 6e 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  en if this routi
68b0: 6e 65 20 66 61 69 6c 73 20 74 6f 20 61 6c 6c 6f  ne fails to allo
68c0: 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
68d0: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  Term..**.** WARN
68e0: 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ING:  This routi
68f0: 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63  ne might realloc
6900: 61 74 65 20 74 68 65 20 73 70 61 63 65 20 75 73  ate the space us
6910: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57  ed to store.** W
6920: 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20  hereTerms.  All 
6930: 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68 65 72  pointers to Wher
6940: 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20 62 65  eTerms should be
6950: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 66 74   invalidated aft
6960: 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  er.** calling th
6970: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63  is routine.  Suc
6980: 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62  h pointers may b
6990: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  e reinitialized 
69a0: 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  by referencing.*
69b0: 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61  * the pWC->a[] a
69c0: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
69d0: 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49  int whereClauseI
69e0: 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73  nsert(WhereClaus
69f0: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c  e *pWC, Expr *p,
6a00: 20 75 38 20 77 74 46 6c 61 67 73 29 7b 0a 20 20   u8 wtFlags){.  
6a10: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
6a20: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 74  ;.  int idx;.  t
6a30: 65 73 74 63 61 73 65 28 20 77 74 46 6c 61 67 73  estcase( wtFlags
6a40: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
6a50: 29 3b 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  );.  if( pWC->nT
6a60: 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20  erm>=pWC->nSlot 
6a70: 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
6a80: 20 2a 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b   *pOld = pWC->a;
6a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
6aa0: 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e   = pWC->pWInfo->
6ab0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
6ac0: 70 57 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  pWC->a = sqlite3
6ad0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
6ae0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
6af0: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
6b00: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
6b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6b20: 20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f   wtFlags & TERM_
6b30: 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20  DYNAMIC ){.     
6b40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6b50: 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  lete(db, p);.   
6b60: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 43 2d 3e     }.      pWC->
6b70: 61 20 3d 20 70 4f 6c 64 3b 0a 20 20 20 20 20 20  a = pOld;.      
6b80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
6b90: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
6ba0: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
6bb0: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
6bc0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
6bd0: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
6be0: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
6bf0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
6c00: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
6c10: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 73 71 6c 69  WC->nSlot = sqli
6c20: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
6c30: 64 62 2c 20 70 57 43 2d 3e 61 29 2f 73 69 7a 65  db, pWC->a)/size
6c40: 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 3b 0a 20  of(pWC->a[0]);. 
6c50: 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57   }.  pTerm = &pW
6c60: 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e  C->a[idx = pWC->
6c70: 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54 65 72  nTerm++];.  pTer
6c80: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
6c90: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
6ca0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
6cb0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
6cc0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
6cd0: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
6ce0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
6cf0: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
6d00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6d10: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
6d20: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
6d30: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
6d40: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
6d50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
6d60: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
6d70: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
6d80: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
6d90: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
6da0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
6db0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
6dc0: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
6dd0: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
6de0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
6df0: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
6e00: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
6e10: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
6e20: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
6e30: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
6e40: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
6e50: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
6e60: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
6e70: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
6e80: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
6e90: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
6ea0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
6eb0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
6ec0: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
6ed0: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
6ee0: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
6ef0: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
6f00: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
6f10: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
6f20: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
6f30: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
6f40: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
6f50: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
6f60: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
6f70: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
6f80: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
6f90: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
6fa0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
6fb0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
6fc0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
6fd0: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
6fe0: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
6ff0: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
7000: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
7010: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
7020: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
7030: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
7040: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
7050: 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f  u8 op){.  pWC->o
7060: 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45  p = op;.  if( pE
7070: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
7080: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
7090: 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72  !=op ){.    wher
70a0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
70b0: 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  C, pExpr, 0);.  
70c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65  }else{.    where
70d0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
70e0: 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20  ->pLeft, op);.  
70f0: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
7100: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
7110: 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   op);.  }.}../*.
7120: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
7130: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a  WhereMaskSet obj
7140: 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ect.*/.#define i
7150: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28  nitMaskSet(P)  (
7160: 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52  P)->n=0../*.** R
7170: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
7180: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
7190: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
71a0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
71b0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
71c0: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
71d0: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
71e0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
71f0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
7200: 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20  iCursor){.  int 
7210: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  i;.  assert( pMa
7220: 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73  skSet->n<=(int)s
7230: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
7240: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
7250: 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b  <pMaskSet->n; i+
7260: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73  +){.    if( pMas
7270: 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75  kSet->ix[i]==iCu
7280: 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65  rsor ){.      re
7290: 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b  turn MASKBIT(i);
72a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
72b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
72c0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
72d0: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
72e0: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
72f0: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
7300: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
7310: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
7320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7330: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
7340: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
7350: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
7360: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
7370: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
7380: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
7390: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
73a0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
73b0: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
73c0: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
73d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
73e0: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
73f0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7400: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
7410: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
7420: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
7430: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
7440: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
7450: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
7460: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
7470: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
7480: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
7490: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
74a0: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
74b0: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
74c0: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
74d0: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
74e0: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
74f0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
7500: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
7510: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
7520: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
7530: 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
7540: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
7550: 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61  prSelectTableUsa
7560: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
7570: 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74  , Select*);.stat
7580: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54  ic Bitmask exprT
7590: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
75a0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
75b0: 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69  , Expr *p){.  Bi
75c0: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
75d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
75e0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
75f0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
7600: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d  .    mask = getM
7610: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  ask(pMaskSet, p-
7620: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65  >iTable);.    re
7630: 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20  turn mask;.  }. 
7640: 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c   mask = exprTabl
7650: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7660: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d   p->pRight);.  m
7670: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
7680: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
7690: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  p->pLeft);.  if(
76a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
76b0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
76c0: 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  ) ){.    mask |=
76d0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
76e0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
76f0: 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  p->x.pSelect);. 
7700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b   }else{.    mask
7710: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
7720: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7730: 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20   p->x.pList);.  
7740: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
7750: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
7760: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
7770: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
7780: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70  t *pMaskSet, Exp
7790: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
77a0: 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73   int i;.  Bitmas
77b0: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
77c0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
77d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
77e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
77f0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
7800: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7810: 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  Set, pList->a[i]
7820: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
7830: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
7840: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
7850: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
7860: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
7870: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7880: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
7890: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
78a0: 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a  .  while( pS ){.
78b0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
78c0: 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  c = pS->pSrc;.  
78d0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
78e0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
78f0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73  skSet, pS->pELis
7900: 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  t);.    mask |= 
7910: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
7920: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
7930: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
7940: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
7950: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
7960: 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42  Set, pS->pOrderB
7970: 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20  y);.    mask |= 
7980: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
7990: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68  MaskSet, pS->pWh
79a0: 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ere);.    mask |
79b0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
79c0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
79d0: 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  Having);.    if(
79e0: 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29   ALWAYS(pSrc!=0)
79f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
7a00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7a10: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
7a20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b  +){.        mask
7a30: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
7a40: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7a50: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53  t, pSrc->a[i].pS
7a60: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7a70: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
7a80: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
7a90: 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29   pSrc->a[i].pOn)
7aa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7ab0: 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72      pS = pS->pPr
7ac0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ior;.  }.  retur
7ad0: 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n mask;.}../*.**
7ae0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
7af0: 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74  the given operat
7b00: 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65  or is one of the
7b10: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
7b20: 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f  is.** allowed fo
7b30: 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57  r an indexable W
7b40: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
7b50: 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f  .  The allowed o
7b60: 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20  perators are.** 
7b70: 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22  "=", "<", ">", "
7b80: 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c  <=", ">=", "IN",
7b90: 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a   and "IS NULL".*
7ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
7bb0: 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a  owedOp(int op){.
7bc0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e    assert( TK_GT>
7bd0: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54  TK_EQ && TK_GT<T
7be0: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
7bf0: 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26  ( TK_LT>TK_EQ &&
7c00: 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a   TK_LT<TK_GE );.
7c10: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e    assert( TK_LE>
7c20: 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54  TK_EQ && TK_LE<T
7c30: 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_GE );.  assert
7c40: 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34  ( TK_GE==TK_EQ+4
7c50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d   );.  return op=
7c60: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
7c70: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
7c80: 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  E) || op==TK_ISN
7c90: 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  ULL;.}../*.** Sw
7ca0: 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f  ap two objects o
7cb0: 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a  f type TYPE..*/.
7cc0: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
7cd0: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
7ce0: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
7cf0: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
7d00: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
7d10: 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20  r.  Expressions 
7d20: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f  of the form "X o
7d30: 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76  p Y".** are conv
7d40: 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70  erted into "Y op
7d50: 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65   X"..**.** If le
7d60: 66 74 2f 72 69 67 68 74 20 70 72 65 63 65 64 65  ft/right precede
7d70: 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d 65 20 69  nce rules come i
7d80: 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e 20 64 65  nto play when de
7d90: 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  termining the.**
7da0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7db0: 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c 4c 41 54  nce, then COLLAT
7dc0: 45 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  E operators are 
7dd0: 61 64 6a 75 73 74 65 64 20 74 6f 20 65 6e 73 75  adjusted to ensu
7de0: 72 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  re.** that the c
7df0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7e00: 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  e does not chang
7e10: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  e.  For example:
7e20: 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e  .** "Y collate N
7e30: 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f  OCASE op X" beco
7e40: 6d 65 73 20 22 58 20 6f 70 20 59 22 20 62 65 63  mes "X op Y" bec
7e50: 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ause any collati
7e60: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 6e 0a 2a  on sequence on.*
7e70: 2a 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  * the left hand 
7e80: 73 69 64 65 20 6f 66 20 61 20 63 6f 6d 70 61 72  side of a compar
7e90: 69 73 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  ison overrides a
7ea0: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
7eb0: 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74 61 63 68  uence .** attach
7ec0: 65 64 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ed to the right.
7ed0: 20 46 6f 72 20 74 68 65 20 73 61 6d 65 20 72 65   For the same re
7ee0: 61 73 6f 6e 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ason the EP_Coll
7ef0: 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e  ate flag.** is n
7f00: 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a  ot commuted..*/.
7f10: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
7f20: 43 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70  Commute(Parse *p
7f30: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7f40: 70 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69  pr){.  u16 expRi
7f50: 67 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52  ght = (pExpr->pR
7f60: 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  ight->flags & EP
7f70: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  _Collate);.  u16
7f80: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
7f90: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
7fa0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20  & EP_Collate);. 
7fb0: 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64   assert( allowed
7fc0: 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26  Op(pExpr->op) &&
7fd0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
7fe0: 4e 20 29 3b 0a 20 20 69 66 28 20 65 78 70 52 69  N );.  if( expRi
7ff0: 67 68 74 3d 3d 65 78 70 4c 65 66 74 20 29 7b 0a  ght==expLeft ){.
8000: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 58 20      /* Either X 
8010: 61 6e 64 20 59 20 62 6f 74 68 20 68 61 76 65 20  and Y both have 
8020: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
8030: 20 6f 72 20 6e 65 69 74 68 65 72 20 64 6f 20 2a   or neither do *
8040: 2f 0a 20 20 20 20 69 66 28 20 65 78 70 52 69 67  /.    if( expRig
8050: 68 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  ht ){.      /* B
8060: 6f 74 68 20 58 20 61 6e 64 20 59 20 68 61 76 65  oth X and Y have
8070: 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
8080: 72 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 58  rs.  Make sure X
8090: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 20   is always.     
80a0: 20 2a 2a 20 75 73 65 64 20 62 79 20 63 6c 65 61   ** used by clea
80b0: 72 69 6e 67 20 74 68 65 20 45 50 5f 43 6f 6c 6c  ring the EP_Coll
80c0: 61 74 65 20 66 6c 61 67 20 66 72 6f 6d 20 59 2e  ate flag from Y.
80d0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
80e0: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
80f0: 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20  = ~EP_Collate;. 
8100: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
8110: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
8120: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8130: 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Left)!=0 ){.    
8140: 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 58 20 6e    /* Neither X n
8150: 6f 72 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  or Y have COLLAT
8160: 45 20 6f 70 65 72 61 74 6f 72 73 2c 20 62 75 74  E operators, but
8170: 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d 64 65 66   X has a non-def
8180: 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ault.      ** co
8190: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
81a0: 2e 20 20 53 6f 20 61 64 64 20 74 68 65 20 45 50  .  So add the EP
81b0: 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b 65 72 20  _Collate marker 
81c0: 6f 6e 20 58 20 74 6f 20 63 61 75 73 65 0a 20 20  on X to cause.  
81d0: 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 62 65 20      ** it to be 
81e0: 73 65 61 72 63 68 65 64 20 66 69 72 73 74 2e 20  searched first. 
81f0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
8200: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pLeft->flags |= 
8210: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
8220: 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28 45 78 70  }.  }.  SWAP(Exp
8230: 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r*,pExpr->pRight
8240: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  ,pExpr->pLeft);.
8250: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e    if( pExpr->op>
8260: 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73  =TK_GT ){.    as
8270: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
8280: 47 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  GT+2 );.    asse
8290: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45  rt( TK_GE==TK_LE
82a0: 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
82b0: 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b  ( TK_GT>TK_EQ );
82c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
82d0: 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  GT<TK_LE );.    
82e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
82f0: 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70  p>=TK_GT && pExp
8300: 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a  r->op<=TK_GE );.
8310: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
8320: 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47  ((pExpr->op-TK_G
8330: 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d  T)^2)+TK_GT;.  }
8340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  .}../*.** Transl
8350: 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f  ate from TK_xx o
8360: 70 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78  perator to WO_xx
8370: 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61   bitmask..*/.sta
8380: 74 69 63 20 75 31 36 20 6f 70 65 72 61 74 6f 72  tic u16 operator
8390: 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20  Mask(int op){.  
83a0: 75 31 36 20 63 3b 0a 20 20 61 73 73 65 72 74 28  u16 c;.  assert(
83b0: 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29   allowedOp(op) )
83c0: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  ;.  if( op==TK_I
83d0: 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  N ){.    c = WO_
83e0: 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
83f0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
8400: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 53 4e 55  .    c = WO_ISNU
8410: 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
8420: 20 61 73 73 65 72 74 28 20 28 57 4f 5f 45 51 3c   assert( (WO_EQ<
8430: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20 3c 20 30  <(op-TK_EQ)) < 0
8440: 78 37 66 66 66 20 29 3b 0a 20 20 20 20 63 20 3d  x7fff );.    c =
8450: 20 28 75 31 36 29 28 57 4f 5f 45 51 3c 3c 28 6f   (u16)(WO_EQ<<(o
8460: 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20 7d 0a 20  p-TK_EQ));.  }. 
8470: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
8480: 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f  ISNULL || c==WO_
8490: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ISNULL );.  asse
84a0: 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c  rt( op!=TK_IN ||
84b0: 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 61   c==WO_IN );.  a
84c0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45 51  ssert( op!=TK_EQ
84d0: 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a   || c==WO_EQ );.
84e0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
84f0: 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20  _LT || c==WO_LT 
8500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
8510: 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LE || c==WO_
8520: 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LE );.  assert( 
8530: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d  op!=TK_GT || c==
8540: 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_GT );.  asser
8550: 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  t( op!=TK_GE || 
8560: 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72 65  c==WO_GE );.  re
8570: 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn c;.}../*.**
8580: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
8590: 6e 65 78 74 20 57 68 65 72 65 54 65 72 6d 20 74  next WhereTerm t
85a0: 68 61 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f  hat matches acco
85b0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69  rding to the cri
85c0: 74 65 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69  teria.** establi
85d0: 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 70 53  shed when the pS
85e0: 63 61 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69  can object was i
85f0: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68  nitialized by wh
8600: 65 72 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a  ereScanInit()..*
8610: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
8620: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
8630: 72 65 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72  re matching Wher
8640: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69  eTerms..*/.stati
8650: 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65  c WhereTerm *whe
8660: 72 65 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65  reScanNext(Where
8670: 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20  Scan *pScan){.  
8680: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
8690: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
86a0: 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66  or on the LHS of
86b0: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69   the term */.  i
86c0: 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
86d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
86e0: 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20  n on the LHS of 
86f0: 74 68 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f  the term.  -1 fo
8700: 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20  r IPK */.  Expr 
8710: 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
8720: 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
8730: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
8740: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
8750: 70 57 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74  pWC;    /* Short
8760: 68 61 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e  hand for pScan->
8770: 70 57 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  pWC */.  WhereTe
8780: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a  rm *pTerm;    /*
8790: 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20   The term being 
87a0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tested */.  int 
87b0: 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20  k = pScan->k;   
87c0: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61   /* Where to sta
87d0: 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a  rt scanning */..
87e0: 20 20 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e    while( pScan->
87f0: 69 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e  iEquiv<=pScan->n
8800: 45 71 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75  Equiv ){.    iCu
8810: 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69  r = pScan->aEqui
8820: 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d  v[pScan->iEquiv-
8830: 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20  2];.    iColumn 
8840: 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  = pScan->aEquiv[
8850: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
8860: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 57  ;.    while( (pW
8870: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 29 21  C = pScan->pWC)!
8880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
8890: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20  pTerm=pWC->a+k; 
88a0: 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b  k<pWC->nTerm; k+
88b0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
88c0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
88d0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
88e0: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
88f0: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
8900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
8910: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
8920: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 29 21  tor & WO_EQUIV)!
8930: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
8940: 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3c 41   pScan->nEquiv<A
8950: 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e 2d 3e  rraySize(pScan->
8960: 61 45 71 75 69 76 29 0a 20 20 20 20 20 20 20 20  aEquiv).        
8970: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
8980: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
8990: 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74 65 33      pX = sqlite3
89a0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
89b0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
89c0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
89d0: 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f     assert( pX->o
89e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
8a00: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
8a10: 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20 20 20  quiv; j+=2){.   
8a20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8a30: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 3d  Scan->aEquiv[j]=
8a40: 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20  =pX->iTable.    
8a50: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53             && pS
8a60: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d  can->aEquiv[j+1]
8a70: 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  ==pX->iColumn ){
8a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ac0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e      if( j==pScan
8ad0: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
8ae0: 20 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d            pScan-
8af0: 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70 58 2d  >aEquiv[j] = pX-
8b00: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
8b10: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45         pScan->aE
8b20: 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58 2d 3e  quiv[j+1] = pX->
8b30: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
8b40: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45         pScan->nE
8b50: 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20 20 20  quiv += 2;.     
8b60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
8b80: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8b90: 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e 6f 70  ator & pScan->op
8ba0: 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  Mask)!=0 ){.    
8bb0: 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66          /* Verif
8bc0: 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 61  y the affinity a
8bd0: 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
8be0: 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f 0a 20  uence match */. 
8bf0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8c00: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
8c10: 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  && (pTerm->eOper
8c20: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
8c30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8c40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8c50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
8c60: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
8c70: 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d  e = pWC->pWInfo-
8c80: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
8c90: 20 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72         pX = pTer
8ca0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
8cb0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
8cc0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
8cd0: 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d 3e 69  yOk(pX, pScan->i
8ce0: 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  dxaff) ){.      
8cf0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
8d00: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
8d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
8d20: 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65    assert(pX->pLe
8d30: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ft);.           
8d40: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
8d50: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
8d60: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 0a 20  ollSeq(pParse,. 
8d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
8db0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8dc0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
8dd0: 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  ==0 ) pColl = pP
8de0: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
8df0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
8e00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8e10: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
8e20: 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c  me, pScan->zColl
8e30: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
8e40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8e50: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
8e60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
8e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
8e80: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
8e90: 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30 0a 20  or & WO_EQ)!=0. 
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
8eb0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
8ec0: 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d  r->pRight)->op==
8ed0: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
8ee0: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54         && pX->iT
8ef0: 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  able==pScan->aEq
8f00: 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20  uiv[0].         
8f10: 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75      && pX->iColu
8f20: 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  mn==pScan->aEqui
8f30: 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[1].           
8f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8f50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f70: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20 3d        pScan->k =
8f80: 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20   k+1;.          
8f90: 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a    return pTerm;.
8fa0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8fc0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
8fd0: 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70 4f 75   pScan->pWC->pOu
8fe0: 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d 20 30  ter;.      k = 0
8ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63 61  ;.    }.    pSca
9000: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
9010: 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b 20 3d  pOrigWC;.    k =
9020: 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   0;.    pScan->i
9030: 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a  Equiv += 2;.  }.
9040: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9050: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
9060: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  a WHERE clause s
9070: 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e 20 20  canner object.  
9080: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
9090: 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
90a0: 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72 6e 20   match.  Return 
90b0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
90c0: 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a 2a 2a  e no matches..**
90d0: 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65 72 20  .** The scanner 
90e0: 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 69 6e  will be searchin
90f0: 67 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  g the WHERE clau
9100: 73 65 20 70 57 43 2e 20 20 49 74 20 77 69 6c 6c  se pWC.  It will
9110: 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74 65 72   look.** for ter
9120: 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ms of the form "
9130: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77  X <op> <expr>" w
9140: 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75 6d 6e  here X is column
9150: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
9160: 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68 65 20  e.** iCur.  The 
9170: 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f 6e 65  <op> must be one
9180: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
9190: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 6f  s described by o
91a0: 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pMask..**.** If 
91b0: 74 68 65 20 73 65 61 72 63 68 20 69 73 20 66 6f  the search is fo
91c0: 72 20 58 20 61 6e 64 20 74 68 65 20 57 48 45 52  r X and the WHER
91d0: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
91e0: 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  s terms of the.*
91f0: 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65 6e 20  * form X=Y then 
9200: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
9210: 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 74  ht also return t
9220: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
9230: 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65 78 70  .** "Y <op> <exp
9240: 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  r>".  The number
9250: 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 74 72   of levels of tr
9260: 61 6e 73 69 74 69 76 69 74 79 20 69 73 20 6c 69  ansitivity is li
9270: 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20 69 73  mited,.** but is
9280: 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e 64 6c   enough to handl
9290: 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c 79 20  e most commonly 
92a0: 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20 73 74  occurring SQL st
92b0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
92c0: 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68 65 20  If X is not the 
92d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
92e0: 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73 74 20  KEY then X must 
92f0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
9300: 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49 64 78  th.** index pIdx
9310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72  ..*/.static Wher
9320: 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e  eTerm *whereScan
9330: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53 63 61  Init(.  WhereSca
9340: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
9350: 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63 61 6e  /* The WhereScan
9360: 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 69 6e   object being in
9370: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57  itialized */.  W
9380: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
9390: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
93a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
93b0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e   scanned */.  in
93c0: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
93d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
93e0: 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20  to scan for */. 
93f0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9400: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
9410: 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  mn to scan for *
9420: 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b 2c 20  /.  u32 opMask, 
9430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9440: 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20 73 63  perator(s) to sc
9450: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  an for */.  Inde
9460: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
9470: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
9480: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
9490: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a  his index */.){.
94a0: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 6d    int j;..  /* m
94b0: 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30 2c 20  emset(pScan, 0, 
94c0: 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29 29 3b  sizeof(*pScan));
94d0: 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70 4f 72   */.  pScan->pOr
94e0: 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20 70 53  igWC = pWC;.  pS
94f0: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43 3b 0a  can->pWC = pWC;.
9500: 20 20 69 66 28 20 70 49 64 78 20 26 26 20 69 43    if( pIdx && iC
9510: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
9520: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
9530: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
9540: 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  ol[iColumn].affi
9550: 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nity;.    for(j=
9560: 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  0; pIdx->aiColum
9570: 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b 20 6a  n[j]!=iColumn; j
9580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4e  ++){.      if( N
9590: 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43  EVER(j>=pIdx->nC
95a0: 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e 20  olumn) ) return 
95b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 63  0;.    }.    pSc
95c0: 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20  an->zCollName = 
95d0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b  pIdx->azColl[j];
95e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
95f0: 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b  can->idxaff = 0;
9600: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c  .    pScan->zCol
9610: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  lName = 0;.  }. 
9620: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20 3d   pScan->opMask =
9630: 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61 6e   opMask;.  pScan
9640: 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61 6e  ->k = 0;.  pScan
9650: 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69 43  ->aEquiv[0] = iC
9660: 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71  ur;.  pScan->aEq
9670: 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d 6e  uiv[1] = iColumn
9680: 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69  ;.  pScan->nEqui
9690: 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d 3e  v = 2;.  pScan->
96a0: 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72 65  iEquiv = 2;.  re
96b0: 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e 65  turn whereScanNe
96c0: 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f 2a  xt(pScan);.}../*
96d0: 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
96e0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
96f0: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 69  RE clause that i
9700: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
9710: 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a   <op> <expr>".**
9720: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72 65   where X is a re
9730: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
9740: 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  Column of table 
9750: 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73  iCur and <op> is
9760: 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57   one of.** the W
9770: 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f  O_xx operator co
9780: 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62 79  des specified by
9790: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
97a0: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  r..** Return a p
97b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65  ointer to the te
97c0: 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  rm.  Return 0 if
97d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
97e0: 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75 72  * The term retur
97f0: 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d 3c  ned might by Y=<
9800: 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20 69  expr> if there i
9810: 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74 72  s another constr
9820: 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 57  aint in.** the W
9830: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
9840: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
9850: 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20 63  X=Y.  Any such c
9860: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
9870: 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64  be.** identified
9880: 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49 56   by the WO_EQUIV
9890: 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65 72   bit in the pTer
98a0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69 65  m->eOperator fie
98b0: 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71 75  ld.  The.** aEqu
98c0: 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64 73  iv[] array holds
98d0: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
98e0: 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74 68  quivalents, with
98f0: 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61 62   each SQL variab
9900: 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20  le.** taking up 
9910: 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45 71  two slots in aEq
9920: 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72 73  uiv[].  The firs
9930: 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74 68  t slot is for th
9940: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
9950: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ** and the secon
9960: 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f 6c  d is for the col
9970: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  umn number.  The
9980: 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73 20  re are 22 slots 
9990: 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20 73  in aEquiv[].** s
99a0: 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  o that means we 
99b0: 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70  can look for X p
99c0: 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74 68  lus up to 10 oth
99d0: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
99e0: 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20 61  lues..** Hence a
99f0: 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77 69   search for X wi
9a00: 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e  ll return <expr>
9a10: 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31 3d   if X=A1 and A1=
9a20: 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a 20  A2 and A2=A3.** 
9a30: 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41  and ... and A9=A
9a40: 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72  10 and A10=<expr
9a50: 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  >..**.** If ther
9a60: 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74  e are multiple t
9a70: 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
9a80: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
9a90: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
9aa0: 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79  pr>".** then try
9ab0: 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74   for the one wit
9ac0: 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65  h no dependencie
9ad0: 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e  s on <expr> - in
9ae0: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68 65   other words whe
9af0: 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20  re.** <expr> is 
9b00: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
9b10: 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ssion of some ki
9b20: 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e  nd.  Only return
9b30: 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74   entries of.** t
9b40: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
9b50: 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61 20  Y" where Y is a 
9b60: 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65  column in anothe
9b70: 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65  r table if no te
9b80: 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  rms of.** the fo
9b90: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73  rm "X <op> <cons
9ba0: 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20  t-expr>" exist. 
9bb0: 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69    If no terms wi
9bc0: 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48  th a constant RH
9bd0: 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20  S.** exist, try 
9be0: 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d  to return a term
9bf0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
9c00: 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a  se WO_EQUIV..*/.
9c10: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
9c20: 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57 68   *findTerm(.  Wh
9c30: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9c40: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
9c50: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65   clause to be se
9c60: 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20  arched */.  int 
9c70: 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  iCur,           
9c80: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
9c90: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69  er of LHS */.  i
9ca0: 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
9cb0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
9cc0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
9cd0: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
9ce0: 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d  dy,     /* RHS m
9cf0: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20  ust not overlap 
9d00: 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a  with this mask *
9d10: 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20  /.  u32 op,     
9d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
9d30: 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65  k of WO_xx value
9d40: 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65  s describing ope
9d50: 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78  rator */.  Index
9d60: 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
9d70: 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70   /* Must be comp
9d80: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73  atible with this
9d90: 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e   index, if not N
9da0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72  ULL */.){.  Wher
9db0: 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d  eTerm *pResult =
9dc0: 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   0;.  WhereTerm 
9dd0: 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20  *p;.  WhereScan 
9de0: 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65  scan;..  p = whe
9df0: 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
9e00: 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f  , pWC, iCur, iCo
9e10: 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b  lumn, op, pIdx);
9e20: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
9e30: 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
9e40: 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
9e50: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  y)==0 ){.      i
9e60: 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69 67 68  f( p->prereqRigh
9e70: 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f 70 65  t==0 && (p->eOpe
9e80: 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20  rator&WO_EQ)!=0 
9e90: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9ea0: 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n p;.      }.   
9eb0: 20 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d     if( pResult==
9ec0: 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b  0 ) pResult = p;
9ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77  .    }.    p = w
9ee0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63  hereScanNext(&sc
9ef0: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
9f00: 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  n pResult;.}../*
9f10: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
9f20: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
9f30: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72  d exprAnalyze(Sr
9f40: 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61  cList*, WhereCla
9f50: 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  use*, int);../*.
9f60: 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c  ** Call exprAnal
9f70: 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  yze on all terms
9f80: 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75   in a WHERE clau
9f90: 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  se.  .*/.static 
9fa0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
9fb0: 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  All(.  SrcList *
9fc0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
9fd0: 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* the FROM clau
9fe0: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  se */.  WhereCla
9ff0: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
a000: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
a010: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
a020: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
a030: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
a040: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
a050: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
a060: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
a070: 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  WC, i);.  }.}..#
a080: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a090: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
a0a0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  TION./*.** Check
a0b0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67   to see if the g
a0c0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
a0d0: 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  is a LIKE or GLO
a0e0: 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a  B operator that.
a0f0: 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69  ** can be optimi
a100: 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61  zed using inequa
a110: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
a120: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
a130: 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e  f it is.** so an
a140: 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
a150: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
a160: 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  or the operator 
a170: 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c  to be optimizibl
a180: 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20  e, the RHS must 
a190: 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c  be a string.** l
a1a0: 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73  iteral that does
a1b0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
a1c0: 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f  a wildcard.  .*/
a1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69  .static int isLi
a1e0: 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73  keOrGlob(.  Pars
a1f0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a200: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
a210: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
a220: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
a230: 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
a240: 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73  est this express
a250: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ion */.  Expr **
a260: 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f  ppPrefix,  /* Po
a270: 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49  inter to TK_STRI
a280: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  NG expression wi
a290: 74 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69  th pattern prefi
a2a0: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  x */.  int *pisC
a2b0: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
a2c0: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
a2d0: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
a2e0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
a2f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
a300: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
a310: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
a320: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
a330: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
a340: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
a350: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  0;         /* St
a360: 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c  ring on RHS of L
a370: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
a380: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
a390: 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20  *pLeft;      /* 
a3a0: 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  Right and left s
a3b0: 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  ize of LIKE oper
a3c0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ator */.  ExprLi
a3d0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  st *pList;      
a3e0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
a3f0: 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20  operands to the 
a400: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f  LIKE operator */
a410: 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20  .  int c;       
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a430: 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69   One character i
a440: 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63  n z[] */.  int c
a450: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
a460: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a470: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
a480: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
a490: 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33  s */.  char wc[3
a4a0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
a4b0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68    /* Wildcard ch
a4c0: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71  aracters */.  sq
a4d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a4e0: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
a4f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
a500: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
a510: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
a520: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
a530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
a540: 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a  code of pRight *
a550: 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  /..  if( !sqlite
a560: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
a570: 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61  db, pExpr, pnoCa
a580: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
a590: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66  eturn 0;.  }.#if
a5a0: 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49  def SQLITE_EBCDI
a5b0: 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65  C.  if( *pnoCase
a5c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
a5d0: 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45  dif.  pList = pE
a5e0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
a5f0: 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61  pLeft = pList->a
a600: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [1].pExpr;.  if(
a610: 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43   pLeft->op!=TK_C
a620: 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73 71 6c  OLUMN .   || sql
a630: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
a640: 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f  (pLeft)!=SQLITE_
a650: 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c 7c 20  AFF_TEXT .   || 
a660: 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66 74 2d  IsVirtual(pLeft-
a670: 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20 20 20  >pTab).  ){.    
a680: 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35 2d  /* IMP: R-02065-
a690: 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d 68  49465 The left-h
a6a0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
a6b0: 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65  LIKE or GLOB ope
a6c0: 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20 2a  rator must.    *
a6d0: 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  * be the name of
a6e0: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
a6f0: 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66 66  mn with TEXT aff
a700: 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65  inity. */.    re
a710: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 73  turn 0;.  }.  as
a720: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43 6f  sert( pLeft->iCo
a730: 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f 2a  lumn!=(-1) ); /*
a740: 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65 76   Because IPK nev
a750: 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54 20  er has AFF_TEXT 
a760: 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20 70  */..  pRight = p
a770: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a780: 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d  ;.  op = pRight-
a790: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
a7a0: 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20  K_REGISTER ){.  
a7b0: 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f    op = pRight->o
a7c0: 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70  p2;.  }.  if( op
a7d0: 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b  ==TK_VARIABLE ){
a7e0: 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70 72  .    Vdbe *pRepr
a7f0: 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d 3e  epare = pParse->
a800: 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20 20  pReprepare;.    
a810: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67 68  int iCol = pRigh
a820: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
a830: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  pVal = sqlite3Vd
a840: 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
a850: 70 52 65 70 72 65 70 61 72 65 2c 20 69 43 6f 6c  pReprepare, iCol
a860: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
a870: 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  E);.    if( pVal
a880: 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   && sqlite3_valu
a890: 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d 53 51  e_type(pVal)==SQ
a8a0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
a8b0: 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 73     z = (char *)s
a8c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
a8d0: 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  t(pVal);.    }. 
a8e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
a8f0: 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d  tVarmask(pParse-
a900: 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b 0a 20  >pVdbe, iCol);. 
a910: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
a920: 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42  t->op==TK_VARIAB
a930: 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  LE || pRight->op
a940: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
a950: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
a960: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
a970: 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e    z = pRight->u.
a980: 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  zToken;.  }.  if
a990: 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ( z ){.    cnt =
a9a0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
a9b0: 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20  c=z[cnt])!=0 && 
a9c0: 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77  c!=wc[0] && c!=w
a9d0: 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d  c[1] && c!=wc[2]
a9e0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
a9f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
aa00: 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75  nt!=0 && 255!=(u
aa10: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
aa20: 20 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69      Expr *pPrefi
aa30: 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d  x;.      *pisCom
aa40: 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d  plete = c==wc[0]
aa50: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
aa60: 0a 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d  .      pPrefix =
aa70: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
aa80: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a   TK_STRING, z);.
aa90: 20 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69        if( pPrefi
aaa0: 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a  x ) pPrefix->u.z
aab0: 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a  Token[cnt] = 0;.
aac0: 20 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20        *ppPrefix 
aad0: 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20  = pPrefix;.     
aae0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49   if( op==TK_VARI
aaf0: 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ABLE ){.        
ab00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ab10: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20  ->pVdbe;.       
ab20: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
ab30: 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74  armask(v, pRight
ab40: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
ab50: 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70      if( *pisComp
ab60: 6c 65 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e  lete && pRight->
ab70: 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20  u.zToken[1] ){. 
ab80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
ab90: 68 65 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49  he rhs of the LI
aba0: 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  KE expression is
abb0: 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64   a variable, and
abc0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
abd0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
abe0: 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  of the variable 
abf0: 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e  means there is n
ac00: 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65  o need to invoke
ac10: 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20   the LIKE.      
ac20: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c      ** function,
ac30: 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69   then no OP_Vari
ac40: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64  able will be add
ac50: 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  ed to the progra
ac60: 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  m..          ** 
ac70: 54 68 69 73 20 63 61 75 73 65 73 20 70 72 6f 62  This causes prob
ac80: 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c  lems for the sql
ac90: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
aca0: 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20  ter_name().     
acb0: 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20       ** API. To 
acc0: 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c  workaround them,
acd0: 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f   add a dummy OP_
ace0: 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20  Variable here.. 
acf0: 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20           */ .   
ad00: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
ad10: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ad20: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
ad30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ad40: 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
ad50: 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a  e, pRight, r1);.
ad60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ad70: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ad80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
ad90: 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29  entAddr(v)-1, 0)
ada0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
adb0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
adc0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
add0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ade0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
adf0: 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    z = 0;.    }. 
ae00: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
ae10: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
ae20: 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d  return (z!=0);.}
ae30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ae40: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
ae50: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
ae60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ae70: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
ae80: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
ae90: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
aea0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
aeb0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
aec0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
aed0: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
aee0: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
aef0: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
af00: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
af10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
af20: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
af30: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
af40: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
af50: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
af60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
af70: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
af80: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
af90: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
afa0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
afb0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
afc0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74  r->u.zToken,"mat
afd0: 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ch")!=0 ){.    r
afe0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
aff0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
b000: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
b010: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
b020: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b030: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
b040: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
b050: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
b060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
b070: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
b080: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b090: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
b0a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
b0b0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
b0c0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
b0d0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
b0e0: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
b0f0: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
b100: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
b110: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
b120: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
b130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
b140: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
b150: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
b160: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
b170: 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67    pDerived->flag
b180: 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67  s |= pBase->flag
b190: 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b  s & EP_FromJoin;
b1a0: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69  .  pDerived->iRi
b1b0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
b1c0: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
b1d0: 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64  Table;.}..#if !d
b1e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b1f0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
b200: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
b210: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b220: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
b230: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
b240: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
b250: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
b260: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
b270: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
b280: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
b290: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
b2a0: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
b2b0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (d=13).**     
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
b2e0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
b2f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
b300: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
b310: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
b320: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
b330: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
b340: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
b350: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
b360: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
b370: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
b380: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
b390: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
b3a0: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
b3b0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
b3c0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
b3d0: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
b3e0: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
b3f0: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b400: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
b410: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
b420: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
b430: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
b440: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
b450: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
b460: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
b470: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
b480: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
b490: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
b4a0: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
b4b0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
b4c0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
b4d0: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
b4e0: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
b4f0: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
b500: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
b510: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
b520: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
b530: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
b540: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
b550: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
b560: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
b570: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
b580: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
b590: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
b5a0: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
b5b0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
b5c0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
b5d0: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
b5e0: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
b5f0: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
b600: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
b610: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
b620: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
b630: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
b640: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
b650: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
b660: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 20  gle column of C 
b670: 61 6e 64 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  and.** a single 
b680: 74 61 62 6c 65 20 54 20 28 61 73 20 73 68 6f 77  table T (as show
b690: 6e 20 69 6e 20 65 78 61 6d 70 6c 65 20 42 20 61  n in example B a
b6a0: 62 6f 76 65 29 20 74 68 65 6e 20 63 72 65 61 74  bove) then creat
b6b0: 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a  e a new virtual.
b6c0: 2a 2a 20 74 65 72 6d 20 74 68 61 74 20 69 73 20  ** term that is 
b6d0: 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 49 4e  an equivalent IN
b6e0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 6e   expression.  In
b6f0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
b700: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 62 65 69   the term.** bei
b710: 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 3a 0a  ng analyzed is:.
b720: 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 3d 20 65  **.**      x = e
b730: 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32 20  xpr1  OR  expr2 
b740: 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70  = x  OR  x = exp
b750: 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 63 72  r3.**.** then cr
b760: 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75  eate a new virtu
b770: 61 6c 20 74 65 72 6d 20 6c 69 6b 65 20 74 68 69  al term like thi
b780: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  s:.**.**      x 
b790: 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c  IN (expr1,expr2,
b7a0: 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53  expr3).**.** CAS
b7b0: 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 2:.**.** If al
b7c0: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 69  l subterms are i
b7d0: 6e 64 65 78 61 62 6c 65 20 62 79 20 61 20 73 69  ndexable by a si
b7e0: 6e 67 6c 65 20 74 61 62 6c 65 20 54 2c 20 74 68  ngle table T, th
b7f0: 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20  en set.**.**    
b800: 20 57 68 65 72 65 54 65 72 6d 2e 65 4f 70 65 72   WhereTerm.eOper
b810: 61 74 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  ator            
b820: 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20    =  WO_OR.**   
b830: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
b840: 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  rInfo->indexable
b850: 20 20 7c 3d 20 20 74 68 65 20 63 75 72 73 6f 72    |=  the cursor
b860: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c   number for tabl
b870: 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20 73 75 62 74  e T.**.** A subt
b880: 65 72 6d 20 69 73 20 22 69 6e 64 65 78 61 62 6c  erm is "indexabl
b890: 65 22 20 69 66 20 69 74 20 69 73 20 6f 66 20 74  e" if it is of t
b8a0: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20  he form.** "T.C 
b8b0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 77 68 65  <op> <expr>" whe
b8c0: 72 65 20 43 20 69 73 20 61 6e 79 20 63 6f 6c 75  re C is any colu
b8d0: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 54 20 61 6e  mn of table T an
b8e0: 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e  d .** <op> is on
b8f0: 65 20 6f 66 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e of "=", "<", "
b900: 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e 3d 22 2c 20  <=", ">", ">=", 
b910: 22 49 53 20 4e 55 4c 4c 22 2c 20 6f 72 20 22 49  "IS NULL", or "I
b920: 4e 22 2e 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d  N"..** A subterm
b930: 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
b940: 6c 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 41  le if it is an A
b950: 4e 44 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ND of two or mor
b960: 65 0a 2a 2a 20 73 75 62 73 75 62 74 65 72 6d 73  e.** subsubterms
b970: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
b980: 20 77 68 69 63 68 20 69 73 20 69 6e 64 65 78 61   which is indexa
b990: 62 6c 65 2e 20 20 49 6e 64 65 78 61 62 6c 65 20  ble.  Indexable 
b9a0: 41 4e 44 20 0a 2a 2a 20 73 75 62 74 65 72 6d 73  AND .** subterms
b9b0: 20 68 61 76 65 20 74 68 65 69 72 20 65 4f 70 65   have their eOpe
b9c0: 72 61 74 6f 72 20 73 65 74 20 74 6f 20 57 4f 5f  rator set to WO_
b9d0: 41 4e 44 20 61 6e 64 20 74 68 65 79 20 68 61 76  AND and they hav
b9e0: 65 0a 2a 2a 20 75 2e 70 41 6e 64 49 6e 66 6f 20  e.** u.pAndInfo 
b9f0: 73 65 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  set to a dynamic
ba00: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57  ally allocated W
ba10: 68 65 72 65 41 6e 64 54 65 72 6d 20 6f 62 6a 65  hereAndTerm obje
ba20: 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61  ct..**.** From a
ba30: 6e 6f 74 68 65 72 20 70 6f 69 6e 74 20 6f 66 20  nother point of 
ba40: 76 69 65 77 2c 20 22 69 6e 64 65 78 61 62 6c 65  view, "indexable
ba50: 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  " means that the
ba60: 20 73 75 62 74 65 72 6d 20 63 6f 75 6c 64 0a 2a   subterm could.*
ba70: 2a 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 62 65  * potentially be
ba80: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
ba90: 64 65 78 20 69 66 20 61 6e 20 61 70 70 72 6f 70  dex if an approp
baa0: 72 69 61 74 65 20 69 6e 64 65 78 20 65 78 69 73  riate index exis
bab0: 74 73 2e 0a 2a 2a 20 54 68 69 73 20 61 6e 61 6c  ts..** This anal
bac0: 79 73 69 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ysis does not co
bad0: 6e 73 69 64 65 72 20 77 68 65 74 68 65 72 20 6f  nsider whether o
bae0: 72 20 6e 6f 74 20 74 68 65 20 69 6e 64 65 78 20  r not the index 
baf0: 65 78 69 73 74 73 3b 20 74 68 61 74 0a 2a 2a 20  exists; that.** 
bb00: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 65  is something the
bb10: 20 62 65 73 74 49 6e 64 65 78 28 29 20 72 6f 75   bestIndex() rou
bb20: 74 69 6e 65 20 77 69 6c 6c 20 64 65 74 65 72 6d  tine will determ
bb30: 69 6e 65 2e 20 20 54 68 69 73 20 61 6e 61 6c 79  ine.  This analy
bb40: 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b  sis.** only look
bb50: 73 20 61 74 20 77 68 65 74 68 65 72 20 73 75 62  s at whether sub
bb60: 74 65 72 6d 73 20 61 70 70 72 6f 70 72 69 61 74  terms appropriat
bb70: 65 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 65  e for indexing e
bb80: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  xist..**.** All 
bb90: 65 78 61 6d 70 6c 65 73 20 41 20 74 68 72 6f 75  examples A throu
bba0: 67 68 20 45 20 61 62 6f 76 65 20 61 6c 6c 20 73  gh E above all s
bbb0: 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20  atisfy case 2.  
bbc0: 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a 2a  But if a term.**
bbd0: 20 61 6c 73 6f 20 73 74 61 74 69 73 66 69 65 73   also statisfies
bbe0: 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73   case 1 (such as
bbf0: 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   B) we know that
bc00: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77   the optimizer w
bc10: 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72  ill.** always pr
bc20: 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20  efer case 1, so 
bc30: 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  in that case we 
bc40: 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73  pretend that cas
bc50: 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61  e 2 is not.** sa
bc60: 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  tisfied..**.** I
bc70: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
bc80: 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ase that multipl
bc90: 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64  e tables are ind
bca0: 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61  exable.  For exa
bcb0: 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f  mple,.** (E) abo
bcc0: 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20  ve is indexable 
bcd0: 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20  on tables P, Q, 
bce0: 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72  and R..**.** Ter
bcf0: 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  ms that satisfy 
bd00: 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69  case 2 are candi
bd10: 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70  dates for lookup
bd20: 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70   by using.** sep
bd30: 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f  arate indices to
bd40: 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72   find rowids for
bd50: 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e   each subterm an
bd60: 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74  d composing.** t
bd70: 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20  he union of all 
bd80: 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52  rowids using a R
bd90: 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  owSet object.  T
bda0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a  his is similar.*
bdb0: 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64  * to "bitmap ind
bdc0: 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64  ices" in other d
bdd0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e  atabase engines.
bde0: 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45  .**.** OTHERWISE
bdf0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  :.**.** If neith
be00: 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61  er case 1 nor ca
be10: 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e  se 2 apply, then
be20: 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72   leave the eOper
be30: 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a  ator set to.** z
be40: 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20  ero.  This term 
be50: 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
be60: 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  r search..*/.sta
be70: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
be80: 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72  lyzeOrTerm(.  Sr
be90: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
bea0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
beb0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
bec0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
bed0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
bee0: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
bef0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
bf00: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
bf10: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
bf20: 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f  f the OR-term to
bf30: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
bf40: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
bf50: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
bf60: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  Info;        /* 
bf70: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
bf80: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
bf90: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
bfa0: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
bfb0: 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rse;         /* 
bfc0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
bfd0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
bfe0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c000: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c010: 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
c020: 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
c030: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20  >a[idxTerm];    
c040: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
c050: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
c060: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
c070: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20  erm->pExpr;     
c080: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
c090: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
c0a0: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
c0b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c0e0: 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ers */.  WhereCl
c0f0: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
c100: 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66     /* Breakup of
c110: 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74   pTerm into subt
c120: 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54  erms */.  WhereT
c130: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20  erm *pOrTerm;   
c140: 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72      /* A Sub-ter
c150: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72  m within the pOr
c160: 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49  Wc */.  WhereOrI
c170: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
c180: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
c190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f  information asso
c1a0: 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72  ciated with pTer
c1b0: 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63  m */.  Bitmask c
c1c0: 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20  hngToIN;        
c1d0: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
c1e0: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
c1f0: 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73  se 1 */.  Bitmas
c200: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
c210: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
c220: 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  at are indexable
c230: 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73  , satisfying cas
c240: 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  e 2 */..  /*.  *
c250: 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63  * Break the OR c
c260: 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73  lause into its s
c270: 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73  eparate subterms
c280: 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20  .  The subterms 
c290: 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  are.  ** stored 
c2a0: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
c2b0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
c2c0: 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  ining within the
c2d0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a   WhereOrInfo.  *
c2e0: 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
c2f0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
c300: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61   original OR cla
c310: 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20  use term..  */. 
c320: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
c330: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
c340: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52  _DYNAMIC|TERM_OR
c350: 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46  INFO|TERM_ANDINF
c360: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  O))==0 );.  asse
c370: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
c380: 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d  K_OR );.  pTerm-
c390: 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72  >u.pOrInfo = pOr
c3a0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
c3b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
c3c0: 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29  izeof(*pOrInfo))
c3d0: 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d  ;.  if( pOrInfo=
c3e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
c3f0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c400: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20   TERM_ORINFO;.  
c410: 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f  pOrWc = &pOrInfo
c420: 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61  ->wc;.  whereCla
c430: 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70  useInit(pOrWc, p
c440: 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53  WInfo);.  whereS
c450: 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70  plit(pOrWc, pExp
c460: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70  r, TK_OR);.  exp
c470: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
c480: 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20  , pOrWc);.  if( 
c490: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c4a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
c4b0: 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72  ert( pOrWc->nTer
c4c0: 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  m>=2 );..  /*.  
c4d0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  ** Compute the s
c4e0: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
c4f0: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
c500: 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20  cases 1 or 2..  
c510: 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d  */.  indexable =
c520: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
c530: 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74  chngToIN = ~(Bit
c540: 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
c550: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
c560: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
c570: 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61  ; i>=0 && indexa
c580: 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  ble; i--, pOrTer
c590: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
c5a0: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
c5b0: 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d  r & WO_SINGLE)==
c5c0: 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
c5d0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
c5e0: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
c5f0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
c600: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
c610: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
c620: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
c630: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
c640: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
c650: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
c660: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
c670: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
c680: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
c690: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
c6a0: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
c6b0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
c6c0: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
c6d0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
c6e0: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
c6f0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
c700: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
c710: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
c720: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
c730: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
c740: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
c750: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
c760: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
c770: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
c780: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
c790: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
c7a0: 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29  WC, pWC->pWInfo)
c7b0: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53  ;.        whereS
c7c0: 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72  plit(pAndWC, pOr
c7d0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f  Term->pExpr, TK_
c7e0: 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78  AND);.        ex
c7f0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
c800: 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20  c, pAndWC);.    
c810: 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74      pAndWC->pOut
c820: 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
c830: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
c840: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c850: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
c860: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c870: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
c880: 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e  =0, pAndTerm=pAn
c890: 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43  dWC->a; j<pAndWC
c8a0: 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41  ->nTerm; j++, pA
c8b0: 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ndTerm++){.     
c8c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c8d0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  AndTerm->pExpr )
c8e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
c8f0: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64  ( allowedOp(pAnd
c900: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29  Term->pExpr->op)
c910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c920: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26    b |= getMask(&
c930: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
c940: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
c950: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
c960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
c970: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c980: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
c990: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
c9a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
c9b0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
c9c0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
c9d0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
c9e0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
c9f0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
ca00: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
ca10: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
ca20: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
ca30: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
ca40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
ca50: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
ca60: 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
ca70: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
ca80: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
ca90: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
caa0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
cab0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b   TERM_VIRTUAL ){
cac0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
cad0: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f  rm *pOther = &pO
cae0: 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e  rWc->a[pOrTerm->
caf0: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
cb00: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26    b |= getMask(&
cb10: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
cb20: 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75  , pOther->leftCu
cb30: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
cb40: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
cb50: 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  = b;.      if( (
cb60: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
cb70: 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
cb80: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
cb90: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  IN = 0;.      }e
cba0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  lse{.        chn
cbb0: 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20  gToIN &= b;.    
cbc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
cbd0: 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20   /*.  ** Record 
cbe0: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
cbf0: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
cc00: 61 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20  ase 2.  The set 
cc10: 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d  might be.  ** em
cc20: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49  pty..  */.  pOrI
cc30: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d  nfo->indexable =
cc40: 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54   indexable;.  pT
cc50: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
cc60: 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20   indexable==0 ? 
cc70: 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a  0 : WO_OR;..  /*
cc80: 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68  .  ** chngToIN h
cc90: 6f 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61  olds a set of ta
cca0: 62 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74  bles that *might
ccb0: 2a 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  * satisfy case 1
ccc0: 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68  .  But.  ** we h
ccd0: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61  ave to do some a
cce0: 64 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69  dditional checki
ccf0: 6e 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73  ng to see if cas
cd00: 65 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20  e 1 really.  ** 
cd10: 69 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20  is satisfied..  
cd20: 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e  **.  ** chngToIN
cd30: 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65   will hold eithe
cd40: 72 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74  r 0, 1, or 2 bit
cd50: 73 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61  s.  The 0-bit ca
cd60: 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  se means.  ** th
cd70: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  at there is no p
cd80: 6f 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72  ossibility of tr
cd90: 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f  ansforming the O
cda0: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e  R clause into an
cdb0: 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  .  ** IN operato
cdc0: 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72  r because one or
cdd0: 20 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74   more terms in t
cde0: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e  he OR clause con
cdf0: 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68  tain.  ** someth
ce00: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d  ing other than =
ce10: 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  = on a column in
ce20: 20 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c   the single tabl
ce30: 65 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20  e.  The 1-bit.  
ce40: 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68  ** case means th
ce50: 61 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  at every term of
ce60: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
ce70: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20  s of the form.  
ce80: 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e  ** "table.column
ce90: 3d 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20  =expr" for some 
cea0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54  single table.  T
ceb0: 68 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20  he one bit that 
cec0: 69 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c  is set.  ** will
ced0: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
cee0: 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e  he common table.
cef0: 20 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20    We still need 
cf00: 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  to check to make
cf10: 0a 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73  .  ** sure the s
cf20: 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73  ame column is us
cf30: 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e  ed on all terms.
cf40: 20 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65    The 2-bit case
cf50: 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68   is when.  ** th
cf60: 65 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20  e all terms are 
cf70: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62  of the form "tab
cf80: 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65  le1.column=table
cf90: 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20  2.column".  It. 
cfa0: 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73   ** might be pos
cfb0: 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e  sible to form an
cfc0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
cfd0: 68 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e  h either table1.
cfe0: 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74  column.  ** or t
cff0: 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20  able2.column as 
d000: 74 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65  the LHS if eithe
d010: 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65  r is common to e
d020: 76 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a  very term of.  *
d030: 2a 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e  * the OR clause.
d040: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
d050: 74 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68  that terms of th
d060: 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f  e form "table.co
d070: 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75  lumn1=table.colu
d080: 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73  mn2" (the.  ** s
d090: 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74  ame table on bot
d0a0: 68 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d  h sizes of the =
d0b0: 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74  =) cannot be opt
d0c0: 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  imized..  */.  i
d0d0: 66 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  f( chngToIN ){. 
d0e0: 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54     int okToChngT
d0f0: 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  oIN = 0;     /* 
d100: 54 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76  True if the conv
d110: 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20  ersion to IN is 
d120: 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74  valid */.    int
d130: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20   iColumn = -1;  
d140: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
d150: 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66   index on lhs of
d160: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
d170: 20 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20      int iCursor 
d180: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
d190: 20 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f   Table cursor co
d1a0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d  mmon to all term
d1b0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d  s */.    int j =
d1c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d1d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d1e0: 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  er */..    /* Se
d1f0: 61 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65  arch for a table
d200: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74   and column that
d210: 20 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20   appears on one 
d220: 73 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20  side or the.    
d230: 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  ** other of the 
d240: 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65  == operator in e
d250: 76 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54  very subterm.  T
d260: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  hat table and co
d270: 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  lumn.    ** will
d280: 20 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20   be recorded in 
d290: 69 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c  iCursor and iCol
d2a0: 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68  umn.  There migh
d2b0: 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20  t not be any.   
d2c0: 20 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61   ** such table a
d2d0: 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20  nd column.  Set 
d2e0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20  okToChngToIN if 
d2f0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  an appropriate t
d300: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  able.    ** and 
d310: 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20  column is found 
d320: 62 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68  but leave okToCh
d330: 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20  ngToIN false if 
d340: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a  not found..    *
d350: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
d360: 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54  <2 && !okToChngT
d370: 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  oIN; j++){.     
d380: 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63   pOrTerm = pOrWc
d390: 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ->a;.      for(i
d3a0: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b  =pOrWc->nTerm-1;
d3b0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54   i>=0; i--, pOrT
d3c0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
d3d0: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
d3e0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
d3f0: 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  EQ );.        pO
d400: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
d410: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
d420: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
d430: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
d440: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
d450: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
d460: 74 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61  the 2-bit case a
d470: 6e 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65  nd we are on the
d480: 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f   second iteratio
d490: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  n and.          
d4a0: 2a 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  ** current term 
d4b0: 69 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  is from the firs
d4c0: 74 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f  t iteration.  So
d4d0: 20 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e   skip this term.
d4e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
d4f0: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
d500: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
d510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d520: 20 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49      if( (chngToI
d530: 4e 20 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49  N & getMask(&pWI
d540: 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
d550: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
d560: 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or))==0 ){.     
d570: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72       /* This ter
d580: 6d 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65  m must be of the
d590: 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62   form t1.a==t2.b
d5a0: 20 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20   where t2 is in 
d5b0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
d5c0: 20 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75   chngToIN set bu
d5d0: 74 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68  t t1 is not.  Th
d5e0: 69 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  is term will be 
d5f0: 65 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64  either preceeded
d600: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
d610: 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69   follwed by an i
d620: 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32  nverted copy (t2
d630: 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70  .b==t1.a).  Skip
d640: 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20   this term .    
d650: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65        ** and use
d660: 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20   its inversion. 
d670: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
d680: 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e  tcase( pOrTerm->
d690: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
d6a0: 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OPIED );.       
d6b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72     testcase( pOr
d6c0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
d6d0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
d6e0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
d6f0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
d700: 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45  gs & (TERM_COPIE
d710: 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20  D|TERM_VIRTUAL) 
d720: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
d730: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
d740: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
d750: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65   = pOrTerm->u.le
d760: 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
d770: 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54    iCursor = pOrT
d780: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b  erm->leftCursor;
d790: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d7b0: 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( i<0 ){.       
d7c0: 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65   /* No candidate
d7d0: 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61   table+column wa
d7e0: 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63  s found.  This c
d7f0: 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20  an only occur.  
d800: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
d810: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
d820: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
d830: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
d840: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
d850: 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49  werOfTwo(chngToI
d860: 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  N) );.        as
d870: 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d  sert( chngToIN==
d880: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
d890: 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73  >sMaskSet, iCurs
d8a0: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  or) );.        b
d8b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d8c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
d8d0: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
d8e0: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20  We have found a 
d8f0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20  candidate table 
d900: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65  and column.  Che
d910: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ck to see if tha
d920: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  t.      ** table
d930: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63   and column is c
d940: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
d950: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  erm in the OR cl
d960: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b  ause */.      ok
d970: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a  ToChngToIN = 1;.
d980: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30        for(; i>=0
d990: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e   && okToChngToIN
d9a0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
d9b0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
d9c0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
d9d0: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
d9e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
d9f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
da00: 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
da10: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
da20: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
da30: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
da40: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
da50: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21  m->u.leftColumn!
da60: 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
da70: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
da80: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
da90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
daa0: 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66   int affLeft, af
dab0: 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  fRight;.        
dac0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68    /* If the righ
dad0: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
dae0: 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68  lso a column, th
daf0: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65  en the affinitie
db00: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  s.          ** o
db10: 66 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64  f both right and
db20: 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74   left sides must
db30: 20 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f   be such that no
db40: 20 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20   type.          
db50: 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ** conversions a
db60: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
db70: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
db80: 65 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20  et #2249).      
db90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
dba0: 20 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69   affRight = sqli
dbb0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
dbc0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
dbd0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
dbe0: 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c     affLeft = sql
dbf0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
dc00: 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d  (pOrTerm->pExpr-
dc10: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
dc20: 20 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21     if( affRight!
dc30: 3d 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d  =0 && affRight!=
dc40: 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  affLeft ){.     
dc50: 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54         okToChngT
dc60: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oIN = 0;.       
dc70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dc80: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
dc90: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
dca0: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  R_OK;.          
dcb0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
dcc0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
dcd0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
dce0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73   okToChngToIN is
dcf0: 20 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61   true if origina
dd00: 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65  l pTerm satisfie
dd10: 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e  s.    ** case 1.
dd20: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
dd30: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
dd40: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61  virtual term tha
dd50: 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65  t is .    ** pTe
dd60: 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  rm converted int
dd70: 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  o an IN operator
dd80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
dd90: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b   okToChngToIN ){
dda0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
ddb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
ddc0: 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70   A transient dup
ddd0: 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f  licate expressio
dde0: 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  n */.      ExprL
ddf0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20  ist *pList = 0; 
de00: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20    /* The RHS of 
de10: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
de20: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
de30: 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Left = 0;       
de40: 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68  /* The LHS of th
de50: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
de60: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
de70: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
de80: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e   The complete IN
de90: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   operator */..  
dea0: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
deb0: 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  >nTerm-1, pOrTer
dec0: 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30  m=pOrWc->a; i>=0
ded0: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
dee0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
def0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
df00: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d   & TERM_OR_OK)==
df10: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
df20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
df30: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
df40: 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
df50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
df60: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
df70: 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  =iCursor );.    
df80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
df90: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
dfa0: 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  n==iColumn );.  
dfb0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
dfc0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
dfd0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
dfe0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
dff0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
e000: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
e010: 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  d(pWInfo->pParse
e020: 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a  , pList, pDup);.
e030: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
e040: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
e050: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pLeft;.      }. 
e060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
e070: 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft!=0 );.      p
e080: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
e090: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
e0a0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  0);.      pNew =
e0b0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
e0c0: 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75  arse, TK_IN, pDu
e0d0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
e0e0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
e0f0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
e100: 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72          transfer
e110: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
e120: 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
e130: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
e140: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
e150: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
e160: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
e170: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
e180: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  ;.        idxNew
e190: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
e1a0: 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  sert(pWC, pNew, 
e1b0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
e1c0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
e1d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
e1e0: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
e1f0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
e200: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
e210: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  );.        pTerm
e220: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
e230: 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43  rm];.        pWC
e240: 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72  ->a[idxNew].iPar
e250: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
e260: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
e270: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
e280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
e290: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
e2a0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
e2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e2c0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
e2d0: 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a 20 63  = WO_NOOP;  /* c
e2e0: 61 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73  ase 1 trumps cas
e2f0: 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  e 2 */.    }.  }
e300: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
e310: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
e320: 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51  IMIZATION && !SQ
e330: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
e340: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  RY */../*.** The
e350: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
e360: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
e370: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
e380: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
e390: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
e3a0: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
e3b0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
e3c0: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
e3d0: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
e3e0: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
e3f0: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
e400: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
e410: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
e420: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
e430: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e440: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
e450: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
e460: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
e470: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
e480: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
e490: 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a  p> <expr>"..**.*
e4a0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e4b0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
e4c0: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
e4d0: 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59  ere both X and Y
e4e0: 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c   are.** columns,
e4f0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
e500: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  al expression is
e510: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
e520: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
e530: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
e540: 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61   "Y <op> X" is a
e550: 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52  dded to the WHER
e560: 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20  E clause and.** 
e570: 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74  analyzed separat
e580: 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ely.  The origin
e590: 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65  al term is marke
e5a0: 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49  d with TERM_COPI
e5b0: 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65  ED.** and the ne
e5c0: 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  w term is marked
e5d0: 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d   with TERM_DYNAM
e5e0: 49 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73  IC (because it's
e5f0: 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20   pExpr.** needs 
e600: 74 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68  to be freed with
e610: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
e620: 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55  ) and TERM_VIRTU
e630: 41 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a  AL (because it.*
e640: 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20  * is a commuted 
e650: 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20  copy of a prior 
e660: 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67  term.)  The orig
e670: 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43  inal term has nC
e680: 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68  hild=1.** and th
e690: 65 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61  e copy has idxPa
e6a0: 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20  rent set to the 
e6b0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69  index of the ori
e6c0: 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73  ginal term..*/.s
e6d0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
e6e0: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
e6f0: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
e700: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
e710: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
e720: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
e730: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
e740: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
e750: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
e760: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e770: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
e780: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
e790: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
e7a0: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
e7b0: 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63  Info; /* WHERE c
e7c0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
e7d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
e7e0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e800: 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62 65  * The term to be
e810: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57   analyzed */.  W
e820: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
e830: 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20 20  skSet;          
e840: 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65 20  /* Set of table 
e850: 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20  index masks */. 
e860: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e890: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
e8a0: 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
e8b0: 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20 20  prereqLeft;     
e8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 72           /* Prer
e8d0: 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68 65  equesites of the
e8e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f   pExpr->pLeft */
e8f0: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
e900: 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  qAll;           
e910: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
e920: 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a 2f  ites of pExpr */
e930: 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72 61  .  Bitmask extra
e940: 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20 20  Right = 0;      
e950: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65 70      /* Extra dep
e960: 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46  endencies on LEF
e970: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72  T JOIN */.  Expr
e980: 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20 20   *pStr1 = 0;    
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e9a0: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
e9b0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   operator */.  i
e9c0: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20  nt isComplete = 
e9d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e9e0: 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* RHS of LIKE/G
e9f0: 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77 69  LOB ends with wi
ea00: 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20  ldcard */.  int 
ea10: 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20 20  noCase = 0;     
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea30: 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69 6e  LIKE/GLOB distin
ea40: 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f 0a  guishes case */.
ea50: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20     /* Top-level 
ea80: 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70 72  operator.  pExpr
ea90: 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65 20  ->op */.  Parse 
eaa0: 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
eab0: 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20 50 61  ->pParse;  /* Pa
eac0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ead0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
eae0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
eaf0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
eb00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
eb10: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
eb20: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
eb30: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  urn;.  }.  pTerm
eb40: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
eb50: 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20  rm];.  pMaskSet 
eb60: 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
eb70: 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Set;.  pExpr = p
eb80: 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61  Term->pExpr;.  a
eb90: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
eba0: 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78 70 72  !=TK_AS && pExpr
ebb0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op!=TK_COLLATE
ebc0: 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74   );.  prereqLeft
ebd0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
ebe0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
ebf0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
ec00: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
ec10: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
ec20: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ec30: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
ec40: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
ec50: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
ec60: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
ec70: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
ec80: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
ec90: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
eca0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ecb0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
ecc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
ecd0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ece0: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
ecf0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
ed00: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
ed10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ed20: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
ed30: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
ed40: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
ed50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
ed60: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
ed70: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
ed80: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
ed90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
eda0: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
edb0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
edc0: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
edd0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
ede0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
edf0: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
ee00: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
ee10: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
ee20: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
ee30: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
ee40: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
ee50: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
ee60: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
ee70: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
ee80: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
ee90: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
eea0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
eeb0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
eec0: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
eed0: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
eee0: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
eef0: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ef00: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ef10: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
ef20: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
ef30: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
ef40: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
ef50: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20  lowedOp(op) ){. 
ef60: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
ef70: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
ef80: 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d 3e 70  Collate(pExpr->p
ef90: 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70 72 20  Left);.    Expr 
efa0: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
efb0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
efc0: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
efd0: 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73 6b 20  .    u16 opMask 
efe0: 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
eff0: 52 69 67 68 74 20 26 20 70 72 65 72 65 71 4c 65  Right & prereqLe
f000: 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20  ft)==0 ? WO_ALL 
f010: 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20  : WO_EQUIV;.    
f020: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
f030: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
f040: 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72    pTerm->leftCur
f050: 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61  sor = pLeft->iTa
f060: 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ble;.      pTerm
f070: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
f080: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
f090: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
f0a0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
f0b0: 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d  orMask(op) & opM
f0c0: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ask;.    }.    i
f0d0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
f0e0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ght->op==TK_COLU
f0f0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  MN ){.      Wher
f100: 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20  eTerm *pNew;.   
f110: 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20     Expr *pDup;. 
f120: 20 20 20 20 20 75 31 36 20 65 45 78 74 72 61 4f       u16 eExtraO
f130: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
f140: 20 45 78 74 72 61 20 62 69 74 73 20 66 6f 72 20   Extra bits for 
f150: 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pNew->eOperator 
f160: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  */.      if( pTe
f170: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
f180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
f190: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
f1a0: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
f1b0: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
f1c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
f1d0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f1e0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
f1f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
f200: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
f210: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
f220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f230: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
f240: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
f250: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
f260: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
f270: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f280: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
f290: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
f2a0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
f2b0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
f2c0: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
f2d0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
f2e0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
f2f0: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
f300: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
f310: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
f320: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
f330: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20  COPIED;.        
f340: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f350: 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26  K_EQ.         &&
f360: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f370: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
f380: 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26  Join).         &
f390: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
f3a0: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
f3b0: 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20  _Transitive).   
f3c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
f3d0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
f3e0: 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a  or |= WO_EQUIV;.
f3f0: 20 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61            eExtra
f400: 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  Op = WO_EQUIV;. 
f410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
f430: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
f440: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
f450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f460: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
f470: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
f480: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
f490: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
f4a0: 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pDup->pLeft);.  
f4b0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
f4c0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
f4d0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
f4e0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
f4f0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
f500: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
f510: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
f520: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
f530: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
f540: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
f550: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
f560: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
f570: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
f580: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
f590: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
f5a0: 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61  perator = (opera
f5b0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
f5c0: 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20  ) + eExtraOp) & 
f5d0: 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  opMask;.    }.  
f5e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f5f0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
f600: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
f610: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
f620: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
f630: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
f640: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
f650: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
f660: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
f670: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
f680: 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78  lements.  For ex
f690: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
f6a0: 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20        a BETWEEN 
f6b0: 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a  b AND c.  **.  *
f6c0: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
f6d0: 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
f6e0: 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62      (a BETWEEN b
f6f0: 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d   AND c) AND (a>=
f700: 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20  b) AND (a<=c).  
f710: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20  **.  ** The two 
f720: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64  new terms are ad
f730: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
f740: 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61   of the WhereCla
f750: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  use object..  **
f760: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61   The new terms a
f770: 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64  re "dynamic" and
f780: 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66   are children of
f790: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45   the original BE
f7a0: 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e  TWEEN.  ** term.
f7b0: 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61    That means tha
f7c0: 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  t if the BETWEEN
f7d0: 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20   term is coded, 
f7e0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
f7f0: 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20  .  ** skipped.  
f800: 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64  Or, if the child
f810: 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65  ren are satisfie
f820: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74  d by an index, t
f830: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
f840: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
f850: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
f860: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
f870: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
f880: 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  && pWC->op==TK_A
f890: 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ND ){.    ExprLi
f8a0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
f8b0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
f8c0: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
f8d0: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
f8e0: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
f8f0: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
f900: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
f910: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
f920: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
f930: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
f940: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
f950: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
f960: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
f970: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
f980: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
f990: 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  ops[i], .       
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f9c0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
f9d0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fa00: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
fa10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
fa20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e  , 0);.      idxN
fa30: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
fa40: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
fa50: 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55  Expr, TERM_VIRTU
fa60: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
fa70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fa80: 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20  ( idxNew==0 );. 
fa90: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
faa0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
fab0: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
fac0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
fad0: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
fae0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
faf0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
fb00: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
fb10: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
fb20: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fb30: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
fb40: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
fb50: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fb60: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
fb70: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
fb80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
fb90: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e  UBQUERY).  /* An
fba0: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
fbb0: 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66  t is composed of
fbc0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62   two or more sub
fbd0: 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20  terms connected 
fbe0: 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70  by.  ** an OR op
fbf0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65  erator..  */.  e
fc00: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  lse if( pExpr->o
fc10: 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20  p==TK_OR ){.    
fc20: 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d  assert( pWC->op=
fc30: 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65  =TK_AND );.    e
fc40: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
fc50: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54  (pSrc, pWC, idxT
fc60: 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  erm);.    pTerm 
fc70: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
fc80: 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  m];.  }.#endif /
fc90: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
fca0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
fcb0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fcc0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
fcd0: 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64  IZATION.  /* Add
fce0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
fcf0: 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63  reduce the searc
fd00: 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b  h space on a LIK
fd10: 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f  E or GLOB.  ** o
fd20: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20  perator..  **.  
fd30: 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72  ** A like patter
fd40: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78  n of the form "x
fd50: 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73   LIKE 'abc%'" is
fd60: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f   changed into co
fd70: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20  nstraints.  **. 
fd80: 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d   **          x>=
fd90: 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64  'abc' AND x<'abd
fda0: 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62  ' AND x LIKE 'ab
fdb0: 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  c%'.  **.  ** Th
fdc0: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
fdd0: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22   of the prefix "
fde0: 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e  abc" is incremen
fdf0: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a  ted to form the.
fe00: 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e    ** termination
fe10: 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22   condition "abd"
fe20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43  ..  */.  if( pWC
fe30: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20  ->op==TK_AND .  
fe40: 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62   && isLikeOrGlob
fe50: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
fe60: 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c  &pStr1, &isCompl
fe70: 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20  ete, &noCase).  
fe80: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  ){.    Expr *pLe
fe90: 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53  ft;       /* LHS
fea0: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
feb0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78  erator */.    Ex
fec0: 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20  pr *pStr2;      
fed0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72   /* Copy of pStr
fee0: 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f  1 - RHS of LIKE/
fef0: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
ff00: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
ff10: 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a  xpr1;.    Expr *
ff20: 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69  pNewExpr2;.    i
ff30: 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20  nt idxNew1;.    
ff40: 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20  int idxNew2;.   
ff50: 20 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e   Token sCollSeqN
ff60: 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame;  /* Name of
ff70: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
ff80: 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66  nce */..    pLef
ff90: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
ffa0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
ffb0: 20 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69      pStr2 = sqli
ffc0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ffd0: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  Str1, 0);.    if
ffe0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
fff0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20  led ){.      u8 
10000 63 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a  c, *pC;       /*
10010 20 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   Last character 
10020 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10030 20 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20   wildcard */.   
10040 20 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53     pC = (u8*)&pS
10050 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71  tr2->u.zToken[sq
10060 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53  lite3Strlen30(pS
10070 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31  tr2->u.zToken)-1
10080 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
10090 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
100a0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
100b0 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
100c0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
100d0 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
100e0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
100f0 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
10100 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
10110 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
10120 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
10130 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
10140 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
10150 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
10160 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
10170 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
10180 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
10190 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
101a0 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
101b0 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
101c0 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
101d0 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
101e0 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
101f0 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
10200 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
10210 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10220 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
10230 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
10240 30 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  0;.        c = s
10250 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
10260 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  er[c];.      }. 
10270 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31       *pC = c + 1
10280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c  ;.    }.    sCol
10290 6c 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43  lSeqName.z = noC
102a0 61 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a  ase ? "NOCASE" :
102b0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73   "BINARY";.    s
102c0 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20  CollSeqName.n = 
102d0 36 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31  6;.    pNewExpr1
102e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
102f0 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
10300 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
10310 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
10320 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20  arse, TK_GE, .  
10330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10340 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
10350 6b 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ken(pParse,pNewE
10360 78 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61  xpr1,&sCollSeqNa
10370 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
10380 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
10390 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
103a0 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
103b0 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
103c0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
103d0 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63  AMIC);.    testc
103e0 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20  ase( idxNew1==0 
103f0 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
10400 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64  ze(pSrc, pWC, id
10410 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77  xNew1);.    pNew
10420 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45  Expr2 = sqlite3E
10430 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
10440 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
10450 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr2 = sqlite3PEx
10460 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54  pr(pParse, TK_LT
10470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
10480 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
10490 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 70  teToken(pParse,p
104a0 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c 6c 53  NewExpr2,&sCollS
104b0 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
104c0 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20      pStr2, 0);. 
104d0 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65     idxNew2 = whe
104e0 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
104f0 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54  WC, pNewExpr2, T
10500 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10510 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74  _DYNAMIC);.    t
10520 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32  estcase( idxNew2
10530 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41  ==0 );.    exprA
10540 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
10550 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20  , idxNew2);.    
10560 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
10570 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66  idxTerm];.    if
10580 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  ( isComplete ){.
10590 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
105a0 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New1].iParent = 
105b0 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
105c0 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69  WC->a[idxNew2].i
105d0 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
105e0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
105f0 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d  Child = 2;.    }
10600 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
10610 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
10620 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
10630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10640 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10650 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
10660 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
10670 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
10680 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
10690 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
106a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
106b0 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
106c0 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
106d0 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
106e0 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
106f0 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
10700 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
10710 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
10720 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
10730 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
10740 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
10750 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
10760 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
10770 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
10780 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
10790 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
107a0 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
107b0 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
107c0 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
107d0 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
107e0 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
107f0 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
10800 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
10810 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
10820 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
10830 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
10840 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
10850 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45  xpr;.    prereqE
10860 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55  xpr = exprTableU
10870 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
10880 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
10890 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54  eqColumn = exprT
108a0 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
108b0 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
108c0 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20  if( (prereqExpr 
108d0 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d  & prereqColumn)=
108e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
108f0 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
10900 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
10910 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
10920 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20  , TK_MATCH, .   
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
10950 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
10960 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b   pRight, 0), 0);
10970 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
10980 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
10990 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
109a0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
109b0 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
109c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
109d0 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
109e0 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
109f0 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
10a00 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
10a10 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
10a20 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
10a30 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
10a40 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
10a50 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
10a60 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
10a70 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
10a80 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10a90 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
10aa0 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65  MATCH;.      pNe
10ab0 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  wTerm->iParent =
10ac0 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
10ad0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
10ae0 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
10af0 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
10b00 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  1;.      pTerm->
10b10 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
10b20 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e  COPIED;.      pN
10b30 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c  ewTerm->prereqAl
10b40 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  l = pTerm->prere
10b50 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  qAll;.    }.  }.
10b60 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10b70 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10b80 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
10b90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
10ba0 33 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69  3.  /* When sqli
10bb0 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
10bc0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
10bd0 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72  able an operator
10be0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72   of the.  ** for
10bf0 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  m "x IS NOT NULL
10c00 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  " can sometimes 
10c10 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72  be evaluated mor
10c20 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20  e efficiently.  
10c30 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69  ** as "x>NULL" i
10c40 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  f x is not an IN
10c50 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
10c60 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74  Y.  So construct
10c70 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20   a.  ** virtual 
10c80 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72  term of that for
10c90 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  m..  **.  ** Not
10ca0 65 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  e that the virtu
10cb0 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  al term must be 
10cc0 74 61 67 67 65 64 20 77 69 74 68 20 54 45 52 4d  tagged with TERM
10cd0 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20  _VNULL.  This.  
10ce0 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61  ** TERM_VNULL ta
10cf0 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20  g will suppress 
10d00 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
10d10 63 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ck at the beginn
10d20 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ing.  ** of the 
10d30 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74  loop.  Without t
10d40 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c  he TERM_VNULL fl
10d50 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ag, the not-null
10d60 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74   check at.  ** t
10d70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10d80 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e  loop will preven
10d90 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72  t any results fr
10da0 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  om being returne
10db0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
10dc0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
10dd0 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d  ULL.   && pExpr-
10de0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
10df0 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
10e00 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  r->pLeft->iColum
10e10 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  n>=0.   && Optim
10e20 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
10e30 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
10e40 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
10e50 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
10e60 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
10e70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
10e80 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
10e90 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
10ea0 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
10eb0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
10ec0 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10ef0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
10f00 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
10f30 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
10f40 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
10f50 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
10f60 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
10f70 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
10fa0 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
10fb0 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
10fc0 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
10fd0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
10fe0 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
10ff0 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
11000 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
11010 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
11020 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
11030 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
11040 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
11050 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
11060 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
11070 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
11080 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
11090 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
110a0 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
110b0 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
110c0 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
110d0 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
110e0 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
110f0 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
11100 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
11110 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
11120 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
11130 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
11140 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
11150 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11160 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 20 2a 2f  E_ENABLE_STAT */
11170 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f  ..  /* Prevent O
11180 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  N clause terms o
11190 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72  f a LEFT JOIN fr
111a0 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f  om being used to
111b0 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69   drive.  ** an i
111c0 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20  ndex for tables 
111d0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
111e0 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
111f0 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
11200 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74  ht |= extraRight
11210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11220 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
11230 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20 65 6e  s pList for a en
11240 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 65 73  try that matches
11250 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
11260 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78 20  umn.** of index 
11270 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  pIdx..**.** If s
11280 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uch an expressio
11290 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20  n is found, its 
112a0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e  index in pList->
112b0 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  a[] is returned.
112c0 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73   If.** no expres
112d0 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d  sion is found, -
112e0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
112f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
11300 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72  dIndexCol(.  Par
11310 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11330 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
11340 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
11350 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
11360 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
11370 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20   list to search 
11380 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66       /* Cursor f
113b0 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  or table associa
113c0 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f  ted with pIdx */
113d0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d     /* Index to m
11400 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a  atch column of *
11410 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66      /* Column of
11440 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   index to match 
11450 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
11460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
11470 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
11480 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28  l[iCol];..  for(
11490 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
114a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
114b0 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
114c0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
114d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
114e0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  r);.    if( p->o
114f0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
11500 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d    && p->iColumn=
11510 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
11520 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70 2d  iCol].     && p-
11530 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a 20  >iTable==iBase. 
11540 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c     ){.      Coll
11550 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
11560 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
11570 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f    if( ALWAYS(pCo
115a0 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  ll) && 0==sqlite
115b0 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
115c0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  zName, zColl) ){
115d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
115e0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
115f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d  .  }..  return -
11600 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
11610 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
11620 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
11630 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
11640 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
11650 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
11660 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49  dant..**.** A DI
11670 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20 72  STINCT list is r
11680 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65 20  edundant if the 
11690 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
116a0 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f 66  s some subset of
116b0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
116c0 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64 20   are unique and 
116d0 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61  non-null..*/.sta
116e0 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
116f0 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50  ctRedundant(.  P
11700 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11710 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
11720 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11730 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
11740 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  st,        /* Th
11750 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
11760 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
11770 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
11780 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11790 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
117a0 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  pDistinct       
117b0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
117c0 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  t that needs to 
117d0 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29  be DISTINCT */.)
117e0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
117f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
11800 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a    .  int iBase;.
11830 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
11840 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
11850 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c  table or sub-sel
11860 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
11870 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74  clause of.  ** t
11880 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
11890 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
118a0 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20  ossible to show 
118b0 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
118c0 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  T .  ** clause i
118d0 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
118e0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
118f0 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
11900 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54   0;.  iBase = pT
11910 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
11920 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70  rsor;.  pTab = p
11930 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
11940 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  ab;..  /* If any
11950 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
11960 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f  ons is an IPK co
11970 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42  lumn on table iB
11980 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ase, then return
11990 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74   .  ** true. Not
119a0 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c  e: The (p->iTabl
119b0 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f  e==iBase) part o
119c0 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20  f this test may 
119d0 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a  be false if the.
119e0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c    ** current SEL
119f0 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ECT is a correla
11a00 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  ted sub-query.. 
11a10 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11a20 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70  <pDistinct->nExp
11a30 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
11a40 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
11a50 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
11a60 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45  istinct->a[i].pE
11a70 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
11a80 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
11a90 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
11aa0 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
11ab0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
11ac0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
11ad0 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65  rough all indice
11ae0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s on the table, 
11af0 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f  checking each to
11b00 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73   see if it makes
11b10 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e  .  ** the DISTIN
11b20 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64  CT qualifier red
11b30 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20  undant. It does 
11b40 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  so if:.  **.  **
11b50 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20     1. The index 
11b60 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45  is itself UNIQUE
11b70 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , and.  **.  ** 
11b80 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20    2. All of the 
11b90 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
11ba0 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20  ndex are either 
11bb0 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73  part of the pDis
11bc0 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20  tinct.  **      
11bd0 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68  list, or else th
11be0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
11bf0 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f  ontains a term o
11c00 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d  f the form "col=
11c10 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  X",.  **      wh
11c20 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74  ere X is a const
11c30 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63  ant value. The c
11c40 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
11c50 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20  es of the.  **  
11c60 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61      comparison a
11c70 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65  nd select-list e
11c80 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
11c90 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
11ca0 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
11cb0 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20   **   3. All of 
11cc0 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75  those index colu
11cd0 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
11ce0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  e WHERE clause d
11cf0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20  oes not.  **    
11d00 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c    contain a "col
11d10 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75 62  =X" term are sub
11d20 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55  ject to a NOT NU
11d30 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  LL constraint.. 
11d40 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
11d50 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
11d60 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
11d70 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
11d80 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
11d90 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  None ) continue;
11da0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11db0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
11dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
11dd0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  Col = pIdx->aiCo
11de0 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
11df0 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70  f( 0==findTerm(p
11e00 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c  WC, iBase, iCol,
11e10 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f   ~(Bitmask)0, WO
11e20 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20 20  _EQ, pIdx) ){.  
11e30 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43 6f        int iIdxCo
11e40 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  l = findIndexCol
11e50 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
11e60 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78 2c  ct, iBase, pIdx,
11e70 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   i);.        if(
11e80 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70 54   iIdxCol<0 || pT
11e90 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
11ea0 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e  iColumn[i]].notN
11eb0 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
11ec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11ed0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11ee0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49   }.    if( i==pI
11ef0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
11f00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
11f10 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  ex implies that 
11f20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
11f30 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e 64  lifier is redund
11f40 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ant. */.      re
11f50 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
11f60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
11f70 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 28 61 6e  ../* .** The (an
11f80 20 61 70 70 72 6f 78 69 6d 61 74 65 29 20 73 75   approximate) su
11f90 6d 20 6f 66 20 74 77 6f 20 57 68 65 72 65 43 6f  m of two WhereCo
11fa0 73 74 73 2e 20 20 54 68 69 73 20 63 6f 6d 70 75  sts.  This compu
11fb0 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6e 6f 74  tation is.** not
11fc0 20 61 20 73 69 6d 70 6c 65 20 22 2b 22 20 6f 70   a simple "+" op
11fd0 65 72 61 74 6f 72 20 62 65 63 61 75 73 65 20 57  erator because W
11fe0 68 65 72 65 43 6f 73 74 20 69 73 20 73 74 6f 72  hereCost is stor
11ff0 65 64 20 61 73 20 61 20 6c 6f 67 61 72 69 74 68  ed as a logarith
12000 6d 69 63 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  mic.** value..**
12010 20 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72   .*/.static Wher
12020 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74 41  eCost whereCostA
12030 64 64 28 57 68 65 72 65 43 6f 73 74 20 61 2c 20  dd(WhereCost a, 
12040 57 68 65 72 65 43 6f 73 74 20 62 29 7b 0a 20 20  WhereCost b){.  
12050 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
12060 69 67 6e 65 64 20 63 68 61 72 20 78 5b 5d 20 3d  igned char x[] =
12070 20 7b 0a 20 20 20 20 20 31 30 2c 20 31 30 2c 20   {.     10, 10, 
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 20 20 20 20 20 2f 2a 20 30 2c 31 20 2a          /* 0,1 *
120a0 2f 0a 20 20 20 20 20 20 39 2c 20 39 2c 20 20 20  /.      9, 9,   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 20 20 2f 2a 20 32 2c 33 20 2a 2f         /* 2,3 */
120d0 0a 20 20 20 20 20 20 38 2c 20 38 2c 20 20 20 20  .      8, 8,    
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 2f 2a 20 34 2c 35 20 2a 2f 0a        /* 4,5 */.
12100 20 20 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 20        7, 7, 7,  
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 20 20 2f 2a 20 36 2c 37 2c 38 20 2a 2f       /* 6,7,8 */
12130 0a 20 20 20 20 20 20 36 2c 20 36 2c 20 36 2c 20  .      6, 6, 6, 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 2f 2a 20 39 2c 31 30 2c 31 31        /* 9,10,11
12160 20 2a 2f 0a 20 20 20 20 20 20 35 2c 20 35 2c 20   */.      5, 5, 
12170 35 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5,              
12180 20 20 20 20 20 20 20 20 20 2f 2a 20 31 32 2d 31           /* 12-1
12190 34 20 2a 2f 0a 20 20 20 20 20 20 34 2c 20 34 2c  4 */.      4, 4,
121a0 20 34 2c 20 34 2c 20 20 20 20 20 20 20 20 20 20   4, 4,          
121b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 35 2d            /* 15-
121c0 31 38 20 2a 2f 0a 20 20 20 20 20 20 33 2c 20 33  18 */.      3, 3
121d0 2c 20 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20  , 3, 3, 3, 3,   
121e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 39             /* 19
121f0 2d 32 34 20 2a 2f 0a 20 20 20 20 20 20 32 2c 20  -24 */.      2, 
12200 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32  2, 2, 2, 2, 2, 2
12210 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
12220 35 2d 33 31 20 2a 2f 0a 20 20 7d 3b 0a 20 20 69  5-31 */.  };.  i
12230 66 28 20 61 3e 3d 62 20 29 7b 0a 20 20 20 20 69  f( a>=b ){.    i
12240 66 28 20 61 3e 62 2b 34 39 20 29 20 72 65 74 75  f( a>b+49 ) retu
12250 72 6e 20 61 3b 0a 20 20 20 20 69 66 28 20 61 3e  rn a;.    if( a>
12260 62 2b 33 31 20 29 20 72 65 74 75 72 6e 20 61 2b  b+31 ) return a+
12270 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 2b  1;.    return a+
12280 78 5b 61 2d 62 5d 3b 0a 20 20 7d 65 6c 73 65 7b  x[a-b];.  }else{
12290 0a 20 20 20 20 69 66 28 20 62 3e 61 2b 34 39 20  .    if( b>a+49 
122a0 29 20 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20  ) return b;.    
122b0 69 66 28 20 62 3e 61 2b 33 31 20 29 20 72 65 74  if( b>a+31 ) ret
122c0 75 72 6e 20 62 2b 31 3b 0a 20 20 20 20 72 65 74  urn b+1;.    ret
122d0 75 72 6e 20 62 2b 78 5b 62 2d 61 5d 3b 0a 20 20  urn b+x[b-a];.  
122e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  }.}../*.** Conve
122f0 72 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e  rt an integer in
12300 74 6f 20 61 20 57 68 65 72 65 43 6f 73 74 2e 20  to a WhereCost. 
12310 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12320 20 63 6f 6d 70 75 74 65 20 61 0a 2a 2a 20 67 6f   compute a.** go
12330 6f 64 20 61 70 70 72 6f 78 69 6d 61 74 61 74 69  od approximatati
12340 6f 6e 20 66 6f 72 20 31 30 2a 6c 6f 67 32 28 78  on for 10*log2(x
12350 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  )..*/.static Whe
12360 72 65 43 6f 73 74 20 77 68 65 72 65 43 6f 73 74  reCost whereCost
12370 28 74 52 6f 77 63 6e 74 20 78 29 7b 0a 20 20 73  (tRowcnt x){.  s
12380 74 61 74 69 63 20 57 68 65 72 65 43 6f 73 74 20  tatic WhereCost 
12390 61 5b 5d 20 3d 20 7b 20 30 2c 20 32 2c 20 33 2c  a[] = { 0, 2, 3,
123a0 20 35 2c 20 36 2c 20 37 2c 20 38 2c 20 39 20 7d   5, 6, 7, 8, 9 }
123b0 3b 0a 20 20 57 68 65 72 65 43 6f 73 74 20 79 20  ;.  WhereCost y 
123c0 3d 20 34 30 3b 0a 20 20 69 66 28 20 78 3c 38 20  = 40;.  if( x<8 
123d0 29 7b 0a 20 20 20 20 69 66 28 20 78 3c 32 20 29  ){.    if( x<2 )
123e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
123f0 68 69 6c 65 28 20 78 3c 38 20 29 7b 20 20 79 20  hile( x<8 ){  y 
12400 2d 3d 20 31 30 3b 20 78 20 3c 3c 3d 20 31 3b 20  -= 10; x <<= 1; 
12410 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  }.  }else{.    w
12420 68 69 6c 65 28 20 78 3e 32 35 35 20 29 7b 20 79  hile( x>255 ){ y
12430 20 2b 3d 20 34 30 3b 20 78 20 3e 3e 3d 20 34 3b   += 40; x >>= 4;
12440 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 78 3e   }.    while( x>
12450 31 35 20 29 7b 20 20 79 20 2b 3d 20 31 30 3b 20  15 ){  y += 10; 
12460 78 20 3e 3e 3d 20 31 3b 20 7d 0a 20 20 7d 0a 20  x >>= 1; }.  }. 
12470 20 72 65 74 75 72 6e 20 61 5b 78 26 37 5d 20 2b   return a[x&7] +
12480 20 79 20 2d 20 31 30 3b 0a 7d 0a 0a 23 69 66 6e   y - 10;.}..#ifn
12490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
124b0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 64 6f 75  ** Convert a dou
124c0 62 6c 65 20 28 61 73 20 72 65 63 65 69 76 65 64  ble (as received
124d0 20 66 72 6f 6d 20 78 42 65 73 74 49 6e 64 65 78   from xBestIndex
124e0 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61   of a virtual ta
124f0 62 6c 65 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 57  ble).** into a W
12500 68 65 72 65 43 6f 73 74 2e 20 20 49 6e 20 6f 74  hereCost.  In ot
12510 68 65 72 20 77 6f 72 64 73 2c 20 63 6f 6d 70 75  her words, compu
12520 74 65 20 61 6e 20 61 70 70 72 6f 78 69 6d 61 74  te an approximat
12530 69 6f 6e 20 66 6f 72 0a 2a 2a 20 31 30 2a 6c 6f  ion for.** 10*lo
12540 67 32 28 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  g2(x)..*/.static
12550 20 57 68 65 72 65 43 6f 73 74 20 77 68 65 72 65   WhereCost where
12560 43 6f 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28 64  CostFromDouble(d
12570 6f 75 62 6c 65 20 78 29 7b 0a 20 20 75 36 34 20  ouble x){.  u64 
12580 61 3b 0a 20 20 57 68 65 72 65 43 6f 73 74 20 65  a;.  WhereCost e
12590 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
125a0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
125b0 6f 66 28 61 29 3d 3d 38 20 29 3b 0a 20 20 69 66  of(a)==8 );.  if
125c0 28 20 78 3c 3d 31 20 29 20 72 65 74 75 72 6e 20  ( x<=1 ) return 
125d0 30 3b 0a 20 20 69 66 28 20 78 3c 3d 32 30 30 30  0;.  if( x<=2000
125e0 30 30 30 30 30 30 20 29 20 72 65 74 75 72 6e 20  000000 ) return 
125f0 77 68 65 72 65 43 6f 73 74 28 28 74 52 6f 77 63  whereCost((tRowc
12600 6e 74 29 78 29 3b 0a 20 20 6d 65 6d 63 70 79 28  nt)x);.  memcpy(
12610 26 61 2c 20 26 78 2c 20 38 29 3b 0a 20 20 65 20  &a, &x, 8);.  e 
12620 3d 20 28 61 3e 3e 35 32 29 20 2d 20 31 30 32 32  = (a>>52) - 1022
12630 3b 0a 20 20 72 65 74 75 72 6e 20 65 2a 31 30 3b  ;.  return e*10;
12640 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12650 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12660 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
12670 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67  Estimate the log
12680 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
12690 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73  put value to bas
126a0 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  e 2..*/.static W
126b0 68 65 72 65 43 6f 73 74 20 65 73 74 4c 6f 67 28  hereCost estLog(
126c0 57 68 65 72 65 43 6f 73 74 20 4e 29 7b 0a 20 20  WhereCost N){.  
126d0 57 68 65 72 65 43 6f 73 74 20 78 20 3d 20 77 68  WhereCost x = wh
126e0 65 72 65 43 6f 73 74 28 4e 29 3b 0a 20 20 72 65  ereCost(N);.  re
126f0 74 75 72 6e 20 78 3e 33 33 20 3f 20 78 20 2d 20  turn x>33 ? x - 
12700 33 33 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  33 : 0;.}../*.**
12710 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
12720 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
12730 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
12740 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
12750 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
12760 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
12770 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
12780 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
12790 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
127a0 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
127b0 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
127c0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
127d0 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
127e0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
127f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12800 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
12810 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
12820 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
12830 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
12840 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
12850 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
12860 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
12870 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
12880 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
12890 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
128a0 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
128b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
128c0 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
128d0 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
128e0 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
128f0 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
12900 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
12910 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
12920 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
12930 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
12940 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
12950 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
12960 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
12970 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12980 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
12990 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
129a0 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
129b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
129c0 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
129d0 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
129e0 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
129f0 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
12a00 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
12a10 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
12a20 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
12a30 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
12a40 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
12a50 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
12a60 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
12a70 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
12a80 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
12a90 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
12aa0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
12ab0 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
12ac0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
12ad0 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
12ae0 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
12af0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
12b00 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
12b10 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
12b20 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
12b30 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12b40 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
12b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
12b60 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
12b70 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
12b80 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
12b90 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
12ba0 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
12bb0 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
12bc0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
12bd0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
12be0 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
12bf0 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
12c00 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12c10 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
12c20 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
12c30 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65  matedCost);.}.#e
12c40 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43  lse.#define TRAC
12c50 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a  E_IDX_INPUTS(A).
12c60 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44  #define TRACE_ID
12c70 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e  X_OUTPUTS(A).#en
12c80 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
12c90 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
12ca0 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52  IC_INDEX./*.** R
12cb0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12cc0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
12cd0 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20  erm pTerm is of 
12ce0 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a  a form where it.
12cf0 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64  ** could be used
12d00 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74   with an index t
12d10 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61  o access pSrc, a
12d20 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f  ssuming an appro
12d30 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20  priate.** index 
12d40 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  existed..*/.stat
12d50 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72  ic int termCanDr
12d60 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  iveIndex(.  Wher
12d70 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
12d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
12d90 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12da0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74  to check */.  st
12db0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12dc0 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
12dd0 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79  Table we are try
12de0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f  ing to access */
12df0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
12e00 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ady             
12e10 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f    /* Tables in o
12e20 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68  uter loops of th
12e30 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63  e join */.){.  c
12e40 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70  har aff;.  if( p
12e50 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
12e60 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
12e70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12e80 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
12e90 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20  tor & WO_EQ)==0 
12ea0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12eb0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
12ec0 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
12ed0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
12ee0 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e  .  if( pTerm->u.
12ef0 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  leftColumn<0 ) r
12f00 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d  eturn 0;.  aff =
12f10 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
12f20 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  l[pTerm->u.leftC
12f30 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
12f40 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49  .  if( !sqlite3I
12f50 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
12f60 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66  Term->pExpr, aff
12f70 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
12f80 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
12f90 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
12fa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
12fb0 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
12fc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12fd0 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
12fe0 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
12ff0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
13000 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
13010 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
13020 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
13030 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
13040 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
13050 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
13060 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
13070 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
13080 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
13090 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
130a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
130b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
130c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
130d0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
130e0 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
130f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
13100 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
13110 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
13120 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
13130 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
13140 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
13150 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
13160 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
13170 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
13180 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
13190 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
131a0 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
131b0 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
131c0 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
131d0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
131e0 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
131f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13200 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
13210 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
13220 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
13230 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
13240 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
13250 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
13260 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
13270 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
13280 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
13290 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
132a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65 6d    /* Byte of mem
132d0 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20 70  ory needed for p
132e0 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  Idx */.  Index *
132f0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
13300 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
13310 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
13320 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
13330 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13350 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
13360 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
13370 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
13380 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
13390 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
133a0 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
133b0 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
133c0 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
133d0 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
133e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
133f0 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
13400 64 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  d */.  KeyInfo *
13410 70 4b 65 79 69 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyinfo;       
13420 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
13430 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6e  ation for the in
13440 64 65 78 20 2a 2f 20 20 20 0a 20 20 69 6e 74 20  dex */   .  int 
13450 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
13460 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
13470 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c  f the index fill
13480 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
13490 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
134a0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
134b0 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  er holding an in
134c0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
134d0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
134e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
134f0 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  olumn counter */
13500 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13520 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
13530 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c  /.  int mxBitCol
13540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13550 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d  /* Maximum colum
13560 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73  n in pSrc->colUs
13570 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ed */.  CollSeq 
13580 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
13590 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
135a0 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20   sequence to on 
135b0 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68  a column */.  Wh
135c0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20  ereLoop *pLoop; 
135d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
135e0 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a   Loop object */.
135f0 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
13600 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
13610 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
13620 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
13630 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
13640 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
13650 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
13660 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
13670 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65  lumns */.  u8 se
13680 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20  ntWarning = 0;  
13690 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
136a0 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73  f a warnning has
136b0 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a   been issued */.
136c0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
136d0 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
136e0 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
136f0 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
13700 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
13710 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
13720 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
13730 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
13740 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
13750 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
13760 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
13770 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
13780 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
13790 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
137a0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
137b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  r of columns tha
137c0 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20  t will be added 
137d0 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  to the index.  *
137e0 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61  * and used to ma
137f0 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  tch WHERE clause
13800 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
13810 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20    nColumn = 0;. 
13820 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e   pTable = pSrc->
13830 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d  pTab;.  pWCEnd =
13840 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54   &pWC->a[pWC->nT
13850 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  erm];.  pLoop = 
13860 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
13870 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
13880 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
13890 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
138a0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
138b0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
138c0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
138d0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
138e0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
138f0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
13900 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
13910 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
13920 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
13930 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
13940 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
13950 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
13960 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13970 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
13980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65  );.      if( !se
13990 6e 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20  ntWarning ){.   
139a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
139b0 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  (SQLITE_WARNING_
139c0 41 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20  AUTOINDEX,.     
139d0 20 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69         "automati
139e0 63 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73  c index on %s(%s
139f0 29 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  )", pTable->zNam
13a00 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e,.            p
13a10 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
13a20 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
13a30 20 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20    sentWarning = 
13a40 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
13a50 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20   if( (idxCols & 
13a60 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  cMask)==0 ){.   
13a70 20 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f       if( whereLo
13a80 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d  opResize(pParse-
13a90 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 43 6f 6c  >db, pLoop, nCol
13aa0 75 6d 6e 2b 31 29 20 29 20 72 65 74 75 72 6e 3b  umn+1) ) return;
13ab0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
13ac0 61 4c 54 65 72 6d 5b 6e 43 6f 6c 75 6d 6e 2b 2b  aLTerm[nColumn++
13ad0 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
13ae0 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
13af0 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
13b00 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
13b10 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20   nColumn>0 );.  
13b20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
13b30 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  Eq = pLoop->nLTe
13b40 72 6d 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  rm = nColumn;.  
13b50 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
13b60 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
13b70 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   | WHERE_IDX_ONL
13b80 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
13b90 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
13ba0 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41         | WHERE_A
13bb0 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a  UTO_INDEX;..  /*
13bc0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
13bd0 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  r of additional 
13be0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74  columns needed t
13bf0 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20  o create a.  ** 
13c00 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
13c10 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64   A "covering ind
13c20 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ex" is an index 
13c30 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
13c40 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  l.  ** columns t
13c50 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62  hat are needed b
13c60 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69  y the query.  Wi
13c70 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  th a covering in
13c80 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72  dex, the.  ** or
13c90 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76  iginal table nev
13ca0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  er needs to be a
13cb0 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61  ccessed.  Automa
13cc0 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74  tic indices must
13cd0 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72  .  ** be a cover
13ce0 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73  ing index becaus
13cf0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
13d00 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20   not be updated 
13d10 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  if the.  ** orig
13d20 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67  inal table chang
13d30 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  es and the index
13d40 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f   and table canno
13d50 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20  t both be used. 
13d60 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f   ** if they go o
13d70 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f  ut of sync..  */
13d80 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70  .  extraCols = p
13d90 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28  Src->colUsed & (
13da0 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42  ~idxCols | MASKB
13db0 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78  IT(BMS-1));.  mx
13dc0 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65  BitCol = (pTable
13dd0 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29  ->nCol >= BMS-1)
13de0 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c   ? BMS-1 : pTabl
13df0 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63  e->nCol;.  testc
13e00 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ase( pTable->nCo
13e10 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65  l==BMS-1 );.  te
13e20 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e  stcase( pTable->
13e30 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  nCol==BMS-2 );. 
13e40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
13e50 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
13e60 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
13e70 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 43 6f  MASKBIT(i) ) nCo
13e80 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  lumn++;.  }.  if
13e90 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
13ea0 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
13eb0 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20   ){.    nColumn 
13ec0 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  += pTable->nCol 
13ed0 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20  - BMS + 1;.  }. 
13ee0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
13ef0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
13f00 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f  EQ | WHERE_IDX_O
13f10 4e 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  NLY;..  /* Const
13f20 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
13f30 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
13f40 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
13f50 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
13f60 28 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65  (Index);.  nByte
13f70 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65   += nColumn*size
13f80 6f 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20  of(int);     /* 
13f90 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a  Index.aiColumn *
13fa0 2f 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f  /.  nByte += nCo
13fb0 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72  lumn*sizeof(char
13fc0 2a 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  *);   /* Index.a
13fd0 7a 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65  zColl */.  nByte
13fe0 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20   += nColumn;    
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14000 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
14010 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
14020 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
14030 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79  (pParse->db, nBy
14040 74 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  te);.  if( pIdx=
14050 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
14060 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
14070 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70  ndex = pIdx;.  p
14080 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
14090 68 61 72 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a  har**)&pIdx[1];.
140a0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
140b0 20 3d 20 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e   = (int*)&pIdx->
140c0 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b  azColl[nColumn];
140d0 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
140e0 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 64 78  der = (u8*)&pIdx
140f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75  ->aiColumn[nColu
14100 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61  mn];.  pIdx->zNa
14110 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78  me = "auto-index
14120 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ";.  pIdx->nColu
14130 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  mn = nColumn;.  
14140 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  pIdx->pTable = p
14150 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a  Table;.  n = 0;.
14160 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20    idxCols = 0;. 
14170 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
14180 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
14190 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
141a0 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49  f( termCanDriveI
141b0 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63  ndex(pTerm, pSrc
141c0 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20  , notReady) ){. 
141d0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
141e0 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
141f0 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61  umn;.      Bitma
14200 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e  sk cMask = iCol>
14210 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42  =BMS ? MASKBIT(B
14220 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28  MS-1) : MASKBIT(
14230 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73  iCol);.      tes
14240 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
14250 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
14260 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
14270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
14280 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
14290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
142a0 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
142b0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64  Expr;.        id
142c0 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a  xCols |= cMask;.
142d0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
142e0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72  Column[n] = pTer
142f0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
14300 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
14310 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
14320 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
14330 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
14340 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
14350 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
14360 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70 43  l[n] = ALWAYS(pC
14370 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  oll) ? pColl->zN
14380 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a  ame : "BINARY";.
14390 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
143a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
143b0 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d   assert( (u32)n=
143c0 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
143d0 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  nEq );..  /* Add
143e0 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
143f0 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61  mns needed to ma
14400 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  ke the automatic
14410 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a   index into.  **
14420 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
14430 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  x */.  for(i=0; 
14440 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
14450 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
14460 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
14470 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
14480 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b  aiColumn[n] = i;
14490 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43  .      pIdx->azC
144a0 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59  oll[n] = "BINARY
144b0 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ";.      n++;.  
144c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53    }.  }.  if( pS
144d0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
144e0 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
144f0 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b      for(i=BMS-1;
14500 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
14510 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64   i++){.      pId
14520 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
14530 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   i;.      pIdx->
14540 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e  azColl[n] = "BIN
14550 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b  ARY";.      n++;
14560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
14570 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20  ert( n==nColumn 
14580 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
14590 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
145a0 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e 66  dex */.  pKeyinf
145b0 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  o = sqlite3Index
145c0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
145d0 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74 28  pIdx);.  assert(
145e0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
145f0 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  >=0 );.  pLevel-
14600 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
14610 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
14620 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14630 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
14640 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
14650 43 75 72 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20  Cur, nColumn+1, 
14660 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
14670 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
14680 65 79 69 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyinfo, P4_KEYIN
14690 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56  FO_HANDOFF);.  V
146a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
146b0 66 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d  for %s", pTable-
146c0 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20  >zName));..  /* 
146d0 46 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74  Fill the automat
146e0 69 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f  ic index with co
146f0 6e 74 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54  ntent */.  addrT
14700 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
14710 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
14720 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ind, pLevel->iTa
14730 62 43 75 72 29 3b 0a 20 20 72 65 67 52 65 63 6f  bCur);.  regReco
14740 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
14750 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
14760 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
14770 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
14780 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e  , pIdx, pLevel->
14790 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63 6f  iTabCur, regReco
147a0 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  rd, 1, 0);.  sql
147b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
147c0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
147d0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c  pLevel->iIdxCur,
147e0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
147f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14800 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
14810 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
14820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14830 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65  (v, OP_Next, pLe
14840 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64  vel->iTabCur, ad
14850 64 72 54 6f 70 2b 31 29 3b 0a 20 20 73 71 6c 69  drTop+1);.  sqli
14860 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
14870 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  v, SQLITE_STMTST
14880 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b  ATUS_AUTOINDEX);
14890 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
148a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
148b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  p);.  sqlite3Rel
148c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
148d0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
148e0 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72    .  /* Jump her
148f0 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20  e when skipping 
14900 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
14910 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
14920 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14930 64 64 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64  ddrInit);.}.#end
14940 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14950 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
14960 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  X */..#ifndef SQ
14970 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14980 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c  LTABLE./*.** All
14990 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61  ocate and popula
149a0 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  te an sqlite3_in
149b0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
149c0 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  re. It is the .*
149d0 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
149e0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
149f0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
14a00 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74 75  ease the structu
14a10 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67  re.** by passing
14a20 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   the pointer ret
14a30 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
14a40 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65  nction to sqlite
14a50 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
14a60 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  tic sqlite3_inde
14a70 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65  x_info *allocate
14a80 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72  IndexInfo(.  Par
14a90 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68  se *pParse,.  Wh
14aa0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a  ereClause *pWC,.
14ab0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14ac0 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
14ad0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
14ae0 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  y.){.  int i, j;
14af0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
14b00 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
14b10 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
14b20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
14b30 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14b40 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
14b50 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
14b60 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
14b70 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
14b80 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
14b90 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
14ba0 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73  nt nOrderBy;.  s
14bb0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14bc0 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20  o *pIdxInfo;..  
14bd0 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  /* Count the num
14be0 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20  ber of possible 
14bf0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
14c00 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69  straints referri
14c10 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ng.  ** to this 
14c20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
14c30 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30  .  for(i=nTerm=0
14c40 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  , pTerm=pWC->a; 
14c50 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b  i<pWC->nTerm; i+
14c60 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
14c70 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
14c80 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e  Cursor != pSrc->
14c90 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e  iCursor ) contin
14ca0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
14cb0 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
14cc0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
14cd0 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
14ce0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14cf0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14d00 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
14d10 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
14d20 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
14d30 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  LL );.    if( pT
14d40 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14d50 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63   (WO_ISNULL) ) c
14d60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
14d70 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
14d80 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63  & TERM_VNULL ) c
14d90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65  ontinue;.    nTe
14da0 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rm++;.  }..  /* 
14db0 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  If the ORDER BY 
14dc0 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  clause contains 
14dd0 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  only columns in 
14de0 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a  the current .  *
14df0 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
14e00 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
14e10 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
14e20 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a  erBy part of.  *
14e30 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
14e40 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
14e50 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65  re..  */.  nOrde
14e60 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rBy = 0;.  if( p
14e70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
14e80 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d  nt n = pOrderBy-
14e90 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
14ea0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
14eb0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
14ec0 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
14ed0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14ee0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
14ef0 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70  K_COLUMN || pExp
14f00 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d  r->iTable!=pSrc-
14f10 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  >iCursor ) break
14f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14f30 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72  i==n){.      nOr
14f40 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d  derBy = n;.    }
14f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
14f60 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
14f70 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
14f80 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
14f90 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
14fa0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
14fb0 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
14fc0 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
14ff0 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
15000 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
15010 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
15030 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
15040 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
15050 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
15060 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15070 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15080 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
15090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
150a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
150b0 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63 74  alize the struct
150c0 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ure.  The sqlite
150d0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
150e0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
150f0 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73    ** many fields
15100 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72   that are declar
15110 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72  ed "const" to pr
15120 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78  event xBestIndex
15130 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67   from.  ** chang
15140 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61  ing them.  We ha
15150 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75  ve to do some fu
15160 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f  nky casting in o
15170 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69  rder to.  ** ini
15180 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
15190 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  elds..  */.  pId
151a0 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20  xCons = (struct 
151b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
151c0 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49  nstraint*)&pIdxI
151d0 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72  nfo[1];.  pIdxOr
151e0 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20  derBy = (struct 
151f0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
15200 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73  derby*)&pIdxCons
15210 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67  [nTerm];.  pUsag
15220 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  e = (struct sqli
15230 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
15240 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64  aint_usage*)&pId
15250 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42  xOrderBy[nOrderB
15260 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49  y];.  *(int*)&pI
15270 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
15280 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a  int = nTerm;.  *
15290 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d  (int*)&pIdxInfo-
152a0 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
152b0 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
152c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
152d0 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
152e0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
152f0 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20  nt = pIdxCons;. 
15300 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
15310 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
15320 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
15330 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
15340 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20  rBy;.  *(struct 
15350 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
15360 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a  nstraint_usage**
15370 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
15380 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20  straintUsage =. 
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72    pUsage;..  for
153e0 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57  (i=j=0, pTerm=pW
153f0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
15400 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
15410 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20  ){.    u8 op;.  
15420 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
15430 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
15440 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
15450 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
15460 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54   IsPowerOfTwo(pT
15470 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
15480 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20   ~WO_EQUIV) );. 
15490 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
154a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
154b0 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73  WO_IN );.    tes
154c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
154d0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
154e0 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
154f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15500 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20  & (WO_ISNULL) ) 
15510 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15520 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
15530 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
15540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49  continue;.    pI
15550 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d  dxCons[j].iColum
15560 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  n = pTerm->u.lef
15570 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  tColumn;.    pId
15580 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66  xCons[j].iTermOf
15590 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70  fset = i;.    op
155a0 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f   = (u8)pTerm->eO
155b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
155c0 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f  ;.    if( op==WO
155d0 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51  _IN ) op = WO_EQ
155e0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
155f0 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20 20 2f  ].op = op;.    /
15600 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
15610 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
15620 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
15630 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
15640 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
15650 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
15660 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
15670 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
15680 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
15690 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
156a0 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
156b0 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
156c0 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
156d0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
156e0 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
156f0 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
15700 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
15710 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
15720 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
15730 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
15740 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
15750 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
15760 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
15770 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
15780 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
15790 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
157a0 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
157b0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
157c0 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
157d0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
157e0 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
157f0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15800 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45  or & (WO_IN|WO_E
15810 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
15820 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54  _GT|WO_GE|WO_MAT
15830 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b 0a  CH) );.    j++;.
15840 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
15850 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
15860 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
15870 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
15880 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 64  ].pExpr;.    pId
15890 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  xOrderBy[i].iCol
158a0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
158b0 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f 72  lumn;.    pIdxOr
158c0 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20  derBy[i].desc = 
158d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
158e0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
158f0 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f   return pIdxInfo
15900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
15910 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65  able object refe
15920 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73 20  rence passed as 
15930 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
15940 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
15950 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70  tion.** must rep
15960 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c  resent a virtual
15970 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e   table. This fun
15980 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68  ction invokes th
15990 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a  e xBestIndex().*
159a0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
159b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69  virtual table wi
159c0 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  th the sqlite3_i
159d0 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74  ndex_info object
159e0 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69   that.** comes i
159f0 6e 20 61 73 20 74 68 65 20 33 72 64 20 61 72 67  n as the 3rd arg
15a00 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
15a10 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
15a20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
15a30 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
15a40 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
15a50 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
15a60 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
15a70 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
15a80 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
15a90 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
15aa0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
15ab0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
15ac0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
15ad0 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
15ae0 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
15af0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
15b00 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
15b10 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
15b20 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
15b30 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
15b40 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
15b50 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
15b60 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
15b70 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
15b80 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
15b90 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
15ba0 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
15bb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15bc0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
15bd0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15be0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
15bf0 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
15c00 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
15c10 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
15c20 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
15c30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52  .  int rc;..  TR
15c40 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70  ACE_IDX_INPUTS(p
15c50 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
15c60 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49  >pModule->xBestI
15c70 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a  ndex(pVtab, p);.
15c80 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50    TRACE_IDX_OUTP
15c90 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72  UTS(p);..  if( r
15ca0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15cb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15cc0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
15cd0 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61    pParse->db->ma
15ce0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
15cf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
15d00 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
15d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15d20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15d30 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
15d40 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
15d50 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
15d60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15d70 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
15d80 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
15d90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
15da0 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
15db0 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
15dc0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  Msg = 0;..  for(
15dd0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
15de0 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
15df0 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73 74 72   if( !p->aConstr
15e00 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 20 26  aint[i].usable &
15e10 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  & p->aConstraint
15e20 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
15e30 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ex>0 ){.      sq
15e40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15e50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
15e60 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42 65 73   "table %s: xBes
15e70 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65 64 20  tIndex returned 
15e80 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22  an invalid plan"
15e90 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
15ea0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15eb0 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
15ec0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
15ed0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15ee0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
15ef0 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c   */...#ifdef SQL
15f00 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
15f10 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
15f20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
15f30 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
15f40 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
15f50 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
15f60 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
15f70 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
15f80 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
15f90 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
15fa0 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
15fb0 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61  ws less than pVa
15fc0 6c 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  l.**    aStat[1]
15fd0 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
15fe0 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
15ff0 74 6f 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65  to pVal.**.** Re
16000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16010 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
16020 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
16030 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
16040 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16050 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16060 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
16070 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16090 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
160a0 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
160b0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
160c0 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
160d0 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
160e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e  er */.  int roun
160f0 64 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  dUp,            
16100 20 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20      /* Round up 
16110 69 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20  if true.  Round 
16120 64 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f  down if false */
16130 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61  .  tRowcnt *aSta
16140 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
16150 2a 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69  * OUT: stats wri
16160 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
16170 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 49    tRowcnt n;.  I
16180 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d  ndexSample *aSam
16190 70 6c 65 3b 0a 20 20 69 6e 74 20 69 2c 20 65 54  ple;.  int i, eT
161a0 79 70 65 3b 0a 20 20 69 6e 74 20 69 73 45 71 20  ype;.  int isEq 
161b0 3d 20 30 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  = 0;.  i64 v;.  
161c0 64 6f 75 62 6c 65 20 72 2c 20 72 53 3b 0a 0a 20  double r, rS;.. 
161d0 20 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70   assert( roundUp
161e0 3d 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d  ==0 || roundUp==
161f0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
16200 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29  Idx->nSample>0 )
16210 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20  ;.  if( pVal==0 
16220 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16230 45 52 52 4f 52 3b 0a 20 20 6e 20 3d 20 70 49 64  ERROR;.  n = pId
16240 78 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a  x->aiRowEst[0];.
16250 20 20 61 53 61 6d 70 6c 65 20 3d 20 70 49 64 78    aSample = pIdx
16260 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20 65 54 79  ->aSample;.  eTy
16270 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
16280 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a  ue_type(pVal);..
16290 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
162a0 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
162b0 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76     v = sqlite3_v
162c0 61 6c 75 65 5f 69 6e 74 36 34 28 70 56 61 6c 29  alue_int64(pVal)
162d0 3b 0a 20 20 20 20 72 20 3d 20 28 69 36 34 29 76  ;.    r = (i64)v
162e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
162f0 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3b 20  <pIdx->nSample; 
16300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
16310 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16320 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20  ==SQLITE_NULL ) 
16330 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16340 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  if( aSample[i].e
16350 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58  Type>=SQLITE_TEX
16360 54 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  T ) break;.     
16370 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16380 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
16390 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
163a0 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
163b0 75 2e 69 3e 3d 76 20 29 7b 0a 20 20 20 20 20 20  u.i>=v ){.      
163c0 20 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70      isEq = aSamp
163d0 6c 65 5b 69 5d 2e 75 2e 69 3d 3d 76 3b 0a 20 20  le[i].u.i==v;.  
163e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
163f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
16410 73 65 72 74 28 20 61 53 61 6d 70 6c 65 5b 69 5d  sert( aSample[i]
16420 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46  .eType==SQLITE_F
16430 4c 4f 41 54 20 29 3b 0a 20 20 20 20 20 20 20 20  LOAT );.        
16440 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  if( aSample[i].u
16450 2e 72 3e 3d 72 20 29 7b 0a 20 20 20 20 20 20 20  .r>=r ){.       
16460 20 20 20 69 73 45 71 20 3d 20 61 53 61 6d 70 6c     isEq = aSampl
16470 65 5b 69 5d 2e 75 2e 72 3d 3d 72 3b 0a 20 20 20  e[i].u.r==r;.   
16480 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
164a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
164b0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
164c0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 72 20 3d  FLOAT ){.    r =
164d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
164e0 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
164f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
16500 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
16510 0a 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70  .      if( aSamp
16520 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16530 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  ITE_NULL ) conti
16540 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61  nue;.      if( a
16550 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e  Sample[i].eType>
16560 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 20 62  =SQLITE_TEXT ) b
16570 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
16580 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65  aSample[i].eType
16590 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
165a0 7b 0a 20 20 20 20 20 20 20 20 72 53 20 3d 20 61  {.        rS = a
165b0 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3b 0a 20  Sample[i].u.r;. 
165c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
165d0 20 20 20 20 72 53 20 3d 20 61 53 61 6d 70 6c 65      rS = aSample
165e0 5b 69 5d 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d  [i].u.i;.      }
165f0 0a 20 20 20 20 20 20 69 66 28 20 72 53 3e 3d 72  .      if( rS>=r
16600 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 45 71   ){.        isEq
16610 20 3d 20 72 53 3d 3d 72 3b 0a 20 20 20 20 20 20   = rS==r;.      
16620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16630 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16640 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
16650 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d  _NULL ){.    i =
16660 20 30 3b 0a 20 20 20 20 69 66 28 20 61 53 61 6d   0;.    if( aSam
16670 70 6c 65 5b 30 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[0].eType==SQ
16680 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 69 73 45 71  LITE_NULL ) isEq
16690 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
166a0 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65     assert( eType
166b0 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c  ==SQLITE_TEXT ||
166c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42   eType==SQLITE_B
166d0 4c 4f 42 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  LOB );.    for(i
166e0 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  =0; i<pIdx->nSam
166f0 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ple; i++){.     
16700 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16710 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45  eType==SQLITE_TE
16720 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
16730 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42  .eType==SQLITE_B
16740 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 20 20 62  LOB ){.        b
16750 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16760 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 70 49    }.    if( i<pI
16770 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 20 20  dx->nSample ){  
16780 20 20 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74      .      sqlit
16790 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
167a0 3e 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  >db;.      CollS
167b0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
167c0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20   const u8 *z;.  
167d0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53      if( eType==S
167e0 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20  QLITE_BLOB ){.  
167f0 20 20 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74        z = (const
16800 20 75 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61   u8 *)sqlite3_va
16810 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a  lue_blob(pVal);.
16820 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
16830 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
16840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16850 43 6f 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Coll->enc==SQLIT
16860 45 5f 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20  E_UTF8 );.      
16870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
16880 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
16890 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
168a0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
168b0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
168c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
168d0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
168e0 75 65 6e 63 65 20 77 61 73 20 75 6e 61 76 61 69  uence was unavai
168f0 6c 61 62 6c 65 2c 20 77 65 20 73 68 6f 75 6c 64  lable, we should
16900 20 68 61 76 65 20 66 61 69 6c 65 64 0a 20 20 20   have failed.   
16910 20 20 20 20 20 2a 2a 20 6c 6f 6e 67 20 61 67 6f       ** long ago
16920 20 61 6e 64 20 6e 65 76 65 72 20 72 65 61 63 68   and never reach
16930 65 64 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 20  ed this point.  
16940 42 75 74 20 77 65 27 6c 6c 20 63 68 65 63 6b 20  But we'll check 
16950 6a 75 73 74 20 74 6f 0a 20 20 20 20 20 20 20 20  just to.        
16960 2a 2a 20 62 65 20 64 6f 75 62 6c 79 20 73 75 72  ** be doubly sur
16970 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  e. */.        if
16980 28 20 4e 45 56 45 52 28 70 43 6f 6c 6c 3d 3d 30  ( NEVER(pColl==0
16990 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
169a0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
169b0 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a   z = (const u8 *
169c0 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78  )sqlite3ValueTex
169d0 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  t(pVal, pColl->e
169e0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nc);.        if(
169f0 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20   !z ){.         
16a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16a10 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
16a20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16a30 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43  z && pColl && pC
16a40 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20  oll->xCmp );.   
16a50 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73     }.      n = s
16a60 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73  qlite3ValueBytes
16a70 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
16a80 63 29 3b 0a 20 20 0a 20 20 20 20 20 20 66 6f 72  c);.  .      for
16a90 28 3b 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  (; i<pIdx->nSamp
16aa0 6c 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  le; i++){.      
16ab0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
16ac0 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70 65   int eSampletype
16ad0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54   = aSample[i].eT
16ae0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ype;.        if(
16af0 20 65 53 61 6d 70 6c 65 74 79 70 65 3c 65 54 79   eSampletype<eTy
16b00 70 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pe ) continue;. 
16b10 20 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70         if( eSamp
16b20 6c 65 74 79 70 65 21 3d 65 54 79 70 65 20 29 20  letype!=eType ) 
16b30 62 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53  break;.#ifndef S
16b40 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
16b60 6c 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f  ll->enc!=SQLITE_
16b70 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20  UTF8 ){.        
16b80 20 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20    int nSample;. 
16b90 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
16ba0 53 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33  Sample = sqlite3
16bb0 55 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20  Utf8to16(.      
16bc0 20 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c          db, pCol
16bd0 6c 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b  l->enc, aSample[
16be0 69 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b  i].u.z, aSample[
16bf0 69 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70  i].nByte, &nSamp
16c00 6c 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  le.          );.
16c10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
16c20 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20  Sample ){.      
16c30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
16c40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
16c50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
16c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16c70 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
16c80 20 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f           c = pCo
16c90 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
16ca0 70 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20  pUser, nSample, 
16cb0 7a 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a  zSample, n, z);.
16cc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16cd0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d  3DbFree(db, zSam
16ce0 70 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ple);.        }e
16cf0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
16d00 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63     {.          c
16d10 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
16d20 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61  Coll->pUser, aSa
16d30 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61  mple[i].nByte, a
16d40 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e  Sample[i].u.z, n
16d50 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , z);.        }.
16d60 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30          if( c>=0
16d70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
16d80 28 20 63 3d 3d 30 20 29 20 69 73 45 71 20 3d 20  ( c==0 ) isEq = 
16d90 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
16da0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16db0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16dc0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
16dd0 69 6e 74 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 20  int, aSample[i] 
16de0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d  is the first sam
16df0 70 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ple that is grea
16e00 74 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ter than.  ** or
16e10 20 65 71 75 61 6c 20 74 6f 20 70 56 61 6c 2e 20   equal to pVal. 
16e20 20 4f 72 20 69 66 20 69 3d 3d 70 49 64 78 2d 3e   Or if i==pIdx->
16e30 6e 53 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 6c  nSample, then al
16e40 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20 6c 65  l samples are le
16e50 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 70 56 61  ss.  ** than pVa
16e60 6c 2e 20 20 49 66 20 61 53 61 6d 70 6c 65 5b 69  l.  If aSample[i
16e70 5d 3d 3d 70 56 61 6c 2c 20 74 68 65 6e 20 69 73  ]==pVal, then is
16e80 45 71 3d 3d 31 2e 0a 20 20 2a 2f 0a 20 20 69 66  Eq==1..  */.  if
16e90 28 20 69 73 45 71 20 29 7b 0a 20 20 20 20 61 73  ( isEq ){.    as
16ea0 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53  sert( i<pIdx->nS
16eb0 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 61 53 74  ample );.    aSt
16ec0 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
16ed0 69 5d 2e 6e 4c 74 3b 0a 20 20 20 20 61 53 74 61  i].nLt;.    aSta
16ee0 74 5b 31 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69  t[1] = aSample[i
16ef0 5d 2e 6e 45 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ].nEq;.  }else{.
16f00 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
16f10 65 72 2c 20 69 55 70 70 65 72 2c 20 69 47 61 70  er, iUpper, iGap
16f20 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29  ;.    if( i==0 )
16f30 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d  {.      iLower =
16f40 20 30 3b 0a 20 20 20 20 20 20 69 55 70 70 65 72   0;.      iUpper
16f50 20 3d 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 6e 4c   = aSample[0].nL
16f60 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
16f70 20 20 20 20 69 55 70 70 65 72 20 3d 20 69 3e 3d      iUpper = i>=
16f80 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 3f 20  pIdx->nSample ? 
16f90 6e 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e  n : aSample[i].n
16fa0 4c 74 3b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72  Lt;.      iLower
16fb0 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e   = aSample[i-1].
16fc0 6e 45 71 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d  nEq + aSample[i-
16fd0 31 5d 2e 6e 4c 74 3b 0a 20 20 20 20 7d 0a 20 20  1].nLt;.    }.  
16fe0 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
16ff0 78 2d 3e 61 76 67 45 71 3b 0a 20 20 20 20 69 66  x->avgEq;.    if
17000 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72  ( iLower>=iUpper
17010 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d   ){.      iGap =
17020 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
17030 20 20 20 20 20 69 47 61 70 20 3d 20 69 55 70 70       iGap = iUpp
17040 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20 20  er - iLower;.   
17050 20 7d 0a 20 20 20 20 69 66 28 20 72 6f 75 6e 64   }.    if( round
17060 55 70 20 29 7b 0a 20 20 20 20 20 20 69 47 61 70  Up ){.      iGap
17070 20 3d 20 28 69 47 61 70 2a 32 29 2f 33 3b 0a 20   = (iGap*2)/3;. 
17080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17090 69 47 61 70 20 3d 20 69 47 61 70 2f 33 3b 0a 20  iGap = iGap/3;. 
170a0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 30     }.    aStat[0
170b0 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20 69 47 61  ] = iLower + iGa
170c0 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
170d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
170e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
170f0 41 42 4c 45 5f 53 54 41 54 33 20 2a 2f 0a 0a 2f  ABLE_STAT3 */../
17100 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69  *.** If expressi
17110 6f 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65  on pExpr represe
17120 6e 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61  nts a literal va
17130 6c 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  lue, set *pp to 
17140 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73  point to.** an s
17150 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
17160 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
17170 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  g the same value
17180 2c 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a  , with affinity.
17190 2a 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ** aff applied t
171a0 6f 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74  o it, before ret
171b0 75 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68  urning. It is th
171c0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
171d0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c   of the .** call
171e0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
171f0 20 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74   release this st
17200 72 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69  ructure by passi
17210 6e 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c  ng it to .** sql
17220 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
17230 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
17240 72 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61  rrent parse is a
17250 20 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69   recompile (sqli
17260 74 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20  te3Reprepare()) 
17270 61 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20  and pExpr.** is 
17280 61 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  an SQL variable 
17290 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
172a0 61 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61  as a non-NULL va
172b0 6c 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c  lue bound to it,
172c0 0a 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71  .** create an sq
172d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
172e0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
172f0 20 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61   this value, aga
17300 69 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e  in with.** affin
17310 69 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20  ity aff applied 
17320 74 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a  to it, instead..
17330 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72  **.** If neither
17340 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70   of the above ap
17350 70 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ply, set *pp to 
17360 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
17370 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
17380 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
17390 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
173a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23   SQLITE_OK..*/.#
173b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
173c0 42 4c 45 5f 53 54 41 54 33 0a 73 74 61 74 69 63  BLE_STAT3.static
173d0 20 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78   int valueFromEx
173e0 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  pr(.  Parse *pPa
173f0 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  rse, .  Expr *pE
17400 78 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20  xpr, .  u8 aff, 
17410 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17420 20 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70   **pp.){.  if( p
17430 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  Expr->op==TK_VAR
17440 49 41 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78  IABLE.   || (pEx
17450 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
17460 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  TER && pExpr->op
17470 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a  2==TK_VARIABLE).
17480 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61    ){.    int iVa
17490 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  r = pExpr->iColu
174a0 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  mn;.    sqlite3V
174b0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50  dbeSetVarmask(pP
174c0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61  arse->pVdbe, iVa
174d0 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71  r);.    *pp = sq
174e0 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
174f0 64 56 61 6c 75 65 28 70 50 61 72 73 65 2d 3e 70  dValue(pParse->p
17500 52 65 70 72 65 70 61 72 65 2c 20 69 56 61 72 2c  Reprepare, iVar,
17510 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74 75 72   aff);.    retur
17520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17530 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
17540 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  3ValueFromExpr(p
17550 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
17560 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61  , SQLITE_UTF8, a
17570 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e 64 69  ff, pp);.}.#endi
17580 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
17590 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
175a0 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e  o estimate the n
175b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
175c0 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69 74  at will be visit
175d0 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69 6e  ed.** by scannin
175e0 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61  g an index for a
175f0 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65 73   range of values
17600 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79 20  . The range may 
17610 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a 2a  have an upper.**
17620 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72 20   bound, a lower 
17630 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e 20  bound, or both. 
17640 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
17650 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74 20   terms that set 
17660 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e 64  the upper.** and
17670 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61 72   lower bounds ar
17680 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79  e represented by
17690 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
176a0 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  er respectively.
176b0 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
176c0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
176d0 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31 28  ndex p is on t1(
176e0 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  a):.**.**   ... 
176f0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
17700 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
17710 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
17720 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20          |_____| 
17730 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20    |_____|.**    
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a 2a     |         |.*
17760 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17770 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20 20        pLower    
17780 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  pUpper.**.** If 
17790 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75 70  either of the up
177a0 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75  per or lower bou
177b0 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nd is not presen
177c0 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20  t, then NULL is 
177d0 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c 61  passed in.** pla
177e0 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  ce of the corres
177f0 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65 72  ponding WhereTer
17800 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 71  m..**.** The nEq
17810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
17820 73 73 65 64 20 74 68 65 20 69 6e 64 65 78 20 6f  ssed the index o
17830 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c 75  f the index colu
17840 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  mn subject to th
17850 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74  e.** range const
17860 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75 69 76  raint. Or, equiv
17870 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e 75 6d  alently, the num
17880 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
17890 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 6f  constraints.** o
178a0 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68 65 20  ptimized by the 
178b0 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78 20 73  proposed index s
178c0 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  can. For example
178d0 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78  , assuming index
178e0 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31 28 61   p is.** on t1(a
178f0 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20 53 51  , b), and the SQ
17900 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  L query is:.**.*
17910 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
17920 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e 44 20  WHERE a = ? AND 
17930 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20 3f 20  b > ? AND b < ? 
17940 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
17950 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  Eq should be pas
17960 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 31 20  sed the value 1 
17970 28 61 73 20 74 68 65 20 72 61 6e 67 65 20 72 65  (as the range re
17980 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d 6e 2c  stricted column,
17990 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20 73 65  .** b, is the se
179a0 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74 20 63  cond left-most c
179b0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
179c0 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  ex). Or, if the 
179d0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
179e0 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
179f0 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
17a00 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
17a10 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65  en nEq should be
17a20 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a   passed 0..**.**
17a30 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
17a40 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lue is an intege
17a50 72 20 64 69 76 69 73 6f 72 20 74 6f 20 72 65 64  r divisor to red
17a60 75 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  uce the estimate
17a70 64 0a 2a 2a 20 73 65 61 72 63 68 20 73 70 61 63  d.** search spac
17a80 65 2e 20 20 41 20 72 65 74 75 72 6e 20 76 61 6c  e.  A return val
17a90 75 65 20 6f 66 20 31 20 6d 65 61 6e 73 20 74 68  ue of 1 means th
17aa0 61 74 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  at range constra
17ab0 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6e 6f 20 68  ints are.** no h
17ac0 65 6c 70 20 61 74 20 61 6c 6c 2e 20 20 41 20 72  elp at all.  A r
17ad0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 32  eturn value of 2
17ae0 20 6d 65 61 6e 73 20 72 61 6e 67 65 20 63 6f 6e   means range con
17af0 73 74 72 61 69 6e 74 73 20 61 72 65 0a 2a 2a 20  straints are.** 
17b00 65 78 70 65 63 74 65 64 20 74 6f 20 72 65 64 75  expected to redu
17b10 63 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70  ce the search sp
17b20 61 63 65 20 62 79 20 68 61 6c 66 2e 20 20 41 6e  ace by half.  An
17b30 64 20 73 6f 20 66 6f 72 74 68 2e 2e 2e 0a 2a 2a  d so forth....**
17b40 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e  .** In the absen
17b50 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  ce of sqlite_sta
17b60 74 33 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c  t3 ANALYZE data,
17b70 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71   each range ineq
17b80 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65  uality.** reduce
17b90 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  s the search spa
17ba0 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ce by a factor o
17bb0 66 20 34 2e 20 20 48 65 6e 63 65 20 61 20 73 69  f 4.  Hence a si
17bc0 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
17bd0 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73  (x>?).** results
17be0 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
17bf0 34 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63 6f  4 and a range co
17c00 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41 4e  nstraint (x>? AN
17c10 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a 2a  D x<?) results.*
17c20 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66  * in a return of
17c30 20 31 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   16..*/.static i
17c40 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
17c50 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
17c60 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17c70 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
17c80 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17c90 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17cb0 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
17cc0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f  ing the range-co
17cd0 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22  mpared column; "
17ce0 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  x" */.  int nEq,
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d00 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43  index into p->aC
17d10 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67  ol[] of the rang
17d20 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
17d30 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
17d40 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
17d50 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
17d60 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
17d70 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
17d80 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
17d90 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
17da0 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
17db0 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
17dc0 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
17dd0 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ULL */.  WhereCo
17de0 73 74 20 2a 70 52 61 6e 67 65 44 69 76 20 2f 2a  st *pRangeDiv /*
17df0 20 4f 55 54 3a 20 52 65 64 75 63 65 20 73 65 61   OUT: Reduce sea
17e00 72 63 68 20 73 70 61 63 65 20 62 79 20 74 68 69  rch space by thi
17e10 73 20 64 69 76 69 73 6f 72 20 2a 2f 0a 29 7b 0a  s divisor */.){.
17e20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17e30 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
17e40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17e50 33 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20  3..  if( nEq==0 
17e60 26 26 20 70 2d 3e 6e 53 61 6d 70 6c 65 20 26 26  && p->nSample &&
17e70 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
17e80 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
17e90 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29 20 29   SQLITE_Stat3) )
17ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
17eb0 6c 75 65 20 2a 70 52 61 6e 67 65 56 61 6c 3b 0a  lue *pRangeVal;.
17ec0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
17ed0 65 72 20 3d 20 30 3b 0a 20 20 20 20 74 52 6f 77  er = 0;.    tRow
17ee0 63 6e 74 20 69 55 70 70 65 72 20 3d 20 70 2d 3e  cnt iUpper = p->
17ef0 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20  aiRowEst[0];.   
17f00 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
17f10 20 20 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70     u8 aff = p->p
17f20 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
17f30 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69  iColumn[0]].affi
17f40 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20 70  nity;..    if( p
17f50 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 45  Lower ){.      E
17f60 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f  xpr *pExpr = pLo
17f70 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
17f80 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76  ht;.      rc = v
17f90 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
17fa0 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  rse, pExpr, aff,
17fb0 20 26 70 52 61 6e 67 65 56 61 6c 29 3b 0a 20 20   &pRangeVal);.  
17fc0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f      assert( (pLo
17fd0 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  wer->eOperator &
17fe0 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21   (WO_GT|WO_GE))!
17ff0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
18000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
18010 20 20 20 20 20 26 26 20 77 68 65 72 65 4b 65 79       && whereKey
18020 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
18030 20 70 52 61 6e 67 65 56 61 6c 2c 20 30 2c 20 61   pRangeVal, 0, a
18040 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
18050 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c     ){.        iL
18060 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
18070 20 20 20 20 20 69 66 28 20 28 70 4c 6f 77 65 72       if( (pLower
18080 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
18090 5f 47 54 29 21 3d 30 20 29 20 69 4c 6f 77 65 72  _GT)!=0 ) iLower
180a0 20 2b 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20   += a[1];.      
180b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
180c0 61 6c 75 65 46 72 65 65 28 70 52 61 6e 67 65 56  alueFree(pRangeV
180d0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
180e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
180f0 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20 20   && pUpper ){.  
18100 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
18110 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
18120 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72  >pRight;.      r
18130 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
18140 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
18150 20 61 66 66 2c 20 26 70 52 61 6e 67 65 56 61 6c   aff, &pRangeVal
18160 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18170 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61   (pUpper->eOpera
18180 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  tor & (WO_LT|WO_
18190 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  LE))!=0 );.     
181a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
181b0 4f 4b 0a 20 20 20 20 20 20 20 26 26 20 77 68 65  OK.       && whe
181c0 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
181d0 65 2c 20 70 2c 20 70 52 61 6e 67 65 56 61 6c 2c  e, p, pRangeVal,
181e0 20 31 2c 20 61 29 3d 3d 53 51 4c 49 54 45 5f 4f   1, a)==SQLITE_O
181f0 4b 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  K.      ){.     
18200 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
18210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
18220 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
18230 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 20 69   & WO_LE)!=0 ) i
18240 55 70 70 65 72 20 2b 3d 20 61 5b 31 5d 3b 0a 20  Upper += a[1];. 
18250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
18260 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 52  ite3ValueFree(pR
18270 61 6e 67 65 56 61 6c 29 3b 0a 20 20 20 20 7d 0a  angeVal);.    }.
18280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 57  TE_OK ){.      W
182a0 68 65 72 65 43 6f 73 74 20 69 42 61 73 65 20 3d  hereCost iBase =
182b0 20 77 68 65 72 65 43 6f 73 74 28 70 2d 3e 61 69   whereCost(p->ai
182c0 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20  RowEst[0]);.    
182d0 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
182e0 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  wer ){.        i
182f0 42 61 73 65 20 2d 3d 20 77 68 65 72 65 43 6f 73  Base -= whereCos
18300 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  t(iUpper - iLowe
18310 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
18320 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20 69    *pRangeDiv = i
18330 42 61 73 65 3b 0a 20 20 20 20 20 20 57 48 45 52  Base;.      WHER
18340 45 54 52 41 43 45 28 30 78 31 30 30 2c 20 28 22  ETRACE(0x100, ("
18350 72 61 6e 67 65 20 73 63 61 6e 20 72 65 67 69 6f  range scan regio
18360 6e 73 3a 20 25 75 2e 2e 25 75 20 20 64 69 76 3d  ns: %u..%u  div=
18370 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33  (u32)iLower, (u3
183a0 32 29 69 55 70 70 65 72 2c 20 2a 70 52 61 6e 67  2)iUpper, *pRang
183b0 65 44 69 76 29 29 3b 0a 20 20 20 20 20 20 72 65  eDiv));.      re
183c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
183d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
183e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
183f0 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
18400 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
18410 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
18420 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23 65 6e 64  METER(nEq);.#end
18430 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  if.  assert( pLo
18440 77 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b  wer || pUpper );
18450 0a 20 20 2a 70 52 61 6e 67 65 44 69 76 20 3d 20  .  *pRangeDiv = 
18460 30 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  0;.  /* TUNING: 
18470 20 45 61 63 68 20 69 6e 65 71 75 61 6c 69 74 79   Each inequality
18480 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64 75   constraint redu
18490 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73  ces the search s
184a0 70 61 63 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a  pace 4-fold..  *
184b0 2a 20 41 20 42 45 54 57 45 45 4e 20 6f 70 65 72  * A BETWEEN oper
184c0 61 74 6f 72 2c 20 74 68 65 72 65 66 6f 72 65 2c  ator, therefore,
184d0 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
184e0 72 63 68 20 73 70 61 63 65 20 31 36 2d 66 6f 6c  rch space 16-fol
184f0 64 20 2a 2f 0a 20 20 69 66 28 20 70 4c 6f 77 65  d */.  if( pLowe
18500 72 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74  r && (pLower->wt
18510 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
18520 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  LL)==0 ){.    *p
18530 52 61 6e 67 65 44 69 76 20 2b 3d 20 32 30 3b 20  RangeDiv += 20; 
18540 20 61 73 73 65 72 74 28 20 32 30 3d 3d 77 68 65   assert( 20==whe
18550 72 65 43 6f 73 74 28 34 29 20 29 3b 0a 20 20 7d  reCost(4) );.  }
18560 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b  .  if( pUpper ){
18570 0a 20 20 20 20 2a 70 52 61 6e 67 65 44 69 76 20  .    *pRangeDiv 
18580 2b 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20  += 20;  assert( 
18590 32 30 3d 3d 77 68 65 72 65 43 6f 73 74 28 34 29  20==whereCost(4)
185a0 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
185b0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
185c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
185d0 54 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T3./*.** Estimat
185e0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
185f0 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
18600 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
18610 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69   on.** an equali
18620 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d  ty constraint x=
18630 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20  VALUE and where 
18640 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72  that VALUE occur
18650 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74  s in.** the hist
18660 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69  ogram data.  Thi
18670 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65  s only works whe
18680 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d  n x is the left-
18690 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f  most.** column o
186a0 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73  f an index and s
186b0 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
186c0 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
186d0 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74  ailable.** for t
186e0 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e  hat index.  When
186f0 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61   pExpr==NULL tha
18700 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73  t means the cons
18710 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20  traint is.** "x 
18720 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64  IS NULL" instead
18730 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a   of "x=VALUE"..*
18740 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
18750 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
18760 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
18770 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18780 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
18790 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
187a0 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
187b0 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
187c0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
187d0 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
187e0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
187f0 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
18800 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
18810 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
18820 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
18830 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
18840 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
18850 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
18860 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
18870 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
18880 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
18890 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
188a0 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
188b0 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
188c0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
188d0 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61  nt whereEqualSca
188e0 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
188f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
18900 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
18910 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
18920 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
18930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18940 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c  he index whose l
18950 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
18960 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78  is pTerm */.  Ex
18970 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
18980 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
18990 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68   for VALUE in th
189a0 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72  e x=VALUE constr
189b0 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  aint */.  tRowcn
189c0 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
189d0 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
189e0 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
189f0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
18a00 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68  lite3_value *pRh
18a10 73 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45  s = 0;  /* VALUE
18a20 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73   on right-hand s
18a30 69 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a  ide of pTerm */.
18a40 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20    u8 aff;       
18a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
18a60 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a  olumn affinity *
18a70 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18a90 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74   Subfunction ret
18aa0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52  urn code */.  tR
18ab0 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20  owcnt a[2];     
18ac0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69          /* Stati
18ad0 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
18ae0 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d  rt( p->aSample!=
18af0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18b00 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20  ->nSample>0 );. 
18b10 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65   aff = p->pTable
18b20 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75  ->aCol[p->aiColu
18b30 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  mn[0]].affinity;
18b40 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
18b50 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72      rc = valueFr
18b60 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
18b70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 52 68 73  Expr, aff, &pRhs
18b80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
18b90 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c 53  goto whereEqualS
18ba0 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a 20  canEst_cancel;. 
18bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 68 73   }else{.    pRhs
18bc0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
18bd0 65 77 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  ew(pParse->db);.
18be0 20 20 7d 0a 20 20 69 66 28 20 70 52 68 73 3d 3d    }.  if( pRhs==
18bf0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18c00 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 72 63  E_NOTFOUND;.  rc
18c10 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73   = whereKeyStats
18c20 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 68 73  (pParse, p, pRhs
18c30 2c 20 30 2c 20 61 29 3b 0a 20 20 69 66 28 20 72  , 0, a);.  if( r
18c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18c50 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
18c60 78 31 30 30 2c 28 22 65 71 75 61 6c 69 74 79 20  x100,("equality 
18c70 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64  scan regions: %d
18c80 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29  \n", (int)a[1]))
18c90 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ;.    *pnRow = a
18ca0 5b 31 5d 3b 0a 20 20 7d 0a 77 68 65 72 65 45 71  [1];.  }.whereEq
18cb0 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
18cc0 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  l:.  sqlite3Valu
18cd0 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20 72  eFree(pRhs);.  r
18ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
18cf0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
18d00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18d10 33 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  3) */..#ifdef SQ
18d20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18d30 33 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  3./*.** Estimate
18d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18d50 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
18d60 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
18d70 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73  on.** an IN cons
18d80 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65  traint where the
18d90 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
18da0 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
18db0 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74  tor.** is a list
18dc0 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61   of values.  Exa
18dd0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
18de0 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
18df0 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72  ,2,3,4).**.** Wr
18e00 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18e10 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18e20 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18e40 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18e50 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
18e60 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
18e70 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
18e80 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
18e90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18ea0 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
18eb0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
18ec0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
18ed0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
18ee0 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
18ef0 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
18f00 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18f10 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18f20 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18f30 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18f40 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18f50 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18f60 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18f70 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18f80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18f90 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61  eInScanEst(.  Pa
18fa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18fb0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
18fc0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
18fd0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64  context */.  Ind
18fe0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
18ff0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
19000 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63  hose left-most c
19010 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20 2a  olumn is pTerm *
19020 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
19030 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  ist,     /* The 
19040 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68  value list on th
19050 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28  e RHS of "x IN (
19060 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a  v1,v2,v3,...)" *
19070 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52  /.  tRowcnt *pnR
19080 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ow       /* Writ
19090 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f  e the revised ro
190a0 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20  w estimate here 
190b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
190c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
190d0 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72  /* Subfunction r
190e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
190f0 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20  tRowcnt nEst;   
19100 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19110 72 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20  r of rows for a 
19120 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20  single term */. 
19130 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74   tRowcnt nRowEst
19140 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20   = 0;    /* New 
19150 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
19160 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a  number of rows *
19170 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
19180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
19190 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
191a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
191b0 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72  mple!=0 );.  for
191c0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
191d0 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  _OK && i<pList->
191e0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
191f0 20 6e 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77   nEst = p->aiRow
19200 45 73 74 5b 30 5d 3b 0a 20 20 20 20 72 63 20 3d  Est[0];.    rc =
19210 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45   whereEqualScanE
19220 73 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c  st(pParse, p, pL
19230 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
19240 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f   &nEst);.    nRo
19250 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20  wEst += nEst;.  
19260 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
19270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
19280 20 6e 52 6f 77 45 73 74 20 3e 20 70 2d 3e 61 69   nRowEst > p->ai
19290 52 6f 77 45 73 74 5b 30 5d 20 29 20 6e 52 6f 77  RowEst[0] ) nRow
192a0 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  Est = p->aiRowEs
192b0 74 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 52 6f 77  t[0];.    *pnRow
192c0 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20   = nRowEst;.    
192d0 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 30  WHERETRACE(0x100
192e0 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
192f0 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22 2c 20 6e  te: est=%g\n", n
19300 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
19310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19320 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
19330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
19340 54 33 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69  T3) */../*.** Di
19350 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20  sable a term in 
19360 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19370 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  .  Except, do no
19380 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  t disable the te
19390 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74  rm.** if it cont
193a0 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45  rols a LEFT OUTE
193b0 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69  R JOIN and it di
193c0 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20  d not originate 
193d0 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20  in the ON.** or 
193e0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
193f0 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  that join..**.**
19400 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65   Consider the te
19410 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20  rm t2.z='ok' in 
19420 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
19430 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  eries:.**.**   (
19440 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  1)  SELECT * FRO
19450 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
19460 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57  2 ON t1.a=t2.x W
19470 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a  HERE t2.z='ok'.*
19480 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20  *   (2)  SELECT 
19490 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
194a0 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
194b0 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b  2.x AND t2.z='ok
194c0 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45  '.**   (3)  SELE
194d0 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
194e0 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78   WHERE t1.a=t2.x
194f0 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a   AND t2.z='ok'.*
19500 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f  *.** The t2.z='o
19510 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  k' is disabled i
19520 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63  n the in (2) bec
19530 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74  ause it originat
19540 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  es.** in the ON 
19550 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72  clause.  The ter
19560 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  m is disabled in
19570 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20   (3) because it 
19580 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f  is not part.** o
19590 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
195a0 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68  OIN.  In (1), th
195b0 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69  e term is not di
195c0 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69  sabled..**.** Di
195d0 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63  sabling a term c
195e0 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20  auses that term 
195f0 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64  to not be tested
19600 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   in the inner lo
19610 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  op.** of the joi
19620 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73  n.  Disabling is
19630 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
19640 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72  .  When terms ar
19650 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62  e satisfied.** b
19660 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69  y indices, we di
19670 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72  sable them to pr
19680 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20  event redundant 
19690 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e  tests in the inn
196a0 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20  er.** loop.  We 
196b0 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f  would get the co
196c0 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66  rrect results if
196d0 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76   nothing were ev
196e0 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20  er disabled,.** 
196f0 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20  but joins might 
19700 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f  run a little slo
19710 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20  wer.  The trick 
19720 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73  is to disable as
19730 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63   much.** as we c
19740 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62  an without disab
19750 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20  ling too much.  
19760 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69  If we disabled i
19770 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a  n (1), we'd get.
19780 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73  ** the wrong ans
19790 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74  wer.  See ticket
197a0 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63   #813..*/.static
197b0 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72   void disableTer
197c0 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c  m(WhereLevel *pL
197d0 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20  evel, WhereTerm 
197e0 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70  *pTerm){.  if( p
197f0 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70  Term.      && (p
19800 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
19810 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20  TERM_CODED)==0. 
19820 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
19830 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c  >iLeftJoin==0 ||
19840 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
19850 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
19860 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29  P_FromJoin)).  )
19870 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  {.    pTerm->wtF
19880 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
19890 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  ED;.    if( pTer
198a0 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b  m->iParent>=0 ){
198b0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
198c0 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72   *pOther = &pTer
198d0 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d  m->pWC->a[pTerm-
198e0 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20  >iParent];.     
198f0 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e   if( (--pOther->
19900 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20  nChild)==0 ){.  
19910 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
19920 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72  m(pLevel, pOther
19930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19940 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
19950 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74  de an OP_Affinit
19960 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c  y opcode to appl
19970 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  y the column aff
19980 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66  inity string zAf
19990 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65  f.** to the n re
199a0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
199b0 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a   at base. .**.**
199c0 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   As an optimizat
199d0 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  ion, SQLITE_AFF_
199e0 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68  NONE entries (wh
199f0 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20  ich are no-ops) 
19a00 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e  at the.** beginn
19a10 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a  ing and end of z
19a20 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  Aff are ignored.
19a30 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73    If all entries
19a40 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20   in zAff are.** 
19a50 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c  SQLITE_AFF_NONE,
19a60 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65   then no code ge
19a70 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a  ts generated..**
19a80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19a90 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63   makes its own c
19aa0 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74  opy of zAff so t
19ab0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69  hat the caller i
19ac0 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64  s free.** to mod
19ad0 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74  ify zAff after t
19ae0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
19af0 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rns..*/.static v
19b00 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66  oid codeApplyAff
19b10 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61  inity(Parse *pPa
19b20 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69  rse, int base, i
19b30 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66  nt n, char *zAff
19b40 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
19b50 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
19b60 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20  if( zAff==0 ){. 
19b70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
19b80 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19b90 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
19ba0 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
19bb0 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41   v!=0 );..  /* A
19bc0 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e  djust base and n
19bd0 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51   to skip over SQ
19be0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e  LITE_AFF_NONE en
19bf0 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67  tries at the beg
19c00 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20  inning.  ** and 
19c10 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e  end of the affin
19c20 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f  ity string..  */
19c30 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
19c40 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45   zAff[0]==SQLITE
19c50 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
19c60 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b   n--;.    base++
19c70 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20  ;.    zAff++;.  
19c80 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  }.  while( n>1 &
19c90 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c  & zAff[n-1]==SQL
19ca0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
19cb0 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20      n--;.  }..  
19cc0 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41  /* Code the OP_A
19cd0 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69  ffinity opcode i
19ce0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68  f there is anyth
19cf0 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20  ing left to do. 
19d00 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  */.  if( n>0 ){.
19d10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19d20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
19d30 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
19d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19d50 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a  hangeP4(v, -1, z
19d60 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c  Aff, n);.    sql
19d70 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
19d80 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
19d90 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20  se, base, n);.  
19da0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
19db0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
19dc0 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20  single equality 
19dd0 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
19de0 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71  E clause.  An eq
19df0 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63  uality.** term c
19e00 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65  an be either X=e
19e10 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  xpr or X IN (...
19e20 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
19e30 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a  e term to be .**
19e40 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   coded..**.** Th
19e50 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
19e60 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
19e70 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  nt is left in re
19e80 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a  gister iReg..**.
19e90 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
19ea0 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
19eb0 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
19ec0 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
19ed0 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
19ee0 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
19ef0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
19f00 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
19f10 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
19f20 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
19f30 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
19f40 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
19f50 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
19f60 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
19f70 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75  atic int codeEqu
19f80 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
19f90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
19fa0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
19fb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
19fc0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
19fd0 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
19fe0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19ff0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1a000 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1a010 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76  evel, /* The lev
1a020 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
1a030 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
1a040 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
1a050 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20 20   iEq,           
1a060 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1a070 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 77   equality term w
1a080 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65 6c  ithin this level
1a090 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
1a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a0b0 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f 72  e for reverse-or
1a0c0 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e  der IN operation
1a0d0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  s */.  int iTarg
1a0e0 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
1a0f0 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
1a100 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
1a110 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
1a120 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
1a130 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
1a140 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1a150 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1a180 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
1a190 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
1a1a0 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
1a1b0 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
1a1c0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
1a1d0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1a1e0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1a1f0 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
1a200 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
1a210 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
1a220 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
1a230 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1a240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1a250 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
1a260 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a270 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
1a280 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
1a290 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
1a2a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
1a2b0 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68  oop *pIn;.    Wh
1a2c0 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1a2d0 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1a2e0 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ..    if( (pLoop
1a2f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a300 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1a310 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
1a320 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1a330 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c  x!=0.      && pL
1a340 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1a350 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1a360 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  iEq].    ){.    
1a370 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71 3d    testcase( iEq=
1a380 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a390 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20  case( bRev );.  
1a3a0 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65 76      bRev = !bRev
1a3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1a3c0 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
1a3d0 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
1a3e0 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
1a3f0 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
1a400 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
1a410 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pX, 0);.    if( 
1a420 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
1a430 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
1a440 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
1a450 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
1a460 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
1a470 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
1a480 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
1a490 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a4a0 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
1a4b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
1a4c0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1a4d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1a4e0 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
1a4f0 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  OR)==0 );.    pL
1a500 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
1a510 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a 20  WHERE_IN_ABLE;. 
1a520 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75     if( pLevel->u
1a530 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20  .in.nIn==0 ){.  
1a540 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
1a550 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
1a560 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a570 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
1a580 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20  >u.in.nIn++;.   
1a590 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49   pLevel->u.in.aI
1a5a0 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20 73  nLoop =.       s
1a5b0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
1a5c0 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  rFree(pParse->db
1a5d0 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  , pLevel->u.in.a
1a5e0 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  InLoop,.        
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a600 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 65        sizeof(pLe
1a610 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
1a620 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e  p[0])*pLevel->u.
1a630 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e  in.nIn);.    pIn
1a640 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e   = pLevel->u.in.
1a650 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  aInLoop;.    if(
1a660 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49   pIn ){.      pI
1a670 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  n += pLevel->u.i
1a680 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20  n.nIn - 1;.     
1a690 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61   pIn->iCur = iTa
1a6a0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  b;.      if( eTy
1a6b0 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
1a6c0 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  ID ){.        pI
1a6d0 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73  n->addrInTop = s
1a6e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a6f0 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54  (v, OP_Rowid, iT
1a700 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20  ab, iReg);.     
1a710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a720 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
1a730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a740 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a750 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29 3b   iTab, 0, iReg);
1a760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a770 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20 3d  In->eEndLoopOp =
1a780 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
1a790 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
1a7a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a7b0 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
1a7c0 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
1a7d0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1a7e0 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
1a7f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1a800 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1a810 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
1a820 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
1a830 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1a840 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1a850 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
1a860 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
1a870 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
1a880 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1a890 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61  ple, consider ta
1a8a0 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65  ble t1(a,b,c,d,e
1a8b0 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69  ,f) with index i
1a8c0 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70  1(a,b,c)..** Sup
1a8d0 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63  pose the WHERE c
1a8e0 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20  lause is this:  
1a8f0 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31  a==5 AND b IN (1
1a900 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e  ,2,3) AND c>5 AN
1a910 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e  D c<10.** The in
1a920 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20  dex has as many 
1a930 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74  as three equalit
1a940 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62  y constraints, b
1a950 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78  ut in this.** ex
1a960 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64  ample, the third
1a970 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e   "c" value is an
1a980 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f   inequality.  So
1a990 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f   only two .** co
1a9a0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
1a9b0 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ded.  This routi
1a9c0 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ne will generate
1a9d0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
1a9e0 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20  e.** a==5 and b 
1a9f0 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65  IN (1,2,3).  The
1aa00 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20   current values 
1aa10 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c  for a and b will
1aa20 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e   be stored.** in
1aa30 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
1aa40 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69  isters and the i
1aa50 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
1aa60 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65  t register is re
1aa70 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  turned..**.** In
1aa80 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
1aa90 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
1aaa0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
1aab0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
1aac0 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
1aad0 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
1aae0 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
1aaf0 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
1ab00 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
1ab10 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
1ab20 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
1ab30 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
1ab40 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a  mory cell and.**
1ab50 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66   compute the aff
1ab60 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  inity string..**
1ab70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ab80 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65   always allocate
1ab90 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d  s at least one m
1aba0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
1abb0 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e  eturns.** the in
1abc0 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f  dex of that memo
1abd0 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64  ry cell. The cod
1abe0 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20  e that.** calls 
1abf0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1ac00 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72  l use that memor
1ac10 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20  y cell to store 
1ac20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a  the termination.
1ac30 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
1ac40 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
1ac50 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
1ac60 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
1ac70 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1ac80 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
1ac90 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
1aca0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
1acb0 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
1acc0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
1acd0 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
1ace0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1acf0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1ad00 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
1ad10 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
1ad20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
1ad30 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
1ad40 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
1ad50 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
1ad60 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
1ad70 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
1ad80 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
1ad90 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
1ada0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1adb0 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
1adc0 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
1add0 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
1ade0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
1adf0 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
1ae00 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
1ae10 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1ae20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1ae30 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
1ae40 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
1ae50 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1ae60 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
1ae70 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
1ae80 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
1ae90 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
1aea0 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
1aeb0 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
1aec0 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
1aed0 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
1aee0 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
1aef0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
1af00 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
1af10 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
1af20 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
1af30 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
1af40 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
1af50 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
1af60 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
1af70 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
1af80 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
1af90 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
1afa0 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
1afb0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
1afc0 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
1afd0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
1afe0 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
1aff0 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
1b000 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
1b010 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1b020 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1b030 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1b040 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1b050 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
1b060 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
1b070 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
1b080 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0a0 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
1b0b0 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
1b0c0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
1b0d0 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
1b0e0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1b0f0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
1b100 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
1b110 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
1b120 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
1b130 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
1b140 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
1b150 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b170 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1b180 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
1b190 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
1b1a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1b1b0 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1b1c0 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1b1d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1b1e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1b210 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1b220 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
1b230 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1b240 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1b250 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
1b260 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
1b270 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1b280 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1b290 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1b2a0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1b2d0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1b2e0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1b2f0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1b300 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1b310 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1b320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b330 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1b340 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1b350 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1b380 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1b390 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1b3a0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1b3b0 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1b3c0 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1b3d0 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
1b3e0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1b3f0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1b400 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1b410 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1b420 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
1b430 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1b440 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70  ;.  pIdx = pLoop
1b450 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1b460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
1b470 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  !=0 );..  /* Fig
1b480 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b490 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65   memory cells we
1b4a0 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20   will need then 
1b4b0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20  allocate them.. 
1b4c0 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20   */.  regBase = 
1b4d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
1b4e0 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f 70  ;.  nReg = pLoop
1b4f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b 20  ->u.btree.nEq + 
1b500 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
1b510 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
1b520 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
1b530 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
1b540 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
1b550 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
1b560 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
1b570 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
1b580 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1b590 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
1b5a0 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
1b5b0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
1b5c0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
1b5d0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
1b5e0 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
1b5f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
1b600 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
1b610 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1b620 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
1b630 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1b640 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54  m!=0 );.    /* T
1b650 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75  he following tru
1b660 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
1b670 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
1b680 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
1b690 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
1b6a0 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
1b6b0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1b6c0 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
1b6d0 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
1b6e0 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
1b6f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1b700 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
1b710 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1b720 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1b730 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d  TUAL );.    r1 =
1b740 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1b750 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1b760 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1b770 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1b780 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
1b790 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
1b7a0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
1b7b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1b7c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b7d0 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
1b7e0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
1b7f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b810 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1b820 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
1b830 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
1b840 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
1b850 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1b860 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1b870 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1b880 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b890 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
1b8a0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1b8b0 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
1b8c0 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
1b8d0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1b8e0 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
1b8f0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1b900 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b910 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1b920 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
1b930 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1b940 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
1b950 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1b960 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1b970 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1b980 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
1b990 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1b9a0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1b9b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1b9c0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1b9d0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b9e0 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1b9f0 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1ba00 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
1ba10 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1ba20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1ba30 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1ba40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1ba50 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
1ba60 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
1ba70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1ba80 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
1ba90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1baa0 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
1bab0 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
1bac0 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
1bad0 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
1bae0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
1baf0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
1bb00 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
1bb10 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
1bb20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
1bb30 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
1bb40 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
1bb50 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1bb60 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
1bb70 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
1bb80 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
1bb90 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
1bba0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1bbb0 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
1bbc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1bbd0 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1bbe0 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
1bbf0 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
1bc00 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
1bc10 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
1bc20 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
1bc30 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1bc40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1bc50 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
1bc60 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
1bc70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1bc80 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
1bc90 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1bca0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1bcb0 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
1bcc0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1bcd0 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
1bce0 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
1bcf0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1bd00 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
1bd10 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
1bd20 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1bd30 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d  pStr, zColumn, -
1bd40 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
1bd50 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1bd60 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
1bd70 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1bd80 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
1bd90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
1bda0 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
1bdb0 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
1bdc0 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
1bdd0 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
1bde0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1bdf0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1be00 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
1be10 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
1be20 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
1be30 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
1be40 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
1be50 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
1be60 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
1be70 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
1be80 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
1be90 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
1bea0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1beb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
1bec0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
1bed0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
1bee0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1bef0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
1bf00 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
1bf10 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
1bf20 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
1bf30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1bf40 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
1bf50 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
1bf60 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
1bf70 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
1bf80 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
1bf90 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
1bfa0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1bfb0 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
1bfc0 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
1bfd0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1bfe0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1bff0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
1c000 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
1c010 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
1c020 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
1c030 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
1c040 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
1c050 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
1c060 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
1c070 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1c080 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1c090 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
1c0a0 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
1c0b0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e  .btree.nEq;.  in
1c0c0 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
1c0d0 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
1c0e0 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f  Col;.  int *aiCo
1c0f0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1c100 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
1c110 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
1c120 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
1c130 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1c140 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
1c150 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
1c160 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c170 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1c180 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
1c190 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
1c1a0 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
1c1b0 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
1c1c0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1c1d0 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
1c1e0 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
1c1f0 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
1c200 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1c210 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c 5b  m(&txt, i, aCol[
1c220 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61  aiColumn[i]].zNa
1c230 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a 20  me, "=");.  }.. 
1c240 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70 4c   j = i;.  if( pL
1c250 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45  oop->wsFlags&WHE
1c260 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
1c270 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a      char *z = (j
1c280 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
1c290 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n ) ? "rowid" : 
1c2a0 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
1c2b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
1c2c0 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
1c2d0 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22  txt, i++, z, ">"
1c2e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f  );.  }.  if( pLo
1c2f0 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1c300 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
1c310 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 6a 3d     char *z = (j=
1c320 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1c330 20 29 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   ) ? "rowid" : a
1c340 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  Col[aiColumn[j]]
1c350 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c  .zName;.    expl
1c360 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74  ainAppendTerm(&t
1c370 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22 29 3b 0a  xt, i, z, "<");.
1c380 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
1c390 41 63 63 75 6d 41 70 70 65 6e 64 28 26 74 78 74  AccumAppend(&txt
1c3a0 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 72 65 74  , ")", 1);.  ret
1c3b0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
1c3c0 63 75 6d 46 69 6e 69 73 68 28 26 74 78 74 29 3b  cumFinish(&txt);
1c3d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1c3e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1c3f0 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e  op unless curren
1c400 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
1c410 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
1c420 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  PLAN.** command.
1c430 20 49 66 20 74 68 65 20 71 75 65 72 79 20 62 65   If the query be
1c440 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 69 73 20  ing compiled is 
1c450 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  an EXPLAIN QUERY
1c460 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67 6c 65 0a   PLAN, a single.
1c470 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 61 64 64  ** record is add
1c480 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
1c490 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
1c4a0 20 74 61 62 6c 65 20 73 63 61 6e 20 73 74 72 61   table scan stra
1c4b0 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70 4c 65 76  tegy in .** pLev
1c4c0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  el..*/.static vo
1c4d0 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61  id explainOneSca
1c4e0 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
1c4f0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1c500 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
1c510 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1c520 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
1c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1c540 62 6c 65 20 6c 69 73 74 20 74 68 69 73 20 6c 6f  ble list this lo
1c550 6f 70 20 72 65 66 65 72 73 20 74 6f 20 2a 2f 0a  op refers to */.
1c560 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1c570 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1c580 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20 77 72 69    /* Scan to wri
1c590 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70  te OP_Explain op
1c5a0 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  code for */.  in
1c5b0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c5d0 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 76 65   Value for "leve
1c5e0 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74  l" column of out
1c5f0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  put */.  int iFr
1c600 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
1c610 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1c620 65 20 66 6f 72 20 22 66 72 6f 6d 22 20 63 6f 6c  e for "from" col
1c630 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
1c640 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
1c650 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1c660 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
1c670 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
1c680 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a  reBegin() */.){.
1c690 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
1c6a0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
1c6b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1c6c0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1c6d0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
1c6e0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56 64  ->iFrom];.    Vd
1c6f0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c700 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 56  pVdbe;      /* V
1c710 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  M being construc
1c720 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ted */.    sqlit
1c730 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c740 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  >db;     /* Data
1c750 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
1c760 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20     char *zMsg;  
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20   /* Text to add 
1c790 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f  to EQP output */
1c7a0 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70  .    int iId = p
1c7b0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
1c7c0 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64 20  ;  /* Select id 
1c7d0 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70 75  (left-most outpu
1c7e0 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20 20  t column) */.   
1c7f0 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20 20   int isSearch;  
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c810 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45 41  * True for a SEA
1c820 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20 53  RCH. False for S
1c830 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57 68 65 72  CAN. */.    Wher
1c840 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
1c850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c860 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 57 68 65   controlling Whe
1c870 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
1c880 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 3b 20  .    u32 flags; 
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 61 74     /* Flags that
1c8b0 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20 6c   describe this l
1c8c0 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f  oop */..    pLoo
1c8d0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1c8e0 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20  op;.    flags = 
1c8f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  pLoop->wsFlags;.
1c900 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57      if( (flags&W
1c910 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c  HERE_MULTI_OR) |
1c920 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48  | (wctrlFlags&WH
1c930 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c  ERE_ONETABLE_ONL
1c940 59 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  Y) ) return;..  
1c950 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c    isSearch = (fl
1c960 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c  ags&(WHERE_BTM_L
1c970 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  IMIT|WHERE_TOP_L
1c980 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20  IMIT))!=0.      
1c990 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73        || ((flags
1c9a0 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  &WHERE_VIRTUALTA
1c9b0 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f  BLE)==0 && (pLoo
1c9c0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30  p->u.btree.nEq>0
1c9d0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  )).            |
1c9e0 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57  | (wctrlFlags&(W
1c9f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1ca00 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  |WHERE_ORDERBY_M
1ca10 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67 20  AX));..    zMsg 
1ca20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1ca30 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65 61  (db, "%s", isSea
1ca40 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53 43  rch?"SEARCH":"SC
1ca50 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49  AN");.    if( pI
1ca60 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1ca70 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1ca80 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1ca90 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51 55   zMsg, "%s SUBQU
1caa0 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70 49  ERY %d", zMsg,pI
1cab0 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  tem->iSelectId);
1cac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cad0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1cae0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1caf0 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73 22  g, "%s TABLE %s"
1cb00 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a  , zMsg, pItem->z
1cb10 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Name);.    }..  
1cb20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
1cb30 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ias ){.      zMs
1cb40 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1cb50 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1cb60 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  s AS %s", zMsg, 
1cb70 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
1cb80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1cb90 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 50  lags & (WHERE_IP
1cba0 4b 7c 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  K|WHERE_VIRTUALT
1cbb0 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20 20 20 26  ABLE))==0.     &
1cbc0 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f 70 2d 3e  & ALWAYS(pLoop->
1cbd0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d  u.btree.pIndex!=
1cbe0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1cbf0 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 65  char *zWhere = e
1cc00 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
1cc10 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70 49 74 65  (db, pLoop, pIte
1cc20 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20 20  m->pTab);.      
1cc30 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1cc40 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1cc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc60 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
1cc70 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f 20 0a 20  AUTO_INDEX) ? . 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 22 25 73 20 55 53 49 4e 47 20 41 55 54 4f    "%s USING AUTO
1cca0 4d 41 54 49 43 20 25 73 49 4e 44 45 58 25 2e 30  MATIC %sINDEX%.0
1ccb0 73 25 73 22 20 3a 0a 20 20 20 20 20 20 20 20 20  s%s" :.         
1ccc0 20 20 20 20 20 20 20 20 20 20 22 25 73 20 55 53            "%s US
1ccd0 49 4e 47 20 25 73 49 4e 44 45 58 20 25 73 25 73  ING %sINDEX %s%s
1cce0 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
1ccf0 20 20 20 20 7a 4d 73 67 2c 20 28 28 66 6c 61 67      zMsg, ((flag
1cd00 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1cd10 4c 59 29 20 3f 20 22 43 4f 56 45 52 49 4e 47 20  LY) ? "COVERING 
1cd20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20  " : ""),.       
1cd30 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75          pLoop->u
1cd40 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a  .btree.pIndex->z
1cd50 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20  Name, zWhere);. 
1cd60 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1cd70 65 65 28 64 62 2c 20 7a 57 68 65 72 65 29 3b 0a  ee(db, zWhere);.
1cd80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1cd90 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1cda0 29 21 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26  )!=0 && (flags &
1cdb0 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
1cdc0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  T)!=0 ){.      z
1cdd0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
1cde0 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
1cdf0 22 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45  "%s USING INTEGE
1ce00 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20  R PRIMARY KEY", 
1ce10 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66  zMsg);..      if
1ce20 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43  ( flags&(WHERE_C
1ce30 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43  OLUMN_EQ|WHERE_C
1ce40 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20  OLUMN_IN) ){.   
1ce50 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1ce60 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1ce70 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
1ce80 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  =?)", zMsg);.   
1ce90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1cea0 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ags&WHERE_BOTH_L
1ceb0 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54  IMIT)==WHERE_BOT
1cec0 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  H_LIMIT ){.     
1ced0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1cee0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1cef0 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e 3f  sg, "%s (rowid>?
1cf00 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22 2c 20   AND rowid<?)", 
1cf10 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  zMsg);.      }el
1cf20 73 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45  se if( flags&WHE
1cf30 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
1cf40 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1cf50 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1cf60 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1cf70 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid>?)", zMsg);.
1cf80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cf90 41 4c 57 41 59 53 28 66 6c 61 67 73 26 57 48 45  ALWAYS(flags&WHE
1cfa0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 20 29 7b  RE_TOP_LIMIT) ){
1cfb0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
1cfc0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1cfd0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
1cfe0 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b  owid<?)", zMsg);
1cff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
1d000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d010 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1d020 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c      else if( (fl
1d030 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1d040 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
1d050 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1d060 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1d070 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55   zMsg, "%s VIRTU
1d080 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
1d090 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20  d:%s", zMsg,.   
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d0b0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1d0c0 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  Num, pLoop->u.vt
1d0d0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1d0e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7a 4d 73  }.#endif.    zMs
1d0f0 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
1d100 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
1d110 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 73  s", zMsg);.    s
1d120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d130 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
1d140 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20 69 46 72  iId, iLevel, iFr
1d150 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e  om, zMsg, P4_DYN
1d160 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
1d170 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
1d180 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76 2c 77  ainOneScan(u,v,w
1d190 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
1d1a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
1d1b0 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  PLAIN */.../*.**
1d1c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1d1d0 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
1d1e0 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c 6f  the iLevel-th lo
1d1f0 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  op in the WHERE 
1d200 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d  clause.** implem
1d210 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69 62  entation describ
1d220 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f  ed by pWInfo..*/
1d230 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
1d240 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  codeOneLoopStart
1d250 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
1d260 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70  WInfo,   /* Comp
1d270 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  lete information
1d280 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52 45   about the WHERE
1d290 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1d2a0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
1d2b0 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65 6c    /* Which level
1d2c0 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   of pWInfo->a[] 
1d2d0 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
1d2e0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
1d2f0 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69  Ready     /* Whi
1d300 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 63 75  ch tables are cu
1d310 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c  rrently availabl
1d320 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c  e */.){.  int j,
1d330 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   k;            /
1d340 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1d350 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
1d360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d370 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1d380 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
1d390 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20  int addrNxt;    
1d3a0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
1d3b0 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75   jump to continu
1d3c0 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
1d3d0 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  IN case */.  int
1d3e0 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20   omitTable;     
1d3f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20    /* True if we 
1d400 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  use the index on
1d410 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ly */.  int bRev
1d420 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d430 54 72 75 65 20 69 66 20 77 65 20 6e 65 65 64 20  True if we need 
1d440 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
1d450 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68  se order */.  Wh
1d460 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1d470 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20  ;  /* The where 
1d480 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65  level to be code
1d490 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
1d4a0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f 2a 20 54   *pLoop;    /* T
1d4b0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
1d4c0 65 63 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ect being coded 
1d4d0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
1d4e0 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
1d4f0 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
1d500 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
1d510 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
1d520 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1d540 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1d550 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
1d560 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
1d570 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1d580 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
1d590 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d5b0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1d5c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
1d5d0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1d5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d5f0 65 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 20  e prepared stmt 
1d600 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1d610 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ons */.  struct 
1d620 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
1d630 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d  abItem;  /* FROM
1d640 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69   clause term bei
1d650 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
1d660 74 20 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20  t addrBrk;      
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d680 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
1d690 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  eak out of the l
1d6a0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
1d6b0 72 43 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rCont;          
1d6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d6d0 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
1d6e0 65 20 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c  e with next cycl
1d6f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  e */.  int iRowi
1d700 64 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  dReg = 0;       
1d710 20 2f 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f   /* Rowid is sto
1d720 72 65 64 20 69 6e 20 74 68 69 73 20 72 65 67 69  red in this regi
1d730 73 74 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72  ster, if not zer
1d740 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65  o */.  int iRele
1d750 61 73 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20  aseReg = 0;     
1d760 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65   /* Temp registe
1d770 72 20 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65  r to free before
1d780 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20   returning */.  
1d790 42 69 74 6d 61 73 6b 20 6e 65 77 4e 6f 74 52 65  Bitmask newNotRe
1d7a0 61 64 79 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  ady;      /* Ret
1d7b0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1d7c0 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
1d7d0 3e 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70  >pParse;.  v = p
1d7e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1d7f0 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
1d800 57 43 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  WC;.  db = pPars
1d810 65 2d 3e 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20  e->db;.  pLevel 
1d820 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65  = &pWInfo->a[iLe
1d830 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  vel];.  pLoop = 
1d840 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1d850 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57    pTabItem = &pW
1d860 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1d870 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
1d880 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49  ;.  iCur = pTabI
1d890 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1d8a0 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
1d8b0 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
1d8c0 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
1d8d0 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
1d8e0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1d8f0 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
1d900 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1d910 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1d920 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
1d930 30 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  0;.  VdbeNoopCom
1d940 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
1d950 4a 6f 69 6e 20 4c 6f 6f 70 20 25 64 22 2c 20 69  Join Loop %d", i
1d960 4c 65 76 65 6c 29 29 3b 0a 0a 20 20 2f 2a 20 43  Level));..  /* C
1d970 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72  reate labels for
1d980 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64   the "break" and
1d990 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74   "continue" inst
1d9a0 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f  ructions.  ** fo
1d9b0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
1d9c0 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64 64  op.  Jump to add
1d9d0 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75  rBrk to break ou
1d9e0 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a  t of a loop..  *
1d9f0 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74  * Jump to cont t
1da00 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  o go immediately
1da10 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65   to the next ite
1da20 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  ration of the.  
1da30 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20  ** loop..  **.  
1da40 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69 73  ** When there is
1da50 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c   an IN operator,
1da60 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61 20   we also have a 
1da70 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 20  "addrNxt" label 
1da80 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20  that.  ** means 
1da90 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
1daa0 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61 6c   the next IN val
1dab0 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  ue combination. 
1dac0 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65   When.  ** there
1dad0 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61   are no IN opera
1dae0 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  tors in the cons
1daf0 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61 64  traints, the "ad
1db00 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a  drNxt" label.  *
1db10 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
1db20 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f   "addrBrk"..  */
1db30 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c 65  .  addrBrk = pLe
1db40 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70  vel->addrBrk = p
1db50 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
1db60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1db70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64 72  Label(v);.  addr
1db80 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  Cont = pLevel->a
1db90 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
1dba0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1dbb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1dbc0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
1dbd0 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  ble of a LEFT OU
1dbe0 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61  TER JOIN, alloca
1dbf0 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74  te and.  ** init
1dc00 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20  ialize a memory 
1dc10 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64  cell that record
1dc20 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  s if this table 
1dc30 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a  matches any.  **
1dc40 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
1dc50 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
1dc60 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
1dc70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
1dc80 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a  & (pTabItem[0].j
1dc90 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
1dca0 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65  T)!=0 ){.    pLe
1dcb0 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
1dcc0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1dcd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dce0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1dcf0 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  eger, 0, pLevel-
1dd00 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20  >iLeftJoin);.   
1dd10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1dd20 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e   "init LEFT JOIN
1dd30 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22 29   no-match flag")
1dd40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  );.  }..  /* Spe
1dd50 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 46  cial case of a F
1dd60 52 4f 4d 20 63 6c 61 75 73 65 20 73 75 62 71 75  ROM clause subqu
1dd70 65 72 79 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ery implemented 
1dd80 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
1dd90 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 49 74 65  */.  if( pTabIte
1dda0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
1ddb0 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69  ){.    int regYi
1ddc0 65 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  eld = pTabItem->
1ddd0 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 73  regReturn;.    s
1dde0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ddf0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1de00 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69  pTabItem->addrFi
1de10 6c 6c 53 75 62 2d 31 2c 20 72 65 67 59 69 65 6c  llSub-1, regYiel
1de20 64 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  d);.    pLevel->
1de30 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62  p2 =  sqlite3Vdb
1de40 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
1de50 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  eld, regYield);.
1de60 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1de70 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
1de80 20 63 6f 2d 72 6f 75 74 69 6e 65 20 25 73 22 2c   co-routine %s",
1de90 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
1dea0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
1deb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dec0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 59 69 65  v, OP_If, regYie
1ded0 6c 64 2b 31 2c 20 61 64 64 72 42 72 6b 29 3b 0a  ld+1, addrBrk);.
1dee0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1def0 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
1df00 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
1df10 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1df20 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
1df30 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1df40 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1df50 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
1df60 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
1df70 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
1df80 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
1df90 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
1dfa0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1dfb0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1dfc0 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
1dfd0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
1dfe0 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
1dff0 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
1e000 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
1e010 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1e020 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
1e030 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
1e040 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1e050 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
1e060 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1e070 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
1e080 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1e090 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1e0a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1e0b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1e0c0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
1e0d0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
1e0e0 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
1e0f0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1e100 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1e110 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e120 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
1e130 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1e140 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e150 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
1e160 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1e170 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1e180 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1e190 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1e1a0 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1e1b0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1e1c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e1d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e1e0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1e1f0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1e200 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1e210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e230 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e240 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1e250 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
1e260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e270 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1e280 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
1e290 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
1e2a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e2b0 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
1e2c0 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
1e2d0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e2f0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1e300 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
1e310 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1e320 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1e330 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
1e340 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1e350 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e   pLoop->u.vtab.n
1e360 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
1e370 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e   for(j=0; j<nCon
1e380 73 74 72 61 69 6e 74 20 26 26 20 6a 3c 31 36 3b  straint && j<16;
1e390 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1e3a0 20 28 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e   (pLoop->u.vtab.
1e3b0 6f 6d 69 74 4d 61 73 6b 3e 3e 6a 29 26 31 20 29  omitMask>>j)&1 )
1e3c0 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c  {.        disabl
1e3d0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4c  eTerm(pLevel, pL
1e3e0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 29 3b  oop->aLTerm[j]);
1e3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e400 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1e410 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c  OP_VNext;.    pL
1e420 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1e430 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1e440 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1e450 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1e460 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1e470 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1e480 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69   iReg, nConstrai
1e490 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  nt+2);.    sqlit
1e4a0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1e4b0 50 61 72 73 65 2c 20 31 29 3b 0a 20 20 7d 65 6c  Parse, 1);.  }el
1e4c0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1e4d0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1e4e0 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20  TABLE */..  if( 
1e4f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1e500 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30 0a  & WHERE_IPK)!=0.
1e510 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
1e520 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 43  Flags & (WHERE_C
1e530 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43  OLUMN_IN|WHERE_C
1e540 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a 20 20  OLUMN_EQ))!=0.  
1e550 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 32  ){.    /* Case 2
1e560 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
1e570 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
1e580 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
1e590 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  an.    **       
1e5a0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
1e5b0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
1e5c0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
1e5d0 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   Or.    **      
1e5e0 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65      we reference
1e5f0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75   multiple rows u
1e600 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e  sing a "rowid IN
1e610 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20   (...)".    **  
1e620 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63          construc
1e630 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1e640 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
1e650 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b 0a 20  tree.nEq==1 );. 
1e660 20 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d     iReleaseReg =
1e670 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1e680 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
1e690 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1e6a0 4c 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73  LTerm[0];.    as
1e6b0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1e6c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1e6d0 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
1e6e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
1e6f0 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
1e700 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1e710 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
1e720 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
1e730 69 52 6f 77 69 64 52 65 67 20 3d 20 63 6f 64 65  iRowidReg = code
1e740 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61  EqualityTerm(pPa
1e750 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76  rse, pTerm, pLev
1e760 65 6c 2c 20 30 2c 20 62 52 65 76 2c 20 69 52 65  el, 0, bRev, iRe
1e770 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61  leaseReg);.    a
1e780 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d  ddrNxt = pLevel-
1e790 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71  >addrNxt;.    sq
1e7a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e7b0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
1e7c0 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72   iRowidReg, addr
1e7d0 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Nxt);.    sqlite
1e7e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1e7f0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
1e800 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77  r, addrNxt, iRow
1e810 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69  idReg);.    sqli
1e820 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1e830 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1e840 65 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 31 29  e, iRowidReg, 1)
1e850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1e860 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
1e870 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
1e880 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
1e890 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
1e8a0 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
1e8b0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
1e8c0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 6f    }else if( (pLo
1e8d0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e8e0 45 52 45 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20  ERE_IPK)!=0.    
1e8f0 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
1e900 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1e910 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30  COLUMN_RANGE)!=0
1e920 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  .  ){.    /* Cas
1e930 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61 6e  e 3:  We have an
1e940 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70   inequality comp
1e950 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
1e960 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a  he ROWID field..
1e970 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74      */.    int t
1e980 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
1e990 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a  .    int start;.
1e9a0 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61      int memEndVa
1e9b0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57 68 65  lue = 0;.    Whe
1e9c0 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20  reTerm *pStart, 
1e9d0 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65  *pEnd;..    asse
1e9e0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
1e9f0 20 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20   );.    j = 0;. 
1ea00 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64     pStart = pEnd
1ea10 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1ea20 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1ea30 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
1ea40 20 70 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d   pStart = pLoop-
1ea50 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1ea60 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1ea70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
1ea80 5f 4c 49 4d 49 54 20 29 20 70 45 6e 64 20 3d 20  _LIMIT ) pEnd = 
1ea90 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1eaa0 2b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +];.    assert( 
1eab0 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
1eac0 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1ead0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70 54  bRev ){.      pT
1eae0 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20 20  erm = pStart;.  
1eaf0 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45 6e      pStart = pEn
1eb00 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  d;.      pEnd = 
1eb10 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  pTerm;.    }.   
1eb20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1eb30 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1eb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1eb50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
1eb60 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73 74  t defines the st
1eb70 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  art bound */.   
1eb80 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d 70     int r1, rTemp
1eb90 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  ;        /* Regi
1eba0 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
1ebb0 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e  g the start boun
1ebc0 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  dary */..      /
1ebd0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1ebe0 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54 4b  constant maps TK
1ebf0 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20 63  _xx codes into c
1ec00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20  orresponding .  
1ec10 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f      ** seek opco
1ec20 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64 73  des.  It depends
1ec30 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1ec40 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f   ordering of TK_
1ec50 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  xx.      */.    
1ec60 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65    const u8 aMove
1ec70 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
1ec80 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20      /* TK_GT */ 
1ec90 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20   OP_SeekGt,.    
1eca0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20         /* TK_LE 
1ecb0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20  */  OP_SeekLe,. 
1ecc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1ecd0 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74  LT */  OP_SeekLt
1ece0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
1ecf0 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_GE */  OP_See
1ed00 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  kGe.      };.   
1ed10 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
1ed20 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20  ==TK_GT+1 );    
1ed30 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1ed40 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f  he ordering.. */
1ed50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1ed60 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
1ed70 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66        /*  ... of
1ed80 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75 65   the TK_xx value
1ed90 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  s... */.      as
1eda0 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
1edb0 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+3 );      /* 
1edc0 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63 74   ... is correcct
1edd0 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  . */..      asse
1ede0 72 74 28 20 28 70 53 74 61 72 74 2d 3e 77 74 46  rt( (pStart->wtF
1edf0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
1ee00 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  L)==0 );.      t
1ee10 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1ee20 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1ee30 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20  VIRTUAL );.     
1ee40 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45   pX = pStart->pE
1ee50 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
1ee60 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20  t( pX!=0 );.    
1ee70 20 20 74 65 73 74 63 61 73 65 28 20 70 53 74 61    testcase( pSta
1ee80 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rt->leftCursor!=
1ee90 69 43 75 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73  iCur ); /* trans
1eea0 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74  itive constraint
1eeb0 73 20 2a 2f 0a 20 20 20 20 20 20 72 31 20 3d 20  s */.      r1 = 
1eec0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eed0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
1eee0 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
1eef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ef00 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
1ef10 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
1ef20 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1ef30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1ef40 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1ef50 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1ef60 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1ef70 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1ef80 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
1ef90 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1efa0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
1efb0 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
1efc0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1efd0 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
1efe0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1eff0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1f000 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1f010 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
1f020 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
1f030 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
1f040 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1f050 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
1f060 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1f070 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
1f080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1f090 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1f0a0 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1f0b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f0c0 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
1f0d0 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72  r!=iCur ); /* Tr
1f0e0 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1f0f0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ints */.      te
1f100 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1f110 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f120 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65  TUAL );.      me
1f130 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1f140 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1f150 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f160 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1f170 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1f180 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1f190 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1f1a0 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1f1b0 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1f1c0 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1f1d0 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1f1e0 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1f1f0 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1f200 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1f210 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1f220 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1f230 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1f240 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1f250 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1f260 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1f270 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1f280 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1f290 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1f2a0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1f2b0 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
1f2c0 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1f2d0 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
1f2e0 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1f2f0 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1f300 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1f310 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1f320 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1f330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
1f350 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52  d, iCur, iRowidR
1f360 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1f370 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
1f380 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
1f390 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
1f3a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f3b0 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70  AddOp3(v, testOp
1f3c0 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61  , memEndValue, a
1f3d0 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65  ddrBrk, iRowidRe
1f3e0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f3f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1f400 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
1f410 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d  RIC | SQLITE_JUM
1f420 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  PIFNULL);.    }.
1f430 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f    }else if( pLoo
1f440 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1f450 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20  RE_INDEXED ){.  
1f460 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 41 20 73    /* Case 4: A s
1f470 63 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64  can using an ind
1f480 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
1f490 2a 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48  *         The WH
1f4a0 45 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63  ERE clause may c
1f4b0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
1f4c0 6f 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20  ore equality .  
1f4d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72    **         ter
1f4e0 6d 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22  ms ("==" or "IN"
1f4f0 20 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74   operators) that
1f500 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a   refer to the N.
1f510 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
1f520 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  eft-most columns
1f530 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
1f540 74 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  t may also conta
1f550 69 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  in.    **       
1f560 20 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e    inequality con
1f570 73 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20  straints (>, <, 
1f580 3e 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65  >= or <=) on the
1f590 20 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20   indexed.    ** 
1f5a0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74          column t
1f5b0 68 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hat immediately 
1f5c0 66 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71  follows the N eq
1f5d0 75 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a  ualities. Only .
1f5e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f5f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f  he right-most co
1f600 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
1f610 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
1f620 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a  rest must.    **
1f630 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
1f640 20 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f   "==" and "IN" o
1f650 70 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78  perators. For ex
1f660 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20  ample, if the . 
1f670 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e     **         in
1f680 64 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a  dex is on (x,y,z
1f690 29 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  ), then the foll
1f6a0 6f 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72  owing clauses ar
1f6b0 65 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20  e all .    **   
1f6c0 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a        optimized:
1f6d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f6e0 20 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20            x=5.  
1f6f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f700 78 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20  x=5 AND y=10.   
1f710 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1f720 3d 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20  =5 AND y<10.    
1f730 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1f740 35 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c  5 AND y>5 AND y<
1f750 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1f760 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35       x=5 AND y=5
1f770 20 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a   AND z<=10.    *
1f780 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1f790 20 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f   The z<10 term o
1f7a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1f7b0 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
1f7c0 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  only.    **     
1f7d0 20 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d      the x=5 term
1f7e0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1f7f0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1f800 4e 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20  ND z<10.    **. 
1f810 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20     **         N 
1f820 6d 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74  may be zero if t
1f830 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c  here are inequal
1f840 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
1f850 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f860 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1f870 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f880 72 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69  raints, then N i
1f890 73 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  s at.    **     
1f8a0 20 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20      least one.. 
1f8b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f8c0 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69       This case i
1f8d0 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
1f8e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
1f8f0 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ERE clause.    *
1f900 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72  *         constr
1f910 61 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64  aints but an ind
1f920 65 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61  ex is selected a
1f930 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a  nyway, in order.
1f940 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
1f950 6f 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70  o force the outp
1f960 75 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66  ut order to conf
1f970 6f 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20  orm to an ORDER 
1f980 42 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20  BY..    */  .   
1f990 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1f9a0 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a   aStartOp[] = {.
1f9b0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30        0,.      0
1f9c0 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e  ,.      OP_Rewin
1f9d0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1f9e0 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  2: (!start_const
1f9f0 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1fa00 71 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a  q &&  !bRev) */.
1fa10 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20        OP_Last,  
1fa20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1fa30 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61   (!start_constra
1fa40 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20  ints && startEq 
1fa50 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20  &&   bRev) */.  
1fa60 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20      OP_SeekGt,  
1fa70 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28           /* 4: (
1fa80 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1fa90 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1faa0 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  & !bRev) */.    
1fab0 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20    OP_SeekLt,    
1fac0 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74         /* 5: (st
1fad0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1fae0 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20   && !startEq && 
1faf0 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20   bRev) */.      
1fb00 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20  OP_SeekGe,      
1fb10 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72       /* 6: (star
1fb20 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1fb30 26 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62  &  startEq && !b
1fb40 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1fb50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20  _SeekLe         
1fb60 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f     /* 7: (start_
1fb70 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1fb80 20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65   startEq &&  bRe
1fb90 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  v) */.    };.   
1fba0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1fbb0 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20   aEndOp[] = {.  
1fbc0 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20      OP_Noop,    
1fbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28           /* 0: (
1fbe0 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  !end_constraints
1fbf0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1fc00 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
1fc10 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 1: (end_const
1fc20 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29  raints && !bRev)
1fc30 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
1fc40 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  LT             /
1fc50 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 2: (end_constr
1fc60 61 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a  aints && bRev) *
1fc70 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  /.    };.    int
1fc80 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1fc90 62 74 72 65 65 2e 6e 45 71 3b 20 20 2f 2a 20 4e  btree.nEq;  /* N
1fca0 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
1fcb0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69  N terms */.    i
1fcc0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
1fcd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
1fce0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f   If this is an o
1fcf0 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20  ptimized SELECT 
1fd00 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20  min(x).. */.    
1fd10 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd30 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f  Base register ho
1fd40 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74  lding constraint
1fd50 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
1fd60 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fd80 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  emp register */.
1fd90 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1fda0 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20  RangeStart = 0; 
1fdb0 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
1fdc0 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
1fdd0 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20  ge start */.    
1fde0 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67  WhereTerm *pRang
1fdf0 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  eEnd = 0;    /* 
1fe00 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  Inequality const
1fe10 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65  raint at range e
1fe20 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74  nd */.    int st
1fe30 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20  artEq;          
1fe40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fe50 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73  f range start us
1fe60 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1fe70 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71  */.    int endEq
1fe80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fe90 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
1fea0 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d  ange end uses ==
1feb0 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
1fec0 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73    int start_cons
1fed0 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f  traints;       /
1fee0 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65  * Start of range
1fef0 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1ff00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  */.    int nCons
1ff10 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20  traint;         
1ff20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ff30 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1ff40 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
1ff50 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
1ff60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1ff70 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
1ff80 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
1ff90 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20 20  IdxCur;         
1ffa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1ffb0 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
1ffc0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
1ffd0 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20  int nExtraReg = 
1ffe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1fff0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
20000 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65 64  registers needed
20010 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b 20   */.    int op; 
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74       /* Instruct
20040 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ion opcode */.  
20050 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41 66    char *zStartAf
20060 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
20070 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 73  * Affinity for s
20080 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  tart of range co
20090 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
200a0 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20 20  char *zEndAff;  
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
200c0 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e 64  Affinity for end
200d0 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
200e0 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49 64  aint */..    pId
200f0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
20100 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  ee.pIndex;.    i
20110 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
20120 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 2f  >iIdxCur;..    /
20130 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
20140 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
20150 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
20160 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
20170 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
20180 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20190 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
201a0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
201b0 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
201c0 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
201d0 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
201e0 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
201f0 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
20200 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
20210 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
20220 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
20230 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
20240 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
20250 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
20260 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
20270 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
20280 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
20290 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
202a0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
202b0 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
202c0 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
202d0 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
202e0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
202f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
20300 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
20310 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
20320 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26  _MIN)!=0.     &&
20330 20 28 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74   (pWInfo->bOBSat
20340 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 70 49  !=0).     && (pI
20350 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
20360 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
20370 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
20380 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
20390 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
203a0 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
203b0 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
203c0 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
203d0 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
203e0 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
203f0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
20400 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
20410 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
20420 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
20430 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
20440 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
20450 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
20460 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
20470 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69    j = nEq;.    i
20480 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20490 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
204a0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
204b0 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f 6f 70  ngeStart = pLoop
204c0 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20  ->aLTerm[j++];. 
204d0 20 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d       nExtraReg =
204e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
204f0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
20500 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
20510 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
20520 67 65 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61  geEnd = pLoop->a
20530 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20  LTerm[j++];.    
20540 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
20550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
20560 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
20570 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
20580 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
20590 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
205a0 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
205b0 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
205c0 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
205d0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
205e0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
205f0 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
20600 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
20610 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
20620 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70 4c  yTerms(pParse,pL
20630 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72 61  evel,bRev,nExtra
20640 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29 3b  Reg,&zStartAff);
20650 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20 73  .    zEndAff = s
20660 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
20670 62 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20  b, zStartAff);. 
20680 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
20690 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
206a0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
206b0 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
206c0 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
206d0 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
206e0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
206f0 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
20700 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
20710 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
20720 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
20730 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
20740 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
20750 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
20760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20770 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  (nEq<pIdx->nColu
20780 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  mn && bRev==(pId
20790 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
207a0 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
207b0 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
207c0 76 20 26 26 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  v && pIdx->nColu
207d0 6d 6e 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  mn==nEq).    ){.
207e0 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
207f0 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
20800 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
20810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74  .    }..    test
20820 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20830 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
20840 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
20850 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
20860 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
20870 53 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65  Start && (pRange
20880 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
20890 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a   & WO_GE)!=0 );.
208a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
208b0 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e  angeEnd && (pRan
208c0 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
208d0 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a   & WO_LE)!=0 );.
208e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
208f0 61 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e  angeEnd && (pRan
20900 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
20910 20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a   & WO_GE)!=0 );.
20920 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70      startEq = !p
20930 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52  RangeStart || pR
20940 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72  angeStart->eOper
20950 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
20960 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20  _GE);.    endEq 
20970 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c  =   !pRangeEnd |
20980 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70  | pRangeEnd->eOp
20990 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c  erator & (WO_LE|
209a0 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72  WO_GE);.    star
209b0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
209c0 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e  pRangeStart || n
209d0 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Eq>0;..    /* Se
209e0 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  ek the index cur
209f0 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  sor to the start
20a00 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a   of the range. *
20a10 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
20a20 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
20a30 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a   pRangeStart ){.
20a40 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
20a50 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74  ht = pRangeStart
20a60 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
20a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20a80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
20a90 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e  Right, regBase+n
20aa0 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Eq);.      if( (
20ab0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
20ac0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
20ad0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  L)==0 ){.       
20ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20af0 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52  IsNullJump(v, pR
20b00 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
20b10 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
20b20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
20b30 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20  StartAff ){.    
20b40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
20b50 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
20b60 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
20b70 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
20b80 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
20b90 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
20ba0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
20bb0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
20bc0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
20bd0 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
20be0 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
20bf0 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
20c00 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
20c10 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
20c20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
20c30 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
20c40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  */.          zSt
20c50 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
20c60 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
20c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c80 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
20c90 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
20ca0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53  hange(pRight, zS
20cb0 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b  tartAff[nEq]) ){
20cc0 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
20cd0 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
20ce0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
20d00 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
20d10 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
20d20 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
20d30 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
20d40 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
20d50 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69 6e   }else if( isMin
20d60 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 73  Query ){.      s
20d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20d80 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
20d90 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
20da0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
20db0 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
20dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
20dd0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
20de0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
20df0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
20e00 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
20e10 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 53 74  nConstraint, zSt
20e20 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
20e30 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
20e40 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
20e50 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
20e60 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
20e70 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
20e80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20e90 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20 20  =OP_Rewind );.  
20ea0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20eb0 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20 74  OP_Last );.    t
20ec0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20ed0 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74 65  SeekGt );.    te
20ee0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
20ef0 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65 73  eekGe );.    tes
20f00 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
20f10 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73 74  ekLe );.    test
20f20 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
20f30 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  kLt );.    sqlit
20f40 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
20f50 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
20f60 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65  addrNxt, regBase
20f70 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  , nConstraint);.
20f80 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
20f90 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 69   value for the i
20fa0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
20fb0 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  aint at the end 
20fc0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 61  of the.    ** ra
20fd0 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a 20 20  nge (if any)..  
20fe0 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72    */.    nConstr
20ff0 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20  aint = nEq;.    
21000 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20 29 7b  if( pRangeEnd ){
21010 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
21020 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d  ght = pRangeEnd-
21030 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
21040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21050 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
21060 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  rse, regBase+nEq
21070 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
21080 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
21090 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  se, pRight, regB
210a0 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
210b0 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e  if( (pRangeEnd->
210c0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
210d0 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NULL)==0 ){.    
210e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
210f0 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c  odeIsNullJump(v,
21100 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65   pRight, regBase
21110 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
21120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21130 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20 20 20  ( zEndAff ){.   
21140 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21150 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
21160 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b  pRight, zEndAff[
21170 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
21180 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
21190 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
211a0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
211b0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
211c0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
211d0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
211e0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
211f0 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
21200 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
21210 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
21220 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
21230 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
21240 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e 64  /.          zEnd
21250 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
21260 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
21270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21280 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
21290 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
212a0 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41  ge(pRight, zEndA
212b0 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20  ff[nEq]) ){.    
212c0 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45        zEndAff[nE
212d0 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
212e0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
212f0 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20        }  .      
21300 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
21310 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
21320 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64 41 66  e, nEq+1, zEndAf
21330 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  f);.      nConst
21340 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74  raint++;.      t
21350 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
21360 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
21370 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
21380 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
21390 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
213a0 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
213b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 6e 64  3DbFree(db, zEnd
213c0 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
213d0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
213e0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
213f0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
21400 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
21410 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
21420 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
21430 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
21440 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
21450 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45  . */.    op = aE
21460 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
21470 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
21480 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63  Rev)];.    testc
21490 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
214a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
214b0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
214c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
214d0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
214e0 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e      if( op!=OP_N
214f0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
21500 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
21510 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
21520 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
21530 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
21540 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21550 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 65  dbeChangeP5(v, e
21560 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a 30 29  ndEq!=bRev ?1:0)
21570 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21580 49 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 65  If there are ine
21590 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
215a0 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61 74 20  nts, check that 
215b0 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
215c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
215d0 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 69 6e  lumn that the in
215e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72 61 69  equality contrai
215f0 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  ns is not NULL..
21600 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
21610 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
21620 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
21630 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  he loop..    */.
21640 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
21650 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
21660 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  e);.    testcase
21670 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
21680 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
21690 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
216a0 73 65 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  se( pLoop->wsFla
216b0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
216c0 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
216d0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
216e0 26 20 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  & (WHERE_BTM_LIM
216f0 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
21700 49 54 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IT))!=0 ){.     
21710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21720 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
21730 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72   iIdxCur, nEq, r
21740 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
21750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21760 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64  P_IsNull, r1, ad
21770 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  drCont);.    }. 
21780 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
21790 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
217a0 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   r1);..    /* Se
217b0 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ek the table cur
217c0 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64  sor, if required
217d0 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54   */.    disableT
217e0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
217f0 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69  geStart);.    di
21800 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
21810 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20  , pRangeEnd);.  
21820 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
21830 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
21840 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
21850 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
21860 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
21870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21880 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
21890 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
218a0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
218b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
218c0 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
218d0 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
218e0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
218f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21900 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
21910 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
21920 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
21930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
21940 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75  ecord the instru
21950 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65  ction used to te
21960 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
21970 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a  . Disable .    *
21980 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
21990 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64  erms made redund
219a0 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78  ant by the index
219b0 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20   range scan..   
219c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f   */.    if( pLoo
219d0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
219e0 52 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20  RE_ONEROW ){.   
219f0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21a00 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c  OP_Noop;.    }el
21a10 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20  se if( bRev ){. 
21a20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
21a30 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d  = OP_Prev;.    }
21a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
21a50 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74  el->op = OP_Next
21a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
21a70 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
21a80 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  ;.    if( (pLoop
21a90 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21aa0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 3d 3d 30  E_CONSTRAINT)==0
21ab0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
21ac0 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
21ad0 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
21ae0 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65 6c 73  N_STEP;.    }els
21af0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
21b00 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29   pLevel->p5==0 )
21b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
21b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21b30 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
21b40 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 6f 6f 70  TION.  if( pLoop
21b50 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
21b60 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
21b70 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 77    /* Case 5:  Tw
21b80 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
21b90 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65 72  tely indexed ter
21ba0 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ms connected by 
21bb0 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  OR.    **.    **
21bc0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
21bd0 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21be0 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c   TABLE t1(a,b,c,
21bf0 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  d);.    **   CRE
21c00 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
21c10 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20 20  t1(a);.    **   
21c20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20  CREATE INDEX i2 
21c30 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a 2a  ON t1(b);.    **
21c40 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
21c50 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20 20  i3 ON t1(c);.   
21c60 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
21c70 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
21c80 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20 4f  ERE a=5 OR b=7 O
21c90 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31 33  R (c=11 AND d=13
21ca0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
21cb0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c 20  In the example, 
21cc0 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  there are three 
21cd0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
21ce0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a 20  nnected by OR.. 
21cf0 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f 66     ** The top of
21d00 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20   the loop looks 
21d10 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
21d20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
21d30 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
21d50 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
21d60 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 0a  in reg 1.    **.
21d70 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72      ** Then, for
21d80 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74 65   each indexed te
21d90 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm, the followin
21da0 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73  g. The arguments
21db0 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53 65   to.    ** RowSe
21dc0 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20 74  tTest are such t
21dd0 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f 66  hat the rowid of
21de0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
21df0 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20 20   is inserted.   
21e00 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f 77   ** into the Row
21e10 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61 6c  Set. If it is al
21e20 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20 63  ready present, c
21e30 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68 65  ontrol skips the
21e40 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f 70  .    ** Gosub op
21e50 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20 73  code and jumps s
21e60 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20 63  traight to the c
21e70 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
21e80 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20 20   WhereEnd()..   
21e90 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
21ea0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65    sqlite3WhereBe
21eb0 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20 20  gin(<term>).    
21ec0 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77 53  **          RowS
21ed0 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20 20  etTest          
21ee0 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72 74          # Insert
21ef0 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77 73   rowid into rows
21f00 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  et.    **       
21f10 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32 20     Gosub      2 
21f20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  A.    **        
21f30 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
21f40 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
21f50 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61 62  Following the ab
21f60 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65 72  ove, code to ter
21f70 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
21f80 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74 61   Label A, the ta
21f90 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  rget.    ** of t
21fa0 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c 20  he Gosub above, 
21fb0 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e 73  jumps to the ins
21fc0 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20 61  truction right a
21fd0 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a 20  fter the Goto.. 
21fe0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21ff0 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20        Null      
22000 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
22010 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77    # Zero the row
22020 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20  set in reg 1.   
22030 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 74   **          Got
22040 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20 20  o       B       
22050 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20 6c           # The l
22060 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64 2e  oop is finished.
22070 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
22080 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f       A: <loop bo
22090 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  dy>             
220a0 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61 74      # Return dat
220b0 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20 20  a, whatever..   
220c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
220d0 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20 32      Return     2
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74  # Jump back to t
22100 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a 0a  he Gosub.    **.
22110 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a 20      **       B: 
22120 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 3e  <after the loop>
22130 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20  .    **.    */. 
22140 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
22150 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65  pOrWc;    /* The
22160 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65   OR-clause broke
22170 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65  n out into subte
22180 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  rms */.    SrcLi
22190 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20  st *pOrTab;     
221a0 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74    /* Shortened t
221b0 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d  able list or OR-
221c0 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f  clause generatio
221d0 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
221e0 70 43 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20  pCov = 0;       
221f0 20 20 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69        /* Potenti
22200 61 6c 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  al covering inde
22210 78 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  x (or NULL) */. 
22220 20 20 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d     int iCovCur =
22230 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
22240 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
22250 20 66 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73   for index scans
22260 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20   (if any) */..  
22270 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20    int regReturn 
22280 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22290 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
222a0 65 67 69 73 74 65 72 20 75 73 65 64 20 77 69 74  egister used wit
222b0 68 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20  h OP_Gosub */.  
222c0 20 20 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20    int regRowset 
222d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
222e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
222f0 65 67 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53  egister for RowS
22300 65 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  et object */.   
22310 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
22320 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22340 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
22350 6f 77 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  owid */.    int 
22360 69 4c 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69  iLoopBody = sqli
22370 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
22380 28 76 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  (v);  /* Start o
22390 66 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20  f loop body */. 
223a0 20 20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b     int iRetInit;
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
223d0 41 64 64 72 65 73 73 20 6f 66 20 72 65 67 52 65  Address of regRe
223e0 74 75 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20  turn init */.   
223f0 20 69 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72   int untestedTer
22400 6d 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ms = 0;         
22410 20 20 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d      /* Some term
22420 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
22430 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69   tested */.    i
22440 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22470 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a 70  r */.    Expr *p
22480 41 6e 64 45 78 70 72 20 3d 20 30 3b 20 20 20 20  AndExpr = 0;    
22490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
224a0 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e 2e 29 22  n ".. AND (...)"
224b0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
224c0 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
224d0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
224e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
224f0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
22500 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
22510 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 20 29 3b  rator & WO_OR );
22520 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
22530 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
22540 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29  ERM_ORINFO)!=0 )
22550 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70  ;.    pOrWc = &p
22560 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
22570 3e 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  >wc;.    pLevel-
22580 3e 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b  >op = OP_Return;
22590 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
225a0 3d 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20  = regReturn;..  
225b0 20 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65    /* Set up a ne
225c0 77 20 53 72 63 4c 69 73 74 20 69 6e 20 70 4f 72  w SrcList in pOr
225d0 54 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  Tab containing t
225e0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73  he table being s
225f0 63 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79  canned.    ** by
22600 20 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68   this loop in th
22610 65 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20  e a[0] slot and 
22620 61 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62  all notReady tab
22630 6c 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c  les in a[1..] sl
22640 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  ots..    ** This
22650 20 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63   becomes the Src
22660 4c 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75  List in the recu
22670 72 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71  rsive call to sq
22680 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
22690 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
226a0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
226b0 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >1 ){.      int 
226c0 6e 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20  nNotReady;      
226d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
226e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52  e number of notR
226f0 65 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20  eady tables */. 
22700 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
22710 69 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72  ist_item *origSr
22720 63 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  c;     /* Origin
22730 61 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65  al list of table
22740 73 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52  s */.      nNotR
22750 65 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  eady = pWInfo->n
22760 4c 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d  Level - iLevel -
22770 20 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62   1;.      pOrTab
22780 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41   = sqlite3StackA
22790 6c 6c 6f 63 52 61 77 28 64 62 2c 0a 20 20 20 20  llocRaw(db,.    
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
227c0 70 4f 72 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61  pOrTab)+ nNotRea
227d0 64 79 2a 73 69 7a 65 6f 66 28 70 4f 72 54 61 62  dy*sizeof(pOrTab
227e0 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20  ->a[0]));.      
227f0 69 66 28 20 70 4f 72 54 61 62 3d 3d 30 20 29 20  if( pOrTab==0 ) 
22800 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
22810 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e  .      pOrTab->n
22820 41 6c 6c 6f 63 20 3d 20 28 75 38 29 28 6e 4e 6f  Alloc = (u8)(nNo
22830 74 52 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20  tReady + 1);.   
22840 20 20 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20     pOrTab->nSrc 
22850 3d 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63  = pOrTab->nAlloc
22860 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
22870 4f 72 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74  OrTab->a, pTabIt
22880 65 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62  em, sizeof(*pTab
22890 49 74 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72  Item));.      or
228a0 69 67 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e  igSrc = pWInfo->
228b0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pTabList->a;.   
228c0 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e     for(k=1; k<=n
228d0 4e 6f 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a  NotReady; k++){.
228e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
228f0 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f  pOrTab->a[k], &o
22900 72 69 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d  rigSrc[pLevel[k]
22910 2e 69 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28  .iFrom], sizeof(
22920 70 4f 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a  pOrTab->a[k]));.
22930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
22940 65 7b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  e{.      pOrTab 
22950 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
22960 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  st;.    }..    /
22970 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
22980 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65 72   rowset register
22990 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c   to contain NULL
229a0 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73  . An SQL NULL is
229b0 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c   .    ** equival
229c0 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ent to an empty 
229d0 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  rowset..    **. 
229e0 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69     ** Also initi
229f0 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20  alize regReturn 
22a00 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61  to contain the a
22a10 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
22a20 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a  struction .    *
22a30 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
22a40 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52  llowing the OP_R
22a50 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74  eturn at the bot
22a60 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  tom of the loop.
22a70 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
22a80 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66 65  required in a fe
22a90 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a  w obscure LEFT J
22aa0 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65 20  OIN cases where 
22ab0 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20  control jumps.  
22ac0 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f    ** over the to
22ad0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e  p of the loop in
22ae0 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69  to the body of i
22af0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
22b00 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72  the .    ** corr
22b10 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72  ect response for
22b20 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70   the end-of-loop
22b30 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65   code (the OP_Re
22b40 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20  turn) is to .   
22b50 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   ** fall through
22b60 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
22b70 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61  truction, just a
22b80 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65  s an OP_Next doe
22b90 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s if.    ** call
22ba0 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
22bb0 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20  alized cursor.. 
22bc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
22bd0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
22be0 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
22bf0 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
22c00 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
22c10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
22c20 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
22c30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22c40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22c50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
22c60 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
22c70 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
22c80 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
22c90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
22ca0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
22cb0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
22cc0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
22cd0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
22ce0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
22cf0 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
22d00 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
22d10 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
22d20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
22d30 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
22d40 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
22d50 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
22d60 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
22d70 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
22d80 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
22d90 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
22da0 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
22db0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
22dc0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
22dd0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
22de0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22df0 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
22e00 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
22e10 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
22e20 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
22e30 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
22e40 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
22e50 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
22e60 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
22e70 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
22e80 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
22e90 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
22ea0 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
22eb0 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
22ec0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
22ed0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
22ee0 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
22ef0 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
22f00 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
22f10 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
22f20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
22f30 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
22f40 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
22f50 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
22f60 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
22f70 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
22f80 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
22f90 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
22fa0 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
22fb0 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
22fc0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
22fd0 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
22fe0 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
22ff0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
23000 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
23010 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
23020 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
23030 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
23040 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
23050 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
23060 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23070 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
23080 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
23090 20 20 20 20 20 20 20 20 69 66 28 20 70 57 43 2d          if( pWC-
230a0 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67  >a[iTerm].wtFlag
230b0 73 20 26 20 28 54 45 52 4d 5f 4f 52 49 4e 46 4f  s & (TERM_ORINFO
230c0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
230d0 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
230e0 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74  a[iTerm].eOperat
230f0 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20  or & WO_ALL)==0 
23100 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23110 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
23120 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
23130 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
23140 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
23150 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
23160 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
23170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23180 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
23190 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
231a0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
231b0 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20  pParse, TK_AND, 
231c0 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b  0, pAndExpr, 0);
231d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
231e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
231f0 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69  <pOrWc->nTerm; i
23200 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
23210 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d  eTerm *pOrTerm =
23220 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a   &pOrWc->a[ii];.
23230 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
23240 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
23250 43 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d  Cur || (pOrTerm-
23260 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
23270 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
23280 20 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53     WhereInfo *pS
23290 75 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  ubWInfo;        
232a0 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
232b0 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
232c0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
232d0 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
232e0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
232f0 20 20 20 20 20 69 66 28 20 70 41 6e 64 45 78 70       if( pAndExp
23300 72 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  r && !ExprHasPro
23310 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c 20 45  perty(pOrExpr, E
23320 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
23330 20 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70           pAndExp
23340 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72 45 78  r->pLeft = pOrEx
23350 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  pr;.          pO
23360 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78 70 72  rExpr = pAndExpr
23370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23380 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
23390 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
233a0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
233b0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
233c0 20 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20        pSubWInfo 
233d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
233e0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54  gin(pParse, pOrT
233f0 61 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20  ab, pOrExpr, 0, 
23400 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
23410 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
23420 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
23430 20 7c 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e 4c   | WHERE_AND_ONL
23440 59 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y |.            
23450 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
23460 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c 20  E_FORCE_TABLE | 
23470 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
23480 4e 4c 59 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20  NLY, iCovCur);. 
23490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
234a0 53 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72  SubWInfo || pPar
234b0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
234c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
234d0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
234e0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
234f0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53     WhereLoop *pS
23500 75 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  ubLoop;.        
23510 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e    explainOneScan
23520 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
23530 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
23540 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
23550 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
23560 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
23570 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
23580 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
23590 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
235a0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
235b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
235c0 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
235d0 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
235e0 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
235f0 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
23600 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
23610 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
23620 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
23630 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
23640 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29      regRowid, 0)
23680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
23690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
236a0 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54  nt(v, OP_RowSetT
236b0 65 73 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a  est, regRowset,.
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
236f0 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 2c  entAddr(v)+2, r,
23700 20 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20   iSet);.        
23710 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
23720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
23730 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
23740 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64  Return, iLoopBod
23750 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  y);..          /
23760 2a 20 54 68 65 20 70 53 75 62 57 49 6e 66 6f 2d  * The pSubWInfo-
23770 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 66  >untestedTerms f
23780 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 74  lag means that t
23790 68 69 73 20 4f 52 20 74 65 72 6d 0a 20 20 20 20  his OR term.    
237a0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
237b0 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41  ed one or more A
237c0 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e  ND term from a n
237d0 6f 74 52 65 61 64 79 20 74 61 62 6c 65 2e 20 20  otReady table.  
237e0 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
237f0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
23800 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 20 63  notReady table c
23810 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 65 73 74  ould not be test
23820 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20  ed and will.    
23830 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
23840 20 62 65 20 74 65 73 74 65 64 20 6c 61 74 65 72   be tested later
23850 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23860 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
23870 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
23880 54 65 72 6d 73 20 29 20 75 6e 74 65 73 74 65 64  Terms ) untested
23890 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20  Terms = 1;..    
238a0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
238b0 6f 66 20 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63  of the OR-connec
238c0 74 65 64 20 74 65 72 6d 73 20 61 72 65 20 6f 70  ted terms are op
238d0 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 74 68  timized using th
238e0 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
238f0 20 2a 2a 20 69 6e 64 65 78 2c 20 61 6e 64 20 74   ** index, and t
23900 68 65 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  he index is open
23910 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
23920 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  e cursor number.
23930 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
23940 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c  each call to sql
23950 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
23960 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 6c 6f   made by this lo
23970 6f 70 2c 20 69 74 20 6d 61 79 0a 20 20 20 20 20  op, it may.     
23980 20 20 20 20 20 2a 2a 20 62 65 20 70 6f 73 73 69       ** be possi
23990 62 6c 65 20 74 6f 20 75 73 65 20 74 68 61 74 20  ble to use that 
239a0 69 6e 64 65 78 20 61 73 20 61 20 63 6f 76 65 72  index as a cover
239b0 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ing index..     
239c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
239d0 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
239e0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
239f0 42 65 67 69 6e 28 29 20 61 62 6f 76 65 20 72 65  Begin() above re
23a00 73 75 6c 74 65 64 20 69 6e 20 61 20 73 63 61 6e  sulted in a scan
23a10 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
23a20 2a 2a 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  ** uses an index
23a30 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 65 69  , and this is ei
23a40 74 68 65 72 20 74 68 65 20 66 69 72 73 74 20 4f  ther the first O
23a50 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  R-connected term
23a60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
23a70 6f 63 65 73 73 65 64 20 6f 72 20 74 68 65 20 69  ocessed or the i
23a80 6e 64 65 78 20 69 73 20 74 68 65 20 73 61 6d 65  ndex is the same
23a90 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
23aa0 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 0a 20 20   all previous.  
23ab0 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
23ac0 2c 20 73 65 74 20 70 43 6f 76 20 74 6f 20 74 68  , set pCov to th
23ad0 65 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65  e candidate cove
23ae0 72 69 6e 67 20 69 6e 64 65 78 2e 20 4f 74 68 65  ring index. Othe
23af0 72 77 69 73 65 2c 20 73 65 74 20 0a 20 20 20 20  rwise, set .    
23b00 20 20 20 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f        ** pCov to
23b10 20 4e 55 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74   NULL to indicat
23b20 65 20 74 68 61 74 20 6e 6f 20 63 61 6e 64 69 64  e that no candid
23b30 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  ate covering ind
23b40 65 78 20 77 69 6c 6c 20 0a 20 20 20 20 20 20 20  ex will .       
23b50 20 20 20 2a 2a 20 62 65 20 61 76 61 69 6c 61 62     ** be availab
23b60 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
23b70 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 4c  .          pSubL
23b80 6f 6f 70 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d  oop = pSubWInfo-
23b90 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  >a[0].pWLoop;.  
23ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23bb0 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61  (pSubLoop->wsFla
23bc0 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
23bd0 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20  INDEX)==0 );.   
23be0 20 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62         if( (pSub
23bf0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
23c00 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
23c10 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
23c20 28 69 69 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f  (ii==0 || pSubLo
23c30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
23c40 65 78 3d 3d 70 43 6f 76 29 0a 20 20 20 20 20 20  ex==pCov).      
23c50 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23c60 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
23c70 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49 64 78 43  Info->a[0].iIdxC
23c80 75 72 3d 3d 69 43 6f 76 43 75 72 20 29 3b 0a 20  ur==iCovCur );. 
23c90 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 76 20             pCov 
23ca0 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  = pSubLoop->u.bt
23cb0 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
23cc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23cd0 20 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20           pCov = 
23ce0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  0;.          }..
23cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
23d00 69 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72  ish the loop thr
23d10 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69  ough table entri
23d20 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65  es that match te
23d30 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20  rm pOrTerm. */. 
23d40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d50 57 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e  WhereEnd(pSubWIn
23d60 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fo);.        }. 
23d70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23d80 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69   pLevel->u.pCovi
23d90 64 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69  dx = pCov;.    i
23da0 66 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c  f( pCov ) pLevel
23db0 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76  ->iIdxCur = iCov
23dc0 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e  Cur;.    if( pAn
23dd0 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  dExpr ){.      p
23de0 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  AndExpr->pLeft =
23df0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
23e00 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
23e10 70 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d  pAndExpr);.    }
23e20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23e30 43 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74  ChangeP1(v, iRet
23e40 49 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  Init, sqlite3Vdb
23e50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
23e60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23e70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
23e80 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61  to, 0, pLevel->a
23e90 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c  ddrBrk);.    sql
23ea0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
23eb0 61 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64  abel(v, iLoopBod
23ec0 79 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49  y);..    if( pWI
23ed0 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20  nfo->nLevel>1 ) 
23ee0 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
23ef0 28 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20  (db, pOrTab);.  
23f00 20 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54    if( !untestedT
23f10 65 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65  erms ) disableTe
23f20 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
23f30 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
23f40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23f50 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
23f60 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
23f70 43 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69  Case 6:  There i
23f80 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
23f90 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
23fa0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
23fb0 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
23fc0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
23fd0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
23fe0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
23ff0 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
24000 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
24010 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
24020 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
24030 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
24040 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
24050 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
24060 76 3d 3d 31 20 29 3b 0a 20 20 20 20 70 4c 65 76  v==1 );.    pLev
24070 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62  el->op = aStep[b
24080 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Rev];.    pLevel
24090 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20  ->p1 = iCur;.   
240a0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20   pLevel->p2 = 1 
240b0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
240c0 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52  Op2(v, aStart[bR
240d0 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ev], iCur, addrB
240e0 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  rk);.    pLevel-
240f0 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d  >p5 = SQLITE_STM
24100 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
24110 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 65 77  _STEP;.  }.  new
24120 4e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74 52 65  NotReady = notRe
24130 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b 28 26  ady & ~getMask(&
24140 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
24150 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49  , iCur);..  /* I
24160 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
24170 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
24180 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
24190 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
241a0 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
241b0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
241c0 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
241d0 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  /.  for(pTerm=pW
241e0 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65  C->a, j=pWC->nTe
241f0 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
24200 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
24210 20 2a 70 45 3b 0a 20 20 20 20 74 65 73 74 63 61   *pE;.    testca
24220 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
24230 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
24240 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
24250 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
24260 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29  s & TERM_CODED )
24270 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
24280 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
24290 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
242a0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
242b0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
242c0 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 65 77  >prereqAll & new
242d0 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  NotReady)!=0 ){.
242e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
242f0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
24300 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
24310 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
24320 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
24330 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
24340 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
24350 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
24360 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
24370 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24380 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
24390 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
243a0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
243b0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
243c0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
243d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
243e0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
243f0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
24400 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24410 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24420 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f  arse, pE, addrCo
24430 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
24440 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72  FNULL);.    pTer
24450 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
24460 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20  RM_CODED;.  }.. 
24470 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
24480 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c  to test for impl
24490 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ied constraints 
244a0 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74  based on transit
244b0 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68  ivity.  ** of th
244c0 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e  e "==" operator.
244d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
244e0 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45 52 45  le: If the WHERE
244f0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
24500 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64   "t1.a=t2.b" and
24510 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a   "t2.b=123".  **
24520 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69   and we are codi
24530 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61  ng the t1 loop a
24540 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68  nd the t2 loop h
24550 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64  as not yet coded
24560 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63  ,.  ** then we c
24570 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74  annot use the "t
24580 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72  1.a=t2.b" constr
24590 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e  aint, but we can
245a0 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69   code.  ** the i
245b0 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33  mplied "t1.a=123
245c0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  " constraint..  
245d0 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
245e0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
245f0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
24600 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
24610 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20  r *pE, *pEAlt;. 
24620 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41     WhereTerm *pA
24630 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  lt;.    if( pTer
24640 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  m->wtFlags & (TE
24650 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
24660 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
24670 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
24680 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f  ->eOperator!=(WO
24690 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20  _EQUIV|WO_EQ) ) 
246a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
246b0 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
246c0 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  sor!=iCur ) cont
246d0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c  inue;.    if( pL
246e0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
246f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24700 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pE = pTerm->pExp
24710 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  r;.    assert( !
24720 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24730 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
24740 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24750 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
24760 67 68 74 20 26 20 6e 65 77 4e 6f 74 52 65 61 64  ght & newNotRead
24770 79 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c  y)!=0 );.    pAl
24780 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
24790 2c 20 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75  , iCur, pTerm->u
247a0 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74  .leftColumn, not
247b0 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f  Ready, WO_EQ|WO_
247c0 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  IN, 0);.    if( 
247d0 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pAlt==0 ) contin
247e0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74  ue;.    if( pAlt
247f0 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
24800 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
24810 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  nue;.    testcas
24820 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
24830 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
24840 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c 74    testcase( pAlt
24850 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
24860 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4e  _IN );.    VdbeN
24870 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
24880 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65  begin transitive
24890 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a   constraint"));.
248a0 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69      pEAlt = sqli
248b0 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
248c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41  (db, sizeof(*pEA
248d0 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45  lt));.    if( pE
248e0 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  Alt ){.      *pE
248f0 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78  Alt = *pAlt->pEx
24900 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d  pr;.      pEAlt-
24910 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65  >pLeft = pE->pLe
24920 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ft;.      sqlite
24930 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
24940 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72  rse, pEAlt, addr
24950 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
24960 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
24970 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
24980 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20  (db, pEAlt);.   
24990 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72   }.  }..  /* For
249a0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
249b0 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
249c0 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
249d0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
249e0 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  .  ** at least o
249f0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
24a00 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
24a10 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
24a20 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  able.  .  */.  i
24a30 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
24a40 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76  Join ){.    pLev
24a50 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20  el->addrFirst = 
24a60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
24a70 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
24a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24a90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
24aa0 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
24ab0 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
24ac0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f  omment((v, "reco
24ad0 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
24ae0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
24af0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
24b00 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28  Parse);.    for(
24b10 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
24b20 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; j<pWC->nTerm;
24b30 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
24b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24b50 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
24b60 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
24b70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24b80 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
24b90 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
24ba0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
24bb0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
24bc0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
24bd0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
24be0 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
24bf0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e  m->prereqAll & n
24c00 65 77 4e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ewNotReady)!=0 )
24c10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
24c20 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
24c30 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
24c40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24c50 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24c60 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
24c70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24c80 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
24c90 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
24ca0 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
24cb0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
24cc0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
24cd0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
24ce0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
24cf0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24d00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
24d10 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72  eleaseReg);..  r
24d20 65 74 75 72 6e 20 6e 65 77 4e 6f 74 52 65 61 64  eturn newNotRead
24d30 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  y;.}..#ifdef WHE
24d40 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
24d50 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
24d60 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
24d70 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
24d80 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
24d90 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
24da0 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
24db0 2c 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c  , SrcList *pTabL
24dc0 69 73 74 29 7b 0a 20 20 69 6e 74 20 6e 62 20 3d  ist){.  int nb =
24dd0 20 31 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53   1+(pTabList->nS
24de0 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63  rc+7)/8;.  struc
24df0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24e00 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74  pItem = pTabList
24e10 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20  ->a + p->iTab;. 
24e20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
24e30 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71  Item->pTab;.  sq
24e40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
24e50 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25  ("%c%2d.%0*llx.%
24e60 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a  0*llx", p->cId,.
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62       p->iTab, nb
24e90 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e  , p->maskSelf, n
24ea0 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20  b, p->prereq);. 
24eb0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24ec0 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20  ntf(" %12s",.   
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ee0 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
24ef0 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
24f00 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  : pTab->zName);.
24f10 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
24f20 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
24f30 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
24f40 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65    if( p->u.btree
24f50 2e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  .pIndex ){.     
24f60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
24f70 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e  me = p->u.btree.
24f80 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20  pIndex->zName;. 
24f90 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
24fa0 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 69 70 6b  0 ) zName = "ipk
24fb0 22 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ";.      if( str
24fc0 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ncmp(zName, "sql
24fd0 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
24fe0 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   17)==0 ){.     
24ff0 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74     int i = sqlit
25000 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
25010 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77  ) - 1;.        w
25020 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d  hile( zName[i]!=
25030 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20  '_' ) i--;.     
25040 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20     zName += i;. 
25050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
25060 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25070 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e  ".%-16s %2d", zN
25080 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e  ame, p->u.btree.
25090 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nEq);.    }else{
250a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
250b0 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73 22  bugPrintf("%20s"
250c0 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ,"");.    }.  }e
250d0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
250e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76  ;.    if( p->u.v
250f0 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20  tab.idxStr ){.  
25100 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
25110 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25  mprintf("(%d,\"%
25120 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20  s\",%x)",.      
25130 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76            p->u.v
25140 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
25150 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d  .vtab.idxStr, p-
25160 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
25170 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25180 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
25190 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29  mprintf("(%d,%x)
251a0 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  ", p->u.vtab.idx
251b0 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Num, p->u.vtab.o
251c0 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  mitMask);.    }.
251d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
251e0 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c  Printf(" %-19s",
251f0 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   z);.    sqlite3
25200 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20  _free(z);.  }.  
25210 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
25220 74 66 28 22 20 66 20 25 30 34 78 20 4e 20 25 64  tf(" f %04x N %d
25230 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
25240 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 73 71 6c  ->nLTerm);.  sql
25250 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
25260 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c  " cost %d,%d,%d\
25270 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70  n", p->rSetup, p
25280 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29  ->rRun, p->nOut)
25290 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
252a0 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d  * Convert bulk m
252b0 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c  emory into a val
252c0 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  id WhereLoop tha
252d0 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a  t can be passed.
252e0 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43  ** to whereLoopC
252f0 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e  lear harmlessly.
25300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25310 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68  whereLoopInit(Wh
25320 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70  ereLoop *p){.  p
25330 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c  ->aLTerm = p->aL
25340 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e  TermSpace;.  p->
25350 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d  nLTerm = 0;.  p-
25360 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53  >nLSlot = ArrayS
25370 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61  ize(p->aLTermSpa
25380 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67  ce);.  p->wsFlag
25390 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s = 0;.}../*.** 
253a0 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c  Clear the WhereL
253b0 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65  oop.u union.  Le
253c0 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c  ave WhereLoop.pL
253d0 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a  Term intact..*/.
253e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
253f0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
25400 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
25410 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66  reLoop *p){.  if
25420 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  ( p->wsFlags & (
25430 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
25440 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e  LE|WHERE_AUTO_IN
25450 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20  DEX) ){.    if( 
25460 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
25470 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
25480 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61  )!=0 && p->u.vta
25490 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
254a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
254b0 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  (p->u.vtab.idxSt
254c0 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76  r);.      p->u.v
254d0 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
254e0 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61  ;.      p->u.vta
254f0 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  b.idxStr = 0;.  
25500 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
25510 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25520 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26  AUTO_INDEX)!=0 &
25530 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  & p->u.btree.pIn
25540 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
25550 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25560 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  , p->u.btree.pIn
25570 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  dex->zColAff);. 
25580 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
25590 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
255a0 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  e.pIndex);.     
255b0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
255c0 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
255d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  }.}../*.** Deall
255e0 6f 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d  ocate internal m
255f0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20  emory used by a 
25600 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
25610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25620 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73  whereLoopClear(s
25630 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25640 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
25650 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61   p->aLTerm!=p->a
25660 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c  LTermSpace ) sql
25670 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25680 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65  ->aLTerm);.  whe
25690 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
256a0 28 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65  (db, p);.  where
256b0 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a  LoopInit(p);.}..
256c0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  /*.** Increase t
256d0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
256e0 74 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e  tion for pLoop->
256f0 61 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61  aLTerm[] to be a
25700 74 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74  t least n..*/.st
25710 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
25720 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
25730 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
25740 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68  *p, int n){.  Wh
25750 65 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b  ereTerm **paNew;
25760 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74  .  if( p->nLSlot
25770 3e 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=n ) return SQL
25780 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e  ITE_OK;.  n = (n
25790 2b 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20  +7)&~7;.  paNew 
257a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
257b0 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
257c0 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29  p->aLTerm[0])*n)
257d0 3b 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30  ;.  if( paNew==0
257e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
257f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
25800 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
25810 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
25820 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
25830 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
25840 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
25850 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
25860 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
25870 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20  m);.  p->aLTerm 
25880 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c  = paNew;.  p->nL
25890 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75  Slot = n;.  retu
258a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
258b0 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
258c0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
258d0 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e   second pLoop in
258e0 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f  to the first..*/
258f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
25900 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65  eLoopXfer(sqlite
25910 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70  3 *db, WhereLoop
25920 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70   *pTo, WhereLoop
25930 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
25940 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
25950 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e  db, pTo, pFrom->
25960 6e 4c 54 65 72 6d 29 20 29 20 72 65 74 75 72 6e  nLTerm) ) return
25970 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25980 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
25990 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20  nion(db, pTo);. 
259a0 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
259b0 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
259c0 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
259d0 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
259e0 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
259f0 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
25a00 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
25a10 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
25a20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25a30 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
25a40 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
25a50 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
25a60 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
25a70 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
25a80 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
25a90 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
25aa0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
25ab0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
25ac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25ad0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
25ae0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
25af0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
25b00 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
25b10 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
25b20 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
25b30 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
25b40 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
25b50 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
25b60 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
25b70 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
25b80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
25b90 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
25ba0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
25bb0 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
25bc0 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
25bd0 6f 29 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43  o) ){.    whereC
25be0 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e  lauseClear(&pWIn
25bf0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68  fo->sWC);.    wh
25c00 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f  ile( pWInfo->pLo
25c10 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65  ops ){.      Whe
25c20 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e  reLoop *p = pWIn
25c30 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20  fo->pLoops;.    
25c40 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73    pWInfo->pLoops
25c50 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b   = p->pNextLoop;
25c60 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
25c70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
25c80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25c90 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  DbFree(db, pWInf
25ca0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
25cb0 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c 61   Insert or repla
25cc0 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 65  ce a WhereLoop e
25cd0 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20 74  ntry using the t
25ce0 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65 64  emplate supplied
25cf0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74  ..**.** An exist
25d00 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  ing WhereLoop en
25d10 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76 65  try might be ove
25d20 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20  rwritten if the 
25d30 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20  new template.** 
25d40 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68 61  is better and ha
25d50 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  s fewer dependen
25d60 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74 65  cies.  Or the te
25d70 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20 69  mplate will be i
25d80 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e 6f  gnored.** and no
25d90 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63 63   insert will occ
25da0 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ur if an existin
25db0 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 66  g WhereLoop is f
25dc0 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a 2a  aster and has.**
25dd0 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63   fewer dependenc
25de0 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65 6d  ies than the tem
25df0 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69 73  plate.  Otherwis
25e00 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f 6f  e a new WhereLoo
25e10 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62 61  p is.** added ba
25e20 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70 6c  sed on the templ
25e30 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ate..**.** If pB
25e40 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
25e50 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
25e60 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
25e70 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70  ut only the.** p
25e80 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64  rerequisites and
25e90 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63   rRun and nOut c
25ea0 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65  osts of the N be
25eb0 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a  st loops.  That.
25ec0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ** information i
25ed0 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68  s gathered in th
25ee0 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  e pBuilder->pOrS
25ef0 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
25f00 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63   special.** proc
25f10 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  essing mode is u
25f20 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20  sed only for OR 
25f30 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
25f40 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  g..**.** When ac
25f50 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
25f60 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
25f70 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
25f80 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20   is NULL) we.** 
25f90 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72  still might over
25fa0 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f  write similar lo
25fb0 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77  ops with the new
25fc0 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65   template if the
25fd0 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 20 69 73 20  .** template is 
25fe0 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
25ff0 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
26000 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
26010 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
26020 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
26030 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
26040 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
26050 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
26060 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
26070 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
26080 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
26090 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
260a0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
260b0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
260c0 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
260d0 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
260e0 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
260f0 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
26100 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
26110 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65 20 74  **    (5)  The t
26120 65 6d 70 6c 61 74 65 20 75 73 65 73 20 6d 6f 72  emplate uses mor
26130 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 73  e terms of the s
26140 61 6d 65 20 69 6e 64 65 78 20 62 75 74 20 68 61  ame index but ha
26150 73 20 6e 6f 20 61 64 64 69 74 69 6f 6e 61 6c 0a  s no additional.
26160 2a 2a 20 20 20 20 20 20 20 20 20 64 65 70 65 6e  **         depen
26170 64 65 6e 63 69 65 73 20 20 20 20 20 20 20 20 20  dencies         
26180 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
26190 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
261a0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
261b0 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
261c0 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
261d0 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
261e0 2a 70 70 50 72 65 76 2c 20 2a 70 2c 20 2a 70 4e  *ppPrev, *p, *pN
261f0 65 78 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65  ext = 0;.  Where
26200 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
26210 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
26220 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26230 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
26240 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42  >db;..  /* If pB
26250 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
26260 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
26270 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
26280 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a  of the costs.  *
26290 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20  * and prereqs.. 
262a0 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
262b0 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b  er->pOrSet!=0 ){
262c0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
262d0 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31 36 20  ENABLED.    u16 
262e0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
262f0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69 6e 74  rSet->n;.    int
26300 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20   x =.#endif.    
26310 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
26320 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
26330 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26340 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
26350 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
26380 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
26390 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
263a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
263b0 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
263c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
263d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22  3DebugPrintf(x?"
263e0 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20     or-%d:  ":"  
263f0 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20   or-X:  ", n);. 
26400 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
26410 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
26420 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29  WInfo->pTabList)
26430 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
26440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26450 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  _OK;.  }..  /* S
26460 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
26470 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
26480 74 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f 72  to overwrite, or
26490 20 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20 2a   which takes.  *
264a0 2a 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20  * priority over 
264b0 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a  pTemplate..  */.
264c0 20 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70 57    for(ppPrev=&pW
264d0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 3d  Info->pLoops, p=
264e0 2a 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50 72  *ppPrev; p; ppPr
264f0 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
26500 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
26510 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
26520 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
26530 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
26540 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
26550 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
26560 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
26570 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
26580 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
26590 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
265a0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
265b0 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
265c0 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
265d0 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
265e0 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
265f0 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
26600 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
26610 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
26620 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
26630 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
26640 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
26650 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
26660 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
26670 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
26680 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
26690 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
266a0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
266b0 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
266c0 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
266d0 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
266e0 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
266f0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
26700 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
26710 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
26720 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
26730 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
26740 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
26750 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
26760 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
26770 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
26780 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
26790 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
267a0 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
267b0 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
267c0 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
267d0 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
267e0 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
267f0 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
26800 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
26810 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
26820 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
26830 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
26840 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
26850 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
26860 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
26870 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
26880 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65  q.     && p->rSe
26890 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup<=pTemplate->
268a0 72 53 65 74 75 70 0a 20 20 20 20 20 26 26 20 70  rSetup.     && p
268b0 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
268c0 65 2d 3e 72 52 75 6e 0a 20 20 20 20 29 7b 0a 20  e->rRun.    ){. 
268d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
268e0 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e 20 70  nch taken when p
268f0 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62 65 74   is equal or bet
26900 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61  ter than pTempla
26910 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  te in .      ** 
26920 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70 65 6e  all of (1) depen
26930 64 65 6e 63 65 73 20 28 32 29 20 73 65 74 75 70  dences (2) setup
26940 2d 63 6f 73 74 2c 20 61 6e 64 20 28 33 29 20 72  -cost, and (3) r
26950 75 6e 2d 63 6f 73 74 2e 20 2a 2f 0a 20 20 20 20  un-cost. */.    
26960 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
26970 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup==pTemplate->
26980 72 53 65 74 75 70 20 29 3b 0a 20 20 20 20 20 20  rSetup );.      
26990 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54  if( p->nLTerm<pT
269a0 65 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a  emplate->nLTerm.
269b0 20 20 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73         && (p->ws
269c0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
269d0 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20  DEXED)!=0.      
269e0 20 26 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e   && (pTemplate->
269f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26a00 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
26a10 20 20 20 26 26 20 70 2d 3e 75 2e 62 74 72 65 65     && p->u.btree
26a20 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70 6c 61  .pIndex==pTempla
26a30 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  te->u.btree.pInd
26a40 65 78 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  ex.       && p->
26a50 70 72 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74  prereq==pTemplat
26a60 65 2d 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20  e->prereq.      
26a70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76  ){.        /* Ov
26a80 65 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74  erwrite an exist
26a90 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  ing WhereLoop wi
26aa0 74 68 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e  th an similar on
26ab0 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 20 20  e that uses.    
26ac0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d      ** more term
26ad0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  s of the index *
26ae0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  /.        pNext 
26af0 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
26b00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26b10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26b20 20 20 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65      /* pTemplate
26b30 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e   is not helpful.
26b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75  .        ** Retu
26b50 72 6e 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  rn without chang
26b60 69 6e 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e  ing or adding an
26b70 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  ything */.      
26b80 20 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70    goto whereLoop
26b90 49 6e 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20  Insert_noop;.   
26ba0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
26bb0 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
26bc0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
26bd0 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
26be0 72 65 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d  rereq.     && p-
26bf0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
26c00 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26 20 41  ->rRun.     && A
26c10 4c 57 41 59 53 28 70 2d 3e 72 53 65 74 75 70 3e  LWAYS(p->rSetup>
26c20 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
26c30 75 70 29 20 2f 2a 20 53 65 65 20 53 45 54 55 50  up) /* See SETUP
26c40 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
26c50 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
26c60 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 61 6e   /* Overwrite an
26c70 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
26c80 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74 74 65  oop with a bette
26c90 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61 74 20  r one: one that 
26ca0 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 74 74  is.      ** bett
26cb0 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28 31 29  er at one of (1)
26cc0 20 64 65 70 65 6e 64 65 6e 63 65 73 2c 20 28 32   dependences, (2
26cd0 29 20 73 65 74 75 70 2d 63 6f 73 74 2c 20 6f 72  ) setup-cost, or
26ce0 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20   (3) run-cost.  
26cf0 20 20 20 20 2a 2a 20 61 6e 64 20 69 73 20 6e 6f      ** and is no
26d00 20 77 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66   worse in any of
26d10 20 74 68 6f 73 65 20 63 61 74 65 67 6f 72 69 65   those categorie
26d20 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 78  s. */.      pNex
26d30 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  t = p->pNextLoop
26d40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
26d50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
26d60 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
26d70 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74  point it means t
26d80 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73  hat either p[] s
26d90 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69  hould be overwri
26da0 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70  tten.  ** with p
26db0 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b  Template[] if p[
26dc0 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20  ] exists, or if 
26dd0 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c  p==NULL then all
26de0 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  ocate a new.  **
26df0 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69   WhereLoop and i
26e00 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23  nsert it..  */.#
26e10 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
26e20 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
26e30 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
26e40 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
26e50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
26e60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26e70 22 69 6e 73 2d 64 65 6c 3a 20 20 22 29 3b 0a 20  "ins-del:  ");. 
26e80 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
26e90 69 6e 74 28 70 2c 20 70 57 49 6e 66 6f 2d 3e 70  int(p, pWInfo->p
26ea0 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  TabList);.    }.
26eb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
26ec0 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77 3a  Printf("ins-new:
26ed0 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65 4c    ");.    whereL
26ee0 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61  oopPrint(pTempla
26ef0 74 65 2c 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  te, pWInfo->pTab
26f00 4c 69 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  List);.  }.#endi
26f10 66 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  f.  if( p==0 ){.
26f20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44      p = sqlite3D
26f30 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
26f40 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
26f50 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26f60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
26f70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65  NOMEM;.    where
26f80 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 7d  LoopInit(p);.  }
26f90 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  .  whereLoopXfer
26fa0 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
26fb0 65 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  e);.  p->pNextLo
26fc0 6f 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 2a 70  op = pNext;.  *p
26fd0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 69 66 28  pPrev = p;.  if(
26fe0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
26ff0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
27000 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
27010 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
27020 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
27030 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
27040 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
27050 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
27060 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
27070 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27090 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
270a0 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73  if the insert is
270b0 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 77 68 65 72   a no-op */.wher
270c0 65 4c 6f 6f 70 49 6e 73 65 72 74 5f 6e 6f 6f 70  eLoopInsert_noop
270d0 3a 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  :.#if WHERETRACE
270e0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
270f0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
27100 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71   & 0x8 ){.    sq
27110 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27120 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a  ("ins-noop: ");.
27130 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
27140 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 57  nt(pTemplate, pW
27150 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 29 3b  Info->pTabList);
27160 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
27170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
27180 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61   .}../*.** We ha
27190 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
271a0 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
271b0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
271c0 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
271d0 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
271e0 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
271f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
27200 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
27210 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
27220 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
27230 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
27240 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
27250 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
27260 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
27270 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
27280 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
27290 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
272a0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
272b0 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
272c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
272d0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
272e0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
272f0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
27300 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
27330 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65   pSrc */.  Where
27340 43 6f 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  Cost nInMul     
27350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
27360 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
27370 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
27380 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
27390 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
273a0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
273b0 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
273c0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
273d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
273e0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
273f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
27400 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
27410 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
27420 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
27430 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
27440 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
27450 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
27460 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
27470 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
27480 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
27490 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
274a0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
274b0 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
274c0 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
274d0 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
274e0 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
274f0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27510 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
27520 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
27530 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
27540 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
27550 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
27560 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
27570 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
27580 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
27590 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
275a0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
275b0 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
275c0 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
275e0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
275f0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
27600 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f   */.  int saved_
27610 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
27620 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
27630 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
27640 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
27650 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
27660 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
27670 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27680 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
27690 6c 61 67 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  lags */.  WhereC
276a0 6f 73 74 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20  ost saved_nOut; 
276b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
276c0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
276d0 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
276e0 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
276f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27700 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
27710 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
27720 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
27730 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
27740 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27750 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72  n code */.  Wher
27760 65 43 6f 73 74 20 6e 52 6f 77 45 73 74 3b 20 20  eCost nRowEst;  
27770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
27780 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73  stimated index s
27790 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20  electivity */.  
277a0 57 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69  WhereCost rLogSi
277b0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
277c0 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
277d0 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
277e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
277f0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
27800 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
27810 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
27820 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
27830 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
27840 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
27850 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
27860 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
27870 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
27880 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27890 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
278a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
278b0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
278c0 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
278d0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
278e0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
278f0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
27900 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27910 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27920 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e  e if( pProbe->tn
27930 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e  um<=0 || (pSrc->
27940 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
27950 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70  FT)!=0 ){.    op
27960 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
27970 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
27980 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
27990 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
279a0 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
279b0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f  _ISNULL|WO_GT|WO
279c0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
279d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
279e0 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
279f0 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
27a00 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
27a10 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
27a20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27a30 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<=pProbe->nCol
27a40 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  umn );.  if( pNe
27a50 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c  w->u.btree.nEq <
27a60 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e   pProbe->nColumn
27a70 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
27a80 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
27a90 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27aa0 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  q];.    nRowEst 
27ab0 3d 20 77 68 65 72 65 43 6f 73 74 28 70 50 72 6f  = whereCost(pPro
27ac0 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b 70 4e 65  be->aiRowEst[pNe
27ad0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 31  w->u.btree.nEq+1
27ae0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77  ]);.    if( nRow
27af0 45 73 74 3d 3d 30 20 26 26 20 70 50 72 6f 62 65  Est==0 && pProbe
27b00 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
27b10 6e 65 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 31  ne ) nRowEst = 1
27b20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
27b30 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 6e 52  Col = -1;.    nR
27b40 6f 77 45 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  owEst = 0;.  }. 
27b50 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
27b60 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42  anInit(&scan, pB
27b70 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72  uilder->pWC, pSr
27b80 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  c->iCursor, iCol
27b90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27ba0 20 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b            opMask
27bb0 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76  , pProbe);.  sav
27bc0 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75  ed_nEq = pNew->u
27bd0 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61  .btree.nEq;.  sa
27be0 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
27bf0 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
27c00 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
27c10 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
27c20 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
27c30 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
27c40 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
27c50 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
27c60 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 4c 6f 67  etup = 0;.  rLog
27c70 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 77 68  Size = estLog(wh
27c80 65 72 65 43 6f 73 74 28 70 50 72 6f 62 65 2d 3e  ereCost(pProbe->
27c90 61 69 52 6f 77 45 73 74 5b 30 5d 29 29 3b 0a 20  aiRowEst[0]));. 
27ca0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
27cb0 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30  E_OK && pTerm!=0
27cc0 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53  ; pTerm = whereS
27cd0 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b  canNext(&scan)){
27ce0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  .    int nIn = 0
27cf0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
27d00 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
27d10 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
27d20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 64 65 66  continue;.#ifdef
27d30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
27d40 54 41 54 33 0a 20 20 20 20 69 66 28 20 28 70 54  TAT3.    if( (pT
27d50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
27d60 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 20 26 26  ERM_VNULL)!=0 &&
27d70 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
27d80 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20  l[iCol].notNull 
27d90 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
27da0 65 3b 20 2f 2a 20 73 6b 69 70 20 49 53 20 4e 4f  e; /* skip IS NO
27db0 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
27dc0 74 73 20 6f 6e 20 61 20 4e 4f 54 20 4e 55 4c 4c  ts on a NOT NULL
27dd0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 7d   column */.    }
27de0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 77  .#endif.    pNew
27df0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
27e00 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
27e10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
27e20 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
27e30 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
27e40 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
27e50 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
27e60 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
27e70 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
27e80 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
27e90 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c   */.    pNew->aL
27ea0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
27eb0 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m++] = pTerm;.  
27ec0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
27ed0 20 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c   (saved_prereq |
27ee0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
27ef0 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61  ght) & ~pNew->ma
27f00 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4e 65 77  skSelf;.    pNew
27f10 2d 3e 72 52 75 6e 20 3d 20 72 4c 6f 67 53 69 7a  ->rRun = rLogSiz
27f20 65 3b 20 2f 2a 20 42 61 73 65 6c 69 6e 65 20 63  e; /* Baseline c
27f30 6f 73 74 20 69 73 20 6c 6f 67 32 28 4e 29 2e 20  ost is log2(N). 
27f40 20 41 64 6a 75 73 74 6d 65 6e 74 73 20 62 65 6c   Adjustments bel
27f50 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ow */.    if( pT
27f60 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
27f70 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
27f80 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
27f90 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
27fa0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
27fb0 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
27fc0 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
27fd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
27fe0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
27ff0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
28000 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
28010 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
28020 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
28030 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
28040 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20       nIn = 46;  
28050 61 73 73 65 72 74 28 20 34 36 3d 3d 77 68 65 72  assert( 46==wher
28060 65 43 6f 73 74 28 32 35 29 20 29 3b 0a 20 20 20  eCost(25) );.   
28070 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
28080 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
28090 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70  st && pExpr->x.p
280a0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
280b0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
280c0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
280d0 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20  ...)" */.       
280e0 20 6e 49 6e 20 3d 20 77 68 65 72 65 43 6f 73 74   nIn = whereCost
280f0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
28100 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >nExpr);.      }
28110 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
28120 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  n += nIn;.      
28130 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28140 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  q++;.      pNew-
28150 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74 20  >nOut = nRowEst 
28160 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a  + nInMul + nIn;.
28170 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
28180 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28190 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20 20   (WO_EQ) ){.    
281a0 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
281b0 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
281c0 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48  E_COLUMN_NULL|WH
281d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29 21  ERE_COLUMN_IN))!
281e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
281f0 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d 3d       || nInMul==
28200 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  0 );.      pNew-
28210 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28220 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
28230 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20 0a     if( iCol<0  .
28240 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 62         || (pProb
28250 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
28260 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30  one && nInMul==0
28270 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
28280 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
28290 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  ==pProbe->nColum
282a0 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  n-1).      ){.  
282b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
282c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
282d0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d  HERE_COLUMN_IN)=
282e0 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b 0a  =0 || iCol<0 );.
282f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
28300 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  Flags |= WHERE_O
28310 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20  NEROW;.      }. 
28320 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
28330 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20 20  ee.nEq++;.      
28340 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f  pNew->nOut = nRo
28350 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a 20  wEst + nInMul;. 
28360 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65     }else if( pTe
28370 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
28380 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a 20  (WO_ISNULL) ){. 
28390 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
283a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
283b0 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70  MN_NULL;.      p
283c0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
283d0 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  ++;.      /* TUN
283e0 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65 6c  ING: IS NULL sel
283f0 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a 20  ects 2 rows */. 
28400 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20 20       nIn = 10;  
28410 61 73 73 65 72 74 28 20 31 30 3d 3d 77 68 65 72  assert( 10==wher
28420 65 43 6f 73 74 28 32 29 20 29 3b 0a 20 20 20 20  eCost(2) );.    
28430 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
28440 52 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 20  RowEst + nInMul 
28450 2b 20 6e 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  + nIn;.    }else
28460 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
28470 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57  rator & (WO_GT|W
28480 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74  O_GE) ){.      t
28490 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
284a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47  eOperator & WO_G
284b0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
284c0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
284d0 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
284e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
284f0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28500 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
28510 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _BTM_LIMIT;.    
28520 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a    pBtm = pTerm;.
28530 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a        pTop = 0;.
28540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28550 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
28560 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
28570 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
28580 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
28590 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
285a0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_LT );.      t
285b0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
285c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
285d0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
285e0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
285f0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
28600 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
28610 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
28620 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
28630 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
28640 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
28650 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
28670 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
28680 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
28690 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e 65     }.    if( pNe
286a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
286b0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
286c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
286d0 73 74 20 6e 4f 75 74 20 61 6e 64 20 72 52 75 6e  st nOut and rRun
286e0 20 66 6f 72 20 53 54 41 54 33 20 72 61 6e 67 65   for STAT3 range
286f0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20   values */.     
28700 20 57 68 65 72 65 43 6f 73 74 20 72 44 69 76 3b   WhereCost rDiv;
28710 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67  .      whereRang
28720 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
28730 20 70 50 72 6f 62 65 2c 20 70 4e 65 77 2d 3e 75   pProbe, pNew->u
28740 2e 62 74 72 65 65 2e 6e 45 71 2c 0a 20 20 20 20  .btree.nEq,.    
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20      pBtm, pTop, 
28770 26 72 44 69 76 29 3b 0a 20 20 20 20 20 20 70 4e  &rDiv);.      pN
28780 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
28790 5f 6e 4f 75 74 3e 72 44 69 76 2b 31 30 20 3f 20  _nOut>rDiv+10 ? 
287a0 73 61 76 65 64 5f 6e 4f 75 74 20 2d 20 72 44 69  saved_nOut - rDi
287b0 76 20 3a 20 31 30 3b 0a 20 20 20 20 7d 0a 23 69  v : 10;.    }.#i
287c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
287d0 4c 45 5f 53 54 41 54 33 0a 20 20 20 20 69 66 28  LE_STAT3.    if(
287e0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
287f0 45 71 3d 3d 31 20 26 26 20 70 50 72 6f 62 65 2d  Eq==1 && pProbe-
28800 3e 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 26 26  >nSample.     &&
28810 20 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e    OptimizationEn
28820 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
28830 5f 53 74 61 74 33 29 20 29 7b 0a 20 20 20 20 20  _Stat3) ){.     
28840 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20   tRowcnt nOut = 
28850 30 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  0;.      if( (pT
28860 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28870 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
28880 4c 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  L))!=0 ){.      
28890 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
288a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
288b0 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
288c0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
288d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
288e0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
288f0 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
28900 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
28910 20 70 50 72 6f 62 65 2c 20 70 54 65 72 6d 2d 3e   pProbe, pTerm->
28920 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
28930 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nOut);.      }el
28940 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  se if( (pTerm->e
28950 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
28960 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
28970 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  &  !ExprHasPrope
28980 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
28990 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
289a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
289b0 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
289c0 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65 2c 20  pParse, pProbe, 
289d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78 2e  pTerm->pExpr->x.
289e0 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  pList, &nOut);. 
289f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
28a00 65 72 74 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20  ert( nOut==0 || 
28a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28a20 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20  .      if( nOut 
28a30 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 77  ) pNew->nOut = w
28a40 68 65 72 65 43 6f 73 74 28 6e 4f 75 74 29 3b 0a  hereCost(nOut);.
28a50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28a60 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c   if( (pNew->wsFl
28a70 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44 58  ags & (WHERE_IDX
28a80 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29  _ONLY|WHERE_IPK)
28a90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
28aa0 20 45 61 63 68 20 72 6f 77 20 69 6e 76 6f 6c 76   Each row involv
28ab0 65 73 20 61 20 73 74 65 70 20 6f 66 20 74 68 65  es a step of the
28ac0 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 61 20 62   index, then a b
28ad0 69 6e 61 72 79 20 73 65 61 72 63 68 20 6f 66 0a  inary search of.
28ae0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 69        ** the mai
28af0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  n table */.     
28b00 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 20 77   pNew->rRun =  w
28b10 68 65 72 65 43 6f 73 74 41 64 64 28 70 4e 65 77  hereCostAdd(pNew
28b20 2d 3e 72 52 75 6e 2c 20 72 4c 6f 67 53 69 7a 65  ->rRun, rLogSize
28b30 3e 32 37 20 3f 20 72 4c 6f 67 53 69 7a 65 2d 31  >27 ? rLogSize-1
28b40 37 20 3a 20 31 30 29 3b 0a 20 20 20 20 7d 0a 20  7 : 10);.    }. 
28b50 20 20 20 2f 2a 20 53 74 65 70 20 63 6f 73 74 20     /* Step cost 
28b60 66 6f 72 20 65 61 63 68 20 6f 75 74 70 75 74 20  for each output 
28b70 72 6f 77 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d  row */.    pNew-
28b80 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
28b90 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
28ba0 20 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20   pNew->nOut);.  
28bb0 20 20 2f 2a 20 54 42 44 3a 20 41 64 6a 75 73 74    /* TBD: Adjust
28bc0 20 6e 4f 75 74 20 66 6f 72 20 61 64 64 69 74 69   nOut for additi
28bd0 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73  onal constraints
28be0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 68 65   */.    rc = whe
28bf0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
28c00 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
28c10 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
28c20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
28c30 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
28c40 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
28c50 2e 6e 45 71 3c 28 70 50 72 6f 62 65 2d 3e 6e 43  .nEq<(pProbe->nC
28c60 6f 6c 75 6d 6e 20 2b 20 28 70 50 72 6f 62 65 2d  olumn + (pProbe-
28c70 3e 7a 4e 61 6d 65 21 3d 30 29 29 0a 20 20 20 20  >zName!=0)).    
28c80 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  ){.      whereLo
28c90 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
28ca0 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
28cb0 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e  pProbe, nInMul+n
28cc0 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  In);.    }.  }. 
28cd0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
28ce0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
28cf0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28d00 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
28d10 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
28d20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
28d30 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
28d40 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65  aved_nOut;.  pNe
28d50 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
28d60 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 72 65 74 75  d_nLTerm;.  retu
28d70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28d80 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69  Return True if i
28d90 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
28da0 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20  at pIndex might 
28db0 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20  be useful in.** 
28dc0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
28dd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28de0 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a   in pBuilder..**
28df0 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65  .** Return False
28e00 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65   if pBuilder doe
28e10 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
28e20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28e30 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20   or.** if there 
28e40 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49  is no way for pI
28e50 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75  ndex to be usefu
28e60 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  l in implementin
28e70 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20  g that.** ORDER 
28e80 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74  BY clause..*/.st
28e90 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69  atic int indexMi
28ea0 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72  ghtHelpWithOrder
28eb0 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  By(.  WhereLoopB
28ec0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
28ed0 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ,.  Index *pInde
28ee0 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  x,.  int iCursor
28ef0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
28f00 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  pOB;.  int ii, j
28f10 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  j;..  if( pIndex
28f20 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 72  ->bUnordered ) r
28f30 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
28f40 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pOB = pBuilder->
28f50 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
28f60 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
28f70 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
28f80 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  pOB->nExpr; ii++
28f90 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
28fa0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
28fb0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42 2d  SkipCollate(pOB-
28fc0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a 20  >a[ii].pExpr);. 
28fd0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
28fe0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
28ff0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
29000 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
29010 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
29020 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e  for(jj=0; jj<pIn
29030 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 6a  dex->nColumn; jj
29040 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
29050 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
29060 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  =pIndex->aiColum
29070 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31  n[jj] ) return 1
29080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29090 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
290a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
290b0 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20  a bitmask where 
290c0 31 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  1s indicate that
290d0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
290e0 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  ng column of.** 
290f0 74 68 65 20 74 61 62 6c 65 20 69 73 20 75 73 65  the table is use
29100 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20  d by an index.  
29110 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 36  Only the first 6
29120 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f  3 columns are co
29130 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  nsidered..*/.sta
29140 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75  tic Bitmask colu
29150 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78  mnsInIndex(Index
29160 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
29170 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
29180 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
29190 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
291a0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
291b0 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
291c0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 74 65 73 74 63  mn[j];.    testc
291d0 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
291e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78  .    testcase( x
291f0 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 69  ==BMS-2 );.    i
29200 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
29210 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
29220 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
29230 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
29240 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
29250 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
29260 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
29270 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
29280 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
29290 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
292a0 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
292b0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
292c0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
292d0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
292e0 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
292f0 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
29300 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
29310 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
29320 2a 70 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d  *pTerm;.  for(i=
29330 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  0, pTerm=pWC->a;
29340 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
29350 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
29360 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
29370 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65  rImpliesExpr(pTe
29380 72 6d 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72  rm->pExpr, pWher
29390 65 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  e, iTab) ) retur
293a0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
293b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
293c0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
293d0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69  objects for a si
293e0 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68  ngle table of th
293f0 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65  e join where the
29400 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65   table.** is ide
29410 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65  nfied by pBuilde
29420 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
29430 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
29440 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a  aranteed to be.*
29450 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65  * a b-tree table
29460 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  , not a virtual 
29470 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
29480 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
29490 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c  dBtree(.  WhereL
294a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
294b0 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63  lder, /* WHERE c
294c0 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
294d0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
294e0 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
294f0 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
29500 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
29510 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
29520 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
29530 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
29540 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
29550 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
29560 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29580 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
29590 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
295a0 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20   Index sPk;     
295b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295c0 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a  A fake index obj
295d0 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ect for the prim
295e0 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 74 52 6f  ary key */.  tRo
295f0 77 63 6e 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  wcnt aiRowEstPk[
29600 32 5d 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  2];      /* The 
29610 61 69 52 6f 77 45 73 74 5b 5d 20 76 61 6c 75 65  aiRowEst[] value
29620 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
29630 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 69 43 6f  ex */.  int aiCo
29640 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20  lumnPk = -1;    
29650 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75      /* The aColu
29660 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74  mn[] value for t
29670 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a  he sPk index */.
29680 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
29690 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ist;          /*
296a0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
296b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
296c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
296d0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
296e0 61 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20  ause btree term 
296f0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72  to add */.  Wher
29700 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
29710 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c          /* Templ
29720 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ate WhereLoop ob
29730 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
29740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
29750 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29760 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  code */.  int iS
29770 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20  ortIdx = 1;     
29780 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
29790 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62  umber */.  int b
297a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
297b0 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c         /* A bool
297c0 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 57  ean value */.  W
297d0 68 65 72 65 43 6f 73 74 20 72 53 69 7a 65 3b 20  hereCost rSize; 
297e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
297f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
29800 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
29810 68 65 72 65 43 6f 73 74 20 72 4c 6f 67 53 69 7a  hereCost rLogSiz
29820 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  e;         /* Lo
29830 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e  garithm of the n
29840 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
29850 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
29860 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
29870 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
29880 68 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20  he parsed WHERE 
29890 63 6c 61 75 73 65 20 2a 2f 0a 20 20 0a 20 20 70  clause */.  .  p
298a0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
298b0 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  pNew;.  pWInfo =
298c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
298d0 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  o;.  pTabList = 
298e0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
298f0 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c  ;.  pSrc = pTabL
29900 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
29910 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  Tab;.  pWC = pBu
29920 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73  ilder->pWC;.  as
29930 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
29940 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
29950 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
29960 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
29970 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
29980 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
29990 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
299a0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
299b0 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
299c0 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
299d0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
299e0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
299f0 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
29a00 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
29a10 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
29a20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
29a30 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
29a40 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
29a50 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
29a60 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
29a70 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
29a80 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
29a90 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
29aa0 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
29ab0 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
29ac0 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
29ad0 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29af0 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
29b00 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
29b10 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
29b20 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
29b30 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
29b40 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b  sPk.nColumn = 1;
29b50 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d  .    sPk.aiColum
29b60 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b  n = &aiColumnPk;
29b70 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45 73  .    sPk.aiRowEs
29b80 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
29b90 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
29ba0 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
29bb0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
29bc0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  Src->pTab;.    a
29bd0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
29be0 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  Src->pTab->nRowE
29bf0 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74  st;.    aiRowEst
29c00 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70  Pk[1] = 1;.    p
29c10 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54  First = pSrc->pT
29c20 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
29c30 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
29c40 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
29c50 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64   /* The real ind
29c60 69 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c  ices of the tabl
29c70 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69  e are only consi
29c80 64 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20  dered if the.   
29c90 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45     ** NOT INDEXE
29ca0 44 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f  D qualifier is o
29cb0 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
29cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
29cd0 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d       sPk.pNext =
29ce0 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20   pFirst;.    }. 
29cf0 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b     pProbe = &sPk
29d00 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20  ;.  }.  rSize = 
29d10 77 68 65 72 65 43 6f 73 74 28 70 53 72 63 2d 3e  whereCost(pSrc->
29d20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 29 3b 0a  pTab->nRowEst);.
29d30 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
29d40 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
29d50 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  * Automatic inde
29d60 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 70 42  xes */.  if( !pB
29d70 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 0a 20  uilder->pOrSet. 
29d80 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
29d90 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
29da0 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
29db0 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
29dc0 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  c->pIndex==0.   
29dd0 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43 6f 72  && !pSrc->viaCor
29de0 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21 70 53  outine.   && !pS
29df0 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20  rc->notIndexed. 
29e00 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
29e10 72 72 65 6c 61 74 65 64 0a 20 20 29 7b 0a 20 20  rrelated.  ){.  
29e20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
29e30 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
29e40 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
29e50 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
29e60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
29e70 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
29e80 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
29e90 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
29ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29eb0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
29ec0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
29ed0 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
29ee0 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
29ef0 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
29f00 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
29f10 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
29f20 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
29f30 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
29f40 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
29f50 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
29f60 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
29f70 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
29f80 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
29f90 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
29fa0 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
29fb0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
29fc0 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66   One-time cost f
29fd0 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65  or computing the
29fe0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
29ff0 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   is.        ** a
2a000 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 37 2a 4e  pproximately 7*N
2a010 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
2a020 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2a030 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
2a040 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
2a050 65 69 6e 67 20 69 6e 64 65 78 65 64 2e 20 2a 2f  eing indexed. */
2a060 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2a070 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
2a080 20 2b 20 72 53 69 7a 65 20 2b 20 32 38 3b 20 20   + rSize + 28;  
2a090 61 73 73 65 72 74 28 20 32 38 3d 3d 77 68 65 72  assert( 28==wher
2a0a0 65 43 6f 73 74 28 37 29 20 29 3b 0a 20 20 20 20  eCost(7) );.    
2a0b0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
2a0c0 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  ach index lookup
2a0d0 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20   yields 20 rows 
2a0e0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  in the table.  T
2a0f0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
2a100 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  s more than the 
2a110 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31  usual guess of 1
2a120 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65  0 rows, since we
2a130 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20   have no way.   
2a140 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e       ** of known
2a150 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
2a160 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
2a170 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
2a180 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
2a190 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
2a1a0 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
2a1b0 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
2a1c0 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
2a1d0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2a1e0 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
2a1f0 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 30 29 20  ==whereCost(20) 
2a200 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a210 3e 72 52 75 6e 20 3d 20 77 68 65 72 65 43 6f 73  >rRun = whereCos
2a220 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e  tAdd(rLogSize,pN
2a230 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20  ew->nOut);.     
2a240 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2a250 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   = WHERE_AUTO_IN
2a260 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  DEX;.        pNe
2a270 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74  w->prereq = mExt
2a280 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  ra | pTerm->prer
2a290 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
2a2a0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2a2b0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2a2c0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
2a2d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
2a2e0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
2a2f0 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ices.  */.  for(
2a300 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
2a310 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62  && pProbe; pProb
2a320 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c  e=pProbe->pNext,
2a330 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20   iSortIdx++){.  
2a340 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50    if( pProbe->pP
2a350 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20  artIdxWhere!=0. 
2a360 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73 61      && !whereUsa
2a370 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
2a380 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43 2c  pNew->iTab, pWC,
2a390 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2a3a0 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20  xWhere) ){.     
2a3b0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50   continue;  /* P
2a3c0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e 61  artial index ina
2a3d0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
2a3e0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  his query */.   
2a3f0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62   }.    pNew->u.b
2a400 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20  tree.nEq = 0;.  
2a410 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
2a420 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53   0;.    pNew->iS
2a430 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  ortIdx = 0;.    
2a440 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
2a450 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2a460 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2a470 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53   pNew->nOut = rS
2a480 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ize;.    pNew->u
2a490 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
2a4a0 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20  pProbe;.    b = 
2a4b0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2a4c0 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c 64  thOrderBy(pBuild
2a4d0 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72 63  er, pProbe, pSrc
2a4e0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2a4f0 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f 44  /* The ONEPASS_D
2a500 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65 76  ESIRED flags nev
2a510 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74 68  er occurs togeth
2a520 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42 59  er with ORDER BY
2a530 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a540 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2a550 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2a560 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2a570 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  || b==0 );.    i
2a580 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2a590 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
2a5a0 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b  nteger primary k
2a5b0 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ey index */.    
2a5c0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a5d0 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20  = WHERE_IPK;..  
2a5e0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c      /* Full tabl
2a5f0 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  e scan */.      
2a600 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
2a610 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20   b ? iSortIdx : 
2a620 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  0;.      /* TUNI
2a630 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c  NG: Cost of full
2a640 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 33   table scan is 3
2a650 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e 0a  *(N + log2(N))..
2a660 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65        **  +  The
2a670 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72 20   extra 3 factor 
2a680 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65 20  is to encourage 
2a690 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65 78  the use of index
2a6a0 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20 20  ed lookups.     
2a6b0 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75 6c   **     over ful
2a6c0 6c 20 73 63 61 6e 73 2e 20 20 41 20 73 6d 61 6c  l scans.  A smal
2a6d0 6c 65 72 20 63 6f 6e 73 74 61 6e 74 20 32 20 69  ler constant 2 i
2a6e0 73 20 75 73 65 64 20 66 6f 72 20 63 6f 76 65 72  s used for cover
2a6f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ing.      **    
2a700 20 69 6e 64 65 78 20 73 63 61 6e 73 20 73 6f 20   index scans so 
2a710 74 68 61 74 20 61 20 63 6f 76 65 72 69 6e 67 20  that a covering 
2a720 69 6e 64 65 78 20 73 63 61 6e 20 77 69 6c 6c 20  index scan will 
2a730 62 65 20 66 61 76 6f 72 65 64 20 6f 76 65 72 0a  be favored over.
2a740 20 20 20 20 20 20 2a 2a 20 20 20 20 20 61 20 74        **     a t
2a750 61 62 6c 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  able scan. */.  
2a760 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2a770 20 77 68 65 72 65 43 6f 73 74 41 64 64 28 72 53   whereCostAdd(rS
2a780 69 7a 65 2c 72 4c 6f 67 53 69 7a 65 29 20 2b 20  ize,rLogSize) + 
2a790 31 36 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  16;.      rc = w
2a7a0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2a7b0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2a7c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2a7d0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
2a7e0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2a7f0 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
2a800 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64   & ~columnsInInd
2a810 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20  ex(pProbe);.    
2a820 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2a830 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52  = (m==0) ? (WHER
2a840 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
2a850 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52  _INDEXED) : WHER
2a860 45 5f 49 4e 44 45 58 45 44 3b 0a 0a 20 20 20 20  E_INDEXED;..    
2a870 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e 20 76    /* Full scan v
2a880 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ia index */.    
2a890 20 20 69 66 28 20 62 0a 20 20 20 20 20 20 20 7c    if( b.       |
2a8a0 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20  | ( m==0.       
2a8b0 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e    && pProbe->bUn
2a8c0 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2a8d0 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
2a8e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2a8f0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2a900 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
2a910 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
2a920 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
2a930 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
2a940 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
2a950 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
2a960 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
2a970 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
2a980 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
2a990 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
2a9a0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
2a9b0 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  dx : 0;.        
2a9c0 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
2a9d0 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
2a9e0 20 43 6f 73 74 20 6f 66 20 61 20 63 6f 76 65 72   Cost of a cover
2a9f0 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
2aa00 73 20 32 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29  s 2*(N + log2(N)
2aa10 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  )..          ** 
2aa20 20 2b 20 20 54 68 65 20 65 78 74 72 61 20 32 20   +  The extra 2 
2aa30 66 61 63 74 6f 72 20 69 73 20 74 6f 20 65 6e 63  factor is to enc
2aa40 6f 75 72 61 67 65 20 74 68 65 20 75 73 65 20 6f  ourage the use o
2aa50 66 20 69 6e 64 65 78 65 64 20 6c 6f 6f 6b 75 70  f indexed lookup
2aa60 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
2aa70 20 20 20 6f 76 65 72 20 69 6e 64 65 78 20 73 63     over index sc
2aa80 61 6e 73 2e 20 20 41 20 74 61 62 6c 65 20 73 63  ans.  A table sc
2aa90 61 6e 20 75 73 65 73 20 61 20 66 61 63 74 6f 72  an uses a factor
2aaa0 20 6f 66 20 33 20 73 6f 20 74 68 61 74 0a 20 20   of 3 so that.  
2aab0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2aac0 6e 64 65 78 20 73 63 61 6e 73 20 61 72 65 20 66  ndex scans are f
2aad0 61 76 6f 72 65 64 20 6f 76 65 72 20 74 61 62 6c  avored over tabl
2aae0 65 20 73 63 61 6e 73 2e 0a 20 20 20 20 20 20 20  e scans..       
2aaf0 20 20 20 2a 2a 20 20 2b 20 20 49 66 20 74 68 69     **  +  If thi
2ab00 73 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  s covering index
2ab10 20 6d 69 67 68 74 20 61 6c 73 6f 20 68 65 6c 70   might also help
2ab20 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
2ab30 45 52 20 42 59 0a 20 20 20 20 20 20 20 20 20 20  ER BY.          
2ab40 2a 2a 20 20 20 20 20 63 6c 61 75 73 65 2c 20 74  **     clause, t
2ab50 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69 73 20  hen the cost is 
2ab60 66 75 64 67 65 64 20 64 6f 77 6e 20 73 6c 69 67  fudged down slig
2ab70 68 74 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69  htly so that thi
2ab80 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  s.          **  
2ab90 20 20 20 69 6e 64 65 78 20 69 73 20 66 61 76 6f     index is favo
2aba0 72 65 64 20 61 62 6f 76 65 20 6f 74 68 65 72 20  red above other 
2abb0 69 6e 64 69 63 65 73 20 74 68 61 74 20 68 61 76  indices that hav
2abc0 65 20 6e 6f 20 68 6f 70 65 20 6f 66 0a 20 20 20  e no hope of.   
2abd0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 68 65         **     he
2abe0 6c 70 69 6e 67 20 77 69 74 68 20 74 68 65 20 4f  lping with the O
2abf0 52 44 45 52 20 42 59 2e 20 2a 2f 0a 20 20 20 20  RDER BY. */.    
2ac00 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2ac10 20 3d 20 31 30 20 2b 20 77 68 65 72 65 43 6f 73   = 10 + whereCos
2ac20 74 41 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53  tAdd(rSize,rLogS
2ac30 69 7a 65 29 20 2d 20 62 3b 0a 20 20 20 20 20 20  ize) - b;.      
2ac40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ac50 20 20 20 61 73 73 65 72 74 28 20 62 21 3d 30 20     assert( b!=0 
2ac60 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ); .          /*
2ac70 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2ac80 20 73 63 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d   scanning a non-
2ac90 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 69  covering index i
2aca0 73 20 28 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a  s (N+1)*log2(N).
2acb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69            ** whi
2acc0 63 68 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c  ch we will simpl
2acd0 69 66 79 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f  ify to just N*lo
2ace0 67 32 28 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20  g2(N) */.       
2acf0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2ad00 72 53 69 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65  rSize + rLogSize
2ad10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ad20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2ad30 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2ad40 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2ad50 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2ad60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ad70 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2ad80 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2ad90 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20  pBuilder, pSrc, 
2ada0 70 50 72 6f 62 65 2c 20 30 29 3b 0a 0a 20 20 20  pProbe, 0);..   
2adb0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
2adc0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
2add0 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79  lause, then only
2ade0 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20   that one index 
2adf0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  is.    ** consid
2ae00 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ered. */.    if(
2ae10 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20   pSrc->pIndex ) 
2ae20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2ae30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
2ae40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2ae50 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
2ae60 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
2ae70 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
2ae80 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
2ae90 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
2aea0 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
2aeb0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
2aec0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
2aed0 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
2aee0 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  tual table..*/.s
2aef0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2af00 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20  oopAddVirtual(. 
2af10 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
2af20 72 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a  r *pBuilder   /*
2af30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2af40 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  formation */.){.
2af50 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2af60 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
2af70 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
2af80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
2af90 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
2afa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2afb0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2afc0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
2afd0 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20  se *pWC;        
2afe0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2aff0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2b000 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2b010 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65   *pSrc;   /* The
2b020 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2b030 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
2b040 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2b050 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
2b060 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
2b070 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
2b080 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2b090 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
2b0a0 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
2b0b0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2b0c0 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
2b0d0 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
2b0e0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2b0f0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
2b100 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a   iTerm, mxTerm;.
2b110 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
2b120 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20  t;.  int seenIn 
2b130 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b140 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2b150 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  IN operator is s
2b160 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  een */.  int see
2b170 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nVar = 0;       
2b180 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2b190 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20   a non-constant 
2b1a0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65  constraint is se
2b1b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61  en */.  int iPha
2b1c0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2b1d0 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74       /* 0: const
2b1e0 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73   w/o IN, 1: cons
2b1f0 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a  t, 2: no IN,  2:
2b200 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f   IN */.  WhereLo
2b210 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  op *pNew;.  int 
2b220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b230 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
2b240 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2b250 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2b260 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
2b270 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57  pParse->db;.  pW
2b280 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
2b290 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  C;.  pNew = pBui
2b2a0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53  lder->pNew;.  pS
2b2b0 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54  rc = &pWInfo->pT
2b2c0 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e  abList->a[pNew->
2b2d0 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20  iTab];.  pTab = 
2b2e0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73  pSrc->pTab;.  as
2b2f0 73 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28  sert( IsVirtual(
2b300 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49  pTab) );.  pIdxI
2b310 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e  nfo = allocateIn
2b320 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  dexInfo(pParse, 
2b330 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c  pWC, pSrc, pBuil
2b340 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  der->pOrderBy);.
2b350 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
2b360 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2b370 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d  E_NOMEM;.  pNew-
2b380 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70  >prereq = 0;.  p
2b390 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2b3a0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
2b3b0 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
2b3c0 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
2b3d0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
2b3e0 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2b3f0 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65  ee = 0;.  pUsage
2b400 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
2b410 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
2b420 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
2b430 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
2b440 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72  aint;.  if( wher
2b450 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
2b460 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  pNew, nConstrain
2b470 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
2b480 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78  3DbFree(db, pIdx
2b490 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  Info);.    retur
2b4a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2b4b0 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73    }..  for(iPhas
2b4c0 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20  e=0; iPhase<=3; 
2b4d0 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69  iPhase++){.    i
2b4e0 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69  f( !seenIn && (i
2b4f0 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20  Phase&1)!=0 ){. 
2b500 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20       iPhase++;. 
2b510 20 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e       if( iPhase>
2b520 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  3 ) break;.    }
2b530 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61  .    if( !seenVa
2b540 72 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20  r && iPhase>1 ) 
2b550 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43  break;.    pIdxC
2b560 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
2b570 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2b580 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
2b590 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2b5a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2b5b0 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
2b5c0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
2b5d0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
2b5e0 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
2b5f0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
2b600 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
2b610 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63  [j];.      switc
2b620 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20  h( iPhase ){.   
2b630 20 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20       case 0:    
2b640 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
2b650 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72  hout IN operator
2b660 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
2b670 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2b680 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2b690 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2b6a0 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2b6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b6c0 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eenIn = 1;.     
2b6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b6e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
2b6f0 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20  eqRight!=0 ){.  
2b700 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61            seenVa
2b710 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r = 1;.         
2b720 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
2b730 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2b740 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  O_IN)==0 ){.    
2b750 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b760 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->usable = 1;.  
2b770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b780 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b790 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a     case 1:    /*
2b7a0 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20   Constants with 
2b7b0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  IN operators */.
2b7c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b7d0 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  ( seenIn );.    
2b7e0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2b7f0 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d  usable = (pTerm-
2b800 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29  >prereqRight==0)
2b810 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2b820 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
2b830 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c  2:    /* Variabl
2b840 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f  es without IN */
2b850 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b860 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20  t( seenVar );.  
2b870 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
2b880 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
2b890 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
2b8a0 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20  O_IN)==0;.      
2b8b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b8c0 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a     default:   /*
2b8d0 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20   Variables with 
2b8e0 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  IN */.          
2b8f0 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20  assert( seenVar 
2b900 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20  && seenIn );.   
2b910 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2b920 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2b930 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b940 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b950 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30  memset(pUsage, 0
2b960 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b  , sizeof(pUsage[
2b970 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  0])*pIdxInfo->nC
2b980 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
2b990 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  if( pIdxInfo->ne
2b9a0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29  edToFreeIdxStr )
2b9b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
2b9c0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
2b9d0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2b9e0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
2b9f0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
2ba00 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
2ba10 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2ba20 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64  Str = 0;.    pId
2ba30 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2ba40 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20  nsumed = 0;.    
2ba50 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2ba60 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45  tedCost = SQLITE
2ba70 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62  _BIG_DBL / (doub
2ba80 6c 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76  le)2;.    rc = v
2ba90 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
2baa0 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49  rse, pTab, pIdxI
2bab0 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nfo);.    if( rc
2bac0 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f   ) goto whereLoo
2bad0 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20  pAddVtab_exit;. 
2bae0 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28     pIdxCons = *(
2baf0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
2bb00 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
2bb10 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
2bb20 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e  nstraint;.    pN
2bb30 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a  ew->prereq = 0;.
2bb40 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
2bb50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2bb60 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
2bb70 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f  traint );.    fo
2bb80 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
2bb90 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
2bba0 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
2bbb0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
2bbc0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
2bbd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
2bbe0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
2bbf0 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
2bc00 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
2bc10 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
2bc20 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
2bc30 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43         j = pIdxC
2bc40 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
2bc50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
2bc60 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
2bc70 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  .         || j<0
2bc80 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  .         || j>=
2bc90 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
2bca0 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
2bcb0 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
2bcc0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bcd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2bce0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
2bcf0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2bd00 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73  pParse, "%s.xBes
2bd10 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63  tIndex() malfunc
2bd20 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  tion", pTab->zNa
2bd30 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
2bd40 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
2bd50 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20  Vtab_exit;.     
2bd60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2bd70 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
2bd80 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
2bd90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bda0 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   j==0 );.       
2bdb0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
2bdc0 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
2bdd0 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
2bde0 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
2bdf0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
2be00 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
2be10 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
2be20 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
2be30 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2be40 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2be50 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
2be60 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2be70 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
2be80 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
2be90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2bea0 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
2beb0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2bec0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
2bed0 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
2bee0 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
2bef0 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
2bf00 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
2bf10 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
2bf20 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
2bf30 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
2bf40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2bf50 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
2bf60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2bf70 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
2bf80 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
2bf90 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
2bfa0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2bfb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2bfc0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
2bfd0 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
2bfe0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
2bff0 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
2c000 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2c010 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
2c020 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
2c030 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
2c040 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
2c050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
2c060 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
2c070 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
2c080 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2c090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c0a0 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
2c0b0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
2c0c0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
2c0d0 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
2c0e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
2c0f0 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
2c100 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
2c110 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
2c120 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
2c130 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
2c140 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
2c150 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
2c160 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
2c170 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
2c180 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
2c190 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
2c1a0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
2c1b0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
2c1c0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
2c1d0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
2c1e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
2c1f0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
2c200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c210 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2c220 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
2c230 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
2c240 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
2c250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c260 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
2c270 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
2c280 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2c290 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
2c2a0 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
2c2b0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
2c2c0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
2c2d0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
2c2e0 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
2c2f0 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
2c300 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
2c310 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
2c320 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
2c330 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
2c340 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
2c350 64 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49  dered = (u8)((pI
2c360 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
2c370 21 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  !=0).           
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c390 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2c3a0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
2c3b0 6e 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70  nsumed);.      p
2c3c0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
2c3d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
2c3e0 6e 20 3d 20 77 68 65 72 65 43 6f 73 74 46 72 6f  n = whereCostFro
2c3f0 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
2c400 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
2c410 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
2c420 47 3a 20 45 76 65 72 79 20 76 69 72 74 75 61 6c  G: Every virtual
2c430 20 74 61 62 6c 65 20 71 75 65 72 79 20 72 65 74   table query ret
2c440 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
2c450 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2c460 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20   = 46;  assert( 
2c470 34 36 3d 3d 77 68 65 72 65 43 6f 73 74 28 32 35  46==whereCost(25
2c480 29 20 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65  ) );.      where
2c490 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
2c4a0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
2c4b0 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74    if( pNew->u.vt
2c4c0 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
2c4d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c4e0 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ree(pNew->u.vtab
2c4f0 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20  .idxStr);.      
2c500 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
2c510 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  eedFree = 0;.   
2c520 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
2c530 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74  ..whereLoopAddVt
2c540 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 70  ab_exit:.  if( p
2c550 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2c560 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c 69  reeIdxStr ) sqli
2c570 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
2c580 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71  o->idxStr);.  sq
2c590 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2c5a0 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65 74  pIdxInfo);.  ret
2c5b0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2c5c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2c5d0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
2c5e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72 65  ./*.** Add Where
2c5f0 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f 20  Loop entries to 
2c600 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73 2e  handle OR terms.
2c610 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f 72    This works for
2c620 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65 65   either.** btree
2c630 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62  s or virtual tab
2c640 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  les..*/.static i
2c650 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f  nt whereLoopAddO
2c660 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  r(WhereLoopBuild
2c670 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42 69  er *pBuilder, Bi
2c680 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a 20  tmask mExtra){. 
2c690 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2c6a0 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2c6b0 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
2c6c0 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
2c6d0 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
2c6e0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2c6f0 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
2c700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c710 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
2c720 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
2c730 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
2c740 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
2c750 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
2c760 75 6d 2c 20 73 43 75 72 2c 20 73 50 72 65 76 3b  um, sCur, sPrev;
2c770 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2c780 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2c790 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
2c7a0 65 72 2d 3e 70 57 43 3b 0a 20 20 69 66 28 20 70  er->pWC;.  if( p
2c7b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
2c7c0 73 20 26 20 57 48 45 52 45 5f 41 4e 44 5f 4f 4e  s & WHERE_AND_ON
2c7d0 4c 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  LY ) return SQLI
2c7e0 54 45 5f 4f 4b 3b 0a 20 20 70 57 43 45 6e 64 20  TE_OK;.  pWCEnd 
2c7f0 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e  = pWC->a + pWC->
2c800 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20  nTerm;.  pNew = 
2c810 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
2c820 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
2c830 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
2c840 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
2c850 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  OK; pTerm++){.  
2c860 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
2c870 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29  perator & WO_OR)
2c880 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
2c890 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69  rm->u.pOrInfo->i
2c8a0 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d  ndexable & pNew-
2c8b0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20  >maskSelf)!=0 . 
2c8c0 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72     ){.      Wher
2c8d0 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20  eClause * const 
2c8e0 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e  pOrWC = &pTerm->
2c8f0 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20  u.pOrInfo->wc;. 
2c900 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2c910 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20   const pOrWCEnd 
2c920 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57  = &pOrWC->a[pOrW
2c930 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20  C->nTerm];.     
2c940 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54   WhereTerm *pOrT
2c950 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f  erm;.      int o
2c960 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  nce = 1;.      i
2c970 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20  nt i, j;.    .  
2c980 20 20 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e      pItem = pWIn
2c990 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20  fo->pTabList->a 
2c9a0 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20  + pNew->iTab;.  
2c9b0 20 20 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d      iCur = pItem
2c9c0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2c9d0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
2c9e0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
2c9f0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
2ca00 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
2ca10 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
2ca20 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72  sCur;..      for
2ca30 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
2ca40 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
2ca50 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
2ca60 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
2ca70 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
2ca80 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b   & WO_AND)!=0 ){
2ca90 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42  .          sSubB
2caa0 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54  uild.pWC = &pOrT
2cab0 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d  erm->u.pAndInfo-
2cac0 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  >wc;.        }el
2cad0 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
2cae0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
2caf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
2cb00 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57  mpWC.pWInfo = pW
2cb10 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20  C->pWInfo;.     
2cb20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74       tempWC.pOut
2cb30 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
2cb40 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20      tempWC.op = 
2cb50 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  TK_AND;.        
2cb60 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d    tempWC.nTerm =
2cb70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   1;.          te
2cb80 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d  mpWC.a = pOrTerm
2cb90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  ;.          sSub
2cba0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d  Build.pWC = &tem
2cbb0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pWC;.        }el
2cbc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  se{.          co
2cbd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2cbe0 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e  }.        sCur.n
2cbf0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2cc00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2cc10 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
2cc20 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
2cc30 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
2cc40 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
2cc50 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
2cc60 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20 20  &sSubBuild);.   
2cc70 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2cc80 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20 73  i<sCur.n; i++) s
2cc90 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20  Cur.a[i].prereq 
2cca0 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 20  |= mExtra;.     
2ccb0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2ccc0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2ccd0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2cce0 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
2ccf0 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2cd00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cd10 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2cd20 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e  LITE_OK || sCur.
2cd30 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2cd40 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b  if( sCur.n==0 ){
2cd50 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
2cd60 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
2cd70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2cd80 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20 29  }else if( once )
2cd90 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  {.          wher
2cda0 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26  eOrMove(&sSum, &
2cdb0 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20  sCur);.         
2cdc0 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
2cdd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cde0 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
2cdf0 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
2ce00 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
2ce10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ce20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
2ce30 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
2ce40 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2ce50 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2ce70 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
2ce80 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
2ce90 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
2cea0 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cec0 20 20 20 20 77 68 65 72 65 43 6f 73 74 41 64 64      whereCostAdd
2ced0 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e  (sPrev.a[i].rRun
2cee0 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e  , sCur.a[j].rRun
2cef0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2cf10 68 65 72 65 43 6f 73 74 41 64 64 28 73 50 72 65  hereCostAdd(sPre
2cf20 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
2cf30 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
2cf40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2cf50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cf60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2cf70 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2cf80 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
2cf90 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
2cfa0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
2cfb0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
2cfc0 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
2cfd0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2cfe0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2cff0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
2d000 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
2d010 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
2d020 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
2d030 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
2d040 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
2d050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
2d060 20 54 55 4e 49 4e 47 3a 20 4d 75 6c 74 69 70 6c   TUNING: Multipl
2d070 65 20 62 79 20 33 2e 35 20 66 6f 72 20 74 68 65  e by 3.5 for the
2d080 20 73 65 63 6f 6e 64 61 72 79 20 74 61 62 6c 65   secondary table
2d090 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20   lookup */.     
2d0a0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2d0b0 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b  sSum.a[i].rRun +
2d0c0 20 31 38 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   18;.        pNe
2d0d0 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61  w->nOut = sSum.a
2d0e0 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20  [i].nOut;.      
2d0f0 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2d100 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65   sSum.a[i].prere
2d110 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  q;.        rc = 
2d120 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2d130 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2d140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d150 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2d160 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
2d170 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2d180 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
2d190 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
2d1a0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
2d1b0 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
2d1c0 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
2d1d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2d1e0 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
2d1f0 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
2d200 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
2d210 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
2d220 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
2d230 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2d240 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
2d250 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2d260 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2d270 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
2d280 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2d290 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
2d2a0 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
2d2b0 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
2d2c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d2d0 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
2d2e0 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
2d2f0 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
2d300 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
2d310 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2d320 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
2d330 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
2d340 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2d350 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
2d360 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
2d370 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
2d380 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
2d390 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
2d3a0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
2d3b0 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
2d3c0 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
2d3d0 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
2d3e0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
2d3f0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2d400 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
2d410 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
2d420 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
2d430 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
2d440 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
2d450 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
2d460 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
2d470 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
2d480 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
2d490 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
2d4a0 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
2d4b0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2d4c0 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
2d4d0 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
2d4e0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2d4f0 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
2d500 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a  ilder, mExtra);.
2d510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2d520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d530 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d540 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65  oopAddOr(pBuilde
2d550 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  r, mExtra);.    
2d560 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20  }.    mPrior |= 
2d570 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
2d580 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62      if( rc || db
2d590 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2d5a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68   break;.  }.  wh
2d5b0 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c  ereLoopClear(db,
2d5c0 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
2d5d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   rc;.}../*.** Ex
2d5e0 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61 74  amine a WherePat
2d5f0 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64 69  h (with the addi
2d600 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72  tion of the extr
2d610 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74  a WhereLoop of t
2d620 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65  he 5th.** parame
2d630 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66 20  ters) to see if 
2d640 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20  it outputs rows 
2d650 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
2d660 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72   ORDER BY.** (or
2d670 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f   GROUP BY) witho
2d680 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20 73  ut requiring a s
2d690 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65  eparate sort ope
2d6a0 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 3a  ration.  Return:
2d6b0 0a 2a 2a 20 0a 2a 2a 20 20 20 20 30 3a 20 20 4f  .** .**    0:  O
2d6c0 52 44 45 52 20 42 59 20 69 73 20 6e 6f 74 20 73  RDER BY is not s
2d6d0 61 74 69 73 66 69 65 64 2e 20 20 53 6f 72 74 69  atisfied.  Sorti
2d6e0 6e 67 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20  ng required.**  
2d6f0 20 20 31 3a 20 20 4f 52 44 45 52 20 42 59 20 69    1:  ORDER BY i
2d700 73 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 20  s satisfied.    
2d710 20 20 4f 6d 69 74 20 73 6f 72 74 69 6e 67 0a 2a    Omit sorting.*
2d720 2a 20 20 20 2d 31 3a 20 20 55 6e 6b 6e 6f 77 6e  *   -1:  Unknown
2d730 20 61 74 20 74 68 69 73 20 74 69 6d 65 0a 2a 2a   at this time.**
2d740 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72  .** Note that pr
2d750 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45  ocessing for WHE
2d760 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57  RE_GROUPBY and W
2d770 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2d780 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72  is not as.** str
2d790 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50  ict.  With GROUP
2d7a0 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2d7b0 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72   the only requir
2d7c0 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a  ement is that.**
2d7d0 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73   equivalent rows
2d7e0 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
2d7f0 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20  ely adjacent to 
2d800 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52  one another.  GR
2d810 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49  OUP BY.** and DI
2d820 53 54 49 4e 54 20 64 6f 20 6e 6f 74 20 72 65 71  STINT do not req
2d830 75 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70  uire rows to app
2d840 65 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69  ear in any parti
2d850 63 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c  cular order as l
2d860 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 65  ong.** as equive
2d870 6c 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72  lent rows are gr
2d880 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20  ouped together. 
2d890 20 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20   Thus for GROUP 
2d8a0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a  BY and DISTINCT.
2d8b0 2a 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  ** the pOrderBy 
2d8c0 74 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74  terms can be mat
2d8d0 63 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65  ched in any orde
2d8e0 72 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42  r.  With ORDER B
2d8f0 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65  Y, the .** pOrde
2d900 72 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62  rBy terms must b
2d910 65 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72  e matched in str
2d920 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  ict left-to-righ
2d930 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  t order..*/.stat
2d940 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
2d950 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
2d960 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  (.  WhereInfo *p
2d970 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65  WInfo,    /* The
2d980 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2d990 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
2d9a0 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45  derBy,   /* ORDE
2d9b0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
2d9c0 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61   or DISTINCT cla
2d9d0 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  use to check */.
2d9e0 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 50 61    WherePath *pPa
2d9f0 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  th,     /* The W
2da00 68 65 72 65 50 61 74 68 20 74 6f 20 63 68 65 63  herePath to chec
2da10 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c  k */.  u16 wctrl
2da20 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20  Flags,       /* 
2da30 4d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48  Might contain WH
2da40 45 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57  ERE_GROUPBY or W
2da50 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20  HERE_DISTINCTBY 
2da60 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20  */.  u16 nLoop, 
2da70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2da80 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2da90 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  in pPath->aLoop[
2daa0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ] */.  WhereLoop
2dab0 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20   *pLast,     /* 
2dac0 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f  Add this WhereLo
2dad0 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  op to the end of
2dae0 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
2daf0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52  */.  Bitmask *pR
2db00 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55  evMask     /* OU
2db10 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65  T: Mask of Where
2db20 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20  Loops to run in 
2db30 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
2db40 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b  .){.  u8 revSet;
2db50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2db60 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e  rue if rev is kn
2db70 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b  own */.  u8 rev;
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2db90 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74  * Composite sort
2dba0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72   order */.  u8 r
2dbb0 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  evIdx;          
2dbc0 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20    /* Index sort 
2dbd0 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73  order */.  u8 is
2dbe0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20  OrderDistinct;  
2dbf0 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68   /* All prior Wh
2dc00 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64  ereLoops are ord
2dc10 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  er-distinct */. 
2dc20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75   u8 distinctColu
2dc30 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  mns;   /* True i
2dc40 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55  f the loop has U
2dc50 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63  NIQUE NOT NULL c
2dc60 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69  olumns */.  u8 i
2dc70 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  sMatch;         
2dc80 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74    /* iColumn mat
2dc90 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ches a term of t
2dca0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2dcb0 73 65 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f 6c  se */.  u16 nCol
2dcc0 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  umn;          /*
2dcd0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
2dce0 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
2dcf0 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79 3b 20    u16 nOrderBy; 
2dd00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dd10 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  r terms in the O
2dd20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
2dd30 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20  /.  int iLoop;  
2dd40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2dd50 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20  ex of WhereLoop 
2dd60 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67 20 70  in pPath being p
2dd70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e  rocessed */.  in
2dd80 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2dd90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2dda0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ters */.  int iC
2ddb0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ur;             
2ddc0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
2ddd0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57 68 65   for current Whe
2dde0 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  reLoop */.  int 
2ddf0 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20  iColumn;        
2de00 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75    /* A column nu
2de10 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61 62 6c  mber within tabl
2de20 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68 65 72  e iCur */.  Wher
2de30 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30  eLoop *pLoop = 0
2de40 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57 68 65  ; /* Current Whe
2de50 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f  reLoop being pro
2de60 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65  cessed. */.  Whe
2de70 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
2de80 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
2de90 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
2dea0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2deb0 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20 20 20  r *pOBExpr;     
2dec0 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
2ded0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 52 44  ion from the ORD
2dee0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2def0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2df00 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41  ;       /* COLLA
2df10 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  TE function from
2df20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2df30 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e  use term */.  In
2df40 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
2df50 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
2df60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2df70 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69   pLoop */.  sqli
2df80 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
2df90 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  ->pParse->db;  /
2dfa0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
2dfb0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61  ction */.  Bitma
2dfc0 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20 20 20  sk obSat = 0;   
2dfd0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
2dfe0 52 20 42 59 20 74 65 72 6d 73 20 73 61 74 69 73  R BY terms satis
2dff0 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  fied so far */. 
2e000 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b   Bitmask obDone;
2e010 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
2e020 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
2e030 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  erms */.  Bitmas
2e040 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  k orderDistinctM
2e050 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ask;  /* Mask of
2e060 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65   all well-ordere
2e070 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74  d loops */.  Bit
2e080 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20 20 20  mask ready;     
2e090 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2e0a0 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
2e0b0 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  */..  /*.  ** We
2e0c0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
2e0d0 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20  op is "one-row" 
2e0e0 69 66 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  if it generates 
2e0f0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
2e100 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74  .  ** row of out
2e110 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f  put.  A WhereLoo
2e120 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20  p is one-row if 
2e130 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
2e140 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2e150 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69 6e 64   **  (a) All ind
2e160 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68  ex columns match
2e170 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f 4c 55   with WHERE_COLU
2e180 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29  MN_EQ..  **  (b)
2e190 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 75 6e   The index is un
2e1a0 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68  ique.  ** Any Wh
2e1b0 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20  ereLoop with an 
2e1c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
2e1d0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
2e1e0 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72  e rowid is one-r
2e1f0 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f  ow..  ** Every o
2e200 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
2e210 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 20 57   will have the W
2e220 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20  HERE_ONEROW bit 
2e230 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a  set in wsFlags..
2e240 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79    **.  ** We say
2e250 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69   the WhereLoop i
2e260 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  s "order-distinc
2e270 74 22 20 69 66 20 74 68 65 20 73 65 74 20 6f 66  t" if the set of
2e280 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20   columns from.  
2e290 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c 6f 6f  ** that WhereLoo
2e2a0 70 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  p that are in th
2e2b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2e2c0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
2e2d0 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  for every.  ** r
2e2e0 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c  ow of the WhereL
2e2f0 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d  oop.  Every one-
2e300 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  row WhereLoop is
2e310 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20   automatically. 
2e320 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   ** order-distin
2e330 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c 6f 6f  ct.   A WhereLoo
2e340 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20 63 6f  p that has no co
2e350 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f 52 44  lumns in the ORD
2e360 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
2e370 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64  * is not order-d
2e380 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f  istinct. To be o
2e390 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 69 73  rder-distinct is
2e3a0 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65 20 73   not quite the s
2e3b0 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20 20 2a  ame as being.  *
2e3c0 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65 20 61  * UNIQUE since a
2e3d0 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f   UNIQUE column o
2e3e0 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61 76 65  r index can have
2e3f0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
2e400 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55  hat .  ** are NU
2e410 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75  LL and NULL valu
2e420 65 73 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e  es are equivalen
2e430 74 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  t for the purpos
2e440 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73 74 69  e of order-disti
2e450 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20  nct..  ** To be 
2e460 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2c 20  order-distinct, 
2e470 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74  the columns must
2e480 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64 20 4e   be UNIQUE and N
2e490 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  OT NULL..  **.  
2e4a0 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
2e4b0 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61   a table is alwa
2e4c0 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f  ys UNIQUE and NO
2e4d0 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76  T NULL so whenev
2e4e0 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69  er the.  ** rowi
2e4f0 64 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  d appears in the
2e500 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e510 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2e520 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
2e530 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
2e540 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  lly order-distin
2e550 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65  ct..  */..  asse
2e560 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
2e570 29 3b 0a 0a 20 20 2f 2a 20 53 6f 72 74 61 62 69  );..  /* Sortabi
2e580 6c 69 74 79 20 6f 66 20 76 69 72 74 75 61 6c 20  lity of virtual 
2e590 74 61 62 6c 65 73 20 69 73 20 64 65 74 65 72 6d  tables is determ
2e5a0 69 6e 65 64 20 62 79 20 74 68 65 20 78 42 65 73  ined by the xBes
2e5b0 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 0a 20 20  tIndex method.  
2e5c0 2a 2a 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ** of the virtua
2e5d0 6c 20 74 61 62 6c 65 20 69 74 73 65 6c 66 20 2a  l table itself *
2e5e0 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 2d 3e 77  /.  if( pLast->w
2e5f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
2e600 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20  IRTUALTABLE ){. 
2e610 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 4c 6f     testcase( nLo
2e620 6f 70 3e 30 20 29 3b 20 20 2f 2a 20 54 72 75 65  op>0 );  /* True
2e630 20 77 68 65 6e 20 6f 75 74 65 72 20 6c 6f 6f 70   when outer loop
2e640 73 20 61 72 65 20 6f 6e 65 2d 72 6f 77 20 61 6e  s are one-row an
2e650 64 20 6d 61 74 63 68 20 0a 20 20 20 20 20 20 20  d match .       
2e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e670 20 20 20 2a 2a 20 6e 6f 20 4f 52 44 45 52 20 42     ** no ORDER B
2e680 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 72  Y terms */.    r
2e690 65 74 75 72 6e 20 70 4c 61 73 74 2d 3e 75 2e 76  eturn pLast->u.v
2e6a0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 3b 0a 20  tab.isOrdered;. 
2e6b0 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26   }.  if( nLoop &
2e6c0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  & OptimizationDi
2e6d0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
2e6e0 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2e6f0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
2e700 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
2e710 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74  erBy->nExpr;.  t
2e720 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65 72 42  estcase( nOrderB
2e730 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66  y==BMS-1 );.  if
2e740 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31  ( nOrderBy>BMS-1
2e750 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2e760 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65   Cannot optimize
2e770 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20 4f 52   overly large OR
2e780 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f  DER BYs */.  isO
2e790 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
2e7a0 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53  ;.  obDone = MAS
2e7b0 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29 2d 31  KBIT(nOrderBy)-1
2e7c0 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ;.  orderDistinc
2e7d0 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61  tMask = 0;.  rea
2e7e0 64 79 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c  dy = 0;.  for(iL
2e7f0 6f 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69  oop=0; isOrderDi
2e800 73 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c  stinct && obSat<
2e810 6f 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c  obDone && iLoop<
2e820 3d 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29  =nLoop; iLoop++)
2e830 7b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e  {.    if( iLoop>
2e840 30 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f  0 ) ready |= pLo
2e850 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
2e860 20 20 70 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c    pLoop = iLoop<
2e870 6e 4c 6f 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61  nLoop ? pPath->a
2e880 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c  Loop[iLoop] : pL
2e890 61 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ast;.    assert(
2e8a0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2e8b0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2e8c0 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 20  TABLE)==0 );.   
2e8d0 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e   iCur = pWInfo->
2e8e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
2e8f0 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f 72  p->iTab].iCursor
2e900 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  ;..    /* Mark o
2e910 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59 20  ff any ORDER BY 
2e920 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20 61  term X that is a
2e930 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
2e940 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2e950 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20  he current loop 
2e960 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
2e970 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57  is term in the W
2e980 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75  HERE.    ** clau
2e990 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  se of the form X
2e9a0 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20   IS NULL or X=? 
2e9b0 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 6f  that reference o
2e9c0 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  nly outer.    **
2e9d0 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20   loops..    */. 
2e9e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
2e9f0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
2ea00 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2ea10 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2ea20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f 42  tinue;.      pOB
2ea30 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
2ea40 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f  prSkipCollate(pO
2ea50 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2ea60 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pr);.      if( p
2ea70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  OBExpr->op!=TK_C
2ea80 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65  OLUMN ) continue
2ea90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
2eaa0 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75  xpr->iTable!=iCu
2eab0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2eac0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
2ead0 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Term(&pWInfo->sW
2eae0 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72  C, iCur, pOBExpr
2eaf0 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 20 20 7e 72 65 61 64 79 2c 20 57 4f 5f 45 51 7c    ~ready, WO_EQ|
2eb20 57 4f 5f 49 53 4e 55 4c 4c 2c 20 30 29 3b 0a 20  WO_ISNULL, 0);. 
2eb30 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
2eb40 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2eb50 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2eb60 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29  eOperator&WO_EQ)
2eb70 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72 2d 3e  !=0 && pOBExpr->
2eb80 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
2eb90 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2eba0 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20 20 20   *z1, *z2;.     
2ebb0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2ebc0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57  e3ExprCollSeq(pW
2ebd0 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
2ebe0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2ebf0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2ec00 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
2ec10 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
2ec20 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 43  .        z1 = pC
2ec30 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
2ec40 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2ec50 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2ec60 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2ec70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Term->pExpr);.  
2ec80 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2ec90 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2eca0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2ecb0 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z2 = pColl->zN
2ecc0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2ecd0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2ece0 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63 6f 6e  z1, z2)!=0 ) con
2ecf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
2ed00 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
2ed10 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a  SKBIT(i);.    }.
2ed20 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2ed30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ed40 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20  _ONEROW)==0 ){. 
2ed50 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e       if( pLoop->
2ed60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2ed70 49 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  IPK ){.        p
2ed80 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Index = 0;.     
2ed90 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
2eda0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2edb0 28 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d  (pIndex = pLoop-
2edc0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
2edd0 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62  ==0 || pIndex->b
2ede0 55 6e 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  Unordered ){.   
2edf0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2ee00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ee10 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
2ee20 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
2ee30 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
2ee40 73 74 69 6e 63 74 20 3d 20 70 49 6e 64 65 78 2d  stinct = pIndex-
2ee50 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
2ee60 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
2ee70 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
2ee80 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  h all columns of
2ee90 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64   the index and d
2eea0 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65  eal with the one
2eeb0 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  s.      ** that 
2eec0 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69  are not constrai
2eed0 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e  ned by == or IN.
2eee0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2eef0 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30  rev = revSet = 0
2ef00 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74  ;.      distinct
2ef10 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20  Columns = 0;.   
2ef20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 3d 6e     for(j=0; j<=n
2ef30 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
2ef40 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20        u8 bOnce; 
2ef50 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e    /* True to run
2ef60 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65   the ORDER BY se
2ef70 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  arch loop */..  
2ef80 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
2ef90 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c  er == and IS NUL
2efa0 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  L terms */.     
2efb0 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e     if( j<pLoop->
2efc0 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
2efd0 20 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c       && ((i = pL
2efe0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e  oop->aLTerm[j]->
2eff0 65 4f 70 65 72 61 74 6f 72 29 20 26 20 28 57 4f  eOperator) & (WO
2f000 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _EQ|WO_ISNULL))!
2f010 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2f020 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20          if( i & 
2f030 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
2f040 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2f050 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
2f060 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
2f070 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2f080 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2f090 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
2f0a0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
2f0b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
2f0c0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
2f0d0 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
2f0e0 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
2f0f0 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
2f100 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
2f110 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
2f120 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
2f130 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2f140 20 20 20 20 69 66 28 20 6a 3c 6e 43 6f 6c 75 6d      if( j<nColum
2f150 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  n ){.          /
2f160 2a 20 4e 6f 72 6d 61 6c 20 69 6e 64 65 78 20 63  * Normal index c
2f170 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
2f180 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49      iColumn = pI
2f190 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
2f1a0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76  ];.          rev
2f1b0 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53  Idx = pIndex->aS
2f1c0 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
2f1d0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
2f1e0 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62  mn==pIndex->pTab
2f1f0 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c  le->iPKey ) iCol
2f200 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
2f210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f220 20 20 20 2f 2a 20 54 68 65 20 52 4f 57 49 44 20     /* The ROWID 
2f230 63 6f 6c 75 6d 6e 20 61 74 20 74 68 65 20 65 6e  column at the en
2f240 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
2f250 73 73 65 72 74 28 20 6a 3d 3d 6e 43 6f 6c 75 6d  ssert( j==nColum
2f260 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n );.          i
2f270 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
2f280 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
2f290 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2f2a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
2f2b0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
2f2c0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
2f2d0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
2f2e0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
2f2f0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
2f300 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 0a 20 20  well-ordered .  
2f310 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f320 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74   if( isOrderDist
2f330 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26  inct.         &&
2f340 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20   iColumn>=0.    
2f350 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70       && j>=pLoop
2f360 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20  ->u.btree.nEq.  
2f370 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78         && pIndex
2f380 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
2f390 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
2f3a0 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
2f3b0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
2f3c0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
2f3d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2f3e0 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45  /* Find the ORDE
2f3f0 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63  R BY term that c
2f400 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
2f410 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e j-th column.  
2f420 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
2f430 69 6e 64 65 78 20 61 6e 64 20 61 6e 64 20 6d 61  index and and ma
2f440 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
2f450 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
2f460 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
2f470 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
2f480 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
2f490 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
2f4a0 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
2f4b0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
2f4c0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
2f4d0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
2f4e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2f4f0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
2f500 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
2f510 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
2f520 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
2f530 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
2f540 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2f550 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
2f560 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
2f570 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2f580 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
2f590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
2f5a0 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
2f5b0 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
2f5c0 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
2f5d0 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
2f5e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
2f5f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2f600 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
2f610 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2f620 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
2f630 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2f640 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
2f650 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
2f660 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
2f670 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2f680 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
2f690 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
2f6a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2f6b0 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
2f6c0 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
2f6d0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
2f6e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
2f6f0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
2f700 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2f710 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2f720 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2f730 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
2f740 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
2f750 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f770 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
2f780 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2f790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f7a0 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b    if( isMatch ){
2f7b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2f7c0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
2f7d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f7e0 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  ( distinctColumn
2f7f0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  s==0 );.        
2f800 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75      distinctColu
2f810 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mns = 1;.       
2f820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f     }.          o
2f830 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28  bSat |= MASKBIT(
2f840 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i);.          if
2f850 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
2f860 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52  Flags & WHERE_GR
2f870 4f 55 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20  OUPBY)==0 ){.   
2f880 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
2f890 20 73 75 72 65 20 74 68 65 20 73 6f 72 74 20 6f   sure the sort o
2f8a0 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74 69 62  rder is compatib
2f8b0 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  le in an ORDER B
2f8c0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
2f8d0 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
2f8e0 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
2f8f0 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
2f900 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
2f910 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53          if( revS
2f920 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
2f930 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72      if( (rev ^ r
2f940 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79  evIdx)!=pOrderBy
2f950 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
2f960 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
2f970 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2f990 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
2f9a0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
2f9b0 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
2f9c0 20 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a       if( rev ) *
2f9d0 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b  pRevMask |= MASK
2f9e0 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20  BIT(iLoop);.    
2f9f0 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74            revSet
2fa00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2fa10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2fa20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2fa30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
2fa40 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
2fa50 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
2fa60 20 7c 7c 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b   || j<nColumn ){
2fa70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2fa80 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
2fa90 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
2faa0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
2fab0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
2fac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fad0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2fae0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
2faf0 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
2fb00 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2fb10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
2fb20 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
2fb30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2fb40 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
2fb50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2fb60 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2fb70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2fb80 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
2fb90 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
2fba0 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
2fbb0 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
2fbc0 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
2fbd0 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
2fbe0 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
2fbf0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
2fc00 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
2fc10 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
2fc20 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
2fc30 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
2fc40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
2fc50 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 69  pr *p;.        i
2fc60 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
2fc70 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
2fc80 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f  ;.        p = pO
2fc90 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
2fca0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
2fcb0 28 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28  (exprTableUsage(
2fcc0 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
2fcd0 74 2c 20 70 29 26 7e 6f 72 64 65 72 44 69 73 74  t, p)&~orderDist
2fce0 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
2fcf0 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
2fd00 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
2fd10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fd20 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
2fd30 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
2fd40 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
2fd50 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
2fd60 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
2fd70 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
2fd80 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
2fd90 6e 20 31 3b 0a 20 20 69 66 28 20 21 69 73 4f 72  n 1;.  if( !isOr
2fda0 64 65 72 44 69 73 74 69 6e 63 74 20 29 20 72 65  derDistinct ) re
2fdb0 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2fdc0 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57   -1;.}..#ifdef W
2fdd0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2fde0 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
2fdf0 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
2fe00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2fe10 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
2fe20 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
2fe30 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
2fe40 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
2fe50 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
2fe60 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
2fe70 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
2fe80 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
2fe90 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
2fea0 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
2feb0 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
2fec0 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
2fed0 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
2fee0 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
2fef0 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
2ff00 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
2ff10 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
2ff20 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70  oop objects at p
2ff30 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74  WInfo->pLoops, t
2ff40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
2ff50 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20  ttempts to find 
2ff60 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
2ff70 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73  path that visits
2ff80 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a   each WhereLoop.
2ff90 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70  ** once.  This p
2ffa0 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64  ath is then load
2ffb0 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e  ed into the pWIn
2ffc0 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66  fo->a[].pWLoop f
2ffd0 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73  ields..**.** Ass
2ffe0 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74  ume that the tot
2fff0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  al number of out
30000 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69  put rows that wi
30010 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f  ll need to be so
30020 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  rted.** will be 
30030 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20  nRowEst (in the 
30040 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e  10*log2 represen
30050 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67  tation).  Or, ig
30060 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  nore sorting.** 
30070 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74  costs if nRowEst
30080 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ==0..**.** Retur
30090 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
300a0 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
300b0 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f  _NOMEM of a memo
300c0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
300d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
300e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
300f0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65  rePathSolver(Whe
30100 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
30110 57 68 65 72 65 43 6f 73 74 20 6e 52 6f 77 45 73  WhereCost nRowEs
30120 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69  t){.  int mxChoi
30130 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
30140 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
30150 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75  r of simultaneou
30160 73 20 70 61 74 68 73 20 74 72 61 63 6b 65 64 20  s paths tracked 
30170 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20  */.  int nLoop; 
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30190 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
301a0 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s in the join */
301b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
301c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
301d0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
301e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
301f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30200 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
30210 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
30220 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
30230 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30240 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68   counter over th
30250 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a  e terms of the j
30260 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c  oin */.  int ii,
30270 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20   jj;            
30280 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
30290 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  ers */.  WhereCo
302a0 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
302b0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
302c0 20 61 20 70 61 74 68 20 2a 2f 0a 20 20 57 68 65   a path */.  Whe
302d0 72 65 43 6f 73 74 20 6d 78 43 6f 73 74 20 3d 20  reCost mxCost = 
302e0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
302f0 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
30300 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
30310 20 57 68 65 72 65 43 6f 73 74 20 72 53 6f 72 74   WhereCost rSort
30320 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Cost;         /*
30330 20 43 6f 73 74 20 74 6f 20 64 6f 20 61 20 73 6f   Cost to do a so
30340 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  rt */.  int nTo,
30350 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
30360 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
30370 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
30380 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
30390 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
303a0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
303b0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
303c0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
303d0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
303e0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
303f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30400 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
30410 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
30420 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
30430 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
30440 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
30450 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
30460 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
30470 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
30480 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
30490 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
304a0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
304b0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
304c0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
304d0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
304e0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
304f0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
30500 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
30510 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
30520 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
30530 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
30540 72 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ry */.  char *pS
30550 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
30560 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
30570 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
30580 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  is routine */.. 
30590 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f   pParse = pWInfo
305a0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
305b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e   pParse->db;.  n
305c0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e  Loop = pWInfo->n
305d0 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49  Level;.  /* TUNI
305e0 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71  NG: For simple q
305f0 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65  ueries, only the
30600 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74 72   best path is tr
30610 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  acked..  ** For 
30620 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65  2-way joins, the
30630 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61 72   5 best paths ar
30640 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a  e followed..  **
30650 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20   For joins of 3 
30660 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20  or more tables, 
30670 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65 73  track the 10 bes
30680 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43  t paths */.  mxC
30690 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3d 3d  hoice = (nLoop==
306a0 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d  1) ? 1 : (nLoop=
306b0 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20  =2 ? 5 : 10);.  
306c0 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70  assert( nLoop<=p
306d0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
306e0 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45  >nSrc );.  WHERE
306f0 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d  TRACE(0x002, ("-
30700 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72  --- begin solver
30710 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  \n"));..  /* All
30720 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
30730 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
30740 54 6f 20 61 6e 64 20 61 46 72 6f 6d 20 2a 2f 0a  To and aFrom */.
30750 20 20 69 69 20 3d 20 28 73 69 7a 65 6f 66 28 57    ii = (sizeof(W
30760 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f 66  herePath)+sizeof
30770 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f  (WhereLoop*)*nLo
30780 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a  op)*mxChoice*2;.
30790 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
307a0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
307b0 2c 20 69 69 29 3b 0a 20 20 69 66 28 20 70 53 70  , ii);.  if( pSp
307c0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
307d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
307e0 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68  aTo = (WherePath
307f0 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f  *)pSpace;.  aFro
30800 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65  m = aTo+mxChoice
30810 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d  ;.  memset(aFrom
30820 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f  , 0, sizeof(aFro
30830 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28  m[0]));.  pX = (
30840 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72  WhereLoop**)(aFr
30850 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20  om+mxChoice);.  
30860 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a  for(ii=mxChoice*
30870 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69  2, pFrom=aTo; ii
30880 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b  >0; ii--, pFrom+
30890 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b  +, pX += nLoop){
308a0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  .    pFrom->aLoo
308b0 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 0a 20 20 2f  p = pX;.  }..  /
308c0 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72 63  * Seed the searc
308d0 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  h with a single 
308e0 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61 69  WherePath contai
308f0 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65 4c  ning zero WhereL
30900 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oops..  **.  ** 
30910 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c  TUNING: Do not l
30920 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
30930 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20 61   iterations go a
30940 62 6f 76 65 20 32 35 2e 20 20 49 66 20 74 68 65  bove 25.  If the
30950 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f   cost.  ** of co
30960 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d  mputing an autom
30970 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e 6f  atic index is no
30980 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74 68  t paid back with
30990 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 35 0a  in the first 25.
309a0 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20    ** rows, then 
309b0 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 61  do not use the a
309c0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20  utomatic index. 
309d0 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52  */.  aFrom[0].nR
309e0 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d  ow = MIN(pParse-
309f0 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29  >nQueryLoop, 46)
30a00 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 77  ;  assert( 46==w
30a10 68 65 72 65 43 6f 73 74 28 32 35 29 20 29 3b 0a  hereCost(25) );.
30a20 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20    nFrom = 1;..  
30a30 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68  /* Precompute th
30a40 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
30a50 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75  g the final resu
30a60 6c 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63  lt set, if the c
30a70 61 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71  aller.  ** to sq
30a80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
30a90 29 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20  ) was concerned 
30aa0 61 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f  about sorting */
30ab0 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30  .  rSortCost = 0
30ac0 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
30ad0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e  pOrderBy==0 || n
30ae0 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20  RowEst==0 ){.   
30af0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
30b00 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  redValid = 1;.  
30b10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55  }else{.    /* TU
30b20 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20  NING: Estimated 
30b30 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
30b40 69 73 20 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65  is N*log2(N) whe
30b50 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20 20 20  re N is the.    
30b60 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ** number of out
30b70 70 75 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20  put rows. */.   
30b80 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f   rSortCost = nRo
30b90 77 45 73 74 20 2b 20 65 73 74 4c 6f 67 28 6e 52  wEst + estLog(nR
30ba0 6f 77 45 73 74 29 3b 0a 20 20 20 20 57 48 45 52  owEst);.    WHER
30bb0 45 54 52 41 43 45 28 30 78 30 30 32 2c 28 22 2d  ETRACE(0x002,("-
30bc0 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d  --- sort cost=%-
30bd0 33 64 5c 6e 22 2c 20 72 53 6f 72 74 43 6f 73 74  3d\n", rSortCost
30be0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ));.  }..  /* Co
30bf0 6d 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65  mpute successive
30c00 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50  ly longer WhereP
30c10 61 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70  aths using the p
30c20 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69  revious generati
30c30 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65  on.  ** of Where
30c40 50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73  Paths as the bas
30c50 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e  is for the next.
30c60 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
30c70 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a  the mxChoice.  *
30c80 2a 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20  * best paths at 
30c90 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20  each generation 
30ca0 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30  */.  for(iLoop=0
30cb0 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69  ; iLoop<nLoop; i
30cc0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f  Loop++){.    nTo
30cd0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69   = 0;.    for(ii
30ce0 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b  =0, pFrom=aFrom;
30cf0 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c   ii<nFrom; ii++,
30d00 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
30d10 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e   for(pWLoop=pWIn
30d20 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f  fo->pLoops; pWLo
30d30 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f  op; pWLoop=pWLoo
30d40 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
30d50 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
30d60 61 73 6b 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  askNew;.        
30d70 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
30d80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
30d90 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3d  isOrderedValid =
30da0 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
30db0 64 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20  dValid;.        
30dc0 75 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20 70  u8 isOrdered = p
30dd0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
30de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
30df0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e  Loop->prereq & ~
30e00 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
30e10 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30e20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
30e30 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20  oop->maskSelf & 
30e40 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29  pFrom->maskLoop)
30e50 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
30e60 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
30e70 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70  is point, pWLoop
30e80 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
30e90 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c  to be the next l
30ea0 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  oop. .        **
30eb0 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73   Compute its cos
30ec0 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 43 6f  t */.        rCo
30ed0 73 74 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64  st = whereCostAd
30ee0 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70  d(pWLoop->rSetup
30ef0 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20  ,pWLoop->rRun + 
30f00 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20  pFrom->nRow);.  
30f10 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 77 68        rCost = wh
30f20 65 72 65 43 6f 73 74 41 64 64 28 72 43 6f 73 74  ereCostAdd(rCost
30f30 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 29 3b  , pFrom->rCost);
30f40 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77  .        maskNew
30f50 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
30f60 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
30f70 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69  kSelf;.        i
30f80 66 28 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c  f( !isOrderedVal
30f90 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
30fa0 73 77 69 74 63 68 28 20 77 68 65 72 65 50 61 74  switch( wherePat
30fb0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
30fc0 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y(pWInfo,.      
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fe0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
30ff0 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f  y, pFrom, pWInfo
31000 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20  ->wctrlFlags,.  
31010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31020 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f       iLoop, pWLo
31030 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b  op, &revMask) ){
31040 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
31050 65 20 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70  e 1:  /* Yes.  p
31060 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73  From+pWLoop does
31070 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
31080 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
310a0 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20  Ordered = 1;.   
310b0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
310c0 65 72 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20  eredValid = 1;. 
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
310e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
310f0 63 61 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20  case 0:  /* No. 
31100 20 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69   pFrom+pWLoop wi
31110 6c 6c 20 72 65 71 75 69 72 65 20 61 20 73 65 70  ll require a sep
31120 61 72 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20  arate sort */.  
31130 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
31140 64 65 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  dered = 0;.     
31150 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31160 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
31170 20 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74             rCost
31180 20 3d 20 77 68 65 72 65 43 6f 73 74 41 64 64 28   = whereCostAdd(
31190 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f 73 74  rCost, rSortCost
311a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
311b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
311c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
311d0 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65 74 2e  Cannot tell yet.
311e0 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e 20 74    Try again on t
311f0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
31200 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
31210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
31230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
31240 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
31250 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  revLoop;.       
31260 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   }.        /* Ch
31270 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 57  eck to see if pW
31280 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65 20 61  Loop should be a
31290 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78 43 68  dded to the mxCh
312a0 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66 61 72  oice best so far
312b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
312c0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
312d0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
312e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
312f0 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
31300 3d 3d 6d 61 73 6b 4e 65 77 20 26 26 20 70 54 6f  ==maskNew && pTo
31310 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
31320 3d 3d 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ==isOrderedValid
31330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31340 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
31350 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
31360 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31380 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
31390 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
313a0 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
313b0 63 65 20 26 26 20 72 43 6f 73 74 3e 3d 6d 78 43  ce && rCost>=mxC
313c0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
313d0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
313e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
313f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
31400 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31420 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70  ebugPrintf("Skip
31430 20 20 20 25 73 20 63 6f 73 74 3d 25 33 64 20 6f     %s cost=%3d o
31440 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
31450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
31460 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
31470 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
31480 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20 20 20  ), rCost,.      
31490 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
314a0 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28 69 73  deredValid ? (is
314b0 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20  Ordered ? 'Y' : 
314c0 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20  'N') : '?');.   
314d0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
314e0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  f.            co
314f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31500 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
31510 20 41 64 64 20 61 20 6e 65 77 20 50 61 74 68 20   Add a new Path 
31520 74 6f 20 74 68 65 20 61 54 6f 5b 5d 20 73 65 74  to the aTo[] set
31530 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
31540 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29  ( nTo<mxChoice )
31550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
31560 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 73 69   Increase the si
31570 7a 65 20 6f 66 20 74 68 65 20 61 54 6f 20 73 65  ze of the aTo se
31580 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  t by one */.    
31590 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f          jj = nTo
315a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
315b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
315c0 20 2f 2a 20 4e 65 77 20 70 61 74 68 20 72 65 70   /* New path rep
315d0 6c 61 63 65 73 20 74 68 65 20 70 72 69 6f 72 20  laces the prior 
315e0 77 6f 72 73 74 20 74 6f 20 6b 65 65 70 20 63 6f  worst to keep co
315f0 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69  unt below mxChoi
31600 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ce */.          
31610 20 20 66 6f 72 28 6a 6a 3d 6e 54 6f 2d 31 3b 20    for(jj=nTo-1; 
31620 61 54 6f 5b 6a 6a 5d 2e 72 43 6f 73 74 3c 6d 78  aTo[jj].rCost<mx
31630 43 6f 73 74 3b 20 6a 6a 2d 2d 29 7b 20 61 73 73  Cost; jj--){ ass
31640 65 72 74 28 6a 6a 3e 30 29 3b 20 7d 0a 20 20 20  ert(jj>0); }.   
31650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31660 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a     pTo = &aTo[jj
31670 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  ];.#ifdef WHERET
31680 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
31690 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
316a0 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
316b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
316c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
316d0 74 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f  tf("New    %s co
316e0 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63  st=%-3d order=%c
316f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31700 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31710 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31720 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31740 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
31750 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
31760 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
31780 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
31790 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
317a0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43  ( pTo->rCost<=rC
317b0 6f 73 74 20 29 7b 0a 23 69 66 64 65 66 20 57 48  ost ){.#ifdef WH
317c0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
317d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
317e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
317f0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
31810 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
31830 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
31840 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
31850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31860 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
31870 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
31880 6f 70 29 2c 20 72 43 6f 73 74 2c 0a 20 20 20 20  op), rCost,.    
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
318a0 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20 28  OrderedValid ? (
318b0 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20  isOrdered ? 'Y' 
318c0 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20  : 'N') : '?');. 
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
318e0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
318f0 22 20 20 20 76 73 20 25 73 20 63 6f 73 74 3d 25  "   vs %s cost=%
31900 2d 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  -3d order=%c\n",
31910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31920 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
31930 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
31940 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 0a 20  ), pTo->rCost,. 
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
31970 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  alid ? (pTo->isO
31980 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27  rdered ? 'Y' : '
31990 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  N') : '?');.    
319a0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
319b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
319c0 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
319d0 74 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20  t==rCost );.    
319e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
319f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31a00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31a10 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43  ( pTo->rCost==rC
31a20 6f 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ost+1 );.       
31a30 20 20 20 2f 2a 20 41 20 6e 65 77 20 61 6e 64 20     /* A new and 
31a40 62 65 74 74 65 72 20 73 63 6f 72 65 20 66 6f 72  better score for
31a50 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 63 72   a previously cr
31a60 65 61 74 65 64 20 65 71 75 69 76 61 6c 65 6e 74  eated equivalent
31a70 20 70 61 74 68 20 2a 2f 0a 23 69 66 64 65 66 20   path */.#ifdef 
31a80 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
31a90 45 44 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ED.          if(
31aa0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
31ab0 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31ad0 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
31ae0 20 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74            "Updat
31af0 65 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6f  e %s cost=%-3d o
31b00 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
31b10 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
31b20 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
31b30 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
31b40 43 6f 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Cost,.          
31b50 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56        isOrderedV
31b60 61 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65  alid ? (isOrdere
31b70 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a  d ? 'Y' : 'N') :
31b80 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20   '?');.         
31b90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
31ba0 72 69 6e 74 66 28 22 20 20 77 61 73 20 25 73 20  rintf("  was %s 
31bb0 63 6f 73 74 3d 25 2d 33 64 20 6f 72 64 65 72 3d  cost=%-3d order=
31bc0 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
31bd0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
31be0 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b  Name(pTo, iLoop+
31bf0 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73  1, 0), pTo->rCos
31c00 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31c10 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
31c20 64 56 61 6c 69 64 20 3f 20 28 70 54 6f 2d 3e 69  dValid ? (pTo->i
31c30 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27 20 3a  sOrdered ? 'Y' :
31c40 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20   'N') : '?');.  
31c50 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
31c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31c70 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
31c80 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
31c90 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
31ca0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
31cb0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
31cc0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
31cd0 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
31ce0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
31cf0 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
31d00 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
31d10 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 70     pTo->nRow = p
31d20 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c  From->nRow + pWL
31d30 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 20  oop->nOut;.     
31d40 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
31d50 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
31d60 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c  To->isOrderedVal
31d70 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64 56 61  id = isOrderedVa
31d80 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  lid;.        pTo
31d90 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
31da0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
31db0 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
31dc0 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
31dd0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
31de0 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
31df0 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
31e00 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
31e10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
31e20 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
31e30 20 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d          mxCost =
31e40 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20   aTo[0].rCost;. 
31e50 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d           for(jj=
31e60 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20  1, pTo=&aTo[1]; 
31e70 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b  jj<mxChoice; jj+
31e80 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20  +, pTo++){.     
31e90 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
31ea0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 29 20 6d  rCost>mxCost ) m
31eb0 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f  xCost = pTo->rCo
31ec0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  st;.          }.
31ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31ee0 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
31ef0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
31f00 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
31f10 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20  e3WhereTrace>=2 
31f20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31f30 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
31f40 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
31f50 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
31f60 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
31f70 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
31f80 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
31f90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31fa0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
31fb0 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
31fc0 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
31fd0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
31fe0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
31ff0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
32000 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
32010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
32020 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32030 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
32040 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
32050 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32060 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
32070 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e  edValid && pTo->
32080 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
32090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
320a0 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
320b0 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
320c0 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
320d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
320e0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
320f0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
32100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32110 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
32120 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
32130 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
32140 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
32150 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
32160 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
32170 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
32180 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
32190 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
321a0 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
321b0 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
321c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
321d0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
321e0 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
321f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
32200 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
32210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
32220 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
32230 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
32240 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
32250 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
32260 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
32270 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
32280 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 61 73 73  m = aFrom;.  ass
32290 65 72 74 28 20 6e 46 72 6f 6d 3d 3d 31 20 29 3b  ert( nFrom==1 );
322a0 0a 23 69 66 20 30 20 2f 2a 20 54 68 65 20 66 6f  .#if 0 /* The fo
322b0 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 65 65 64 65  llowing is neede
322c0 64 20 69 66 20 6e 46 72 6f 6d 20 69 73 20 65 76  d if nFrom is ev
322d0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 2a  er more than 1 *
322e0 2f 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  /.  for(ii=1; ii
322f0 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
32300 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
32310 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
32320 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
32330 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 23 65  From[ii];.  }.#e
32340 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
32350 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e  WInfo->nLevel==n
32360 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f 61  Loop );.  /* Loa
32370 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
32380 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49 6e  t path into pWIn
32390 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f  fo */.  for(iLoo
323a0 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70  p=0; iLoop<nLoop
323b0 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
323c0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
323d0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20 2b  el = pWInfo->a +
323e0 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65 76   iLoop;.    pLev
323f0 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57 4c  el->pWLoop = pWL
32400 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f  oop = pFrom->aLo
32410 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20 70  op[iLoop];.    p
32420 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 70  Level->iFrom = p
32430 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20 20  WLoop->iTab;.   
32440 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
32450 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
32460 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
32470 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  From].iCursor;. 
32480 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f   }.  if( (pWInfo
32490 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
324a0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
324b0 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70 57  CT)!=0.   && (pW
324c0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
324d0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
324e0 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70 57  TBY)==0.   && pW
324f0 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
32500 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
32510 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77 45  NOOP.   && nRowE
32520 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  st.  ){.    Bitm
32530 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  ask notUsed;.   
32540 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65 50   int rc = whereP
32550 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
32560 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e  rBy(pWInfo, pWIn
32570 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2c 20  fo->pResultSet, 
32580 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
32590 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 44 49          WHERE_DI
325a0 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f 70 2d  STINCTBY, nLoop-
325b0 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b  1, pFrom->aLoop[
325c0 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73  nLoop-1], &notUs
325d0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
325e0 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65 44 69  =1 ) pWInfo->eDi
325f0 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44  stinct = WHERE_D
32600 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b  ISTINCT_ORDERED;
32610 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 6f 6d  .  }.  if( pFrom
32620 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20  ->isOrdered ){. 
32630 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
32640 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
32650 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
32660 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
32670 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
32680 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
32690 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
326a0 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61     pWInfo->bOBSa
326b0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 49  t = 1;.      pWI
326c0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70  nfo->revMask = p
326d0 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
326e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
326f0 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
32700 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
32710 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
32720 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
32730 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
32740 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
32750 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
32760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
32770 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
32780 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
32790 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
327a0 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
327b0 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
327c0 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
327d0 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
327e0 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
327f0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
32800 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
32810 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
32820 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
32830 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
32840 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
32850 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
32860 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
32870 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
32880 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
32890 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
328a0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
328b0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
328c0 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
328d0 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
328e0 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
328f0 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
32900 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
32910 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
32920 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
32930 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
32940 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
32950 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
32960 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
32970 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
32980 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
32990 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
329a0 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
329b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
329c0 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
329d0 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
329e0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
329f0 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
32a00 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
32a10 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
32a20 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
32a30 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20 3d 20  ;.  .  pWInfo = 
32a40 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
32a50 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e  ;.  if( pWInfo->
32a60 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
32a70 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 29  RE_FORCE_TABLE )
32a80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
32a90 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ert( pWInfo->pTa
32aa0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29  bList->nSrc>=1 )
32ab0 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e  ;.  pItem = pWIn
32ac0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b  fo->pTabList->a;
32ad0 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  .  pTab = pItem-
32ae0 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56  >pTab;.  if( IsV
32af0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
32b00 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
32b10 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29 20 72  Item->zIndex ) r
32b20 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
32b30 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
32b40 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
32b50 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
32b60 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
32b70 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
32b80 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  gs = 0;.  pTerm 
32b90 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
32ba0 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
32bb0 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  EQ, 0);.  if( pT
32bc0 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70  erm ){.    pLoop
32bd0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
32be0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
32bf0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
32c00 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
32c10 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
32c20 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
32c30 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
32c40 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
32c50 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
32c60 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
32c70 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
32c80 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
32c90 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
32ca0 3d 3d 77 68 65 72 65 43 6f 73 74 28 31 30 29 20  ==whereCost(10) 
32cb0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
32cc0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
32cd0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
32ce0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
32cf0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
32d00 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
32d10 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49   || pIdx->pPartI
32d20 64 78 57 68 65 72 65 21 3d 30 20 29 20 63 6f 6e  dxWhere!=0 ) con
32d30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
32d40 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
32d50 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
32d60 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
32d70 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
32d80 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
32d90 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70 49  j], 0, WO_EQ, pI
32da0 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
32db0 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
32dc0 6b 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  k;.        where
32dd0 4c 6f 6f 70 52 65 73 69 7a 65 28 70 57 49 6e 66  LoopResize(pWInf
32de0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  o->pParse->db, p
32df0 4c 6f 6f 70 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Loop, j);.      
32e00 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
32e10 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  j] = pTerm;.    
32e20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 21    }.      if( j!
32e30 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
32e40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
32e50 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
32e60 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
32e70 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c 57  Q|WHERE_ONEROW|W
32e80 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
32e90 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
32ea0 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d  colUsed & ~colum
32eb0 6e 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29  nsInIndex(pIdx))
32ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
32ed0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
32ee0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
32ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
32f00 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a  Loop->nLTerm = j
32f10 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  ;.      pLoop->u
32f20 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a  .btree.nEq = j;.
32f30 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
32f40 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49  tree.pIndex = pI
32f50 64 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e  dx;.      /* TUN
32f60 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75  ING: Cost of a u
32f70 6e 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b  nique index look
32f80 75 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20  up is 15 */.    
32f90 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
32fa0 33 39 3b 20 20 2f 2a 20 33 39 3d 3d 77 68 65 72  39;  /* 39==wher
32fb0 65 43 6f 73 74 28 31 35 29 20 2a 2f 0a 20 20 20  eCost(15) */.   
32fc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
32fd0 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d    }.  if( pLoop-
32fe0 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  >wsFlags ){.    
32ff0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 57  pLoop->nOut = (W
33000 68 65 72 65 43 6f 73 74 29 31 3b 0a 20 20 20 20  hereCost)1;.    
33010 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
33020 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
33030 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
33040 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
33050 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
33060 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ur);.    pWInfo-
33070 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
33080 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
33090 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
330a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
330b0 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
330c0 2d 3e 62 4f 42 53 61 74 20 3d 20 20 31 3b 0a 20  ->bOBSat =  1;. 
330d0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
330e0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
330f0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
33100 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
33110 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
33120 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
33130 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
33140 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
33150 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
33160 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
33170 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
33180 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
33190 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
331a0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
331b0 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
331c0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
331d0 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
331e0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
331f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
33200 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
33210 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
33220 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
33230 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
33240 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
33250 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
33260 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
33270 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
33280 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
33290 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
332a0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
332b0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
332c0 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
332d0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
332e0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
332f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
33300 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
33310 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
33320 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
33330 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
33340 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
33350 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
33360 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
33370 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
33380 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
33390 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
333a0 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
333b0 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
333c0 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
333d0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
333e0 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
333f0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
33400 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
33410 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
33420 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
33430 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
33440 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
33450 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
33460 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
33470 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
33480 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
33490 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
334a0 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
334b0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
334c0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
334d0 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
334e0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
334f0 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
33500 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
33510 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
33520 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
33530 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
33540 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
33550 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
33560 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
33570 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
33580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33590 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
335a0 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
335b0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
335c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
335d0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
335e0 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
335f0 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
33600 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
33610 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
33620 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
33630 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
33640 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
33650 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
33660 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
33670 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
33680 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
33690 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
336a0 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
336b0 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
336c0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
336d0 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
336e0 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
336f0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
33700 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
33710 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
33720 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
33730 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
33740 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
33750 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
33760 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
33770 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
33780 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
33790 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
337a0 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
337b0 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
337c0 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
337d0 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
337e0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
337f0 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
33800 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
33810 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
33820 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
33830 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
33840 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
33850 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
33860 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
33870 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
33880 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
33890 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
338a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
338b0 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
338c0 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
338d0 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
338e0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
338f0 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
33900 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
33910 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
33920 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
33930 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
33940 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
33950 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
33960 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
33970 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
33980 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
33990 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
339a0 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
339b0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
339c0 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
339d0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
339e0 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
339f0 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
33a00 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
33a10 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33a20 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
33a30 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
33a40 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
33a50 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
33a60 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
33a70 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
33a80 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
33a90 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
33aa0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
33ab0 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
33ac0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
33ad0 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
33ae0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
33af0 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
33b00 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
33b10 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
33b20 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
33b30 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
33b40 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
33b50 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
33b60 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
33b70 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
33b80 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
33b90 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
33ba0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
33bb0 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
33bc0 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
33bd0 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
33be0 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
33bf0 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
33c00 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
33c10 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
33c20 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
33c30 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
33c40 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
33c50 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
33c60 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
33c70 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
33c80 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
33c90 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
33ca0 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
33cb0 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
33cc0 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
33cd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
33ce0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
33cf0 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
33d00 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
33d10 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
33d20 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
33d30 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
33d40 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
33d50 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
33d60 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
33d70 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
33d80 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
33d90 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
33da0 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
33db0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
33dc0 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
33dd0 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
33de0 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
33df0 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
33e00 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
33e10 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
33e20 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
33e30 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
33e40 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
33e50 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
33e60 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
33e70 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
33e80 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
33e90 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
33ea0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
33eb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33ec0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
33ed0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
33ee0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
33ef0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
33f00 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
33f10 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57  By is NULL..*/.W
33f20 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
33f30 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
33f40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
33f50 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
33f60 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
33f70 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
33f80 74 2c 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  t,    /* FROM cl
33f90 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
33fa0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
33fb0 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
33fc0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
33fd0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
33fe0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
33ff0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
34000 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
34010 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
34020 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
34030 2a 70 52 65 73 75 6c 74 53 65 74 2c 20 2f 2a 20  *pResultSet, /* 
34040 52 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  Result set of th
34050 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 75 31 36  e query */.  u16
34060 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20   wctrlFlags,    
34070 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
34080 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
34090 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
340a0 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69  Int.h */.  int i
340b0 49 64 78 43 75 72 20 20 20 20 20 20 20 20 20 20  IdxCur          
340c0 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 4e 45   /* If WHERE_ONE
340d0 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73 65  TABLE_ONLY is se
340e0 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
340f0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  number */.){.  i
34100 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
34110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34120 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
34130 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
34140 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
34150 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
34160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34170 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
34180 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
34190 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
341a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
341b0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
341c0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
341d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
341e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
341f0 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
34200 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
34210 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
34220 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
34230 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
34240 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
34250 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
34260 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
34270 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
34280 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
34290 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
342a0 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
342b0 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
342c0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
342d0 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
342e0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
342f0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
34300 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
34310 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
34320 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
34330 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
34340 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
34350 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
34360 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34380 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
34390 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
343a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
343b0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
343c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
343d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
343f0 64 65 20 2a 2f 0a 0a 0a 20 20 2f 2a 20 56 61 72  de */...  /* Var
34400 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
34410 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
34420 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
34430 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
34440 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 20 20 73  zeof(sWLB));.  s
34450 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  WLB.pOrderBy = p
34460 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44  OrderBy;..  /* D
34470 69 73 61 62 6c 65 20 74 68 65 20 44 49 53 54 49  isable the DISTI
34480 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  NCT optimization
34490 20 69 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69   if SQLITE_Disti
344a0 6e 63 74 4f 70 74 20 69 73 20 73 65 74 20 76 69  nctOpt is set vi
344b0 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74  a.  ** sqlite3_t
344c0 65 73 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f  est_ctrl(SQLITE_
344d0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
344e0 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20  ATIONS,...) */. 
344f0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
34500 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
34510 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74  LITE_DistinctOpt
34520 29 20 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c  ) ){.    wctrlFl
34530 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41  ags &= ~WHERE_WA
34540 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d  NT_DISTINCT;.  }
34550 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
34560 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
34570 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
34580 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
34590 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
345a0 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
345b0 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  k .  */.  testca
345c0 73 65 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  se( pTabList->nS
345d0 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28  rc==BMS );.  if(
345e0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
345f0 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  BMS ){.    sqlit
34600 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
34610 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
34620 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
34630 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75  , BMS);.    retu
34640 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
34650 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  This function no
34660 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73  rmally generates
34670 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66   a nested loop f
34680 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  or all tables in
34690 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e   .  ** pTabList.
346a0 20 20 42 75 74 20 69 66 20 74 68 65 20 57 48 45    But if the WHE
346b0 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
346c0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
346d0 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a  en we should.  *
346e0 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20  * only generate 
346f0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66 69 72  code for the fir
34700 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  st table in pTab
34710 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20  List and assume 
34720 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75  that.  ** any cu
34730 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
34740 20 77 69 74 68 20 73 75 62 73 65 71 75 65 6e 74   with subsequent
34750 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e   tables are unin
34760 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
34770 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63    nTabList = (wc
34780 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
34790 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20  _ONETABLE_ONLY) 
347a0 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e  ? 1 : pTabList->
347b0 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  nSrc;..  /* Allo
347c0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
347d0 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
347e0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
347f0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
34800 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
34810 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c  ue. A single all
34820 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ocation is used 
34830 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68 65  to store the Whe
34840 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75  reInfo.  ** stru
34850 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ct, the contents
34860 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b   of WhereInfo.a[
34870 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  ], the WhereClau
34880 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
34890 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d  * and the WhereM
348a0 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65  askSet structure
348b0 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61  . Since WhereCla
348c0 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  use contains an 
348d0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c  8-byte.  ** fiel
348e0 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29  d (type Bitmask)
348f0 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67   it must be alig
34900 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65  ned on an 8-byte
34910 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a   boundary on.  *
34920 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74  * some architect
34930 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ures. Hence the 
34940 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a  ROUND8() below..
34950 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66    */.  nByteWInf
34960 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  o = ROUND8(sizeo
34970 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54  f(WhereInfo)+(nT
34980 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66  abList-1)*sizeof
34990 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20  (WhereLevel));. 
349a0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
349b0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
349c0 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73  , nByteWInfo + s
349d0 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
349e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
349f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
34a00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34a10 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  b, pWInfo);.    
34a20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  pWInfo = 0;.    
34a30 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
34a40 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
34a50 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61  fo->nLevel = nTa
34a60 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
34a70 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
34a80 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
34a90 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
34aa0 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  .  pWInfo->pOrde
34ab0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
34ac0 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c    pWInfo->pResul
34ad0 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74 53 65  tSet = pResultSe
34ae0 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
34af0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
34b00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
34b10 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
34b20 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67 73  ags = wctrlFlags
34b30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
34b40 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
34b50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
34b60 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
34b70 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
34b80 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f 20  ;.  sWLB.pWInfo 
34b90 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c 42  = pWInfo;.  sWLB
34ba0 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  .pWC = &pWInfo->
34bb0 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65 77  sWC;.  sWLB.pNew
34bc0 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29 28   = (WhereLoop*)(
34bd0 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29 2b  ((char*)pWInfo)+
34be0 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20 61  nByteWInfo);.  a
34bf0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
34c00 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c 42  E_ALIGNMENT(sWLB
34c10 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65 72  .pNew) );.  wher
34c20 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e 70  eLoopInit(sWLB.p
34c30 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  New);.#ifdef SQL
34c40 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c 42  ITE_DEBUG.  sWLB
34c50 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a 27  .pNew->cId = '*'
34c60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  ;.#endif..  /* S
34c70 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63  plit the WHERE c
34c80 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72  lause into separ
34c90 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  ate subexpressio
34ca0 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20  ns where each.  
34cb0 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
34cc0 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79   is separated by
34cd0 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
34ce0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73  ..  */.  initMas
34cf0 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a  kSet(pMaskSet);.
34d00 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
34d10 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
34d20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
34d30 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
34d40 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65  nts(pParse, pWhe
34d50 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  re);.  whereSpli
34d60 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
34d70 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b  pWhere, TK_AND);
34d80 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
34d90 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
34da0 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
34db0 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
34dc0 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
34dd0 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20    .  /* Special 
34de0 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
34df0 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
34e00 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
34e10 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
34e20 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
34e30 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
34e40 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
34e50 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
34e60 66 28 20 70 57 68 65 72 65 20 26 26 20 28 6e 54  f( pWhere && (nT
34e70 61 62 4c 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c  abList==0 || sql
34e80 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
34e90 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65  ntNotJoin(pWhere
34ea0 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
34eb0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
34ec0 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
34ed0 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c  nfo->iBreak, SQL
34ee0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
34ef0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
34f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
34f10 61 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d  al case: No FROM
34f20 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69   clause.  */.  i
34f30 66 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29  f( nTabList==0 )
34f40 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
34f50 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
34f60 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Sat = 1;.    if(
34f70 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
34f80 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
34f90 54 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  T ){.      pWInf
34fa0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
34fb0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
34fc0 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IQUE;.    }.  }.
34fd0 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62  .  /* Assign a b
34fe0 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d  it from the bitm
34ff0 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72  ask to every ter
35000 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
35010 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ause..  **.  ** 
35020 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62  When assigning b
35030 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f  itmask values to
35040 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72   FROM clause cur
35050 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65  sors, it must be
35060 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74  .  ** the case t
35070 68 61 74 20 69 66 20 58 20 69 73 20 74 68 65 20  hat if X is the 
35080 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
35090 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65  N-th FROM clause
350a0 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20   term then.  ** 
350b0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
350c0 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
350d0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66  terms to the lef
350e0 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65  t of the N-th te
350f0 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29  rm.  ** is (X-1)
35100 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f  .   An expressio
35110 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  n from the ON cl
35120 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
35130 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a  OIN can use.  **
35140 20 69 74 73 20 45 78 70 72 2e 69 52 69 67 68 74   its Expr.iRight
35150 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20  JoinTable value 
35160 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d  to find the bitm
35170 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74  ask of the right
35180 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74   table.  ** of t
35190 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61  he join.  Subtra
351a0 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74  cting one from t
351b0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 62  he right table b
351c0 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20  itmask gives a. 
351d0 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20   ** bitmask for 
351e0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
351f0 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f  e left of the jo
35200 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65  in.  Knowing the
35210 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f   bitmask.  ** fo
35220 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
35230 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
35240 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72  ft join is impor
35250 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33  tant.  Ticket #3
35260 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  015..  **.  ** N
35270 6f 74 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b  ote that bitmask
35280 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
35290 72 20 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e  r all pTabList->
352a0 6e 53 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20  nSrc tables in. 
352b0 20 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f   ** pTabList, no
352c0 74 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74  t just the first
352d0 20 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73   nTabList tables
352e0 2e 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e  .  nTabList is n
352f0 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75  ormally.  ** equ
35300 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e  al to pTabList->
35310 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62  nSrc but might b
35320 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31  e shortened to 1
35330 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45   if the.  ** WHE
35340 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
35350 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
35360 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
35370 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
35380 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  ; ii++){.    cre
35390 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
353a0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69  , pTabList->a[ii
353b0 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ].iCursor);.  }.
353c0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
353d0 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74   {.    Bitmask t
353e0 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20  oTheLeft = 0;.  
353f0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
35400 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
35410 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i++){.      Bitm
35420 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28  ask m = getMask(
35430 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
35440 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
35450 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
35460 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65  ( (m-1)==toTheLe
35470 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54 68  ft );.      toTh
35480 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20  eLeft |= m;.    
35490 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
354a0 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
354b0 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
354c0 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
354d0 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
354e0 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
354f0 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
35500 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
35510 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
35520 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
35530 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
35540 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
35550 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
35560 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
35570 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
35580 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
35590 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
355a0 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
355b0 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
355c0 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79    */.  exprAnaly
355d0 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20  zeAll(pTabList, 
355e0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20  &pWInfo->sWC);. 
355f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
35600 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
35610 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35620 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  r;.  }..  /* If 
35630 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  the ORDER BY (or
35640 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
35650 65 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  e contains refer
35660 65 6e 63 65 73 20 74 6f 20 67 65 6e 65 72 61 6c  ences to general
35670 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
35680 73 2c 20 74 68 65 6e 20 77 65 20 77 6f 6e 27 74  s, then we won't
35690 20 62 65 20 61 62 6c 65 20 74 6f 20 73 61 74 69   be able to sati
356a0 73 66 79 20 69 74 20 75 73 69 6e 67 20 69 6e 64  sfy it using ind
356b0 69 63 65 73 2c 20 73 6f 0a 20 20 2a 2a 20 67 6f  ices, so.  ** go
356c0 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 61 62   ahead and disab
356d0 6c 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  le it now..  */.
356e0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
356f0 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
35700 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
35710 4e 43 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  NCT)!=0 ){.    f
35720 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 64  or(ii=0; ii<pOrd
35730 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
35740 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
35750 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
35760 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
35770 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70  OrderBy->a[ii].p
35780 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
35790 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
357a0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
357b0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
357c0 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 30  y = pOrderBy = 0
357d0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
357e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
357f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
35800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
35810 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
35820 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74  }.  }..  if( wct
35830 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35840 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
35850 0a 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69  .    if( isDisti
35860 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
35870 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26  rse, pTabList, &
35880 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65  pWInfo->sWC, pRe
35890 73 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20  sultSet) ){.    
358a0 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43    /* The DISTINC
358b0 54 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69  T marking is poi
358c0 6e 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20  ntless.  Ignore 
358d0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49  it. */.      pWI
358e0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d  nfo->eDistinct =
358f0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
35900 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73  UNIQUE;.    }els
35910 65 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d  e if( pOrderBy==
35920 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
35930 79 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68  y to ORDER BY th
35940 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
35950 6d 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72  make distinct pr
35960 6f 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20  ocessing easier 
35970 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  */.      pWInfo-
35980 3e 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  >wctrlFlags |= W
35990 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b  HERE_DISTINCTBY;
359a0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70  .      pWInfo->p
359b0 4f 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c  OrderBy = pResul
359c0 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
359d0 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
359e0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
359f0 6a 65 63 74 73 20 2a 2f 0a 20 20 57 48 45 52 45  jects */.  WHERE
35a00 54 52 41 43 45 28 30 78 66 66 66 66 2c 28 22 2a  TRACE(0xffff,("*
35a10 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
35a20 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69  rt ***\n"));.  i
35a30 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
35a40 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
35a50 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
35a60 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
35a70 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
35a80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
35a90 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35aa0 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
35ab0 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
35ac0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
35ad0 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
35ae0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
35af0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
35b00 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
35b10 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
35b20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f  ){.      WhereLo
35b30 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20 69 6e 74  op *p;.      int
35b40 20 69 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63   i;.      static
35b50 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
35b60 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
35b70 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
35b80 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
35b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
35bb0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
35bc0 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
35bd0 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
35be0 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
35bf0 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
35c00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
35c10 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
35c20 25 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d  %sizeof(zLabel)]
35c30 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c  ;.        whereL
35c40 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70 54 61 62  oopPrint(p, pTab
35c50 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
35c60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
35c70 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
35c80 65 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20  er(pWInfo, 0);. 
35c90 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
35ca0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77  cFailed ) goto w
35cb0 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
35cc0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
35cd0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
35ce0 20 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76     wherePathSolv
35cf0 65 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66  er(pWInfo, pWInf
35d00 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20  o->nRowOut+1);. 
35d10 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
35d20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
35d30 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
35d40 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
35d50 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
35d60 72 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66  rBy==0 && (db->f
35d70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
35d80 76 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29  verseOrder)!=0 )
35d90 7b 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  {.     pWInfo->r
35da0 65 76 4d 61 73 6b 20 3d 20 28 42 69 74 6d 61 73  evMask = (Bitmas
35db0 6b 29 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 69 66  k)(-1);.  }.  if
35dc0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
35dd0 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c  | NEVER(db->mall
35de0 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20  ocFailed) ){.   
35df0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
35e00 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65  Error;.  }.#ifde
35e10 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
35e20 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
35e30 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a  e3WhereTrace ){.
35e40 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
35e50 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
35e60 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f  tf("---- Solutio
35e70 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e  n nRow=%d", pWIn
35e80 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20  fo->nRowOut);.  
35e90 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 62 4f    if( pWInfo->bO
35ea0 42 53 61 74 20 29 7b 0a 20 20 20 20 20 20 73 71  BSat ){.      sq
35eb0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
35ec0 28 22 20 4f 52 44 45 52 42 59 3d 30 78 25 6c 6c  (" ORDERBY=0x%ll
35ed0 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d  x", pWInfo->revM
35ee0 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ask);.    }.    
35ef0 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e  switch( pWInfo->
35f00 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
35f10 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
35f20 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
35f30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35f40 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44  DebugPrintf("  D
35f50 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65 22 29  ISTINCT=unique")
35f60 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
35f80 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
35f90 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
35fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
35fb0 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
35fc0 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a  INCT=ordered");.
35fd0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
35fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
35ff0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
36000 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  _UNORDERED: {.  
36010 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
36020 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
36030 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64 22 29  INCT=unordered")
36040 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
36050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36060 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
36070 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
36080 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57   for(ii=0; ii<pW
36090 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69  Info->nLevel; ii
360a0 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  ++){.      where
360b0 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e 66 6f  LoopPrint(pWInfo
360c0 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20  ->a[ii].pWLoop, 
360d0 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pTabList);.    }
360e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
360f0 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74   Attempt to omit
36100 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68 65   tables from the
36110 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f   join that do no
36120 74 20 65 66 66 65 63 74 20 74 68 65 20 72 65 73  t effect the res
36130 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  ult */.  if( pWI
36140 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20  nfo->nLevel>=2. 
36150 20 20 26 26 20 70 52 65 73 75 6c 74 53 65 74 21    && pResultSet!
36160 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
36170 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
36180 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
36190 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42  Join).  ){.    B
361a0 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20 3d  itmask tabUsed =
361b0 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
361c0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52  age(pMaskSet, pR
361d0 65 73 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69  esultSet);.    i
361e0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 74 61  f( pOrderBy ) ta
361f0 62 55 73 65 64 20 7c 3d 20 65 78 70 72 4c 69 73  bUsed |= exprLis
36200 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
36210 6b 53 65 74 2c 20 70 4f 72 64 65 72 42 79 29 3b  kSet, pOrderBy);
36220 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e  .    while( pWIn
36230 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b  fo->nLevel>=2 ){
36240 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
36250 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a   *pTerm, *pEnd;.
36260 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
36270 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e  Info->a[pWInfo->
36280 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70  nLevel-1].pWLoop
36290 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 57 49  ;.      if( (pWI
362a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
362b0 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f  [pLoop->iTab].jo
362c0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
362d0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
362e0 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c      if( (wctrlFl
362f0 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
36300 5f 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20  _DISTINCT)==0.  
36310 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e       && (pLoop->
36320 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
36330 4f 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20  ONEROW)==0.     
36340 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
36350 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
36360 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20   if( (tabUsed & 
36370 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
36380 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
36390 20 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70     pEnd = sWLB.p
363a0 57 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43  WC->a + sWLB.pWC
363b0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66  ->nTerm;.      f
363c0 6f 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57  or(pTerm=sWLB.pW
363d0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64  C->a; pTerm<pEnd
363e0 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
363f0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
36400 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f  prereqAll & pLoo
36410 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a  p->maskSelf)!=0.
36420 20 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70           && !Exp
36430 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
36440 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
36450 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
36460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
36470 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
36480 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36490 70 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65  pTerm<pEnd ) bre
364a0 61 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  ak;.      WHERET
364b0 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d  RACE(0xffff, ("-
364c0 3e 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e  > drop loop %c n
364d0 6f 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f  ot used\n", pLoo
364e0 70 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20  p->cId));.      
364f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d  pWInfo->nLevel--
36500 3b 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74  ;.      nTabList
36510 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
36520 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
36530 66 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  f,("*** Optimize
36540 72 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e  r Finished ***\n
36550 22 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  "));.  pWInfo->p
36560 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
36570 70 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  p += pWInfo->nRo
36580 77 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  wOut;..  /* If t
36590 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20  he caller is an 
365a0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
365b0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
365c0 69 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20  is requesting.  
365d0 2a 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d  ** to use a one-
365e0 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  pass algorithm, 
365f0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69  determine if thi
36600 73 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  s is appropriate
36610 2e 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70  ..  ** The one-p
36620 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e  ass algorithm on
36630 6c 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20  ly works if the 
36640 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
36650 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68  straints.  ** th
36660 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75  e statement to u
36670 70 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72  pdate a single r
36680 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ow..  */.  asser
36690 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  t( (wctrlFlags &
366a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
366b0 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57  ESIRED)==0 || pW
366c0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20  Info->nLevel==1 
366d0 29 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46  );.  if( (wctrlF
366e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
366f0 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30  PASS_DESIRED)!=0
36700 20 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d   .   && (pWInfo-
36710 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
36720 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
36730 45 52 4f 57 29 21 3d 30 20 29 7b 0a 20 20 20 20  EROW)!=0 ){.    
36740 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
36750 73 20 3d 20 31 3b 0a 20 20 20 20 70 57 49 6e 66  s = 1;.    pWInf
36760 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
36770 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52  wsFlags &= ~WHER
36780 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_IDX_ONLY;.  }.
36790 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
367a0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
367b0 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
367c0 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
367d0 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
367e0 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
367f0 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
36800 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
36810 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65   for(ii=0, pLeve
36820 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c  l=pWInfo->a; ii<
36830 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20  nTabList; ii++, 
36840 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
36850 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
36860 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
36870 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
36880 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
36890 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
368a0 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
368b0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75  ndex */.    stru
368c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
368d0 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
368e0 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
368f0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
36900 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
36910 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
36920 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
36930 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
36940 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
36950 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  ema);.    pLoop 
36960 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
36970 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
36980 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
36990 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
369a0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
369b0 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
369c0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  hing */.    }els
369d0 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
369e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
369f0 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  LE.    if( (pLoo
36a00 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
36a10 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
36a20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
36a30 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
36a40 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
36a50 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
36a60 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
36a70 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
36a80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
36a90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36aa0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
36ab0 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
36ac0 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
36ad0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
36ae0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
36af0 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20  {.      /* noop 
36b00 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  */.    }else.#en
36b10 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  dif.    if( (pLo
36b20 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
36b30 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
36b40 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63  .         && (wc
36b50 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36b60 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
36b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
36b80 74 20 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f  t op = pWInfo->o
36b90 6b 4f 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70  kOnePass ? OP_Op
36ba0 65 6e 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65  enWrite : OP_Ope
36bb0 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c  nRead;.      sql
36bc0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
36bd0 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
36be0 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
36bf0 61 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 74  ab, op);.      t
36c00 65 73 74 63 61 73 65 28 20 21 70 57 49 6e 66 6f  estcase( !pWInfo
36c10 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
36c20 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31  Tab->nCol==BMS-1
36c30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
36c40 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  se( !pWInfo->okO
36c50 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
36c60 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
36c70 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e     if( !pWInfo->
36c80 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61  okOnePass && pTa
36c90 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20  b->nCol<BMS ){. 
36ca0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
36cb0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c   = pTabItem->col
36cc0 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Used;.        in
36cd0 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
36ce0 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31   for(; b; b=b>>1
36cf0 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  , n++){}.       
36d00 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
36d10 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56  geP4(v, sqlite3V
36d20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
36d30 29 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  )-1, .          
36d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d50 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
36d60 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
36d70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
36d80 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
36d90 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
36da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
36db0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
36dc0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
36dd0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
36de0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  zName);.    }.#i
36df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36e00 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
36e10 58 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  X.    if( (pLoop
36e20 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
36e30 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
36e40 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
36e50 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
36e60 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
36e70 6f 2d 3e 73 57 43 2c 20 70 54 61 62 49 74 65 6d  o->sWC, pTabItem
36e80 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
36e90 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  el);.    }else.#
36ea0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c  endif.    if( pL
36eb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
36ec0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
36ed0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78        Index *pIx
36ee0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
36ef0 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  e.pIndex;.      
36f00 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
36f10 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
36f20 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
36f30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 4d 45  ;.      /* FIXME
36f40 3a 20 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a  :  As an optimiz
36f50 61 74 69 6f 6e 20 75 73 65 20 70 54 61 62 49 74  ation use pTabIt
36f60 65 6d 2d 3e 69 43 75 72 73 6f 72 20 69 66 20 57  em->iCursor if W
36f70 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 2a 2f  HERE_IDX_ONLY */
36f80 0a 20 20 20 20 20 20 69 6e 74 20 69 49 6e 64 65  .      int iInde
36f90 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
36fa0 49 64 78 43 75 72 20 3d 20 69 49 64 78 43 75 72  IdxCur = iIdxCur
36fb0 20 3f 20 69 49 64 78 43 75 72 20 3a 20 70 50 61   ? iIdxCur : pPa
36fc0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
36fd0 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
36fe0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
36ff0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
37000 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
37010 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r>=0 );.      sq
37020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
37030 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
37040 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d 3e  iIndexCur, pIx->
37050 74 6e 75 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20  tnum, iDb,.     
37060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37070 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
37080 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
37090 46 46 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  FF);.      VdbeC
370a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
370b0 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
370c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
370d0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
370e0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
370f0 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e     notReady &= ~
37100 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
37110 3e 73 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49  >sMaskSet, pTabI
37120 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
37130 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
37140 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
37150 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
37160 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
37170 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
37180 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20  reBeginError;.. 
37190 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
371a0 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20   code to do the 
371b0 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74  search.  Each it
371c0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  eration of the f
371d0 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c  or.  ** loop bel
371e0 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ow generates cod
371f0 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e  e for a single n
37200 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
37210 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61  e VM.  ** progra
37220 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61  m..  */.  notRea
37230 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30  dy = ~(Bitmask)0
37240 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
37250 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29  <nTabList; ii++)
37260 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
37270 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20  pWInfo->a[ii];. 
37280 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61     explainOneSca
37290 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
372a0 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20  st, pLevel, ii, 
372b0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77  pLevel->iFrom, w
372c0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
372d0 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f  notReady = codeO
372e0 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e  neLoopStart(pWIn
372f0 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79  fo, ii, notReady
37300 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69  );.    pWInfo->i
37310 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65  Continue = pLeve
37320 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d  l->addrCont;.  }
37330 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a 2f 0a  ..  /* Done. */.
37340 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
37350 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
37360 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
37370 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
37380 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
37390 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
373a0 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
373b0 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
373c0 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
373d0 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
373e0 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
373f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
37400 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
37410 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
37420 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
37430 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
37440 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
37450 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
37460 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
37470 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
37480 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
37490 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
374a0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
374b0 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
374c0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
374d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
374e0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
374f0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
37500 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  op;.  SrcList *p
37510 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
37520 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
37530 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
37540 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
37550 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
37560 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
37570 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
37580 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
37590 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e  e);.  for(i=pWIn
375a0 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e  fo->nLevel-1; i>
375b0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c  =0; i--){.    pL
375c0 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
375d0 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
375e0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
375f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
37600 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37610 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
37620 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  t);.    if( pLev
37630 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  el->op!=OP_Noop 
37640 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
37650 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c  VdbeAddOp2(v, pL
37660 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c  evel->op, pLevel
37670 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32  ->p1, pLevel->p2
37680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
37690 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
376a0 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20  pLevel->p5);.   
376b0 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70   }.    if( pLoop
376c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
376d0 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65  E_IN_ABLE && pLe
376e0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20  vel->u.in.nIn>0 
376f0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
37700 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20  InLoop *pIn;.   
37710 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
37720 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
37730 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
37740 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  l->addrNxt);.   
37750 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d     for(j=pLevel-
37760 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26  >u.in.nIn, pIn=&
37770 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
37780 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20  Loop[j-1]; j>0; 
37790 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20  j--, pIn--){.   
377a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
377b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d  JumpHere(v, pIn-
377c0 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20  >addrInTop+1);. 
377d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
377e0 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d  beAddOp2(v, pIn-
377f0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e  >eEndLoopOp, pIn
37800 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64  ->iCur, pIn->add
37810 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20  rInTop);.       
37820 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
37830 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
37840 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
37850 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
37860 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65  DbFree(db, pLeve
37870 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29  l->u.in.aInLoop)
37880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
37890 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
378a0 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  bel(v, pLevel->a
378b0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28  ddrBrk);.    if(
378c0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
378d0 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
378e0 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
378f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
37900 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
37910 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  , pLevel->iLeftJ
37920 6f 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65  oin);.      asse
37930 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
37940 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
37950 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
37960 20 20 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77      || (pLoop->w
37970 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
37980 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
37990 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
379a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
379b0 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  IDX_ONLY)==0 ){.
379c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
379d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
379e0 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
379f0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
37a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37a10 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
37a20 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
37a30 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ED ){.        sq
37a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
37a50 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
37a60 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
37a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37a80 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  f( pLevel->op==O
37a90 50 5f 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20  P_Return ){.    
37aa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37ab0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
37ac0 62 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70  b, pLevel->p1, p
37ad0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
37ae0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
37af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37b00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37b10 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
37b20 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
37b30 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
37b40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37b50 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
37b60 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22 62 72   }..  /* The "br
37b70 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20 68 65  eak" point is he
37b80 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20 74 68  re, just past th
37b90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 75 74  e end of the out
37ba0 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65  er loop..  ** Se
37bb0 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  t it..  */.  sql
37bc0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
37bd0 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e  abel(v, pWInfo->
37be0 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43  iBreak);..  /* C
37bf0 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  lose all of the 
37c00 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 65 72  cursors that wer
37c10 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69  e opened by sqli
37c20 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20  te3WhereBegin.. 
37c30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 57   */.  assert( pW
37c40 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
37c50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
37c60 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
37c70 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
37c80 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
37c90 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
37ca0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
37cb0 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53   0;.    struct S
37cc0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61  rcList_item *pTa
37cd0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
37ce0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
37cf0 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  om];.    Table *
37d00 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
37d10 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72  >pTab;.    asser
37d20 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
37d30 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
37d40 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
37d50 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
37d60 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
37d70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61  )==0.     && pTa
37d80 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20  b->pSelect==0.  
37d90 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
37da0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
37db0 45 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53  E_OMIT_OPEN_CLOS
37dc0 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  E)==0.    ){.   
37dd0 20 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f     int ws = pLoo
37de0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
37df0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
37e00 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20  kOnePass && (ws 
37e10 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
37e20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37e40 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
37e50 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
37e60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37e70 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
37e80 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20  _INDEXED)!=0 && 
37e90 28 77 73 20 26 20 28 57 48 45 52 45 5f 49 50 4b  (ws & (WHERE_IPK
37ea0 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45  |WHERE_AUTO_INDE
37eb0 58 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  X))==0 ){.      
37ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37ed0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
37ee0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
37ef0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37f00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
37f10 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
37f20 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
37f30 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
37f40 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
37f50 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
37f60 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
37f70 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
37f80 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
37f90 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
37fa0 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
37fb0 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
37fc0 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
37fd0 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
37fe0 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
37ff0 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
38000 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
38010 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
38020 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
38030 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
38040 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
38050 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
38060 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
38070 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
38080 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
38090 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
380a0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
380b0 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
380c0 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
380d0 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
380e0 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
380f0 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
38100 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
38110 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
38120 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
38130 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
38140 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
38150 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38160 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
38170 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
38180 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
38190 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
381a0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
381b0 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
381c0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
381d0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
381e0 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
381f0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC