/ Hex Artifact Content
Login

Artifact 3173f0275cf8643a03ed02084ee56b97fc1a17a2edb5907facec504f59c3172d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  6.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75   contains code u
0190: 73 65 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65  se to manipulate
01a0: 20 22 4d 65 6d 22 20 73 74 72 75 63 74 75 72 65   "Mem" structure
01b0: 2e 20 20 41 20 22 4d 65 6d 22 0a 2a 2a 20 73 74  .  A "Mem".** st
01c0: 6f 72 65 73 20 61 20 73 69 6e 67 6c 65 20 76 61  ores a single va
01d0: 6c 75 65 20 69 6e 20 74 68 65 20 56 44 42 45 2e  lue in the VDBE.
01e0: 20 20 4d 65 6d 20 69 73 20 61 6e 20 6f 70 61 71    Mem is an opaq
01f0: 75 65 20 73 74 72 75 63 74 75 72 65 20 76 69 73  ue structure vis
0200: 69 62 6c 65 0a 2a 2a 20 6f 6e 6c 79 20 77 69 74  ible.** only wit
0210: 68 69 6e 20 74 68 65 20 56 44 42 45 2e 20 20 49  hin the VDBE.  I
0220: 6e 74 65 72 66 61 63 65 20 72 6f 75 74 69 6e 65  nterface routine
0230: 73 20 72 65 66 65 72 20 74 6f 20 61 20 4d 65 6d  s refer to a Mem
0240: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 61   using the.** na
0250: 6d 65 20 73 71 6c 69 74 65 5f 76 61 6c 75 65 0a  me sqlite_value.
0260: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0270: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0280: 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a  de "vdbeInt.h"..
0290: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
02a0: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  BUG./*.** Check 
02b0: 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 61 20  invariants on a 
02c0: 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  Mem object..**.*
02d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
02e0: 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75  s intended for u
02f0: 73 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  se inside of ass
0300: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
0310: 2c 20 6c 69 6b 65 0a 2a 2a 20 74 68 69 73 3a 20  , like.** this: 
0320: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
0330: 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e  e3VdbeCheckMemIn
0340: 76 61 72 69 61 6e 74 73 28 70 4d 65 6d 29 20 29  variants(pMem) )
0350: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.*/.int sqlite3
0360: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
0370: 72 69 61 6e 74 73 28 4d 65 6d 20 2a 70 29 7b 0a  riants(Mem *p){.
0380: 20 20 2f 2a 20 49 66 20 4d 45 4d 5f 44 79 6e 20    /* If MEM_Dyn 
0390: 69 73 20 73 65 74 20 74 68 65 6e 20 4d 65 6d 2e  is set then Mem.
03a0: 78 44 65 6c 21 3d 30 2e 20 20 0a 20 20 2a 2a 20  xDel!=0.  .  ** 
03b0: 4d 65 6d 2e 78 44 65 6c 20 6d 69 67 68 74 20 6e  Mem.xDel might n
03c0: 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ot be initialize
03d0: 64 20 69 66 20 4d 45 4d 5f 44 79 6e 20 69 73 20  d if MEM_Dyn is 
03e0: 63 6c 65 61 72 2e 0a 20 20 2a 2f 0a 20 20 61 73  clear..  */.  as
03f0: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 20  sert( (p->flags 
0400: 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 7c 7c  & MEM_Dyn)==0 ||
0410: 20 70 2d 3e 78 44 65 6c 21 3d 30 20 29 3b 0a 0a   p->xDel!=0 );..
0420: 20 20 2f 2a 20 4d 45 4d 5f 44 79 6e 20 6d 61 79    /* MEM_Dyn may
0430: 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20   only be set if 
0440: 4d 65 6d 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 2e  Mem.szMalloc==0.
0450: 20 20 49 6e 20 74 68 69 73 20 77 61 79 20 77 65    In this way we
0460: 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
0470: 74 20 69 66 20 4d 65 6d 2e 73 7a 4d 61 6c 6c 6f  t if Mem.szMallo
0480: 63 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 73  c>0 then it is s
0490: 61 66 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 4d  afe to do.  ** M
04a0: 65 6d 2e 7a 20 3d 20 4d 65 6d 2e 7a 4d 61 6c 6c  em.z = Mem.zMall
04b0: 6f 63 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  oc without havin
04c0: 67 20 74 6f 20 63 68 65 63 6b 20 4d 65 6d 2e 66  g to check Mem.f
04d0: 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 2e 0a 20 20  lags&MEM_Dyn..  
04e0: 2a 2a 20 54 68 61 74 20 73 61 76 65 73 20 61 20  ** That saves a 
04f0: 66 65 77 20 63 79 63 6c 65 73 20 69 6e 20 69 6e  few cycles in in
0500: 6e 65 72 20 6c 6f 6f 70 73 2e 20 2a 2f 0a 20 20  ner loops. */.  
0510: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
0520: 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20  s & MEM_Dyn)==0 
0530: 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d  || p->szMalloc==
0540: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6e 6e 6f  0 );..  /* Canno
0550: 74 20 62 65 20 62 6f 74 68 20 4d 45 4d 5f 49 6e  t be both MEM_In
0560: 74 20 61 6e 64 20 4d 45 4d 5f 52 65 61 6c 20 61  t and MEM_Real a
0570: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
0580: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  */.  assert( (p-
0590: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
05a0: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 28 4d  t|MEM_Real))!=(M
05b0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
05c0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c   );..  if( p->fl
05d0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
05e0: 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  {.    /* Cannot 
05f0: 62 65 20 62 6f 74 68 20 4d 45 4d 5f 4e 75 6c 6c  be both MEM_Null
0600: 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20   and some other 
0610: 74 79 70 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  type */.    asse
0620: 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  rt( (p->flags & 
0630: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
0640: 6c 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  l|MEM_Str|MEM_Bl
0650: 6f 62 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20  ob|MEM_Agg))==0 
0660: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 4d 45  );..    /* If ME
0670: 4d 5f 4e 75 6c 6c 20 69 73 20 73 65 74 2c 20 74  M_Null is set, t
0680: 68 65 6e 20 65 69 74 68 65 72 20 74 68 65 20 76  hen either the v
0690: 61 6c 75 65 20 69 73 20 61 20 70 75 72 65 20 4e  alue is a pure N
06a0: 55 4c 4c 20 28 74 68 65 20 75 73 75 61 6c 0a 20  ULL (the usual. 
06b0: 20 20 20 2a 2a 20 63 61 73 65 29 20 6f 72 20 69     ** case) or i
06c0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 73  t is a pointer s
06d0: 65 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  et using sqlite3
06e0: 5f 62 69 6e 64 5f 70 6f 69 6e 74 65 72 28 29 20  _bind_pointer() 
06f0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
0700: 33 5f 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72  3_result_pointer
0710: 28 29 2e 20 20 49 66 20 61 20 70 6f 69 6e 74 65  ().  If a pointe
0720: 72 2c 20 74 68 65 6e 20 4d 45 4d 5f 54 65 72 6d  r, then MEM_Term
0730: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 0a 20 20   must also be.  
0740: 20 20 2a 2a 20 73 65 74 2e 0a 20 20 20 20 2a 2f    ** set..    */
0750: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 6c 61  .    if( (p->fla
0760: 67 73 20 26 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d  gs & (MEM_Term|M
0770: 45 4d 5f 53 75 62 74 79 70 65 29 29 3d 3d 28 4d  EM_Subtype))==(M
0780: 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 75 62 74  EM_Term|MEM_Subt
0790: 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ype) ){.      /*
07a0: 20 54 68 69 73 20 69 73 20 61 20 70 6f 69 6e 74   This is a point
07b0: 65 72 20 74 79 70 65 2e 20 20 54 68 65 72 65 20  er type.  There 
07c0: 6d 61 79 20 62 65 20 61 20 66 6c 61 67 20 74 6f  may be a flag to
07d0: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
07e0: 6f 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 77 69  o.      ** do wi
07f0: 74 68 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  th the pointer. 
0800: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
0810: 20 28 28 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f   ((p->flags&MEM_
0820: 44 79 6e 29 21 3d 30 20 3f 20 31 20 3a 20 30 29  Dyn)!=0 ? 1 : 0)
0830: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
0840: 20 28 28 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f   ((p->flags&MEM_
0850: 45 70 68 65 6d 29 21 3d 30 20 3f 20 31 20 3a 20  Ephem)!=0 ? 1 : 
0860: 30 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  0) +.           
0870: 20 20 20 28 28 70 2d 3e 66 6c 61 67 73 26 4d 45     ((p->flags&ME
0880: 4d 5f 53 74 61 74 69 63 29 21 3d 30 20 3f 20 31  M_Static)!=0 ? 1
0890: 20 3a 20 30 29 20 3c 3d 20 31 20 29 3b 0a 0a 20   : 0) <= 1 );.. 
08a0: 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 74 68 65 72       /* No other
08b0: 20 62 69 74 73 20 73 65 74 20 2a 2f 0a 20 20 20   bits set */.   
08c0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66     assert( (p->f
08d0: 6c 61 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c  lags & ~(MEM_Nul
08e0: 6c 7c 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53  l|MEM_Term|MEM_S
08f0: 75 62 74 79 70 65 0a 20 20 20 20 20 20 20 20 20  ubtype.         
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45    |MEM_Dyn|MEM_E
0920: 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29  phem|MEM_Static)
0930: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
0940: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 70 75  e{.      /* A pu
0950: 72 65 20 4e 55 4c 4c 20 6d 69 67 68 74 20 68 61  re NULL might ha
0960: 76 65 20 6f 74 68 65 72 20 66 6c 61 67 73 2c 20  ve other flags, 
0970: 73 75 63 68 20 61 73 20 4d 45 4d 5f 53 74 61 74  such as MEM_Stat
0980: 69 63 2c 20 4d 45 4d 5f 44 79 6e 2c 0a 20 20 20  ic, MEM_Dyn,.   
0990: 20 20 20 2a 2a 20 4d 45 4d 5f 45 70 68 65 6d 2c     ** MEM_Ephem,
09a0: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 2c 20 6f 72   MEM_Cleared, or
09b0: 20 4d 45 4d 5f 53 75 62 74 79 70 65 20 2a 2f 0a   MEM_Subtype */.
09c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
09d0: 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 5f 43 6c     /* The MEM_Cl
09e0: 65 61 72 65 64 20 62 69 74 20 69 73 20 6f 6e 6c  eared bit is onl
09f0: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 4e 55 4c  y allowed on NUL
0a00: 4c 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  Ls */.    assert
0a10: 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  ( (p->flags & ME
0a20: 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 20 29 3b  M_Cleared)==0 );
0a30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
0a40: 7a 4d 61 6c 6c 6f 63 20 66 69 65 6c 64 20 68 6f  zMalloc field ho
0a50: 6c 64 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  lds the correct 
0a60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0a70: 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65  n size */.  asse
0a80: 72 74 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d  rt( p->szMalloc=
0a90: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  =0.       || p->
0aa0: 73 7a 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69 74 65  szMalloc==sqlite
0ab0: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d  3DbMallocSize(p-
0ac0: 3e 64 62 2c 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 20  >db,p->zMalloc) 
0ad0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 20 68 6f  );..  /* If p ho
0ae0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20  lds a string or 
0af0: 62 6c 6f 62 2c 20 74 68 65 20 4d 65 6d 2e 7a 20  blob, the Mem.z 
0b00: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 65 78  must point to ex
0b10: 61 63 74 6c 79 0a 20 20 2a 2a 20 6f 6e 65 20 6f  actly.  ** one o
0b20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
0b30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 31 29  .  **.  **   (1)
0b40: 20 4d 65 6d 6f 72 79 20 69 6e 20 4d 65 6d 2e 7a   Memory in Mem.z
0b50: 4d 61 6c 6c 6f 63 20 61 6e 64 20 6d 61 6e 61 67  Malloc and manag
0b60: 65 64 20 62 79 20 74 68 65 20 4d 65 6d 20 6f 62  ed by the Mem ob
0b70: 6a 65 63 74 0a 20 20 2a 2a 20 20 20 28 32 29 20  ject.  **   (2) 
0b80: 4d 65 6d 6f 72 79 20 74 6f 20 62 65 20 66 72 65  Memory to be fre
0b90: 65 64 20 75 73 69 6e 67 20 4d 65 6d 2e 78 44 65  ed using Mem.xDe
0ba0: 6c 0a 20 20 2a 2a 20 20 20 28 33 29 20 41 6e 20  l.  **   (3) An 
0bb0: 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69 6e 67  ephemeral string
0bc0: 20 6f 72 20 62 6c 6f 62 0a 20 20 2a 2a 20 20 20   or blob.  **   
0bd0: 28 34 29 20 41 20 73 74 61 74 69 63 20 73 74 72  (4) A static str
0be0: 69 6e 67 20 6f 72 20 62 6c 6f 62 0a 20 20 2a 2f  ing or blob.  */
0bf0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0c00: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c10: 42 6c 6f 62 29 29 20 26 26 20 70 2d 3e 6e 3e 30  Blob)) && p->n>0
0c20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
0c30: 0a 20 20 20 20 20 20 28 28 70 2d 3e 73 7a 4d 61  .      ((p->szMa
0c40: 6c 6c 6f 63 3e 30 20 26 26 20 70 2d 3e 7a 3d 3d  lloc>0 && p->z==
0c50: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3f 20 31 20 3a  p->zMalloc)? 1 :
0c60: 20 30 29 20 2b 0a 20 20 20 20 20 20 28 28 70 2d   0) +.      ((p-
0c70: 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 21  >flags&MEM_Dyn)!
0c80: 3d 30 20 3f 20 31 20 3a 20 30 29 20 2b 0a 20 20  =0 ? 1 : 0) +.  
0c90: 20 20 20 20 28 28 70 2d 3e 66 6c 61 67 73 26 4d      ((p->flags&M
0ca0: 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20 3f 20 31  EM_Ephem)!=0 ? 1
0cb0: 20 3a 20 30 29 20 2b 0a 20 20 20 20 20 20 28 28   : 0) +.      ((
0cc0: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61  p->flags&MEM_Sta
0cd0: 74 69 63 29 21 3d 30 20 3f 20 31 20 3a 20 30 29  tic)!=0 ? 1 : 0)
0ce0: 20 3d 3d 20 31 0a 20 20 20 20 29 3b 0a 20 20 7d   == 1.    );.  }
0cf0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
0d00: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
0d10: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
0d20: 20 43 68 65 63 6b 20 74 68 61 74 20 73 74 72 69   Check that stri
0d30: 6e 67 20 76 61 6c 75 65 20 6f 66 20 70 4d 65 6d  ng value of pMem
0d40: 20 61 67 72 65 65 73 20 77 69 74 68 20 69 74 73   agrees with its
0d50: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
0d60: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   value..**.** A 
0d70: 73 69 6e 67 6c 65 20 69 6e 74 20 6f 72 20 72 65  single int or re
0d80: 61 6c 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20  al value always 
0d90: 63 6f 6e 76 65 72 74 73 20 74 6f 20 74 68 65 20  converts to the 
0da0: 73 61 6d 65 20 73 74 72 69 6e 67 73 2e 20 20 42  same strings.  B
0db0: 75 74 0a 2a 2a 20 6d 61 6e 79 20 64 69 66 66 65  ut.** many diffe
0dc0: 72 65 6e 74 20 73 74 72 69 6e 67 73 20 63 61 6e  rent strings can
0dd0: 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
0de0: 74 6f 20 74 68 65 20 73 61 6d 65 20 69 6e 74 20  to the same int 
0df0: 6f 72 20 72 65 61 6c 2e 0a 2a 2a 20 49 66 20 61  or real..** If a
0e00: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
0e10: 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20  a numeric value 
0e20: 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20  and an index is 
0e30: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
0e40: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74  corresponding st
0e50: 72 69 6e 67 20 76 61 6c 75 65 2c 20 74 68 65 6e  ring value, then
0e60: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
0e70: 20 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67   that the string
0e80: 20 62 65 0a 2a 2a 20 64 65 72 69 76 65 64 20 66   be.** derived f
0e90: 72 6f 6d 20 74 68 65 20 6e 75 6d 65 72 69 63 20  rom the numeric 
0ea0: 76 61 6c 75 65 2c 20 6e 6f 74 20 74 68 65 20 6f  value, not the o
0eb0: 74 68 65 72 20 77 61 79 20 61 72 6f 75 6e 64 2c  ther way around,
0ec0: 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68   to ensure.** th
0ed0: 61 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  at the index and
0ee0: 20 74 61 62 6c 65 20 61 72 65 20 63 6f 6e 73 69   table are consi
0ef0: 73 74 65 6e 74 2e 20 20 53 65 65 20 74 69 63 6b  stent.  See tick
0f00: 65 74 0a 2a 2a 20 68 74 74 70 73 3a 2f 2f 77 77  et.** https://ww
0f10: 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
0f20: 2f 69 6e 66 6f 2f 33 34 33 36 33 34 39 34 32 64  /info/343634942d
0f30: 64 35 34 61 62 20 28 32 30 31 38 2d 30 31 2d 33  d54ab (2018-01-3
0f40: 31 29 20 66 6f 72 0a 2a 2a 20 61 6e 20 65 78 61  1) for.** an exa
0f50: 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  mple..**.** This
0f60: 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61   routine looks a
0f70: 74 20 70 4d 65 6d 20 74 6f 20 76 65 72 69 66 79  t pMem to verify
0f80: 20 74 68 61 74 20 69 66 20 69 74 20 68 61 73 20   that if it has 
0f90: 62 6f 74 68 20 61 20 6e 75 6d 65 72 69 63 0a 2a  both a numeric.*
0fa0: 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
0fb0: 20 61 6e 64 20 61 20 73 74 72 69 6e 67 20 72 65   and a string re
0fc0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 68 65  presentation the
0fd0: 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  n the string rep
0fe0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 64 65 72   has.** been der
0ff0: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 75  ived from the nu
1000: 6d 65 72 69 63 20 61 6e 64 20 6e 6f 74 20 74 68  meric and not th
1010: 65 20 6f 74 68 65 72 20 77 61 79 20 61 72 6f 75  e other way arou
1020: 6e 64 2e 20 20 49 74 20 72 65 74 75 72 6e 73 0a  nd.  It returns.
1030: 2a 2a 20 74 72 75 65 20 69 66 20 65 76 65 72 79  ** true if every
1040: 74 68 69 6e 67 20 69 73 20 6f 6b 20 61 6e 64 20  thing is ok and 
1050: 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
1060: 73 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2a 0a  s a problem..**.
1070: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1080: 69 73 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64  is for use insid
1090: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
10a0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a  atements only..*
10b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
10c0: 65 4d 65 6d 43 6f 6e 73 69 73 74 65 6e 74 44 75  eMemConsistentDu
10d0: 61 6c 52 65 70 28 4d 65 6d 20 2a 70 29 7b 0a 20  alRep(Mem *p){. 
10e0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
10f0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
1100: 74 20 69 2c 20 6a 2c 20 69 6e 63 72 3b 0a 20 20  t i, j, incr;.  
1110: 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
1120: 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 20 72 65  MEM_Str)==0 ) re
1130: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 28 70  turn 1;.  if( (p
1140: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
1150: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d 3d 30  nt|MEM_Real))==0
1160: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1170: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  f( p->flags & ME
1180: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  M_Int ){.    sql
1190: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
11a0: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
11b0: 22 25 6c 6c 64 22 2c 70 2d 3e 75 2e 69 29 3b 0a  "%lld",p->u.i);.
11c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
11e0: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
11f0: 22 25 21 2e 31 35 67 22 2c 70 2d 3e 75 2e 72 29  "%!.15g",p->u.r)
1200: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 70 2d 3e 7a  ;.  }.  z = p->z
1210: 3b 0a 20 20 69 20 3d 20 6a 20 3d 20 30 3b 0a 20  ;.  i = j = 0;. 
1220: 20 69 6e 63 72 20 3d 20 31 3b 0a 20 20 69 66 28   incr = 1;.  if(
1230: 20 70 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f   p->enc!=SQLITE_
1240: 55 54 46 38 20 29 7b 0a 20 20 20 20 69 6e 63 72  UTF8 ){.    incr
1250: 20 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 2;.    if( p-
1260: 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1270: 31 36 42 45 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a  16BE ) z++;.  }.
1280: 20 20 77 68 69 6c 65 28 20 7a 42 75 66 5b 6a 5d    while( zBuf[j]
1290: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 42 75 66   ){.    if( zBuf
12a0: 5b 6a 2b 2b 5d 21 3d 7a 5b 69 5d 20 29 20 72 65  [j++]!=z[i] ) re
12b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 20 2b 3d  turn 0;.    i +=
12c0: 20 69 6e 63 72 3b 0a 20 20 7d 0a 20 20 72 65 74   incr;.  }.  ret
12d0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
12e0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
12f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 4d 65  */../*.** If pMe
1300: 6d 20 69 73 20 61 6e 20 6f 62 6a 65 63 74 20 77  m is an object w
1310: 69 74 68 20 61 20 76 61 6c 69 64 20 73 74 72 69  ith a valid stri
1320: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
1330: 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  n, this routine.
1340: 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 65 20 69  ** ensures the i
1350: 6e 74 65 72 6e 61 6c 20 65 6e 63 6f 64 69 6e 67  nternal encoding
1360: 20 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20   for the string 
1370: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
1380: 73 0a 2a 2a 20 27 64 65 73 69 72 65 64 45 6e 63  s.** 'desiredEnc
1390: 27 2c 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ', one of SQLITE
13a0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 55 54  _UTF8, SQLITE_UT
13b0: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
13c0: 55 54 46 31 36 42 45 2e 0a 2a 2a 0a 2a 2a 20 49  UTF16BE..**.** I
13d0: 66 20 70 4d 65 6d 20 69 73 20 6e 6f 74 20 61 20  f pMem is not a 
13e0: 73 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 6f  string object, o
13f0: 72 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  r the encoding o
1400: 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  f the string.** 
1410: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
1420: 73 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  s already stored
1430: 20 75 73 69 6e 67 20 74 68 65 20 72 65 71 75 65   using the reque
1440: 73 74 65 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74  sted encoding, t
1450: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
1460: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1470: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1480: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
1490: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  he conversion is
14a0: 20 73 75 63 63 65 73 73 66 75 6c 20 28 6f 72 20   successful (or 
14b0: 6e 6f 74 20 72 65 71 75 69 72 65 64 29 2e 0a 2a  not required)..*
14c0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d  * SQLITE_NOMEM m
14d0: 61 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 69  ay be returned i
14e0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
14f0: 6c 73 20 64 75 72 69 6e 67 20 63 6f 6e 76 65 72  ls during conver
1500: 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20  sion.** between 
1510: 66 6f 72 6d 61 74 73 2e 0a 2a 2f 0a 69 6e 74 20  formats..*/.int 
1520: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1530: 65 45 6e 63 6f 64 69 6e 67 28 4d 65 6d 20 2a 70  eEncoding(Mem *p
1540: 4d 65 6d 2c 20 69 6e 74 20 64 65 73 69 72 65 64  Mem, int desired
1550: 45 6e 63 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  Enc){.#ifndef SQ
1560: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1570: 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66    int rc;.#endif
1580: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
1590: 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
15a0: 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 61 73  et(pMem) );.  as
15b0: 73 65 72 74 28 20 64 65 73 69 72 65 64 45 6e 63  sert( desiredEnc
15c0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
15d0: 20 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c   desiredEnc==SQL
15e0: 49 54 45 5f 55 54 46 31 36 4c 45 0a 20 20 20 20  ITE_UTF16LE.    
15f0: 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65         || desire
1600: 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  dEnc==SQLITE_UTF
1610: 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 21 28  16BE );.  if( !(
1620: 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pMem->flags&MEM_
1630: 53 74 72 29 20 7c 7c 20 70 4d 65 6d 2d 3e 65 6e  Str) || pMem->en
1640: 63 3d 3d 64 65 73 69 72 65 64 45 6e 63 20 29 7b  c==desiredEnc ){
1650: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1660: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1670: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
1680: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
1690: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
16a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 23 69 66 64 65  >mutex) );.#ifde
16b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
16c0: 46 31 36 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  F16.  return SQL
16d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  ITE_ERROR;.#else
16e0: 0a 0a 20 20 2f 2a 20 4d 65 6d 54 72 61 6e 73 6c  ..  /* MemTransl
16f0: 61 74 65 28 29 20 6d 61 79 20 72 65 74 75 72 6e  ate() may return
1700: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
1710: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 66 20 4e  LITE_NOMEM. If N
1720: 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
1730: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ,.  ** then the 
1740: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
1750: 76 61 6c 75 65 20 6d 61 79 20 6e 6f 74 20 68 61  value may not ha
1760: 76 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f  ve changed..  */
1770: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
1780: 64 62 65 4d 65 6d 54 72 61 6e 73 6c 61 74 65 28  dbeMemTranslate(
1790: 70 4d 65 6d 2c 20 28 75 38 29 64 65 73 69 72 65  pMem, (u8)desire
17a0: 64 45 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  dEnc);.  assert(
17b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20  rc==SQLITE_OK   
17c0: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
17d0: 4f 4d 45 4d 29 3b 0a 20 20 61 73 73 65 72 74 28  OMEM);.  assert(
17e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20  rc==SQLITE_OK   
17f0: 20 7c 7c 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 64   || pMem->enc!=d
1800: 65 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 61 73  esiredEnc);.  as
1810: 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
1820: 4e 4f 4d 45 4d 20 7c 7c 20 70 4d 65 6d 2d 3e 65  NOMEM || pMem->e
1830: 6e 63 3d 3d 64 65 73 69 72 65 64 45 6e 63 29 3b  nc==desiredEnc);
1840: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
1850: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
1860: 6b 65 20 73 75 72 65 20 70 4d 65 6d 2d 3e 7a 20  ke sure pMem->z 
1870: 70 6f 69 6e 74 73 20 74 6f 20 61 20 77 72 69 74  points to a writ
1880: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  able allocation 
1890: 6f 66 20 61 74 20 6c 65 61 73 74 20 0a 2a 2a 20  of at least .** 
18a0: 6d 69 6e 28 6e 2c 33 32 29 20 62 79 74 65 73 2e  min(n,32) bytes.
18b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 50  .**.** If the bP
18c0: 72 65 73 65 72 76 65 20 61 72 67 75 6d 65 6e 74  reserve argument
18d0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 63   is true, then c
18e0: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  opy of the conte
18f0: 6e 74 20 6f 66 0a 2a 2a 20 70 4d 65 6d 2d 3e 7a  nt of.** pMem->z
1900: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 61 6c   into the new al
1910: 6c 6f 63 61 74 69 6f 6e 2e 20 20 70 4d 65 6d 20  location.  pMem 
1920: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 61  must be either a
1930: 20 73 74 72 69 6e 67 20 6f 72 0a 2a 2a 20 62 6c   string or.** bl
1940: 6f 62 20 69 66 20 62 50 72 65 73 65 72 76 65 20  ob if bPreserve 
1950: 69 73 20 74 72 75 65 2e 20 20 49 66 20 62 50 72  is true.  If bPr
1960: 65 73 65 72 76 65 20 69 73 20 66 61 6c 73 65 2c  eserve is false,
1970: 20 61 6e 79 20 70 72 69 6f 72 20 63 6f 6e 74 65   any prior conte
1980: 6e 74 0a 2a 2a 20 69 6e 20 70 4d 65 6d 2d 3e 7a  nt.** in pMem->z
1990: 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a   is discarded..*
19a0: 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  /.SQLITE_NOINLIN
19b0: 45 20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  E int sqlite3Vdb
19c0: 65 4d 65 6d 47 72 6f 77 28 4d 65 6d 20 2a 70 4d  eMemGrow(Mem *pM
19d0: 65 6d 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 62  em, int n, int b
19e0: 50 72 65 73 65 72 76 65 29 7b 0a 20 20 61 73 73  Preserve){.  ass
19f0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
1a00: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
1a10: 74 73 28 70 4d 65 6d 29 20 29 3b 0a 20 20 61 73  ts(pMem) );.  as
1a20: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 56 64  sert( !sqlite3Vd
1a30: 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d  beMemIsRowSet(pM
1a40: 65 6d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  em) );.  testcas
1a50: 65 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 29  e( pMem->db==0 )
1a60: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1a70: 50 72 65 73 65 72 76 65 20 66 6c 61 67 20 69 73  Preserve flag is
1a80: 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
1a90: 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  en the memory ce
1aa0: 6c 6c 20 6d 75 73 74 20 61 6c 72 65 61 64 79 0a  ll must already.
1ab0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 76    ** contain a v
1ac0: 61 6c 69 64 20 73 74 72 69 6e 67 20 6f 72 20 62  alid string or b
1ad0: 6c 6f 62 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  lob value.  */. 
1ae0: 20 61 73 73 65 72 74 28 20 62 50 72 65 73 65 72   assert( bPreser
1af0: 76 65 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 66  ve==0 || pMem->f
1b00: 6c 61 67 73 26 28 4d 45 4d 5f 42 6c 6f 62 7c 4d  lags&(MEM_Blob|M
1b10: 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 74 65 73  EM_Str) );.  tes
1b20: 74 63 61 73 65 28 20 62 50 72 65 73 65 72 76 65  tcase( bPreserve
1b30: 20 26 26 20 70 4d 65 6d 2d 3e 7a 3d 3d 30 20 29   && pMem->z==0 )
1b40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  ;..  assert( pMe
1b50: 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 0a 20  m->szMalloc==0. 
1b60: 20 20 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 73        || pMem->s
1b70: 7a 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69 74 65 33  zMalloc==sqlite3
1b80: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65  DbMallocSize(pMe
1b90: 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61  m->db, pMem->zMa
1ba0: 6c 6c 6f 63 29 20 29 3b 0a 20 20 69 66 28 20 6e  lloc) );.  if( n
1bb0: 3c 33 32 20 29 20 6e 20 3d 20 33 32 3b 0a 20 20  <32 ) n = 32;.  
1bc0: 69 66 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  if( pMem->szMall
1bd0: 6f 63 3e 30 20 26 26 20 62 50 72 65 73 65 72 76  oc>0 && bPreserv
1be0: 65 20 26 26 20 70 4d 65 6d 2d 3e 7a 3d 3d 70 4d  e && pMem->z==pM
1bf0: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  em->zMalloc ){. 
1c00: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65     pMem->z = pMe
1c10: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c  m->zMalloc = sql
1c20: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1c30: 72 65 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d  ree(pMem->db, pM
1c40: 65 6d 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 62  em->z, n);.    b
1c50: 50 72 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  Preserve = 0;.  
1c60: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1c70: 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20  Mem->szMalloc>0 
1c80: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e  ) sqlite3DbFreeN
1c90: 4e 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d  N(pMem->db, pMem
1ca0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
1cb0: 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pMem->zMalloc = 
1cc0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1cd0: 61 77 28 70 4d 65 6d 2d 3e 64 62 2c 20 6e 29 3b  aw(pMem->db, n);
1ce0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 2d  .  }.  if( pMem-
1cf0: 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20  >zMalloc==0 ){. 
1d00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1d10: 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a  mSetNull(pMem);.
1d20: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b      pMem->z = 0;
1d30: 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
1d40: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  loc = 0;.    ret
1d50: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1d60: 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
1d70: 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
1d80: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
1d90: 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64  llocSize(pMem->d
1da0: 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  b, pMem->zMalloc
1db0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50  );.  }..  if( bP
1dc0: 72 65 73 65 72 76 65 20 26 26 20 70 4d 65 6d 2d  reserve && pMem-
1dd0: 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >z ){.    assert
1de0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d  ( pMem->z!=pMem-
1df0: 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  >zMalloc );.    
1e00: 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 4d 61  memcpy(pMem->zMa
1e10: 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70  lloc, pMem->z, p
1e20: 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 69  Mem->n);.  }.  i
1e30: 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  f( (pMem->flags&
1e40: 4d 45 4d 5f 44 79 6e 29 21 3d 30 20 29 7b 0a 20  MEM_Dyn)!=0 ){. 
1e50: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
1e60: 3e 78 44 65 6c 21 3d 30 20 26 26 20 70 4d 65 6d  >xDel!=0 && pMem
1e70: 2d 3e 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  ->xDel!=SQLITE_D
1e80: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 70 4d  YNAMIC );.    pM
1e90: 65 6d 2d 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a  em->xDel((void *
1ea0: 29 28 70 4d 65 6d 2d 3e 7a 29 29 3b 0a 20 20 7d  )(pMem->z));.  }
1eb0: 0a 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d  ..  pMem->z = pM
1ec0: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 70  em->zMalloc;.  p
1ed0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Mem->flags &= ~(
1ee0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65  MEM_Dyn|MEM_Ephe
1ef0: 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  m|MEM_Static);. 
1f00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
1f20: 67 65 20 74 68 65 20 70 4d 65 6d 2d 3e 7a 4d 61  ge the pMem->zMa
1f30: 6c 6c 6f 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  lloc allocation 
1f40: 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 73  to be at least s
1f50: 7a 4e 65 77 20 62 79 74 65 73 2e 0a 2a 2a 20 49  zNew bytes..** I
1f60: 66 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  f pMem->zMalloc 
1f70: 61 6c 72 65 61 64 79 20 6d 65 65 74 73 20 6f 72  already meets or
1f80: 20 65 78 63 65 65 64 73 20 74 68 65 20 72 65 71   exceeds the req
1f90: 75 65 73 74 65 64 20 73 69 7a 65 2c 20 74 68 69  uested size, thi
1fa0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
1fb0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
1fc0: 6e 79 20 70 72 69 6f 72 20 73 74 72 69 6e 67 20  ny prior string 
1fd0: 6f 72 20 62 6c 6f 62 20 63 6f 6e 74 65 6e 74 20  or blob content 
1fe0: 69 6e 20 74 68 65 20 70 4d 65 6d 20 6f 62 6a 65  in the pMem obje
1ff0: 63 74 20 6d 61 79 20 62 65 20 64 69 73 63 61 72  ct may be discar
2000: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 70 4d 65 6d  ded..** The pMem
2010: 2d 3e 78 44 65 6c 20 64 65 73 74 72 75 63 74 6f  ->xDel destructo
2020: 72 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 66 20  r is called, if 
2030: 69 74 20 65 78 69 73 74 73 2e 20 20 54 68 6f 75  it exists.  Thou
2040: 67 68 20 4d 45 4d 5f 53 74 72 0a 2a 2a 20 61 6e  gh MEM_Str.** an
2050: 64 20 4d 45 4d 5f 42 6c 6f 62 20 76 61 6c 75 65  d MEM_Blob value
2060: 73 20 6d 61 79 20 62 65 20 64 69 73 63 61 72 64  s may be discard
2070: 65 64 2c 20 4d 45 4d 5f 49 6e 74 2c 20 4d 45 4d  ed, MEM_Int, MEM
2080: 5f 52 65 61 6c 2c 20 61 6e 64 20 4d 45 4d 5f 4e  _Real, and MEM_N
2090: 75 6c 6c 0a 2a 2a 20 76 61 6c 75 65 73 20 61 72  ull.** values ar
20a0: 65 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  e preserved..**.
20b0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
20c0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
20d0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
20e0: 28 70 72 6f 62 61 62 6c 79 20 53 51 4c 49 54 45  (probably SQLITE
20f0: 5f 4e 4f 4d 45 4d 29 0a 2a 2a 20 69 66 20 75 6e  _NOMEM).** if un
2100: 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
2110: 20 74 68 65 20 72 65 73 69 7a 69 6e 67 2e 0a 2a   the resizing..*
2120: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2130: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
2140: 7a 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  ze(Mem *pMem, in
2150: 74 20 73 7a 4e 65 77 29 7b 0a 20 20 61 73 73 65  t szNew){.  asse
2160: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
2170: 7c 20 73 7a 4e 65 77 3e 30 20 29 3b 0a 20 20 61  | szNew>0 );.  a
2180: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
2190: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d  ags & MEM_Dyn)==
21a0: 30 20 7c 7c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  0 || pMem->szMal
21b0: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  loc==0 );.  if( 
21c0: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3c 73  pMem->szMalloc<s
21d0: 7a 4e 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75  zNew ){.    retu
21e0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  rn sqlite3VdbeMe
21f0: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 73 7a 4e 65  mGrow(pMem, szNe
2200: 77 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 73 73  w, 0);.  }.  ass
2210: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
2220: 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20  s & MEM_Dyn)==0 
2230: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70  );.  pMem->z = p
2240: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20  Mem->zMalloc;.  
2250: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 28  pMem->flags &= (
2260: 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 49 6e 74  MEM_Null|MEM_Int
2270: 7c 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 72 65  |MEM_Real);.  re
2280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2290: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 20 69 73 20 61  }../*.** It is a
22a0: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 20 74 68 61  lready known tha
22b0: 74 20 70 4d 65 6d 20 63 6f 6e 74 61 69 6e 73 20  t pMem contains 
22c0: 61 6e 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20  an unterminated 
22d0: 73 74 72 69 6e 67 2e 0a 2a 2a 20 41 64 64 20 74  string..** Add t
22e0: 68 65 20 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  he zero terminat
22f0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  or..*/.static SQ
2300: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2310: 74 20 76 64 62 65 4d 65 6d 41 64 64 54 65 72 6d  t vdbeMemAddTerm
2320: 69 6e 61 74 6f 72 28 4d 65 6d 20 2a 70 4d 65 6d  inator(Mem *pMem
2330: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2340: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
2350: 2c 20 70 4d 65 6d 2d 3e 6e 2b 32 2c 20 31 29 20  , pMem->n+2, 1) 
2360: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2370: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2380: 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 7a 5b 70  .  }.  pMem->z[p
2390: 4d 65 6d 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70  Mem->n] = 0;.  p
23a0: 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b 31  Mem->z[pMem->n+1
23b0: 5d 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e 66  ] = 0;.  pMem->f
23c0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
23d0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
23f0: 68 61 6e 67 65 20 70 4d 65 6d 20 73 6f 20 74 68  hange pMem so th
2400: 61 74 20 69 74 73 20 4d 45 4d 5f 53 74 72 20 6f  at its MEM_Str o
2410: 72 20 4d 45 4d 5f 42 6c 6f 62 20 76 61 6c 75 65  r MEM_Blob value
2420: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
2430: 20 4d 45 4d 2e 7a 4d 61 6c 6c 6f 63 2c 20 77 68   MEM.zMalloc, wh
2440: 65 72 65 20 69 74 20 63 61 6e 20 62 65 20 73 61  ere it can be sa
2450: 66 65 6c 79 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  fely written..**
2460: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2470: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
2480: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
2490: 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
24a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
24b0: 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61  dbeMemMakeWritea
24c0: 62 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  ble(Mem *pMem){.
24d0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
24e0: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
24f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d  _mutex_held(pMem
2500: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2510: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
2520: 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65  e3VdbeMemIsRowSe
2530: 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 66 28  t(pMem) );.  if(
2540: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
2550: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
2560: 62 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  b))!=0 ){.    if
2570: 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 4d 65  ( ExpandBlob(pMe
2580: 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
2590: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66  TE_NOMEM;.    if
25a0: 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  ( pMem->szMalloc
25b0: 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 7a 21 3d  ==0 || pMem->z!=
25c0: 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  pMem->zMalloc ){
25d0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
25e0: 76 64 62 65 4d 65 6d 41 64 64 54 65 72 6d 69 6e  vdbeMemAddTermin
25f0: 61 74 6f 72 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ator(pMem);.    
2600: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2610: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2620: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d    pMem->flags &=
2630: 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 23 69 66   ~MEM_Ephem;.#if
2640: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2650: 0a 20 20 70 4d 65 6d 2d 3e 70 53 63 6f 70 79 46  .  pMem->pScopyF
2660: 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
2670: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2680: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
2690: 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d 2a 20   the given Mem* 
26a0: 68 61 73 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  has a zero-fille
26b0: 64 20 74 61 69 6c 2c 20 74 75 72 6e 20 69 74 20  d tail, turn it 
26c0: 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61 72 79  into an ordinary
26d0: 0a 2a 2a 20 62 6c 6f 62 20 73 74 6f 72 65 64 20  .** blob stored 
26e0: 69 6e 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  in dynamically a
26f0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a  llocated space..
2700: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2710: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
2720: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
2730: 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 4d 65 6d  emExpandBlob(Mem
2740: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 6e   *pMem){.  int n
2750: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
2760: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
2770: 4d 5f 5a 65 72 6f 20 29 3b 0a 20 20 61 73 73 65  M_Zero );.  asse
2780: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  rt( pMem->flags&
2790: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 61 73  MEM_Blob );.  as
27a0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 56 64  sert( !sqlite3Vd
27b0: 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d  beMemIsRowSet(pM
27c0: 65 6d 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  em) );.  assert(
27d0: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
27e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27f0: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
2800: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ex) );..  /* Set
2810: 20 6e 42 79 74 65 20 74 6f 20 74 68 65 20 6e 75   nByte to the nu
2820: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
2830: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
2840: 74 68 65 20 65 78 70 61 6e 64 65 64 20 62 6c 6f  the expanded blo
2850: 62 2e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  b. */.  nByte = 
2860: 70 4d 65 6d 2d 3e 6e 20 2b 20 70 4d 65 6d 2d 3e  pMem->n + pMem->
2870: 75 2e 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e  u.nZero;.  if( n
2880: 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 6e  Byte<=0 ){.    n
2890: 42 79 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Byte = 1;.  }.  
28a0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
28b0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79  emGrow(pMem, nBy
28c0: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65  te, 1) ){.    re
28d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28e0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 6d  M_BKPT;.  }..  m
28f0: 65 6d 73 65 74 28 26 70 4d 65 6d 2d 3e 7a 5b 70  emset(&pMem->z[p
2900: 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 70 4d 65 6d  Mem->n], 0, pMem
2910: 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 70 4d  ->u.nZero);.  pM
2920: 65 6d 2d 3e 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75  em->n += pMem->u
2930: 2e 6e 5a 65 72 6f 3b 0a 20 20 70 4d 65 6d 2d 3e  .nZero;.  pMem->
2940: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 5a  flags &= ~(MEM_Z
2950: 65 72 6f 7c 4d 45 4d 5f 54 65 72 6d 29 3b 0a 20  ero|MEM_Term);. 
2960: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2970: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
2980: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
2990: 20 67 69 76 65 6e 20 4d 65 6d 20 69 73 20 5c 75   given Mem is \u
29a0: 30 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 2e  0000 terminated.
29b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
29c0: 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61  dbeMemNulTermina
29d0: 74 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  te(Mem *pMem){. 
29e0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
29f0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
2a00: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
2a10: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2a20: 20 74 65 73 74 63 61 73 65 28 20 28 70 4d 65 6d   testcase( (pMem
2a30: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 54  ->flags & (MEM_T
2a40: 65 72 6d 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  erm|MEM_Str))==(
2a50: 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74 72  MEM_Term|MEM_Str
2a60: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
2a70: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
2a80: 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74  (MEM_Term|MEM_St
2a90: 72 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  r))==0 );.  if( 
2aa0: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28  (pMem->flags & (
2ab0: 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74 72  MEM_Term|MEM_Str
2ac0: 29 29 21 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))!=MEM_Str ){. 
2ad0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ae0: 5f 4f 4b 3b 20 20 20 2f 2a 20 4e 6f 74 68 69 6e  _OK;   /* Nothin
2af0: 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
2b00: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 76  se{.    return v
2b10: 64 62 65 4d 65 6d 41 64 64 54 65 72 6d 69 6e 61  dbeMemAddTermina
2b20: 74 6f 72 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 7d  tor(pMem);.  }.}
2b30: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 4d 45 4d 5f  ../*.** Add MEM_
2b40: 53 74 72 20 74 6f 20 74 68 65 20 73 65 74 20 6f  Str to the set o
2b50: 66 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  f representation
2b60: 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  s for the given 
2b70: 4d 65 6d 2e 20 20 4e 75 6d 62 65 72 73 0a 2a 2a  Mem.  Numbers.**
2b80: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 75   are converted u
2b90: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 6e 70  sing sqlite3_snp
2ba0: 72 69 6e 74 66 28 29 2e 20 20 43 6f 6e 76 65 72  rintf().  Conver
2bb0: 74 69 6e 67 20 61 20 42 4c 4f 42 20 74 6f 20 61  ting a BLOB to a
2bc0: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 61 20   string.** is a 
2bd0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 69  no-op..**.** Exi
2be0: 73 74 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  sting representa
2bf0: 74 69 6f 6e 73 20 4d 45 4d 5f 49 6e 74 20 61 6e  tions MEM_Int an
2c00: 64 20 4d 45 4d 5f 52 65 61 6c 20 61 72 65 20 69  d MEM_Real are i
2c10: 6e 76 61 6c 69 64 61 74 65 64 20 69 66 0a 2a 2a  nvalidated if.**
2c20: 20 62 46 6f 72 63 65 20 69 73 20 74 72 75 65 20   bForce is true 
2c30: 62 75 74 20 61 72 65 20 72 65 74 61 69 6e 65 64  but are retained
2c40: 20 69 66 20 62 46 6f 72 63 65 20 69 73 20 66 61   if bForce is fa
2c50: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4d 45 4d  lse..**.** A MEM
2c60: 5f 4e 75 6c 6c 20 76 61 6c 75 65 20 77 69 6c 6c  _Null value will
2c70: 20 6e 65 76 65 72 20 62 65 20 70 61 73 73 65 64   never be passed
2c80: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2c90: 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
2ca0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20   is.** used for 
2cb0: 63 6f 6e 76 65 72 74 69 6e 67 20 76 61 6c 75 65  converting value
2cc0: 73 20 74 6f 20 74 65 78 74 20 66 6f 72 20 72 65  s to text for re
2cd0: 74 75 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 75  turning to the u
2ce0: 73 65 72 20 28 69 2e 65 2e 20 76 69 61 0a 2a 2a  ser (i.e. via.**
2cf0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2d00: 65 78 74 28 29 29 2c 20 6f 72 20 66 6f 72 20 65  ext()), or for e
2d10: 6e 73 75 72 69 6e 67 20 74 68 61 74 20 76 61 6c  nsuring that val
2d20: 75 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 61  ues to be used a
2d30: 73 20 62 74 72 65 65 0a 2a 2a 20 6b 65 79 73 20  s btree.** keys 
2d40: 61 72 65 20 73 74 72 69 6e 67 73 2e 20 49 6e 20  are strings. In 
2d50: 74 68 65 20 66 6f 72 6d 65 72 20 63 61 73 65 20  the former case 
2d60: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69  a NULL pointer i
2d70: 73 20 72 65 74 75 72 6e 65 64 20 74 68 65 0a 2a  s returned the.*
2d80: 2a 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 6c  * user and the l
2d90: 61 74 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65  atter is an inte
2da0: 72 6e 61 6c 20 70 72 6f 67 72 61 6d 6d 69 6e 67  rnal programming
2db0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
2dc0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72  qlite3VdbeMemStr
2dd0: 69 6e 67 69 66 79 28 4d 65 6d 20 2a 70 4d 65 6d  ingify(Mem *pMem
2de0: 2c 20 75 38 20 65 6e 63 2c 20 75 38 20 62 46 6f  , u8 enc, u8 bFo
2df0: 72 63 65 29 7b 0a 20 20 69 6e 74 20 66 67 20 3d  rce){.  int fg =
2e00: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
2e10: 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79 74 65 20  const int nByte 
2e20: 3d 20 33 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  = 32;..  assert(
2e30: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
2e40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e50: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
2e60: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2e70: 20 21 28 66 67 26 4d 45 4d 5f 5a 65 72 6f 29 20   !(fg&MEM_Zero) 
2e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 66  );.  assert( !(f
2e90: 67 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  g&(MEM_Str|MEM_B
2ea0: 6c 6f 62 29 29 20 29 3b 0a 20 20 61 73 73 65 72  lob)) );.  asser
2eb0: 74 28 20 66 67 26 28 4d 45 4d 5f 49 6e 74 7c 4d  t( fg&(MEM_Int|M
2ec0: 45 4d 5f 52 65 61 6c 29 20 29 3b 0a 20 20 61 73  EM_Real) );.  as
2ed0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 56 64  sert( !sqlite3Vd
2ee0: 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d  beMemIsRowSet(pM
2ef0: 65 6d 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  em) );.  assert(
2f00: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2f10: 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a  NMENT(pMem) );..
2f20: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
2f30: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
2f40: 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65 29  ize(pMem, nByte)
2f50: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e   ){.    pMem->en
2f60: 63 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  c = 0;.    retur
2f70: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2f80: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  KPT;.  }..  /* F
2f90: 6f 72 20 61 20 52 65 61 6c 20 6f 72 20 49 6e 74  or a Real or Int
2fa0: 65 67 65 72 2c 20 75 73 65 20 73 71 6c 69 74 65  eger, use sqlite
2fb0: 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 74 6f 20  3_snprintf() to 
2fc0: 70 72 6f 64 75 63 65 20 74 68 65 20 55 54 46 2d  produce the UTF-
2fd0: 38 0a 20 20 2a 2a 20 73 74 72 69 6e 67 20 72 65  8.  ** string re
2fe0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2ff0: 74 68 65 20 76 61 6c 75 65 2e 20 54 68 65 6e 2c  the value. Then,
3000: 20 69 66 20 74 68 65 20 72 65 71 75 69 72 65 64   if the required
3010: 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 69   encoding.  ** i
3020: 73 20 55 54 46 2d 31 36 6c 65 20 6f 72 20 55 54  s UTF-16le or UT
3030: 46 2d 31 36 62 65 20 64 6f 20 61 20 74 72 61 6e  F-16be do a tran
3040: 73 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2a 20 0a 20  slation..  ** . 
3050: 20 2a 2a 20 46 49 58 20 4d 45 3a 20 49 74 20 77   ** FIX ME: It w
3060: 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72 20 69  ould be better i
3070: 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  f sqlite3_snprin
3080: 74 66 28 29 20 63 6f 75 6c 64 20 64 6f 20 55 54  tf() could do UT
3090: 46 2d 31 36 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  F-16..  */.  if(
30a0: 20 66 67 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b   fg & MEM_Int ){
30b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30c0: 72 69 6e 74 66 28 6e 42 79 74 65 2c 20 70 4d 65  rintf(nByte, pMe
30d0: 6d 2d 3e 7a 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  m->z, "%lld", pM
30e0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73  em->u.i);.  }els
30f0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  e{.    assert( f
3100: 67 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  g & MEM_Real );.
3110: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3120: 69 6e 74 66 28 6e 42 79 74 65 2c 20 70 4d 65 6d  intf(nByte, pMem
3130: 2d 3e 7a 2c 20 22 25 21 2e 31 35 67 22 2c 20 70  ->z, "%!.15g", p
3140: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 7d 0a 20  Mem->u.r);.  }. 
3150: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
3160: 21 3d 30 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 6e  !=0 );.  pMem->n
3170: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
3180: 33 30 4e 4e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  30NN(pMem->z);. 
3190: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
31a0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 70 4d 65 6d  ITE_UTF8;.  pMem
31b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
31c0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 69  tr|MEM_Term;.  i
31d0: 66 28 20 62 46 6f 72 63 65 20 29 20 70 4d 65 6d  f( bForce ) pMem
31e0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
31f0: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 3b 0a  _Int|MEM_Real);.
3200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
3210: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d  ngeEncoding(pMem
3220: 2c 20 65 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  , enc);.  return
3230: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3240: 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  *.** Memory cell
3250: 20 70 4d 65 6d 20 63 6f 6e 74 61 69 6e 73 20 74   pMem contains t
3260: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 6e  he context of an
3270: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
3280: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
3290: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 66  tine calls the f
32a0: 69 6e 61 6c 69 7a 65 20 6d 65 74 68 6f 64 20 66  inalize method f
32b0: 6f 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  or that function
32c0: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  .  The.** result
32d0: 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
32e0: 65 20 69 73 20 73 74 6f 72 65 64 20 62 61 63 6b  e is stored back
32f0: 20 69 6e 74 6f 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a   into pMem..**.*
3300: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
3310: 45 52 52 4f 52 20 69 66 20 74 68 65 20 66 69 6e  ERROR if the fin
3320: 61 6c 69 7a 65 72 20 72 65 70 6f 72 74 73 20 61  alizer reports a
3330: 6e 20 65 72 72 6f 72 2e 20 20 53 51 4c 49 54 45  n error.  SQLITE
3340: 5f 4f 4b 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  _OK.** otherwise
3350: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3360: 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28  VdbeMemFinalize(
3370: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 46 75 6e 63 44  Mem *pMem, FuncD
3380: 65 66 20 2a 70 46 75 6e 63 29 7b 0a 20 20 73 71  ef *pFunc){.  sq
3390: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74  lite3_context ct
33a0: 78 3b 0a 20 20 4d 65 6d 20 74 3b 0a 20 20 61 73  x;.  Mem t;.  as
33b0: 73 65 72 74 28 20 70 46 75 6e 63 21 3d 30 20 29  sert( pFunc!=0 )
33c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
33d0: 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  c->xFinalize!=0 
33e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  );.  assert( (pM
33f0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
3400: 4e 75 6c 6c 29 21 3d 30 20 7c 7c 20 70 46 75 6e  Null)!=0 || pFun
3410: 63 3d 3d 70 4d 65 6d 2d 3e 75 2e 70 44 65 66 20  c==pMem->u.pDef 
3420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
3430: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  m->db==0 || sqli
3440: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3450: 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  Mem->db->mutex) 
3460: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 74 78  );.  memset(&ctx
3470: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 74 78 29  , 0, sizeof(ctx)
3480: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 2c 20  );.  memset(&t, 
3490: 30 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  0, sizeof(t));. 
34a0: 20 74 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e   t.flags = MEM_N
34b0: 75 6c 6c 3b 0a 20 20 74 2e 64 62 20 3d 20 70 4d  ull;.  t.db = pM
34c0: 65 6d 2d 3e 64 62 3b 0a 20 20 63 74 78 2e 70 4f  em->db;.  ctx.pO
34d0: 75 74 20 3d 20 26 74 3b 0a 20 20 63 74 78 2e 70  ut = &t;.  ctx.p
34e0: 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 63 74  Mem = pMem;.  ct
34f0: 78 2e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b  x.pFunc = pFunc;
3500: 0a 20 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c  .  pFunc->xFinal
3510: 69 7a 65 28 26 63 74 78 29 3b 20 2f 2a 20 49 4d  ize(&ctx); /* IM
3520: 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33 30  P: R-24505-23230
3530: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
3540: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
3550: 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 69 66  _Dyn)==0 );.  if
3560: 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  ( pMem->szMalloc
3570: 3e 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  >0 ) sqlite3DbFr
3580: 65 65 4e 4e 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  eeNN(pMem->db, p
3590: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  Mem->zMalloc);. 
35a0: 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2c 20 26 74   memcpy(pMem, &t
35b0: 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
35c0: 72 65 74 75 72 6e 20 63 74 78 2e 69 73 45 72 72  return ctx.isErr
35d0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  or;.}../*.** Mem
35e0: 6f 72 79 20 63 65 6c 6c 20 70 41 63 63 75 6d 20  ory cell pAccum 
35f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e  contains the con
3600: 74 65 78 74 20 6f 66 20 61 6e 20 61 67 67 72 65  text of an aggre
3610: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
3620: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
3630: 61 6c 6c 73 20 74 68 65 20 78 56 61 6c 75 65 20  alls the xValue 
3640: 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20  method for that 
3650: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f  function and sto
3660: 72 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  res.** the resul
3670: 74 73 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ts in memory cel
3680: 6c 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 53 51  l pMem..**.** SQ
3690: 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 20 72 65  LITE_ERROR is re
36a0: 74 75 72 6e 65 64 20 69 66 20 78 56 61 6c 75 65  turned if xValue
36b0: 28 29 20 72 65 70 6f 72 74 73 20 61 6e 20 65 72  () reports an er
36c0: 72 6f 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 0a  ror. SQLITE_OK .
36d0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
36e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36f0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
3700: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
3710: 65 6d 41 67 67 56 61 6c 75 65 28 4d 65 6d 20 2a  emAggValue(Mem *
3720: 70 41 63 63 75 6d 2c 20 4d 65 6d 20 2a 70 4f 75  pAccum, Mem *pOu
3730: 74 2c 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e  t, FuncDef *pFun
3740: 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  c){.  sqlite3_co
3750: 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 4d 65 6d  ntext ctx;.  Mem
3760: 20 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   t;.  assert( pF
3770: 75 6e 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  unc!=0 );.  asse
3780: 72 74 28 20 70 46 75 6e 63 2d 3e 78 56 61 6c 75  rt( pFunc->xValu
3790: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
37a0: 28 20 28 70 41 63 63 75 6d 2d 3e 66 6c 61 67 73  ( (pAccum->flags
37b0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20   & MEM_Null)!=0 
37c0: 7c 7c 20 70 46 75 6e 63 3d 3d 70 41 63 63 75 6d  || pFunc==pAccum
37d0: 2d 3e 75 2e 70 44 65 66 20 29 3b 0a 20 20 61 73  ->u.pDef );.  as
37e0: 73 65 72 74 28 20 70 41 63 63 75 6d 2d 3e 64 62  sert( pAccum->db
37f0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
3800: 75 74 65 78 5f 68 65 6c 64 28 70 41 63 63 75 6d  utex_held(pAccum
3810: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
3820: 20 20 6d 65 6d 73 65 74 28 26 63 74 78 2c 20 30    memset(&ctx, 0
3830: 2c 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 0a  , sizeof(ctx));.
3840: 20 20 6d 65 6d 73 65 74 28 26 74 2c 20 30 2c 20    memset(&t, 0, 
3850: 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 74 2e  sizeof(t));.  t.
3860: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
3870: 3b 0a 20 20 74 2e 64 62 20 3d 20 70 41 63 63 75  ;.  t.db = pAccu
3880: 6d 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  m->db;.  sqlite3
3890: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
38a0: 4f 75 74 29 3b 0a 20 20 63 74 78 2e 70 4f 75 74  Out);.  ctx.pOut
38b0: 20 3d 20 70 4f 75 74 3b 0a 20 20 63 74 78 2e 70   = pOut;.  ctx.p
38c0: 4d 65 6d 20 3d 20 70 41 63 63 75 6d 3b 0a 20 20  Mem = pAccum;.  
38d0: 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 46 75 6e  ctx.pFunc = pFun
38e0: 63 3b 0a 20 20 70 46 75 6e 63 2d 3e 78 56 61 6c  c;.  pFunc->xVal
38f0: 75 65 28 26 63 74 78 29 3b 0a 20 20 72 65 74 75  ue(&ctx);.  retu
3900: 72 6e 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a  rn ctx.isError;.
3910: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
3920: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
3930: 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  NC */../*.** If 
3940: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
3950: 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65  contains a value
3960: 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 66 72   that must be fr
3970: 65 65 64 20 62 79 0a 2a 2a 20 69 6e 76 6f 6b 69  eed by.** invoki
3980: 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  ng the external 
3990: 63 61 6c 6c 62 61 63 6b 20 69 6e 20 4d 65 6d 2e  callback in Mem.
39a0: 78 44 65 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  xDel, then this 
39b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69 6c 6c 20  routine.** will 
39c0: 66 72 65 65 20 74 68 61 74 20 76 61 6c 75 65 2e  free that value.
39d0: 20 20 49 74 20 61 6c 73 6f 20 73 65 74 73 20 4d    It also sets M
39e0: 65 6d 2e 66 6c 61 67 73 20 74 6f 20 4d 45 4d 5f  em.flags to MEM_
39f0: 4e 75 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Null..**.** This
3a00: 20 69 73 20 61 20 68 65 6c 70 65 72 20 72 6f 75   is a helper rou
3a10: 74 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33  tine for sqlite3
3a20: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 29  VdbeMemSetNull()
3a30: 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 73 71 6c 69   and.** for sqli
3a40: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
3a50: 65 28 29 2e 20 20 55 73 65 20 74 68 6f 73 65 20  e().  Use those 
3a60: 6f 74 68 65 72 20 72 6f 75 74 69 6e 65 73 20 61  other routines a
3a70: 73 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 70  s the.** entry p
3a80: 6f 69 6e 74 20 66 6f 72 20 72 65 6c 65 61 73 69  oint for releasi
3a90: 6e 67 20 4d 65 6d 20 72 65 73 6f 75 72 63 65 73  ng Mem resources
3aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
3ab0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
3ac0: 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78 74   vdbeMemClearExt
3ad0: 65 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 4d 65  ernAndSetNull(Me
3ae0: 6d 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  m *p){.  assert(
3af0: 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c   p->db==0 || sql
3b00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3b10: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
3b20: 0a 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d  .  assert( VdbeM
3b30: 65 6d 44 79 6e 61 6d 69 63 28 70 29 20 29 3b 0a  emDynamic(p) );.
3b40: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 4d    if( p->flags&M
3b50: 45 4d 5f 41 67 67 20 29 7b 0a 20 20 20 20 73 71  EM_Agg ){.    sq
3b60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61  lite3VdbeMemFina
3b70: 6c 69 7a 65 28 70 2c 20 70 2d 3e 75 2e 70 44 65  lize(p, p->u.pDe
3b80: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
3b90: 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  (p->flags & MEM_
3ba0: 41 67 67 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74  Agg)==0 );.    t
3bb0: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
3bc0: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
3bd0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
3be0: 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20  s&MEM_Dyn ){.   
3bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 44 65 6c   assert( p->xDel
3c00: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
3c10: 20 26 26 20 70 2d 3e 78 44 65 6c 21 3d 30 20 29   && p->xDel!=0 )
3c20: 3b 0a 20 20 20 20 70 2d 3e 78 44 65 6c 28 28 76  ;.    p->xDel((v
3c30: 6f 69 64 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 7d  oid *)p->z);.  }
3c40: 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  .  p->flags = ME
3c50: 4d 5f 4e 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  M_Null;.}../*.**
3c60: 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
3c70: 68 65 6c 64 20 62 79 20 74 68 65 20 4d 65 6d 20  held by the Mem 
3c80: 70 2c 20 62 6f 74 68 20 65 78 74 65 72 6e 61 6c  p, both external
3c90: 20 6d 65 6d 6f 72 79 20 63 6c 65 61 72 65 64 0a   memory cleared.
3ca0: 2a 2a 20 62 79 20 70 2d 3e 78 44 65 6c 20 61 6e  ** by p->xDel an
3cb0: 64 20 6d 65 6d 6f 72 79 20 69 6e 20 70 2d 3e 7a  d memory in p->z
3cc0: 4d 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 54 68  Malloc..**.** Th
3cd0: 69 73 20 69 73 20 61 20 68 65 6c 70 65 72 20 72  is is a helper r
3ce0: 6f 75 74 69 6e 65 20 69 6e 76 6f 6b 65 64 20 62  outine invoked b
3cf0: 79 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  y sqlite3VdbeMem
3d00: 52 65 6c 65 61 73 65 28 29 20 69 6e 0a 2a 2a 20  Release() in.** 
3d10: 74 68 65 20 75 6e 75 73 75 61 6c 20 63 61 73 65  the unusual case
3d20: 20 77 68 65 72 65 20 74 68 65 72 65 20 72 65 61   where there rea
3d30: 6c 6c 79 20 69 73 20 6d 65 6d 6f 72 79 20 69 6e  lly is memory in
3d40: 20 70 20 74 68 61 74 20 6e 65 65 64 73 0a 2a 2a   p that needs.**
3d50: 20 74 6f 20 62 65 20 66 72 65 65 64 2e 0a 2a 2f   to be freed..*/
3d60: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
3d70: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62  OINLINE void vdb
3d80: 65 4d 65 6d 43 6c 65 61 72 28 4d 65 6d 20 2a 70  eMemClear(Mem *p
3d90: 29 7b 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d  ){.  if( VdbeMem
3da0: 44 79 6e 61 6d 69 63 28 70 29 20 29 7b 0a 20 20  Dynamic(p) ){.  
3db0: 20 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78    vdbeMemClearEx
3dc0: 74 65 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 70  ternAndSetNull(p
3dd0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
3de0: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
3df0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
3e00: 70 2d 3e 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  p->db, p->zMallo
3e10: 63 29 3b 0a 20 20 20 20 70 2d 3e 73 7a 4d 61 6c  c);.    p->szMal
3e20: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  loc = 0;.  }.  p
3e30: 2d 3e 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->z = 0;.}../*.*
3e40: 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 6d 65  * Release any me
3e50: 6d 6f 72 79 20 72 65 73 6f 75 72 63 65 73 20 68  mory resources h
3e60: 65 6c 64 20 62 79 20 74 68 65 20 4d 65 6d 2e 20  eld by the Mem. 
3e70: 20 42 6f 74 68 20 74 68 65 20 6d 65 6d 6f 72 79   Both the memory
3e80: 20 74 68 61 74 20 69 73 0a 2a 2a 20 66 72 65 65   that is.** free
3e90: 20 62 79 20 4d 65 6d 2e 78 44 65 6c 20 61 6e 64   by Mem.xDel and
3ea0: 20 74 68 65 20 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63   the Mem.zMalloc
3eb0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 72 65 20   allocation are 
3ec0: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  freed..**.** Use
3ed0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   this routine pr
3ee0: 69 6f 72 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ior to clean up 
3ef0: 70 72 69 6f 72 20 74 6f 20 61 62 61 6e 64 6f 6e  prior to abandon
3f00: 69 6e 67 20 61 20 4d 65 6d 2c 20 6f 72 20 74 6f  ing a Mem, or to
3f10: 0a 2a 2a 20 72 65 73 65 74 20 61 20 4d 65 6d 20  .** reset a Mem 
3f20: 62 61 63 6b 20 74 6f 20 69 74 73 20 6d 69 6e 69  back to its mini
3f30: 6d 75 6d 20 6d 65 6d 6f 72 79 20 75 74 69 6c 69  mum memory utili
3f40: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 55 73  zation..**.** Us
3f50: 65 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  e sqlite3VdbeMem
3f60: 53 65 74 4e 75 6c 6c 28 29 20 74 6f 20 72 65 6c  SetNull() to rel
3f70: 65 61 73 65 20 6a 75 73 74 20 74 68 65 20 4d 65  ease just the Me
3f80: 6d 2e 78 44 65 6c 20 73 70 61 63 65 0a 2a 2a 20  m.xDel space.** 
3f90: 70 72 69 6f 72 20 74 6f 20 69 6e 73 65 72 74 69  prior to inserti
3fa0: 6e 67 20 6e 65 77 20 63 6f 6e 74 65 6e 74 20 69  ng new content i
3fb0: 6e 74 6f 20 74 68 65 20 4d 65 6d 2e 0a 2a 2f 0a  nto the Mem..*/.
3fc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3fd0: 4d 65 6d 52 65 6c 65 61 73 65 28 4d 65 6d 20 2a  MemRelease(Mem *
3fe0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
3ff0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
4000: 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29  mInvariants(p) )
4010: 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44  ;.  if( VdbeMemD
4020: 79 6e 61 6d 69 63 28 70 29 20 7c 7c 20 70 2d 3e  ynamic(p) || p->
4030: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
4040: 76 64 62 65 4d 65 6d 43 6c 65 61 72 28 70 29 3b  vdbeMemClear(p);
4050: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
4060: 6e 76 65 72 74 20 61 20 36 34 2d 62 69 74 20 49  nvert a 64-bit I
4070: 45 45 45 20 64 6f 75 62 6c 65 20 69 6e 74 6f 20  EEE double into 
4080: 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20  a 64-bit signed 
4090: 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 49 66 20 74  integer..** If t
40a0: 68 65 20 64 6f 75 62 6c 65 20 69 73 20 6f 75 74  he double is out
40b0: 20 6f 66 20 72 61 6e 67 65 20 6f 66 20 61 20 36   of range of a 6
40c0: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
40d0: 65 67 65 72 20 74 68 65 6e 0a 2a 2a 20 72 65 74  eger then.** ret
40e0: 75 72 6e 20 74 68 65 20 63 6c 6f 73 65 73 74 20  urn the closest 
40f0: 61 76 61 69 6c 61 62 6c 65 20 36 34 2d 62 69 74  available 64-bit
4100: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
4110: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
4120: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 36 34 20 64  E_NOINLINE i64 d
4130: 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 64 6f 75  oubleToInt64(dou
4140: 62 6c 65 20 72 29 7b 0a 23 69 66 64 65 66 20 53  ble r){.#ifdef S
4150: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
4160: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 57  ING_POINT.  /* W
4170: 68 65 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  hen floating-poi
4180: 6e 74 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 64  nt is omitted, d
4190: 6f 75 62 6c 65 20 61 6e 64 20 69 6e 74 36 34 20  ouble and int64 
41a0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 74 68 69  are the same thi
41b0: 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  ng */.  return r
41c0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a  ;.#else.  /*.  *
41d0: 2a 20 4d 61 6e 79 20 63 6f 6d 70 69 6c 65 72 73  * Many compilers
41e0: 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 64 6f   we encounter do
41f0: 20 6e 6f 74 20 64 65 66 69 6e 65 20 63 6f 6e 73   not define cons
4200: 74 61 6e 74 73 20 66 6f 72 20 74 68 65 0a 20 20  tants for the.  
4210: 2a 2a 20 6d 69 6e 69 6d 75 6d 20 61 6e 64 20 6d  ** minimum and m
4220: 61 78 69 6d 75 6d 20 36 34 2d 62 69 74 20 69 6e  aximum 64-bit in
4230: 74 65 67 65 72 73 2c 20 6f 72 20 74 68 65 79 20  tegers, or they 
4240: 64 65 66 69 6e 65 20 74 68 65 6d 0a 20 20 2a 2a  define them.  **
4250: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 6c 79 2e   inconsistently.
4260: 20 20 41 6e 64 20 6d 61 6e 79 20 64 6f 20 6e 6f    And many do no
4270: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  t understand the
4280: 20 22 4c 4c 22 20 6e 6f 74 61 74 69 6f 6e 2e 0a   "LL" notation..
4290: 20 20 2a 2a 20 53 6f 20 77 65 20 64 65 66 69 6e    ** So we defin
42a0: 65 20 6f 75 72 20 6f 77 6e 20 73 74 61 74 69 63  e our own static
42b0: 20 63 6f 6e 73 74 61 6e 74 73 20 68 65 72 65 20   constants here 
42c0: 75 73 69 6e 67 20 6e 6f 74 68 69 6e 67 0a 20 20  using nothing.  
42d0: 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  ** larger than a
42e0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
42f0: 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 2a 2f 0a 20  constant..  */. 
4300: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 36   static const i6
4310: 34 20 6d 61 78 49 6e 74 20 3d 20 4c 41 52 47 45  4 maxInt = LARGE
4320: 53 54 5f 49 4e 54 36 34 3b 0a 20 20 73 74 61 74  ST_INT64;.  stat
4330: 69 63 20 63 6f 6e 73 74 20 69 36 34 20 6d 69 6e  ic const i64 min
4340: 49 6e 74 20 3d 20 53 4d 41 4c 4c 45 53 54 5f 49  Int = SMALLEST_I
4350: 4e 54 36 34 3b 0a 0a 20 20 69 66 28 20 72 3c 3d  NT64;..  if( r<=
4360: 28 64 6f 75 62 6c 65 29 6d 69 6e 49 6e 74 20 29  (double)minInt )
4370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 69 6e  {.    return min
4380: 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Int;.  }else if(
4390: 20 72 3e 3d 28 64 6f 75 62 6c 65 29 6d 61 78 49   r>=(double)maxI
43a0: 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
43b0: 20 6d 61 78 49 6e 74 3b 0a 20 20 7d 65 6c 73 65   maxInt;.  }else
43c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 36  {.    return (i6
43d0: 34 29 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  4)r;.  }.#endif.
43e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
43f0: 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e 74  some kind of int
4400: 65 67 65 72 20 76 61 6c 75 65 20 77 68 69 63 68  eger value which
4410: 20 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20   is the best we 
4420: 63 61 6e 20 64 6f 0a 2a 2a 20 61 74 20 72 65 70  can do.** at rep
4430: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 76 61  resenting the va
4440: 6c 75 65 20 74 68 61 74 20 2a 70 4d 65 6d 20 64  lue that *pMem d
4450: 65 73 63 72 69 62 65 73 20 61 73 20 61 6e 20 69  escribes as an i
4460: 6e 74 65 67 65 72 2e 0a 2a 2a 20 49 66 20 70 4d  nteger..** If pM
4470: 65 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  em is an integer
4480: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
4490: 20 69 73 20 65 78 61 63 74 2e 20 20 49 66 20 70   is exact.  If p
44a0: 4d 65 6d 20 69 73 0a 2a 2a 20 61 20 66 6c 6f 61  Mem is.** a floa
44b0: 74 69 6e 67 2d 70 6f 69 6e 74 20 74 68 65 6e 20  ting-point then 
44c0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
44d0: 65 64 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ed is the intege
44e0: 72 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20 70 4d  r part..** If pM
44f0: 65 6d 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f  em is a string o
4500: 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 77 65 20  r blob, then we 
4510: 6d 61 6b 65 20 61 6e 20 61 74 74 65 6d 70 74 20  make an attempt 
4520: 74 6f 20 63 6f 6e 76 65 72 74 0a 2a 2a 20 69 74  to convert.** it
4530: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
4540: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
4550: 2e 20 20 49 66 20 70 4d 65 6d 20 72 65 70 72 65  .  If pMem repre
4560: 73 65 6e 74 73 20 61 6e 0a 2a 2a 20 61 6e 20 53  sents an.** an S
4570: 51 4c 2d 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 72  QL-NULL value, r
4580: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  eturn 0..**.** I
4590: 66 20 70 4d 65 6d 20 72 65 70 72 65 73 65 6e 74  f pMem represent
45a0: 73 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75 65  s a string value
45b0: 2c 20 69 74 73 20 65 6e 63 6f 64 69 6e 67 20 6d  , its encoding m
45c0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 65 64 2e  ight be changed.
45d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
45e0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 36 34 20 6d  E_NOINLINE i64 m
45f0: 65 6d 49 6e 74 56 61 6c 75 65 28 4d 65 6d 20 2a  emIntValue(Mem *
4600: 70 4d 65 6d 29 7b 0a 20 20 69 36 34 20 76 61 6c  pMem){.  i64 val
4610: 75 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ue = 0;.  sqlite
4620: 33 41 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c  3Atoi64(pMem->z,
4630: 20 26 76 61 6c 75 65 2c 20 70 4d 65 6d 2d 3e 6e   &value, pMem->n
4640: 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3b 0a 20 20  , pMem->enc);.  
4650: 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 7d 0a  return value;.}.
4660: 69 36 34 20 73 71 6c 69 74 65 33 56 64 62 65 49  i64 sqlite3VdbeI
4670: 6e 74 56 61 6c 75 65 28 4d 65 6d 20 2a 70 4d 65  ntValue(Mem *pMe
4680: 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b  m){.  int flags;
4690: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
46a0: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
46b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65  3_mutex_held(pMe
46c0: 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  m->db->mutex) );
46d0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
46e0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
46f0: 70 4d 65 6d 29 20 29 3b 0a 20 20 66 6c 61 67 73  pMem) );.  flags
4700: 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
4710: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
4720: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 72 65 74  M_Int ){.    ret
4730: 75 72 6e 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  urn pMem->u.i;. 
4740: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
4750: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
4760: 20 20 20 72 65 74 75 72 6e 20 64 6f 75 62 6c 65     return double
4770: 54 6f 49 6e 74 36 34 28 70 4d 65 6d 2d 3e 75 2e  ToInt64(pMem->u.
4780: 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
4790: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
47a0: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20  |MEM_Blob) ){.  
47b0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
47c0: 7a 20 7c 7c 20 70 4d 65 6d 2d 3e 6e 3d 3d 30 20  z || pMem->n==0 
47d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 65  );.    return me
47e0: 6d 49 6e 74 56 61 6c 75 65 28 70 4d 65 6d 29 3b  mIntValue(pMem);
47f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
4800: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
4810: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4820: 62 65 73 74 20 72 65 70 72 65 73 65 6e 74 61 74  best representat
4830: 69 6f 6e 20 6f 66 20 70 4d 65 6d 20 74 68 61 74  ion of pMem that
4840: 20 77 65 20 63 61 6e 20 67 65 74 20 69 6e 74 6f   we can get into
4850: 20 61 0a 2a 2a 20 64 6f 75 62 6c 65 2e 20 20 49   a.** double.  I
4860: 66 20 70 4d 65 6d 20 69 73 20 61 6c 72 65 61 64  f pMem is alread
4870: 79 20 61 20 64 6f 75 62 6c 65 20 6f 72 20 61 6e  y a double or an
4880: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
4890: 20 69 74 73 0a 2a 2a 20 76 61 6c 75 65 2e 20 20   its.** value.  
48a0: 49 66 20 69 74 20 69 73 20 61 20 73 74 72 69 6e  If it is a strin
48b0: 67 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74  g or blob, try t
48c0: 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  o convert it to 
48d0: 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 20 49 66 20  a double..** If 
48e0: 69 74 20 69 73 20 61 20 4e 55 4c 4c 2c 20 72 65  it is a NULL, re
48f0: 74 75 72 6e 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61  turn 0.0..*/.sta
4900: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
4910: 49 4e 45 20 64 6f 75 62 6c 65 20 6d 65 6d 52 65  INE double memRe
4920: 61 6c 56 61 6c 75 65 28 4d 65 6d 20 2a 70 4d 65  alValue(Mem *pMe
4930: 6d 29 7b 0a 20 20 2f 2a 20 28 64 6f 75 62 6c 65  m){.  /* (double
4940: 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  )0 In case of SQ
4950: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
4960: 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
4970: 20 64 6f 75 62 6c 65 20 76 61 6c 20 3d 20 28 64   double val = (d
4980: 6f 75 62 6c 65 29 30 3b 0a 20 20 73 71 6c 69 74  ouble)0;.  sqlit
4990: 65 33 41 74 6f 46 28 70 4d 65 6d 2d 3e 7a 2c 20  e3AtoF(pMem->z, 
49a0: 26 76 61 6c 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70  &val, pMem->n, p
49b0: 4d 65 6d 2d 3e 65 6e 63 29 3b 0a 20 20 72 65 74  Mem->enc);.  ret
49c0: 75 72 6e 20 76 61 6c 3b 0a 7d 0a 64 6f 75 62 6c  urn val;.}.doubl
49d0: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  e sqlite3VdbeRea
49e0: 6c 56 61 6c 75 65 28 4d 65 6d 20 2a 70 4d 65 6d  lValue(Mem *pMem
49f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  ){.  assert( pMe
4a00: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  m->db==0 || sqli
4a10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4a20: 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  Mem->db->mutex) 
4a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
4a40: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
4a50: 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 66 28  T(pMem) );.  if(
4a60: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4a70: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
4a80: 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 75 2e 72 3b  eturn pMem->u.r;
4a90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65  .  }else if( pMe
4aa0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
4ab0: 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
4ac0: 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75   (double)pMem->u
4ad0: 2e 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  .i;.  }else if( 
4ae0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
4af0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
4b00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
4b10: 65 6d 52 65 61 6c 56 61 6c 75 65 28 70 4d 65 6d  emRealValue(pMem
4b20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4b30: 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20  /* (double)0 In 
4b40: 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
4b50: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
4b60: 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  NT... */.    ret
4b70: 75 72 6e 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20  urn (double)0;. 
4b80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
4b90: 72 6e 20 31 20 69 66 20 70 4d 65 6d 20 72 65 70  rn 1 if pMem rep
4ba0: 72 65 73 65 6e 74 73 20 74 72 75 65 2c 20 61 6e  resents true, an
4bb0: 64 20 72 65 74 75 72 6e 20 30 20 69 66 20 70 4d  d return 0 if pM
4bc0: 65 6d 20 72 65 70 72 65 73 65 6e 74 73 20 66 61  em represents fa
4bd0: 6c 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  lse..** Return t
4be0: 68 65 20 76 61 6c 75 65 20 69 66 4e 75 6c 6c 20  he value ifNull 
4bf0: 69 66 20 70 4d 65 6d 20 69 73 20 4e 55 4c 4c 2e  if pMem is NULL.
4c00: 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
4c10: 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75  3VdbeBooleanValu
4c20: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
4c30: 20 69 66 4e 75 6c 6c 29 7b 0a 20 20 69 66 28 20   ifNull){.  if( 
4c40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4c50: 4d 5f 49 6e 74 20 29 20 72 65 74 75 72 6e 20 70  M_Int ) return p
4c60: 4d 65 6d 2d 3e 75 2e 69 21 3d 30 3b 0a 20 20 69  Mem->u.i!=0;.  i
4c70: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4c80: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 72 65 74 75   MEM_Null ) retu
4c90: 72 6e 20 69 66 4e 75 6c 6c 3b 0a 20 20 72 65 74  rn ifNull;.  ret
4ca0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
4cb0: 65 61 6c 56 61 6c 75 65 28 70 4d 65 6d 29 21 3d  ealValue(pMem)!=
4cc0: 30 2e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  0.0;.}../*.** Th
4cd0: 65 20 4d 45 4d 20 73 74 72 75 63 74 75 72 65 20  e MEM structure 
4ce0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 4d 45 4d  is already a MEM
4cf0: 5f 52 65 61 6c 2e 20 20 54 72 79 20 74 6f 20 61  _Real.  Try to a
4d00: 6c 73 6f 20 6d 61 6b 65 20 69 74 20 61 0a 2a 2a  lso make it a.**
4d10: 20 4d 45 4d 5f 49 6e 74 20 69 66 20 77 65 20 63   MEM_Int if we c
4d20: 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
4d30: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
4d40: 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70 4d 65 6d  finity(Mem *pMem
4d50: 29 7b 0a 20 20 69 36 34 20 69 78 3b 0a 20 20 61  ){.  i64 ix;.  a
4d60: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
4d70: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
4d80: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
4d90: 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
4da0: 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 61 73  et(pMem) );.  as
4db0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d  sert( pMem->db==
4dc0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
4dd0: 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62  ex_held(pMem->db
4de0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4df0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
4e00: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
4e10: 20 29 3b 0a 0a 20 20 69 78 20 3d 20 64 6f 75 62   );..  ix = doub
4e20: 6c 65 54 6f 49 6e 74 36 34 28 70 4d 65 6d 2d 3e  leToInt64(pMem->
4e30: 75 2e 72 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  u.r);..  /* Only
4e40: 20 6d 61 72 6b 20 74 68 65 20 76 61 6c 75 65 20   mark the value 
4e50: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 69 66  as an integer if
4e60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 28 31  .  **.  **    (1
4e70: 29 20 74 68 65 20 72 6f 75 6e 64 2d 74 72 69 70  ) the round-trip
4e80: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 61 6c   conversion real
4e90: 2d 3e 69 6e 74 2d 3e 72 65 61 6c 20 69 73 20 61  ->int->real is a
4ea0: 20 6e 6f 2d 6f 70 2c 20 61 6e 64 0a 20 20 2a 2a   no-op, and.  **
4eb0: 20 20 20 20 28 32 29 20 54 68 65 20 69 6e 74 65      (2) The inte
4ec0: 67 65 72 20 69 73 20 6e 65 69 74 68 65 72 20 74  ger is neither t
4ed0: 68 65 20 6c 61 72 67 65 73 74 20 6e 6f 72 20 74  he largest nor t
4ee0: 68 65 20 73 6d 61 6c 6c 65 73 74 0a 20 20 2a 2a  he smallest.  **
4ef0: 20 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65          possible
4f00: 20 69 6e 74 65 67 65 72 20 28 74 69 63 6b 65 74   integer (ticket
4f10: 20 23 33 39 32 32 29 0a 20 20 2a 2a 0a 20 20 2a   #3922).  **.  *
4f20: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  * The second and
4f30: 20 74 68 69 72 64 20 74 65 72 6d 73 20 69 6e 20   third terms in 
4f40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
4f50: 6e 64 69 74 69 6f 6e 61 6c 20 65 6e 66 6f 72 63  nditional enforc
4f60: 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 65 63 6f  es.  ** the seco
4f70: 6e 64 20 63 6f 6e 64 69 74 69 6f 6e 20 75 6e 64  nd condition und
4f80: 65 72 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  er the assumptio
4f90: 6e 20 74 68 61 74 20 61 64 64 69 74 69 6f 6e 20  n that addition 
4fa0: 6f 76 65 72 66 6c 6f 77 20 63 61 75 73 65 73 0a  overflow causes.
4fb0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 77    ** values to w
4fc0: 72 61 70 20 61 72 6f 75 6e 64 2e 0a 20 20 2a 2f  rap around..  */
4fd0: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 72  .  if( pMem->u.r
4fe0: 3d 3d 69 78 20 26 26 20 69 78 3e 53 4d 41 4c 4c  ==ix && ix>SMALL
4ff0: 45 53 54 5f 49 4e 54 36 34 20 26 26 20 69 78 3c  EST_INT64 && ix<
5000: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 29 7b  LARGEST_INT64 ){
5010: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
5020: 20 69 78 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   ix;.    MemSetT
5030: 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45  ypeFlag(pMem, ME
5040: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Int);.  }.}../
5050: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d 65  *.** Convert pMe
5060: 6d 20 74 6f 20 74 79 70 65 20 69 6e 74 65 67 65  m to type intege
5070: 72 2e 20 20 49 6e 76 61 6c 69 64 61 74 65 20 61  r.  Invalidate a
5080: 6e 79 20 70 72 69 6f 72 20 72 65 70 72 65 73 65  ny prior represe
5090: 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  ntations..*/.int
50a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
50b0: 6e 74 65 67 65 72 69 66 79 28 4d 65 6d 20 2a 70  ntegerify(Mem *p
50c0: 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Mem){.  assert( 
50d0: 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73  pMem->db==0 || s
50e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
50f0: 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65  d(pMem->db->mute
5100: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5110: 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49  !sqlite3VdbeMemI
5120: 73 52 6f 77 53 65 74 28 70 4d 65 6d 29 20 29 3b  sRowSet(pMem) );
5130: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
5140: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
5150: 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 70 4d 65 6d  pMem) );..  pMem
5160: 2d 3e 75 2e 69 20 3d 20 73 71 6c 69 74 65 33 56  ->u.i = sqlite3V
5170: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 4d 65 6d  dbeIntValue(pMem
5180: 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  );.  MemSetTypeF
5190: 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 49 6e  lag(pMem, MEM_In
51a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
51b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
51c0: 20 43 6f 6e 76 65 72 74 20 70 4d 65 6d 20 73 6f   Convert pMem so
51d0: 20 74 68 61 74 20 69 74 20 69 73 20 6f 66 20 74   that it is of t
51e0: 79 70 65 20 4d 45 4d 5f 52 65 61 6c 2e 0a 2a 2a  ype MEM_Real..**
51f0: 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   Invalidate any 
5200: 70 72 69 6f 72 20 72 65 70 72 65 73 65 6e 74 61  prior representa
5210: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
5220: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c  lite3VdbeMemReal
5230: 69 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  ify(Mem *pMem){.
5240: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5250: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
5260: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d  _mutex_held(pMem
5270: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
5280: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
5290: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
52a0: 4d 65 6d 29 20 29 3b 0a 0a 20 20 70 4d 65 6d 2d  Mem) );..  pMem-
52b0: 3e 75 2e 72 20 3d 20 73 71 6c 69 74 65 33 56 64  >u.r = sqlite3Vd
52c0: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 4d 65 6d  beRealValue(pMem
52d0: 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  );.  MemSetTypeF
52e0: 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 52 65  lag(pMem, MEM_Re
52f0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  al);.  return SQ
5300: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 43  LITE_OK;.}../* C
5310: 6f 6d 70 61 72 65 20 61 20 66 6c 6f 61 74 69 6e  ompare a floatin
5320: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 74 6f  g point value to
5330: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65   an integer.  Re
5340: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
5350: 20 74 77 6f 0a 2a 2a 20 76 61 6c 75 65 73 20 61   two.** values a
5360: 72 65 20 74 68 65 20 73 61 6d 65 20 77 69 74 68  re the same with
5370: 69 6e 20 74 68 65 20 70 72 65 63 69 73 69 6f 6e  in the precision
5380: 20 6f 66 20 74 68 65 20 66 6c 6f 61 74 69 6e 67   of the floating
5390: 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a   point value..**
53a0: 0a 2a 2a 20 46 6f 72 20 73 6f 6d 65 20 76 65 72  .** For some ver
53b0: 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 6f 6e 20  sions of GCC on 
53c0: 33 32 2d 62 69 74 20 6d 61 63 68 69 6e 65 73 2c  32-bit machines,
53d0: 20 69 66 20 79 6f 75 20 64 6f 20 74 68 65 20 6d   if you do the m
53e0: 6f 72 65 20 6f 62 76 69 6f 75 73 0a 2a 2a 20 63  ore obvious.** c
53f0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 22 72 31  omparison of "r1
5400: 3d 3d 28 64 6f 75 62 6c 65 29 69 22 20 79 6f 75  ==(double)i" you
5410: 20 73 6f 6d 65 74 69 6d 65 73 20 67 65 74 20 61   sometimes get a
5420: 6e 20 61 6e 73 77 65 72 20 6f 66 20 66 61 6c 73  n answer of fals
5430: 65 20 65 76 65 6e 0a 2a 2a 20 74 68 6f 75 67 68  e even.** though
5440: 20 74 68 65 20 72 31 20 61 6e 64 20 28 64 6f 75   the r1 and (dou
5450: 62 6c 65 29 69 20 76 61 6c 75 65 73 20 61 72 65  ble)i values are
5460: 20 62 69 74 2d 66 6f 72 2d 62 69 74 20 74 68 65   bit-for-bit the
5470: 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
5480: 20 69 6e 74 20 73 71 6c 69 74 65 33 52 65 61 6c   int sqlite3Real
5490: 53 61 6d 65 41 73 49 6e 74 28 64 6f 75 62 6c 65  SameAsInt(double
54a0: 20 72 31 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   r1, sqlite3_int
54b0: 36 34 20 69 29 7b 0a 20 20 64 6f 75 62 6c 65 20  64 i){.  double 
54c0: 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a  r2 = (double)i;.
54d0: 20 20 72 65 74 75 72 6e 20 6d 65 6d 63 6d 70 28    return memcmp(
54e0: 26 72 31 2c 20 26 72 32 2c 20 73 69 7a 65 6f 66  &r1, &r2, sizeof
54f0: 28 72 31 29 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  (r1))==0;.}../*.
5500: 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d 65 6d 20  ** Convert pMem 
5510: 73 6f 20 74 68 61 74 20 69 74 20 68 61 73 20 74  so that it has t
5520: 79 70 65 73 20 4d 45 4d 5f 52 65 61 6c 20 6f 72  ypes MEM_Real or
5530: 20 4d 45 4d 5f 49 6e 74 20 6f 72 20 62 6f 74 68   MEM_Int or both
5540: 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  ..** Invalidate 
5550: 61 6e 79 20 70 72 69 6f 72 20 72 65 70 72 65 73  any prior repres
5560: 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  entations..**.**
5570: 20 45 76 65 72 79 20 65 66 66 6f 72 74 20 69 73   Every effort is
5580: 20 6d 61 64 65 20 74 6f 20 66 6f 72 63 65 20 74   made to force t
5590: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 2c 20 65  he conversion, e
55a0: 76 65 6e 20 69 66 20 74 68 65 20 69 6e 70 75 74  ven if the input
55b0: 0a 2a 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20  .** is a string 
55c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
55d0: 6f 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6c 69  ok completely li
55e0: 6b 65 20 61 20 6e 75 6d 62 65 72 2e 20 20 43 6f  ke a number.  Co
55f0: 6e 76 65 72 74 0a 2a 2a 20 61 73 20 6d 75 63 68  nvert.** as much
5600: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   of the string a
5610: 73 20 77 65 20 63 61 6e 20 61 6e 64 20 69 67 6e  s we can and ign
5620: 6f 72 65 20 74 68 65 20 72 65 73 74 2e 0a 2a 2f  ore the rest..*/
5630: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
5640: 4d 65 6d 4e 75 6d 65 72 69 66 79 28 4d 65 6d 20  MemNumerify(Mem 
5650: 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 28 70  *pMem){.  if( (p
5660: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Mem->flags & (ME
5670: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d  M_Int|MEM_Real|M
5680: 45 4d 5f 4e 75 6c 6c 29 29 3d 3d 30 20 29 7b 0a  EM_Null))==0 ){.
5690: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
56a0: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
56b0: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62  lags & (MEM_Blob
56c0: 7c 4d 45 4d 5f 53 74 72 29 29 21 3d 30 20 29 3b  |MEM_Str))!=0 );
56d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
56e0: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  m->db==0 || sqli
56f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5700: 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  Mem->db->mutex) 
5710: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5720: 74 65 33 41 74 6f 69 36 34 28 70 4d 65 6d 2d 3e  te3Atoi64(pMem->
5730: 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70  z, &pMem->u.i, p
5740: 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e  Mem->n, pMem->en
5750: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  c);.    if( rc==
5760: 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 53 65  0 ){.      MemSe
5770: 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20  tTypeFlag(pMem, 
5780: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 7d 65  MEM_Int);.    }e
5790: 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
57a0: 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
57b0: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
57c0: 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e  pMem->z, &pMem->
57d0: 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d  u.r, pMem->n, pM
57e0: 65 6d 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 20 20  em->enc);.      
57f0: 69 66 28 20 72 63 3d 3d 31 20 26 26 20 73 71 6c  if( rc==1 && sql
5800: 69 74 65 33 52 65 61 6c 53 61 6d 65 41 73 49 6e  ite3RealSameAsIn
5810: 74 28 70 4d 65 6d 2d 3e 75 2e 72 2c 20 69 29 20  t(pMem->u.r, i) 
5820: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
5830: 3e 75 2e 69 20 3d 20 69 3b 0a 20 20 20 20 20 20  >u.i = i;.      
5840: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
5850: 28 70 4d 65 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pMem, MEM_Int);
5860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5870: 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65        MemSetType
5880: 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 52  Flag(pMem, MEM_R
5890: 65 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eal);.      }.  
58a0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
58b0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
58c0: 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
58d0: 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 21 3d 30  al|MEM_Null))!=0
58e0: 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67   );.  pMem->flag
58f0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 72 7c 4d  s &= ~(MEM_Str|M
5900: 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f  EM_Blob|MEM_Zero
5910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5920: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5930: 43 61 73 74 20 74 68 65 20 64 61 74 61 74 79 70  Cast the datatyp
5940: 65 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 69  e of the value i
5950: 6e 20 70 4d 65 6d 20 61 63 63 6f 72 64 69 6e 67  n pMem according
5960: 20 74 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79   to the affinity
5970: 0a 2a 2a 20 22 61 66 66 22 2e 20 20 43 61 73 74  .** "aff".  Cast
5980: 69 6e 67 20 69 73 20 64 69 66 66 65 72 65 6e 74  ing is different
5990: 20 66 72 6f 6d 20 61 70 70 6c 79 69 6e 67 20 61   from applying a
59a0: 66 66 69 6e 69 74 79 20 69 6e 20 74 68 61 74 20  ffinity in that 
59b0: 61 20 63 61 73 74 0a 2a 2a 20 69 73 20 66 6f 72  a cast.** is for
59c0: 63 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ced.  In other w
59d0: 6f 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20  ords, the value 
59e0: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  is converted int
59f0: 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a  o the desired.**
5a00: 20 61 66 66 69 6e 69 74 79 20 65 76 65 6e 20 69   affinity even i
5a10: 66 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 69  f that results i
5a20: 6e 20 6c 6f 73 73 20 6f 66 20 64 61 74 61 2e 20  n loss of data. 
5a30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5a40: 0a 2a 2a 20 75 73 65 64 20 28 66 6f 72 20 65 78  .** used (for ex
5a50: 61 6d 70 6c 65 29 20 74 6f 20 69 6d 70 6c 65 6d  ample) to implem
5a60: 65 6e 74 20 74 68 65 20 53 51 4c 20 22 63 61 73  ent the SQL "cas
5a70: 74 28 29 22 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  t()" operator..*
5a80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5a90: 62 65 4d 65 6d 43 61 73 74 28 4d 65 6d 20 2a 70  beMemCast(Mem *p
5aa0: 4d 65 6d 2c 20 75 38 20 61 66 66 2c 20 75 38 20  Mem, u8 aff, u8 
5ab0: 65 6e 63 6f 64 69 6e 67 29 7b 0a 20 20 69 66 28  encoding){.  if(
5ac0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
5ad0: 45 4d 5f 4e 75 6c 6c 20 29 20 72 65 74 75 72 6e  EM_Null ) return
5ae0: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
5af0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
5b00: 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 20 7b 20 20  TE_AFF_BLOB: {  
5b10: 20 2f 2a 20 52 65 61 6c 6c 79 20 61 20 63 61 73   /* Really a cas
5b20: 74 20 74 6f 20 42 4c 4f 42 20 2a 2f 0a 20 20 20  t to BLOB */.   
5b30: 20 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c     if( (pMem->fl
5b40: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3d  ags & MEM_Blob)=
5b50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5b60: 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
5b70: 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 53 51  ffinity(pMem, SQ
5b80: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65  LITE_AFF_TEXT, e
5b90: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  ncoding);.      
5ba0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5bb0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
5bc0: 7c 7c 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  || pMem->db->mal
5bd0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
5be0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
5bf0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
5c00: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
5c10: 70 4d 65 6d 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b  pMem, MEM_Blob);
5c20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5c30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5c40: 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d  s &= ~(MEM_TypeM
5c50: 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a  ask&~MEM_Blob);.
5c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5c70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5c80: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
5c90: 55 4d 45 52 49 43 3a 20 7b 0a 20 20 20 20 20 20  UMERIC: {.      
5ca0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
5cb0: 6d 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20  merify(pMem);.  
5cc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5cd0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ce0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  _AFF_INTEGER: {.
5cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d00: 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70  eMemIntegerify(p
5d10: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Mem);.      brea
5d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5d30: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  e SQLITE_AFF_REA
5d40: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
5d50: 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79  e3VdbeMemRealify
5d60: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72  (pMem);.      br
5d70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5d80: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5d90: 61 73 73 65 72 74 28 20 61 66 66 3d 3d 53 51 4c  assert( aff==SQL
5da0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
5db0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 45        assert( ME
5dc0: 4d 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62  M_Str==(MEM_Blob
5dd0: 3e 3e 33 29 20 29 3b 0a 20 20 20 20 20 20 70 4d  >>3) );.      pM
5de0: 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 4d  em->flags |= (pM
5df0: 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c  em->flags&MEM_Bl
5e00: 6f 62 29 3e 3e 33 3b 0a 20 20 20 20 20 20 73 71  ob)>>3;.      sq
5e10: 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
5e20: 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 53 51  ffinity(pMem, SQ
5e30: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65  LITE_AFF_TEXT, e
5e40: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  ncoding);.      
5e50: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
5e60: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
5e70: 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
5e80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
5e90: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20   pMem->flags &= 
5ea0: 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  ~(MEM_Int|MEM_Re
5eb0: 61 6c 7c 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  al|MEM_Blob|MEM_
5ec0: 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20 62 72 65  Zero);.      bre
5ed0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
5ee0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
5ef0: 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 74 6f  e bulk memory to
5f00: 20 62 65 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   be a consistent
5f10: 20 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   Mem object..**.
5f20: 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 61  ** The minimum a
5f30: 6d 6f 75 6e 74 20 6f 66 20 69 6e 69 74 69 61 6c  mount of initial
5f40: 69 7a 61 74 69 6f 6e 20 66 65 61 73 69 62 6c 65  ization feasible
5f50: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
5f60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5f70: 62 65 4d 65 6d 49 6e 69 74 28 4d 65 6d 20 2a 70  beMemInit(Mem *p
5f80: 4d 65 6d 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  Mem, sqlite3 *db
5f90: 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20  , u16 flags){.  
5fa0: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
5fb0: 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3d   ~MEM_TypeMask)=
5fc0: 3d 30 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c  =0 );.  pMem->fl
5fd0: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
5fe0: 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  Mem->db = db;.  
5ff0: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
6000: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65   0;.}.../*.** De
6010: 6c 65 74 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lete any previou
6020: 73 20 76 61 6c 75 65 20 61 6e 64 20 73 65 74 20  s value and set 
6030: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
6040: 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20 4e 55 4c   in *pMem to NUL
6050: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
6060: 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20  utine calls the 
6070: 4d 65 6d 2e 78 44 65 6c 20 64 65 73 74 72 75 63  Mem.xDel destruc
6080: 74 6f 72 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  tor to dispose o
6090: 66 20 76 61 6c 75 65 73 20 74 68 61 74 0a 2a 2a  f values that.**
60a0: 20 72 65 71 75 69 72 65 20 74 68 65 20 64 65 73   require the des
60b0: 74 72 75 63 74 6f 72 2e 20 20 42 75 74 20 69 74  tructor.  But it
60c0: 20 70 72 65 73 65 72 76 65 73 20 74 68 65 20 4d   preserves the M
60d0: 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 6d 65 6d 6f 72  em.zMalloc memor
60e0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  y allocation..**
60f0: 20 54 6f 20 66 72 65 65 20 61 6c 6c 20 72 65 73   To free all res
6100: 6f 75 72 63 65 73 2c 20 75 73 65 20 73 71 6c 69  ources, use sqli
6110: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
6120: 65 28 29 2c 20 77 68 69 63 68 20 62 6f 74 68 20  e(), which both 
6130: 63 61 6c 6c 73 20 74 68 69 73 0a 2a 2a 20 72 6f  calls this.** ro
6140: 75 74 69 6e 65 20 74 6f 20 69 6e 76 6f 6b 65 20  utine to invoke 
6150: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 61  the destructor a
6160: 6e 64 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 4d  nd deallocates M
6170: 65 6d 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2a 0a 2a  em.zMalloc..**.*
6180: 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
6190: 6e 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ne to reset the 
61a0: 4d 65 6d 20 70 72 69 6f 72 20 74 6f 20 69 6e 73  Mem prior to ins
61b0: 65 72 74 20 61 20 6e 65 77 20 76 61 6c 75 65 2e  ert a new value.
61c0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73 71 6c 69 74  .**.** Use sqlit
61d0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
61e0: 28 29 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 65  () to complete e
61f0: 72 61 73 65 20 74 68 65 20 4d 65 6d 20 70 72 69  rase the Mem pri
6200: 6f 72 20 74 6f 20 61 62 61 6e 64 6f 6e 69 6e 67  or to abandoning
6210: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
6220: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
6230: 6c 6c 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  ll(Mem *pMem){. 
6240: 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61   if( VdbeMemDyna
6250: 6d 69 63 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20  mic(pMem) ){.   
6260: 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78 74   vdbeMemClearExt
6270: 65 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 70 4d  ernAndSetNull(pM
6280: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
6290: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
62a0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d 0a  MEM_Null;.  }.}.
62b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
62c0: 65 53 65 74 4e 75 6c 6c 28 73 71 6c 69 74 65 33  eSetNull(sqlite3
62d0: 5f 76 61 6c 75 65 20 2a 70 29 7b 0a 20 20 73 71  _value *p){.  sq
62e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
62f0: 75 6c 6c 28 28 4d 65 6d 2a 29 70 29 3b 20 0a 7d  ull((Mem*)p); .}
6300: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6310: 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ny previous valu
6320: 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61  e and set the va
6330: 6c 75 65 20 74 6f 20 62 65 20 61 20 42 4c 4f 42  lue to be a BLOB
6340: 20 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 6e 20   of length.** n 
6350: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 7a  containing all z
6360: 65 72 6f 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eros..*/.void sq
6370: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 5a  lite3VdbeMemSetZ
6380: 65 72 6f 42 6c 6f 62 28 4d 65 6d 20 2a 70 4d 65  eroBlob(Mem *pMe
6390: 6d 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 73 71 6c  m, int n){.  sql
63a0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
63b0: 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d  se(pMem);.  pMem
63c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c  ->flags = MEM_Bl
63d0: 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 70  ob|MEM_Zero;.  p
63e0: 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 69 66  Mem->n = 0;.  if
63f0: 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20  ( n<0 ) n = 0;. 
6400: 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 3d   pMem->u.nZero =
6410: 20 6e 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20   n;.  pMem->enc 
6420: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
6430: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 7d 0a   pMem->z = 0;.}.
6440: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 4d 65 6d 20  ./*.** The pMem 
6450: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 63 6f 6e 74  is known to cont
6460: 61 69 6e 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  ain content that
6470: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65 73   needs to be des
6480: 74 72 6f 79 65 64 20 70 72 69 6f 72 0a 2a 2a 20  troyed prior.** 
6490: 74 6f 20 61 20 76 61 6c 75 65 20 63 68 61 6e 67  to a value chang
64a0: 65 2e 20 20 53 6f 20 69 6e 76 6f 6b 65 20 74 68  e.  So invoke th
64b0: 65 20 64 65 73 74 72 75 63 74 6f 72 2c 20 74 68  e destructor, th
64c0: 65 6e 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  en set the value
64d0: 20 74 6f 0a 2a 2a 20 61 20 36 34 2d 62 69 74 20   to.** a 64-bit 
64e0: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
64f0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
6500: 4e 45 20 76 6f 69 64 20 76 64 62 65 52 65 6c 65  NE void vdbeRele
6510: 61 73 65 41 6e 64 53 65 74 49 6e 74 36 34 28 4d  aseAndSetInt64(M
6520: 65 6d 20 2a 70 4d 65 6d 2c 20 69 36 34 20 76 61  em *pMem, i64 va
6530: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
6540: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
6550: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  );.  pMem->u.i =
6560: 20 76 61 6c 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c   val;.  pMem->fl
6570: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 7d  ags = MEM_Int;.}
6580: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
6590: 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ny previous valu
65a0: 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61  e and set the va
65b0: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  lue stored in *p
65c0: 4d 65 6d 20 74 6f 20 76 61 6c 2c 0a 2a 2a 20 6d  Mem to val,.** m
65d0: 61 6e 69 66 65 73 74 20 74 79 70 65 20 49 4e 54  anifest type INT
65e0: 45 47 45 52 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  EGER..*/.void sq
65f0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
6600: 6e 74 36 34 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  nt64(Mem *pMem, 
6610: 69 36 34 20 76 61 6c 29 7b 0a 20 20 69 66 28 20  i64 val){.  if( 
6620: 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70  VdbeMemDynamic(p
6630: 4d 65 6d 29 20 29 7b 0a 20 20 20 20 76 64 62 65  Mem) ){.    vdbe
6640: 52 65 6c 65 61 73 65 41 6e 64 53 65 74 49 6e 74  ReleaseAndSetInt
6650: 36 34 28 70 4d 65 6d 2c 20 76 61 6c 29 3b 0a 20  64(pMem, val);. 
6660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d   }else{.    pMem
6670: 2d 3e 75 2e 69 20 3d 20 76 61 6c 3b 0a 20 20 20  ->u.i = val;.   
6680: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
6690: 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f  EM_Int;.  }.}../
66a0: 2a 20 41 20 6e 6f 2d 6f 70 20 64 65 73 74 72 75  * A no-op destru
66b0: 63 74 6f 72 20 2a 2f 0a 76 6f 69 64 20 73 71 6c  ctor */.void sql
66c0: 69 74 65 33 4e 6f 6f 70 44 65 73 74 72 75 63 74  ite3NoopDestruct
66d0: 6f 72 28 76 6f 69 64 20 2a 70 29 7b 20 55 4e 55  or(void *p){ UNU
66e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
66f0: 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ; }../*.** Set t
6700: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
6710: 69 6e 20 2a 70 4d 65 6d 20 73 68 6f 75 6c 64 20  in *pMem should 
6720: 61 6c 72 65 61 64 79 20 62 65 20 61 20 4e 55 4c  already be a NUL
6730: 4c 2e 0a 2a 2a 20 41 6c 73 6f 20 73 74 6f 72 65  L..** Also store
6740: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 67 6f   a pointer to go
6750: 20 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 76 6f 69   with it..*/.voi
6760: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  d sqlite3VdbeMem
6770: 53 65 74 50 6f 69 6e 74 65 72 28 0a 20 20 4d 65  SetPointer(.  Me
6780: 6d 20 2a 70 4d 65 6d 2c 0a 20 20 76 6f 69 64 20  m *pMem,.  void 
6790: 2a 70 50 74 72 2c 0a 20 20 63 6f 6e 73 74 20 63  *pPtr,.  const c
67a0: 68 61 72 20 2a 7a 50 54 79 70 65 2c 0a 20 20 76  har *zPType,.  v
67b0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
67c0: 72 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 61  r)(void*).){.  a
67d0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
67e0: 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  gs==MEM_Null );.
67f0: 20 20 70 4d 65 6d 2d 3e 75 2e 7a 50 54 79 70 65    pMem->u.zPType
6800: 20 3d 20 7a 50 54 79 70 65 20 3f 20 7a 50 54 79   = zPType ? zPTy
6810: 70 65 20 3a 20 22 22 3b 0a 20 20 70 4d 65 6d 2d  pe : "";.  pMem-
6820: 3e 7a 20 3d 20 70 50 74 72 3b 0a 20 20 70 4d 65  >z = pPtr;.  pMe
6830: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
6840: 75 6c 6c 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  ull|MEM_Dyn|MEM_
6850: 53 75 62 74 79 70 65 7c 4d 45 4d 5f 54 65 72 6d  Subtype|MEM_Term
6860: 3b 0a 20 20 70 4d 65 6d 2d 3e 65 53 75 62 74 79  ;.  pMem->eSubty
6870: 70 65 20 3d 20 27 70 27 3b 0a 20 20 70 4d 65 6d  pe = 'p';.  pMem
6880: 2d 3e 78 44 65 6c 20 3d 20 78 44 65 73 74 72 75  ->xDel = xDestru
6890: 63 74 6f 72 20 3f 20 78 44 65 73 74 72 75 63 74  ctor ? xDestruct
68a0: 6f 72 20 3a 20 73 71 6c 69 74 65 33 4e 6f 6f 70  or : sqlite3Noop
68b0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 7d 0a 0a 23  Destructor;.}..#
68c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
68d0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
68e0: 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  T./*.** Delete a
68f0: 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ny previous valu
6900: 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61  e and set the va
6910: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  lue stored in *p
6920: 4d 65 6d 20 74 6f 20 76 61 6c 2c 0a 2a 2a 20 6d  Mem to val,.** m
6930: 61 6e 69 66 65 73 74 20 74 79 70 65 20 52 45 41  anifest type REA
6940: 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  L..*/.void sqlit
6950: 65 33 56 64 62 65 4d 65 6d 53 65 74 44 6f 75 62  e3VdbeMemSetDoub
6960: 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 64 6f  le(Mem *pMem, do
6970: 75 62 6c 65 20 76 61 6c 29 7b 0a 20 20 73 71 6c  uble val){.  sql
6980: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
6990: 6c 6c 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28 20  ll(pMem);.  if( 
69a0: 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
69b0: 6c 29 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  l) ){.    pMem->
69c0: 75 2e 72 20 3d 20 76 61 6c 3b 0a 20 20 20 20 70  u.r = val;.    p
69d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
69e0: 5f 52 65 61 6c 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  _Real;.  }.}.#en
69f0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
6a00: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
6a10: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
6a20: 65 20 4d 65 6d 20 68 6f 6c 64 73 20 61 20 52 6f  e Mem holds a Ro
6a30: 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  wSet object.  Th
6a40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
6a50: 74 65 6e 64 65 64 0a 2a 2a 20 66 6f 72 20 75 73  tended.** for us
6a60: 65 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  e inside of asse
6a70: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
6a80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
6a90: 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 63  dbeMemIsRowSet(c
6aa0: 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b  onst Mem *pMem){
6ab0: 0a 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d 2d  .  return (pMem-
6ac0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 42 6c 6f 62  >flags&(MEM_Blob
6ad0: 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 28 4d 45 4d  |MEM_Dyn))==(MEM
6ae0: 5f 42 6c 6f 62 7c 4d 45 4d 5f 44 79 6e 29 0a 20  _Blob|MEM_Dyn). 
6af0: 20 20 20 20 20 20 20 20 26 26 20 70 4d 65 6d 2d          && pMem-
6b00: 3e 78 44 65 6c 3d 3d 73 71 6c 69 74 65 33 52 6f  >xDel==sqlite3Ro
6b10: 77 53 65 74 44 65 6c 65 74 65 3b 0a 7d 0a 23 65  wSetDelete;.}.#e
6b20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ndif../*.** Dele
6b30: 74 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 20  te any previous 
6b40: 76 61 6c 75 65 20 61 6e 64 20 73 65 74 20 74 68  value and set th
6b50: 65 20 76 61 6c 75 65 20 6f 66 20 70 4d 65 6d 20  e value of pMem 
6b60: 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 6d 70 74  to be an.** empt
6b70: 79 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 2e  y boolean index.
6b80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
6b90: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
6ba0: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
6bb0: 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
6bc0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
6bd0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  ror occurs..*/.i
6be0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
6bf0: 6d 53 65 74 52 6f 77 53 65 74 28 4d 65 6d 20 2a  mSetRowSet(Mem *
6c00: 70 4d 65 6d 29 7b 0a 20 20 73 71 6c 69 74 65 33  pMem){.  sqlite3
6c10: 20 2a 64 62 20 3d 20 70 4d 65 6d 2d 3e 64 62 3b   *db = pMem->db;
6c20: 0a 20 20 52 6f 77 53 65 74 20 2a 70 3b 0a 20 20  .  RowSet *p;.  
6c30: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
6c40: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
6c50: 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53  te3VdbeMemIsRowS
6c60: 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 73 71  et(pMem) );.  sq
6c70: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
6c80: 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 20 3d  ase(pMem);.  p =
6c90: 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e   sqlite3RowSetIn
6ca0: 69 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 3d  it(db);.  if( p=
6cb0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
6cc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4d 65 6d  TE_NOMEM;.  pMem
6cd0: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 70 3b 0a  ->z = (char*)p;.
6ce0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6cf0: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 44 79 6e  MEM_Blob|MEM_Dyn
6d00: 3b 0a 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d  ;.  pMem->xDel =
6d10: 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 44 65   sqlite3RowSetDe
6d20: 6c 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  lete;.  return S
6d30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6d40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
6d50: 66 20 74 68 65 20 4d 65 6d 20 6f 62 6a 65 63 74  f the Mem object
6d60: 20 63 6f 6e 74 61 69 6e 73 20 61 20 54 45 58 54   contains a TEXT
6d70: 20 6f 72 20 42 4c 4f 42 20 74 68 61 74 20 69 73   or BLOB that is
6d80: 0a 2a 2a 20 74 6f 6f 20 6c 61 72 67 65 20 2d 20  .** too large - 
6d90: 77 68 6f 73 65 20 73 69 7a 65 20 65 78 63 65 65  whose size excee
6da0: 64 73 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  ds SQLITE_MAX_LE
6db0: 4e 47 54 48 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  NGTH..*/.int sql
6dc0: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
6dd0: 67 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61 73 73  g(Mem *p){.  ass
6de0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
6df0: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20  .  if( p->flags 
6e00: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
6e10: 6c 6f 62 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  lob) ){.    int 
6e20: 6e 20 3d 20 70 2d 3e 6e 3b 0a 20 20 20 20 69 66  n = p->n;.    if
6e30: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
6e40: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6e  _Zero ){.      n
6e50: 20 2b 3d 20 70 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   += p->u.nZero;.
6e60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
6e70: 20 6e 3e 70 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74   n>p->db->aLimit
6e80: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
6e90: 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  NGTH];.  }.  ret
6ea0: 75 72 6e 20 30 3b 20 0a 7d 0a 0a 23 69 66 64 65  urn 0; .}..#ifde
6eb0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
6ec0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6ed0: 65 20 70 72 65 70 61 72 65 73 20 61 20 6d 65 6d  e prepares a mem
6ee0: 6f 72 79 20 63 65 6c 6c 20 66 6f 72 20 6d 6f 64  ory cell for mod
6ef0: 69 66 69 63 61 74 69 6f 6e 20 62 79 20 62 72 65  ification by bre
6f00: 61 6b 69 6e 67 0a 2a 2a 20 69 74 73 20 6c 69 6e  aking.** its lin
6f10: 6b 20 74 6f 20 61 20 73 68 61 6c 6c 6f 77 20 63  k to a shallow c
6f20: 6f 70 79 20 61 6e 64 20 62 79 20 6d 61 72 6b 69  opy and by marki
6f30: 6e 67 20 61 6e 79 20 63 75 72 72 65 6e 74 20 73  ng any current s
6f40: 68 61 6c 6c 6f 77 0a 2a 2a 20 63 6f 70 69 65 73  hallow.** copies
6f50: 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 73   of this cell as
6f60: 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
6f70: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6f80: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
6f90: 75 67 67 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  ugging only - to
6fa0: 20 6d 61 6b 65 20 73 75 72 65 20 73 68 61 6c 6c   make sure shall
6fb0: 6f 77 0a 2a 2a 20 63 6f 70 69 65 73 20 61 72 65  ow.** copies are
6fc0: 20 6e 6f 74 20 6d 69 73 75 73 65 64 2e 0a 2a 2f   not misused..*/
6fd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6fe0: 65 4d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67  eMemAboutToChang
6ff0: 65 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 4d  e(Vdbe *pVdbe, M
7000: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
7010: 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 20   i;.  Mem *pX;. 
7020: 20 66 6f 72 28 69 3d 30 2c 20 70 58 3d 70 56 64   for(i=0, pX=pVd
7030: 62 65 2d 3e 61 4d 65 6d 3b 20 69 3c 70 56 64 62  be->aMem; i<pVdb
7040: 65 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 2c 20 70 58  e->nMem; i++, pX
7050: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  ++){.    if( pX-
7060: 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 70 4d 65  >pScopyFrom==pMe
7070: 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  m ){.      /* If
7080: 20 70 58 20 69 73 20 6d 61 72 6b 65 64 20 61 73   pX is marked as
7090: 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20   a shallow copy 
70a0: 6f 66 20 70 4d 65 6d 2c 20 74 68 65 6e 20 76 65  of pMem, then ve
70b0: 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 20 20  rify that.      
70c0: 2a 2a 20 6e 6f 20 73 69 67 6e 69 66 69 63 61 6e  ** no significan
70d0: 74 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  t changes have b
70e0: 65 65 6e 20 6d 61 64 65 20 74 6f 20 70 58 20 73  een made to pX s
70f0: 69 6e 63 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ince the OP_SCop
7100: 79 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20 73 69  y..      ** A si
7110: 67 6e 69 66 69 63 61 6e 74 20 63 68 61 6e 67 65  gnificant change
7120: 20 77 6f 75 6c 64 20 69 6e 64 69 63 61 74 65 64   would indicated
7130: 20 61 20 6d 69 73 73 65 64 20 63 61 6c 6c 20 74   a missed call t
7140: 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
7150: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 58 2e  function for pX.
7160: 20 20 4d 69 6e 6f 72 20 63 68 61 6e 67 65 73 2c    Minor changes,
7170: 20 73 75 63 68 20 61 73 20 61 64 64 69 6e 67 20   such as adding 
7180: 6f 72 20 72 65 6d 6f 76 69 6e 67 20 61 0a 20 20  or removing a.  
7190: 20 20 20 20 2a 2a 20 64 75 61 6c 20 74 79 70 65      ** dual type
71a0: 2c 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61  , are allowed, a
71b0: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 75 6e  s long as the un
71c0: 64 65 72 6c 79 69 6e 67 20 76 61 6c 75 65 20 69  derlying value i
71d0: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  s the.      ** s
71e0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 31  ame. */.      u1
71f0: 36 20 6d 46 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  6 mFlags = pMem-
7200: 3e 66 6c 61 67 73 20 26 20 70 58 2d 3e 66 6c 61  >flags & pX->fla
7210: 67 73 20 26 20 70 58 2d 3e 6d 53 63 6f 70 79 46  gs & pX->mScopyF
7220: 6c 61 67 73 3b 0a 20 20 20 20 20 20 61 73 73 65  lags;.      asse
7230: 72 74 28 20 28 6d 46 6c 61 67 73 26 4d 45 4d 5f  rt( (mFlags&MEM_
7240: 49 6e 74 29 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d  Int)==0 || pMem-
7250: 3e 75 2e 69 3d 3d 70 58 2d 3e 75 2e 69 20 29 3b  >u.i==pX->u.i );
7260: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
7270: 6d 46 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 29  mFlags&MEM_Real)
7280: 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 75 2e 72  ==0 || pMem->u.r
7290: 3d 3d 70 58 2d 3e 75 2e 72 20 29 3b 0a 20 20 20  ==pX->u.r );.   
72a0: 20 20 20 61 73 73 65 72 74 28 20 28 6d 46 6c 61     assert( (mFla
72b0: 67 73 26 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 20  gs&MEM_Str)==0  
72c0: 7c 7c 20 28 70 4d 65 6d 2d 3e 6e 3d 3d 70 58 2d  || (pMem->n==pX-
72d0: 3e 6e 20 26 26 20 70 4d 65 6d 2d 3e 7a 3d 3d 70  >n && pMem->z==p
72e0: 58 2d 3e 7a 29 20 29 3b 0a 20 20 20 20 20 20 61  X->z) );.      a
72f0: 73 73 65 72 74 28 20 28 6d 46 6c 61 67 73 26 4d  ssert( (mFlags&M
7300: 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20 20 7c 7c 20  EM_Blob)==0  || 
7310: 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
7320: 72 65 28 70 4d 65 6d 2c 70 58 29 3d 3d 30 20 29  re(pMem,pX)==0 )
7330: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  ;.      .      /
7340: 2a 20 70 4d 65 6d 20 69 73 20 74 68 65 20 72 65  * pMem is the re
7350: 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 63  gister that is c
7360: 68 61 6e 67 69 6e 67 2e 20 20 42 75 74 20 61 6c  hanging.  But al
7370: 73 6f 20 6d 61 72 6b 20 70 58 20 61 73 0a 20 20  so mark pX as.  
7380: 20 20 20 20 2a 2a 20 75 6e 64 65 66 69 6e 65 64      ** undefined
7390: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
73a0: 71 75 69 63 6b 6c 79 20 64 65 74 65 63 74 20 74  quickly detect t
73b0: 68 65 20 73 68 61 6c 6c 6f 77 2d 63 6f 70 79 20  he shallow-copy 
73c0: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 70  error */.      p
73d0: 58 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  X->flags = MEM_U
73e0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
73f0: 70 58 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d  pX->pScopyFrom =
7400: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
7410: 70 4d 65 6d 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pMem->pScopyFrom
7420: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   = 0;.}.#endif /
7430: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
7440: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  /.../*.** Make a
7450: 6e 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  n shallow copy o
7460: 66 20 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f  f pFrom into pTo
7470: 2e 20 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74  .  Prior content
7480: 73 20 6f 66 0a 2a 2a 20 70 54 6f 20 61 72 65 20  s of.** pTo are 
7490: 66 72 65 65 64 2e 20 20 54 68 65 20 70 46 72 6f  freed.  The pFro
74a0: 6d 2d 3e 7a 20 66 69 65 6c 64 20 69 73 20 6e 6f  m->z field is no
74b0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 20 20 49  t duplicated.  I
74c0: 66 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 7a 20 69 73  f.** pFrom->z is
74d0: 20 75 73 65 64 2c 20 74 68 65 6e 20 70 54 6f 2d   used, then pTo-
74e0: 3e 7a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  >z points to the
74f0: 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 70   same thing as p
7500: 46 72 6f 6d 2d 3e 7a 0a 2a 2a 20 61 6e 64 20 66  From->z.** and f
7510: 6c 61 67 73 20 67 65 74 73 20 73 72 63 54 79 70  lags gets srcTyp
7520: 65 20 28 65 69 74 68 65 72 20 4d 45 4d 5f 45 70  e (either MEM_Ep
7530: 68 65 6d 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69  hem or MEM_Stati
7540: 63 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  c)..*/.static SQ
7550: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7560: 69 64 20 76 64 62 65 43 6c 72 43 6f 70 79 28 4d  id vdbeClrCopy(M
7570: 65 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 4d  em *pTo, const M
7580: 65 6d 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 65  em *pFrom, int e
7590: 54 79 70 65 29 7b 0a 20 20 76 64 62 65 4d 65 6d  Type){.  vdbeMem
75a0: 43 6c 65 61 72 45 78 74 65 72 6e 41 6e 64 53 65  ClearExternAndSe
75b0: 74 4e 75 6c 6c 28 70 54 6f 29 3b 0a 20 20 61 73  tNull(pTo);.  as
75c0: 73 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44 79  sert( !VdbeMemDy
75d0: 6e 61 6d 69 63 28 70 54 6f 29 20 29 3b 0a 20 20  namic(pTo) );.  
75e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
75f0: 61 6c 6c 6f 77 43 6f 70 79 28 70 54 6f 2c 20 70  allowCopy(pTo, p
7600: 46 72 6f 6d 2c 20 65 54 79 70 65 29 3b 0a 7d 0a  From, eType);.}.
7610: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
7620: 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 4d  MemShallowCopy(M
7630: 65 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 4d  em *pTo, const M
7640: 65 6d 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 73  em *pFrom, int s
7650: 72 63 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72  rcType){.  asser
7660: 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d  t( !sqlite3VdbeM
7670: 65 6d 49 73 52 6f 77 53 65 74 28 70 46 72 6f 6d  emIsRowSet(pFrom
7680: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7690: 54 6f 2d 3e 64 62 3d 3d 70 46 72 6f 6d 2d 3e 64  To->db==pFrom->d
76a0: 62 20 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d  b );.  if( VdbeM
76b0: 65 6d 44 79 6e 61 6d 69 63 28 70 54 6f 29 20 29  emDynamic(pTo) )
76c0: 7b 20 76 64 62 65 43 6c 72 43 6f 70 79 28 70 54  { vdbeClrCopy(pT
76d0: 6f 2c 70 46 72 6f 6d 2c 73 72 63 54 79 70 65 29  o,pFrom,srcType)
76e0: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 6d 65  ; return; }.  me
76f0: 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
7700: 20 4d 45 4d 43 45 4c 4c 53 49 5a 45 29 3b 0a 20   MEMCELLSIZE);. 
7710: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 6c 61   if( (pFrom->fla
7720: 67 73 26 4d 45 4d 5f 53 74 61 74 69 63 29 3d 3d  gs&MEM_Static)==
7730: 30 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 66 6c  0 ){.    pTo->fl
7740: 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 44 79 6e  ags &= ~(MEM_Dyn
7750: 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  |MEM_Static|MEM_
7760: 45 70 68 65 6d 29 3b 0a 20 20 20 20 61 73 73 65  Ephem);.    asse
7770: 72 74 28 20 73 72 63 54 79 70 65 3d 3d 4d 45 4d  rt( srcType==MEM
7780: 5f 45 70 68 65 6d 20 7c 7c 20 73 72 63 54 79 70  _Ephem || srcTyp
7790: 65 3d 3d 4d 45 4d 5f 53 74 61 74 69 63 20 29 3b  e==MEM_Static );
77a0: 0a 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20  .    pTo->flags 
77b0: 7c 3d 20 73 72 63 54 79 70 65 3b 0a 20 20 7d 0a  |= srcType;.  }.
77c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
77d0: 66 75 6c 6c 20 63 6f 70 79 20 6f 66 20 70 46 72  full copy of pFr
77e0: 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e 20 20 50 72  om into pTo.  Pr
77f0: 69 6f 72 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ior contents of 
7800: 70 54 6f 20 61 72 65 0a 2a 2a 20 66 72 65 65 64  pTo are.** freed
7810: 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79   before the copy
7820: 20 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a 69 6e 74   is made..*/.int
7830: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
7840: 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c 20 63 6f  opy(Mem *pTo, co
7850: 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f 6d 29 7b  nst Mem *pFrom){
7860: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7870: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
7880: 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ( !sqlite3VdbeMe
7890: 6d 49 73 52 6f 77 53 65 74 28 70 46 72 6f 6d 29  mIsRowSet(pFrom)
78a0: 20 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65   );.  if( VdbeMe
78b0: 6d 44 79 6e 61 6d 69 63 28 70 54 6f 29 20 29 20  mDynamic(pTo) ) 
78c0: 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78 74 65  vdbeMemClearExte
78d0: 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 70 54 6f  rnAndSetNull(pTo
78e0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c  );.  memcpy(pTo,
78f0: 20 70 46 72 6f 6d 2c 20 4d 45 4d 43 45 4c 4c 53   pFrom, MEMCELLS
7900: 49 5a 45 29 3b 0a 20 20 70 54 6f 2d 3e 66 6c 61  IZE);.  pTo->fla
7910: 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b 0a  gs &= ~MEM_Dyn;.
7920: 20 20 69 66 28 20 70 54 6f 2d 3e 66 6c 61 67 73    if( pTo->flags
7930: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
7940: 6f 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 30  ob) ){.    if( 0
7950: 3d 3d 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 26  ==(pFrom->flags&
7960: 4d 45 4d 5f 53 74 61 74 69 63 29 20 29 7b 0a 20  MEM_Static) ){. 
7970: 20 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20       pTo->flags 
7980: 7c 3d 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20  |= MEM_Ephem;.  
7990: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
79a0: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65  VdbeMemMakeWrite
79b0: 61 62 6c 65 28 70 54 6f 29 3b 0a 20 20 20 20 7d  able(pTo);.    }
79c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
79d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  c;.}../*.** Tran
79e0: 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74  sfer the content
79f0: 73 20 6f 66 20 70 46 72 6f 6d 20 74 6f 20 70 54  s of pFrom to pT
7a00: 6f 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20  o. Any existing 
7a10: 76 61 6c 75 65 20 69 6e 20 70 54 6f 20 69 73 0a  value in pTo is.
7a20: 2a 2a 20 66 72 65 65 64 2e 20 49 66 20 70 46 72  ** freed. If pFr
7a30: 6f 6d 20 63 6f 6e 74 61 69 6e 73 20 65 70 68 65  om contains ephe
7a40: 6d 65 72 61 6c 20 64 61 74 61 2c 20 61 20 63 6f  meral data, a co
7a50: 70 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2a 0a 2a  py is made..**.*
7a60: 2a 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 73  * pFrom contains
7a70: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 77 68 65   an SQL NULL whe
7a80: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
7a90: 65 74 75 72 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  eturns..*/.void 
7aa0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
7ab0: 76 65 28 4d 65 6d 20 2a 70 54 6f 2c 20 4d 65 6d  ve(Mem *pTo, Mem
7ac0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 61 73 73 65   *pFrom){.  asse
7ad0: 72 74 28 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30  rt( pFrom->db==0
7ae0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
7af0: 78 5f 68 65 6c 64 28 70 46 72 6f 6d 2d 3e 64 62  x_held(pFrom->db
7b00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7b10: 73 65 72 74 28 20 70 54 6f 2d 3e 64 62 3d 3d 30  sert( pTo->db==0
7b20: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
7b30: 78 5f 68 65 6c 64 28 70 54 6f 2d 3e 64 62 2d 3e  x_held(pTo->db->
7b40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
7b50: 72 74 28 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30  rt( pFrom->db==0
7b60: 20 7c 7c 20 70 54 6f 2d 3e 64 62 3d 3d 30 20 7c   || pTo->db==0 |
7b70: 7c 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 70 54 6f  | pFrom->db==pTo
7b80: 2d 3e 64 62 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ->db );..  sqlit
7b90: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
7ba0: 28 70 54 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28  (pTo);.  memcpy(
7bb0: 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 73 69 7a 65  pTo, pFrom, size
7bc0: 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 46 72 6f  of(Mem));.  pFro
7bd0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
7be0: 75 6c 6c 3b 0a 20 20 70 46 72 6f 6d 2d 3e 73 7a  ull;.  pFrom->sz
7bf0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  Malloc = 0;.}../
7c00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7c10: 76 61 6c 75 65 20 6f 66 20 61 20 4d 65 6d 20 74  value of a Mem t
7c20: 6f 20 62 65 20 61 20 73 74 72 69 6e 67 20 6f 72  o be a string or
7c30: 20 61 20 42 4c 4f 42 2e 0a 2a 2a 0a 2a 2a 20 54   a BLOB..**.** T
7c40: 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
7c50: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 64 65  ment strategy de
7c60: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
7c70: 75 65 20 6f 66 20 74 68 65 20 78 44 65 6c 0a 2a  ue of the xDel.*
7c80: 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20  * parameter. If 
7c90: 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
7ca0: 20 69 73 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   is SQLITE_TRANS
7cb0: 49 45 4e 54 2c 20 74 68 65 6e 20 74 68 65 20 0a  IENT, then the .
7cc0: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 63 6f 70  ** string is cop
7cd0: 69 65 64 20 69 6e 74 6f 20 61 20 28 70 6f 73 73  ied into a (poss
7ce0: 69 62 6c 79 20 65 78 69 73 74 69 6e 67 29 20 62  ibly existing) b
7cf0: 75 66 66 65 72 20 6d 61 6e 61 67 65 64 20 62 79  uffer managed by
7d00: 20 74 68 65 20 0a 2a 2a 20 4d 65 6d 20 73 74 72   the .** Mem str
7d10: 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
7d20: 65 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  e, any existing 
7d30: 62 75 66 66 65 72 20 69 73 20 66 72 65 65 64 20  buffer is freed 
7d40: 61 6e 64 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74  and the.** point
7d50: 65 72 20 63 6f 70 69 65 64 2e 0a 2a 2a 0a 2a 2a  er copied..**.**
7d60: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   If the string i
7d70: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 69 66 20  s too large (if 
7d80: 69 74 20 65 78 63 65 65 64 73 20 74 68 65 20 53  it exceeds the S
7d90: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
7da0: 54 48 0a 2a 2a 20 73 69 7a 65 20 6c 69 6d 69 74  TH.** size limit
7db0: 29 20 74 68 65 6e 20 6e 6f 20 6d 65 6d 6f 72 79  ) then no memory
7dc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 63 63 75   allocation occu
7dd0: 72 73 2e 20 20 49 66 20 74 68 65 20 73 74 72 69  rs.  If the stri
7de0: 6e 67 20 63 61 6e 20 62 65 0a 2a 2a 20 73 74 6f  ng can be.** sto
7df0: 72 65 64 20 77 69 74 68 6f 75 74 20 61 6c 6c 6f  red without allo
7e00: 63 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 74  cating memory, t
7e10: 68 65 6e 20 69 74 20 69 73 2e 20 20 49 66 20 61  hen it is.  If a
7e20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
7e30: 6f 6e 0a 2a 2a 20 69 73 20 72 65 71 75 69 72 65  on.** is require
7e40: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  d to store the s
7e50: 74 72 69 6e 67 2c 20 74 68 65 6e 20 76 61 6c 75  tring, then valu
7e60: 65 20 6f 66 20 70 4d 65 6d 20 69 73 20 75 6e 63  e of pMem is unc
7e70: 68 61 6e 67 65 64 2e 20 20 49 6e 0a 2a 2a 20 65  hanged.  In.** e
7e80: 69 74 68 65 72 20 63 61 73 65 2c 20 53 51 4c 49  ither case, SQLI
7e90: 54 45 5f 54 4f 4f 42 49 47 20 69 73 20 72 65 74  TE_TOOBIG is ret
7ea0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
7eb0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
7ec0: 74 72 28 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 2c  tr(.  Mem *pMem,
7ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
7ee0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 65 74 20  ory cell to set 
7ef0: 74 6f 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  to string value 
7f00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7f10: 2a 7a 2c 20 20 20 20 20 20 2f 2a 20 53 74 72 69  *z,      /* Stri
7f20: 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ng pointer */.  
7f30: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
7f40: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
7f50: 73 74 72 69 6e 67 2c 20 6f 72 20 6e 65 67 61 74  string, or negat
7f60: 69 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c  ive */.  u8 enc,
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f80: 45 6e 63 6f 64 69 6e 67 20 6f 66 20 7a 2e 20 20  Encoding of z.  
7f90: 30 20 66 6f 72 20 42 4c 4f 42 73 20 2a 2f 0a 20  0 for BLOBs */. 
7fa0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
7fb0: 69 64 2a 29 20 2f 2a 20 44 65 73 74 72 75 63 74  id*) /* Destruct
7fc0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  or function */.)
7fd0: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
7fe0: 6e 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76  n;      /* New v
7ff0: 61 6c 75 65 20 66 6f 72 20 70 4d 65 6d 2d 3e 6e  alue for pMem->n
8000: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   */.  int iLimit
8010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  ;         /* Max
8020: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 74 72  imum allowed str
8030: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 73 69 7a 65  ing or blob size
8040: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 20   */.  u16 flags 
8050: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77  = 0;      /* New
8060: 20 76 61 6c 75 65 20 66 6f 72 20 70 4d 65 6d 2d   value for pMem-
8070: 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 61 73 73  >flags */..  ass
8080: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
8090: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
80a0: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
80b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
80c0: 65 72 74 28 20 21 73 71 6c 69 74 65 33 56 64 62  ert( !sqlite3Vdb
80d0: 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65  eMemIsRowSet(pMe
80e0: 6d 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 7a  m) );..  /* If z
80f0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
8100: 65 72 2c 20 73 65 74 20 70 4d 65 6d 20 74 6f 20  er, set pMem to 
8110: 63 6f 6e 74 61 69 6e 20 61 6e 20 53 51 4c 20 4e  contain an SQL N
8120: 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 21 7a  ULL. */.  if( !z
8130: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
8140: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d  dbeMemSetNull(pM
8150: 65 6d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  em);.    return 
8160: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
8170: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 64 62 20 29    if( pMem->db )
8180: 7b 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70  {.    iLimit = p
8190: 4d 65 6d 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Mem->db->aLimit[
81a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
81b0: 47 54 48 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  GTH];.  }else{. 
81c0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 53 51 4c 49     iLimit = SQLI
81d0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3b 0a 20  TE_MAX_LENGTH;. 
81e0: 20 7d 0a 20 20 66 6c 61 67 73 20 3d 20 28 65 6e   }.  flags = (en
81f0: 63 3d 3d 30 3f 4d 45 4d 5f 42 6c 6f 62 3a 4d 45  c==0?MEM_Blob:ME
8200: 4d 5f 53 74 72 29 3b 0a 20 20 69 66 28 20 6e 42  M_Str);.  if( nB
8210: 79 74 65 3c 30 20 29 7b 0a 20 20 20 20 61 73 73  yte<0 ){.    ass
8220: 65 72 74 28 20 65 6e 63 21 3d 30 20 29 3b 0a 20  ert( enc!=0 );. 
8230: 20 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49     if( enc==SQLI
8240: 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20  TE_UTF8 ){.     
8250: 20 6e 42 79 74 65 20 3d 20 30 78 37 66 66 66 66   nByte = 0x7ffff
8260: 66 66 66 20 26 20 28 69 6e 74 29 73 74 72 6c 65  fff & (int)strle
8270: 6e 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(z);.      if( 
8280: 6e 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 20 6e  nByte>iLimit ) n
8290: 42 79 74 65 20 3d 20 69 4c 69 6d 69 74 2b 31 3b  Byte = iLimit+1;
82a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
82b0: 20 20 66 6f 72 28 6e 42 79 74 65 3d 30 3b 20 6e    for(nByte=0; n
82c0: 42 79 74 65 3c 3d 69 4c 69 6d 69 74 20 26 26 20  Byte<=iLimit && 
82d0: 28 7a 5b 6e 42 79 74 65 5d 20 7c 20 7a 5b 6e 42  (z[nByte] | z[nB
82e0: 79 74 65 2b 31 5d 29 3b 20 6e 42 79 74 65 2b 3d  yte+1]); nByte+=
82f0: 32 29 7b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66  2){}.    }.    f
8300: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
8310: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
8320: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
8330: 73 65 74 73 20 74 68 65 20 6e 65 77 20 76 61 6c  sets the new val
8340: 75 65 73 20 6f 66 20 4d 65 6d 2e 7a 20 61 6e 64  ues of Mem.z and
8350: 20 4d 65 6d 2e 78 44 65 6c 2e 20 49 74 0a 20 20   Mem.xDel. It.  
8360: 2a 2a 20 61 6c 73 6f 20 73 65 74 73 20 61 20 66  ** also sets a f
8370: 6c 61 67 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  lag in local var
8380: 69 61 62 6c 65 20 22 66 6c 61 67 73 22 20 74 6f  iable "flags" to
8390: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6d 65   indicate the me
83a0: 6d 6f 72 79 0a 20 20 2a 2a 20 6d 61 6e 61 67 65  mory.  ** manage
83b0: 6d 65 6e 74 20 28 6f 6e 65 20 6f 66 20 4d 45 4d  ment (one of MEM
83c0: 5f 44 79 6e 20 6f 72 20 4d 45 4d 5f 53 74 61 74  _Dyn or MEM_Stat
83d0: 69 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ic)..  */.  if( 
83e0: 78 44 65 6c 3d 3d 53 51 4c 49 54 45 5f 54 52 41  xDel==SQLITE_TRA
83f0: 4e 53 49 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e  NSIENT ){.    in
8400: 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65  t nAlloc = nByte
8410: 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26  ;.    if( flags&
8420: 4d 45 4d 5f 54 65 72 6d 20 29 7b 0a 20 20 20 20  MEM_Term ){.    
8430: 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 28 65 6e 63    nAlloc += (enc
8440: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a  ==SQLITE_UTF8?1:
8450: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
8460: 28 20 6e 42 79 74 65 3e 69 4c 69 6d 69 74 20 29  ( nByte>iLimit )
8470: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8480: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 20  QLITE_TOOBIG;.  
8490: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
84a0: 28 20 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ( nAlloc==0 );. 
84b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 6c     testcase( nAl
84c0: 6c 6f 63 3d 3d 33 31 20 29 3b 0a 20 20 20 20 74  loc==31 );.    t
84d0: 65 73 74 63 61 73 65 28 20 6e 41 6c 6c 6f 63 3d  estcase( nAlloc=
84e0: 3d 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 73  =32 );.    if( s
84f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
8500: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
8510: 2c 20 4d 41 58 28 6e 41 6c 6c 6f 63 2c 33 32 29  , MAX(nAlloc,32)
8520: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8530: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
8540: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  KPT;.    }.    m
8550: 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 7a  emcpy(pMem->z, z
8560: 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 7d 65 6c  , nAlloc);.  }el
8570: 73 65 20 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c  se if( xDel==SQL
8580: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ITE_DYNAMIC ){. 
8590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
85a0: 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
85b0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f      pMem->zMallo
85c0: 63 20 3d 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63  c = pMem->z = (c
85d0: 68 61 72 20 2a 29 7a 3b 0a 20 20 20 20 70 4d 65  har *)z;.    pMe
85e0: 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71  m->szMalloc = sq
85f0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
8600: 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d  e(pMem->db, pMem
8610: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 7d 65  ->zMalloc);.  }e
8620: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
8630: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
8640: 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  Mem);.    pMem->
8650: 7a 20 3d 20 28 63 68 61 72 20 2a 29 7a 3b 0a 20  z = (char *)z;. 
8660: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20     pMem->xDel = 
8670: 78 44 65 6c 3b 0a 20 20 20 20 66 6c 61 67 73 20  xDel;.    flags 
8680: 7c 3d 20 28 28 78 44 65 6c 3d 3d 53 51 4c 49 54  |= ((xDel==SQLIT
8690: 45 5f 53 54 41 54 49 43 29 3f 4d 45 4d 5f 53 74  E_STATIC)?MEM_St
86a0: 61 74 69 63 3a 4d 45 4d 5f 44 79 6e 29 3b 0a 20  atic:MEM_Dyn);. 
86b0: 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20   }..  pMem->n = 
86c0: 6e 42 79 74 65 3b 0a 20 20 70 4d 65 6d 2d 3e 66  nByte;.  pMem->f
86d0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
86e0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 28 65 6e 63  pMem->enc = (enc
86f0: 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 55 54 46  ==0 ? SQLITE_UTF
8700: 38 20 3a 20 65 6e 63 29 3b 0a 0a 23 69 66 6e 64  8 : enc);..#ifnd
8710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8720: 54 46 31 36 0a 20 20 69 66 28 20 70 4d 65 6d 2d  TF16.  if( pMem-
8730: 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46  >enc!=SQLITE_UTF
8740: 38 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  8 && sqlite3Vdbe
8750: 4d 65 6d 48 61 6e 64 6c 65 42 6f 6d 28 70 4d 65  MemHandleBom(pMe
8760: 6d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  m) ){.    return
8770: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
8780: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
8790: 20 20 69 66 28 20 6e 42 79 74 65 3e 69 4c 69 6d    if( nByte>iLim
87a0: 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
87b0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
87c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
87d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
87e0: 2a 20 4d 6f 76 65 20 64 61 74 61 20 6f 75 74 20  * Move data out 
87f0: 6f 66 20 61 20 62 74 72 65 65 20 6b 65 79 20 6f  of a btree key o
8800: 72 20 64 61 74 61 20 66 69 65 6c 64 20 61 6e 64  r data field and
8810: 20 69 6e 74 6f 20 61 20 4d 65 6d 20 73 74 72 75   into a Mem stru
8820: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 64 61  cture..** The da
8830: 74 61 20 69 73 20 70 61 79 6c 6f 61 64 20 66 72  ta is payload fr
8840: 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
8850: 74 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  t pCur is curren
8860: 74 6c 79 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  tly pointing.** 
8870: 74 6f 2e 20 20 6f 66 66 73 65 74 20 61 6e 64 20  to.  offset and 
8880: 61 6d 74 20 64 65 74 65 72 6d 69 6e 65 20 77 68  amt determine wh
8890: 61 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  at portion of th
88a0: 65 20 64 61 74 61 20 6f 72 20 6b 65 79 20 74 6f  e data or key to
88b0: 20 72 65 74 72 69 65 76 65 2e 0a 2a 2a 20 54 68   retrieve..** Th
88c0: 65 20 72 65 73 75 6c 74 20 69 73 20 77 72 69 74  e result is writ
88d0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 70 4d 65  ten into the pMe
88e0: 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  m element..**.**
88f0: 20 54 68 65 20 70 4d 65 6d 20 6f 62 6a 65 63 74   The pMem object
8900: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
8910: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
8920: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
8930: 75 73 65 0a 2a 2a 20 70 4d 65 6d 2d 3e 7a 4d 61  use.** pMem->zMa
8940: 6c 6c 6f 63 20 74 6f 20 68 6f 6c 64 20 74 68 65  lloc to hold the
8950: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
8960: 65 20 62 74 72 65 65 2c 20 69 66 20 70 6f 73 73  e btree, if poss
8970: 69 62 6c 65 2e 20 20 4e 65 77 0a 2a 2a 20 70 4d  ible.  New.** pM
8980: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 73 70 61 63  em->zMalloc spac
8990: 65 20 77 69 6c 6c 20 62 65 20 61 6c 6c 6f 63 61  e will be alloca
89a0: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
89b0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 72  .  The calling r
89c0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 72 65 73  outine.** is res
89d0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
89e0: 69 6e 67 20 73 75 72 65 20 74 68 61 74 20 74 68  ing sure that th
89f0: 65 20 70 4d 65 6d 20 6f 62 6a 65 63 74 20 69 73  e pMem object is
8a00: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 64   eventually.** d
8a10: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
8a20: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
8a30: 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
8a40: 61 73 6f 6e 20 28 6d 61 6c 6c 6f 63 20 72 65 74  ason (malloc ret
8a50: 75 72 6e 73 20 4e 55 4c 4c 20 6f 72 20 75 6e 61  urns NULL or una
8a60: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 61 64 20 66  ble.** to read f
8a70: 72 6f 6d 20 74 68 65 20 64 69 73 6b 29 20 74 68  rom the disk) th
8a80: 65 6e 20 74 68 65 20 70 4d 65 6d 20 69 73 20 6c  en the pMem is l
8a90: 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
8aa0: 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 2a 2f  istent state..*/
8ab0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8ac0: 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
8ad0: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 52 65 73 69  MemFromBtreeResi
8ae0: 7a 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ze(.  BtCursor *
8af0: 70 43 75 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f  pCur,   /* Curso
8b00: 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 72 65  r pointing at re
8b10: 63 6f 72 64 20 74 6f 20 72 65 74 72 69 65 76 65  cord to retrieve
8b20: 2e 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  . */.  u32 offse
8b30: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t,       /* Offs
8b40: 65 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  et from the star
8b50: 74 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 74  t of data to ret
8b60: 75 72 6e 20 62 79 74 65 73 20 66 72 6f 6d 2e 20  urn bytes from. 
8b70: 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
8b80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8b90: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 74   of bytes to ret
8ba0: 75 72 6e 2e 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  urn. */.  Mem *p
8bb0: 4d 65 6d 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Mem         /* O
8bc0: 55 54 3a 20 52 65 74 75 72 6e 20 64 61 74 61 20  UT: Return data 
8bd0: 69 6e 20 74 68 69 73 20 4d 65 6d 20 73 74 72 75  in this Mem stru
8be0: 63 74 75 72 65 2e 20 2a 2f 0a 29 7b 0a 20 20 69  cture. */.){.  i
8bf0: 6e 74 20 72 63 3b 0a 20 20 70 4d 65 6d 2d 3e 66  nt rc;.  pMem->f
8c00: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
8c10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74  .  if( sqlite3Bt
8c20: 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69 7a 65  reeMaxRecordSize
8c30: 28 70 43 75 72 29 3c 6f 66 66 73 65 74 2b 61 6d  (pCur)<offset+am
8c40: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
8c50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8c60: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  KPT;.  }.  if( S
8c70: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
8c80: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
8c90: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
8ca0: 6d 2c 20 61 6d 74 2b 31 29 29 20 29 7b 0a 20 20  m, amt+1)) ){.  
8cb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8cc0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
8cd0: 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 4d   offset, amt, pM
8ce0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 69 66 28 20  em->z);.    if( 
8cf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8d00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 61  .      pMem->z[a
8d10: 6d 74 5d 20 3d 20 30 3b 20 20 20 2f 2a 20 4f 76  mt] = 0;   /* Ov
8d20: 65 72 72 75 6e 20 61 72 65 61 20 75 73 65 64 20  errun area used 
8d30: 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6d 61 6c  when reading mal
8d40: 66 6f 72 6d 65 64 20 72 65 63 6f 72 64 73 20 2a  formed records *
8d50: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
8d60: 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  ags = MEM_Blob;.
8d70: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
8d80: 28 69 6e 74 29 61 6d 74 3b 0a 20 20 20 20 7d 65  (int)amt;.    }e
8d90: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8da0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
8db0: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
8dc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
8de0: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 0a 20 20  MemFromBtree(.  
8df0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
8e00: 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
8e10: 74 69 6e 67 20 61 74 20 72 65 63 6f 72 64 20 74  ting at record t
8e20: 6f 20 72 65 74 72 69 65 76 65 2e 20 2a 2f 0a 20  o retrieve. */. 
8e30: 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
8e40: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
8e50: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64  m the start of d
8e60: 61 74 61 20 74 6f 20 72 65 74 75 72 6e 20 62 79  ata to return by
8e70: 74 65 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 75  tes from. */.  u
8e80: 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
8e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
8ea0: 74 65 73 20 74 6f 20 72 65 74 75 72 6e 2e 20 2a  tes to return. *
8eb0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
8ec0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
8ed0: 74 75 72 6e 20 64 61 74 61 20 69 6e 20 74 68 69  turn data in thi
8ee0: 73 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e  s Mem structure.
8ef0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
8f00: 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  Data;        /* 
8f10: 44 61 74 61 20 66 72 6f 6d 20 74 68 65 20 62 74  Data from the bt
8f20: 72 65 65 20 6c 61 79 65 72 20 2a 2f 0a 20 20 75  ree layer */.  u
8f30: 33 32 20 61 76 61 69 6c 61 62 6c 65 20 3d 20 30  32 available = 0
8f40: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
8f50: 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20  bytes available 
8f60: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 62 74 72  on the local btr
8f70: 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ee page */.  int
8f80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8f90: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8fa0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
8fb0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8fc0: 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
8fd0: 0a 20 20 61 73 73 65 72 74 28 20 21 56 64 62 65  .  assert( !Vdbe
8fe0: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4d 65 6d 29  MemDynamic(pMem)
8ff0: 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 3a 20   );..  /* Note: 
9000: 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 42 74 72  the calls to Btr
9010: 65 65 4b 65 79 46 65 74 63 68 28 29 20 61 6e 64  eeKeyFetch() and
9020: 20 44 61 74 61 46 65 74 63 68 28 29 20 62 65 6c   DataFetch() bel
9030: 6f 77 20 61 73 73 65 72 74 28 29 20 0a 20 20 2a  ow assert() .  *
9040: 2a 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  * that both the 
9050: 42 74 53 68 61 72 65 64 20 61 6e 64 20 64 61 74  BtShared and dat
9060: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6d 75 74  abase handle mut
9070: 65 78 65 73 20 61 72 65 20 68 65 6c 64 2e 20 2a  exes are held. *
9080: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  /.  assert( !sql
9090: 69 74 65 33 56 64 62 65 4d 65 6d 49 73 52 6f 77  ite3VdbeMemIsRow
90a0: 53 65 74 28 70 4d 65 6d 29 20 29 3b 0a 20 20 7a  Set(pMem) );.  z
90b0: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73  Data = (char *)s
90c0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
90d0: 61 64 46 65 74 63 68 28 70 43 75 72 2c 20 26 61  adFetch(pCur, &a
90e0: 76 61 69 6c 61 62 6c 65 29 3b 0a 20 20 61 73 73  vailable);.  ass
90f0: 65 72 74 28 20 7a 44 61 74 61 21 3d 30 20 29 3b  ert( zData!=0 );
9100: 0a 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  ..  if( offset+a
9110: 6d 74 3c 3d 61 76 61 69 6c 61 62 6c 65 20 29 7b  mt<=available ){
9120: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 26  .    pMem->z = &
9130: 7a 44 61 74 61 5b 6f 66 66 73 65 74 5d 3b 0a 20  zData[offset];. 
9140: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9150: 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70   MEM_Blob|MEM_Ep
9160: 68 65 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e  hem;.    pMem->n
9170: 20 3d 20 28 69 6e 74 29 61 6d 74 3b 0a 20 20 7d   = (int)amt;.  }
9180: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 76  else{.    rc = v
9190: 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 52  dbeMemFromBtreeR
91a0: 65 73 69 7a 65 28 70 43 75 72 2c 20 6f 66 66 73  esize(pCur, offs
91b0: 65 74 2c 20 61 6d 74 2c 20 70 4d 65 6d 29 3b 0a  et, amt, pMem);.
91c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
91d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
91e0: 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73 20  Val argument is 
91f0: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 61 20 76 61  known to be a va
9200: 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 4e  lue other than N
9210: 55 4c 4c 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ULL..** Convert 
9220: 69 74 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  it into a string
9230: 20 77 69 74 68 20 65 6e 63 6f 64 69 6e 67 20 65   with encoding e
9240: 6e 63 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  nc and return a 
9250: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 20  pointer.** to a 
9260: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
9270: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20  version of that 
9280: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
9290: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
92a0: 45 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 61  E const void *va
92b0: 6c 75 65 54 6f 54 65 78 74 28 73 71 6c 69 74 65  lueToText(sqlite
92c0: 33 5f 76 61 6c 75 65 2a 20 70 56 61 6c 2c 20 75  3_value* pVal, u
92d0: 38 20 65 6e 63 29 7b 0a 20 20 61 73 73 65 72 74  8 enc){.  assert
92e0: 28 20 70 56 61 6c 21 3d 30 20 29 3b 0a 20 20 61  ( pVal!=0 );.  a
92f0: 73 73 65 72 74 28 20 70 56 61 6c 2d 3e 64 62 3d  ssert( pVal->db=
9300: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
9310: 74 65 78 5f 68 65 6c 64 28 70 56 61 6c 2d 3e 64  tex_held(pVal->d
9320: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
9330: 73 73 65 72 74 28 20 28 65 6e 63 26 33 29 3d 3d  ssert( (enc&3)==
9340: 28 65 6e 63 26 7e 53 51 4c 49 54 45 5f 55 54 46  (enc&~SQLITE_UTF
9350: 31 36 5f 41 4c 49 47 4e 45 44 29 20 29 3b 0a 20  16_ALIGNED) );. 
9360: 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
9370: 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
9380: 28 70 56 61 6c 29 20 29 3b 0a 20 20 61 73 73 65  (pVal) );.  asse
9390: 72 74 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73  rt( (pVal->flags
93a0: 20 26 20 28 4d 45 4d 5f 4e 75 6c 6c 29 29 3d 3d   & (MEM_Null))==
93b0: 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 2d  0 );.  if( pVal-
93c0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c  >flags & (MEM_Bl
93d0: 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20  ob|MEM_Str) ){. 
93e0: 20 20 20 69 66 28 20 45 78 70 61 6e 64 42 6c 6f     if( ExpandBlo
93f0: 62 28 70 56 61 6c 29 20 29 20 72 65 74 75 72 6e  b(pVal) ) return
9400: 20 30 3b 0a 20 20 20 20 70 56 61 6c 2d 3e 66 6c   0;.    pVal->fl
9410: 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 72 3b 0a  ags |= MEM_Str;.
9420: 20 20 20 20 69 66 28 20 70 56 61 6c 2d 3e 65 6e      if( pVal->en
9430: 63 20 21 3d 20 28 65 6e 63 20 26 20 7e 53 51 4c  c != (enc & ~SQL
9440: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
9450: 44 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  D) ){.      sqli
9460: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
9470: 6f 64 69 6e 67 28 70 56 61 6c 2c 20 65 6e 63 20  oding(pVal, enc 
9480: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
9490: 41 4c 49 47 4e 45 44 29 3b 0a 20 20 20 20 7d 0a  ALIGNED);.    }.
94a0: 20 20 20 20 69 66 28 20 28 65 6e 63 20 26 20 53      if( (enc & S
94b0: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
94c0: 4e 45 44 29 21 3d 30 20 26 26 20 31 3d 3d 28 31  NED)!=0 && 1==(1
94d0: 26 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  &SQLITE_PTR_TO_I
94e0: 4e 54 28 70 56 61 6c 2d 3e 7a 29 29 20 29 7b 0a  NT(pVal->z)) ){.
94f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
9500: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Val->flags & (ME
9510: 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74  M_Ephem|MEM_Stat
9520: 69 63 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  ic))!=0 );.     
9530: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9540: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
9550: 28 70 56 61 6c 29 21 3d 53 51 4c 49 54 45 5f 4f  (pVal)!=SQLITE_O
9560: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
9570: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
9580: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9590: 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e  VdbeMemNulTermin
95a0: 61 74 65 28 70 56 61 6c 29 3b 20 2f 2a 20 49 4d  ate(pVal); /* IM
95b0: 50 3a 20 52 2d 33 31 32 37 35 2d 34 34 30 36 30  P: R-31275-44060
95c0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
95d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
95e0: 74 72 69 6e 67 69 66 79 28 70 56 61 6c 2c 20 65  tringify(pVal, e
95f0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  nc, 0);.    asse
9600: 72 74 28 20 30 3d 3d 28 31 26 53 51 4c 49 54 45  rt( 0==(1&SQLITE
9610: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 61 6c  _PTR_TO_INT(pVal
9620: 2d 3e 7a 29 29 20 29 3b 0a 20 20 7d 0a 20 20 61  ->z)) );.  }.  a
9630: 73 73 65 72 74 28 70 56 61 6c 2d 3e 65 6e 63 3d  ssert(pVal->enc=
9640: 3d 28 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f  =(enc & ~SQLITE_
9650: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 7c  UTF16_ALIGNED) |
9660: 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d 30 0a 20 20  | pVal->db==0.  
9670: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
9680: 56 61 6c 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Val->db->mallocF
9690: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
96a0: 56 61 6c 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20 26  Val->enc==(enc &
96b0: 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
96c0: 4c 49 47 4e 45 44 29 20 29 7b 0a 20 20 20 20 61  LIGNED) ){.    a
96d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
96e0: 62 65 4d 65 6d 43 6f 6e 73 69 73 74 65 6e 74 44  beMemConsistentD
96f0: 75 61 6c 52 65 70 28 70 56 61 6c 29 20 29 3b 0a  ualRep(pVal) );.
9700: 20 20 20 20 72 65 74 75 72 6e 20 70 56 61 6c 2d      return pVal-
9710: 3e 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  >z;.  }else{.   
9720: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
9730: 0a 0a 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ../* This functi
9740: 6f 6e 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  on is only avail
9750: 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  able internally,
9760: 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20   it is not part 
9770: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 74 65 72 6e  of the.** extern
9780: 61 6c 20 41 50 49 2e 20 49 74 20 77 6f 72 6b 73  al API. It works
9790: 20 69 6e 20 61 20 73 69 6d 69 6c 61 72 20 77 61   in a similar wa
97a0: 79 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  y to sqlite3_val
97b0: 75 65 5f 74 65 78 74 28 29 2c 0a 2a 2a 20 65 78  ue_text(),.** ex
97c0: 63 65 70 74 20 74 68 65 20 64 61 74 61 20 72 65  cept the data re
97d0: 74 75 72 6e 65 64 20 69 73 20 69 6e 20 74 68 65  turned is in the
97e0: 20 65 6e 63 6f 64 69 6e 67 20 73 70 65 63 69 66   encoding specif
97f0: 69 65 64 20 62 79 20 74 68 65 20 73 65 63 6f 6e  ied by the secon
9800: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20  d.** parameter, 
9810: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 6f 6e  which must be on
9820: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
9830: 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  6BE, SQLITE_UTF1
9840: 36 4c 45 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  6LE or.** SQLITE
9850: 5f 55 54 46 38 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  _UTF8..**.** (20
9860: 30 36 2d 30 32 2d 31 36 3a 29 20 20 54 68 65 20  06-02-16:)  The 
9870: 65 6e 63 20 76 61 6c 75 65 20 63 61 6e 20 62 65  enc value can be
9880: 20 6f 72 2d 65 64 20 77 69 74 68 20 53 51 4c 49   or-ed with SQLI
9890: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
98a0: 2e 0a 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20  ..** If that is 
98b0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
98c0: 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62  he result must b
98d0: 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
98e0: 65 76 65 6e 20 62 79 74 65 0a 2a 2a 20 62 6f 75  even byte.** bou
98f0: 6e 64 61 72 79 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ndary..*/.const 
9900: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 56 61 6c  void *sqlite3Val
9910: 75 65 54 65 78 74 28 73 71 6c 69 74 65 33 5f 76  ueText(sqlite3_v
9920: 61 6c 75 65 2a 20 70 56 61 6c 2c 20 75 38 20 65  alue* pVal, u8 e
9930: 6e 63 29 7b 0a 20 20 69 66 28 20 21 70 56 61 6c  nc){.  if( !pVal
9940: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
9950: 73 73 65 72 74 28 20 70 56 61 6c 2d 3e 64 62 3d  ssert( pVal->db=
9960: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
9970: 74 65 78 5f 68 65 6c 64 28 70 56 61 6c 2d 3e 64  tex_held(pVal->d
9980: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
9990: 73 73 65 72 74 28 20 28 65 6e 63 26 33 29 3d 3d  ssert( (enc&3)==
99a0: 28 65 6e 63 26 7e 53 51 4c 49 54 45 5f 55 54 46  (enc&~SQLITE_UTF
99b0: 31 36 5f 41 4c 49 47 4e 45 44 29 20 29 3b 0a 20  16_ALIGNED) );. 
99c0: 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
99d0: 33 56 64 62 65 4d 65 6d 49 73 52 6f 77 53 65 74  3VdbeMemIsRowSet
99e0: 28 70 56 61 6c 29 20 29 3b 0a 20 20 69 66 28 20  (pVal) );.  if( 
99f0: 28 70 56 61 6c 2d 3e 66 6c 61 67 73 26 28 4d 45  (pVal->flags&(ME
9a00: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 29 29  M_Str|MEM_Term))
9a10: 3d 3d 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ==(MEM_Str|MEM_T
9a20: 65 72 6d 29 20 26 26 20 70 56 61 6c 2d 3e 65 6e  erm) && pVal->en
9a30: 63 3d 3d 65 6e 63 20 29 7b 0a 20 20 20 20 61 73  c==enc ){.    as
9a40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
9a50: 65 4d 65 6d 43 6f 6e 73 69 73 74 65 6e 74 44 75  eMemConsistentDu
9a60: 61 6c 52 65 70 28 70 56 61 6c 29 20 29 3b 0a 20  alRep(pVal) );. 
9a70: 20 20 20 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e     return pVal->
9a80: 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 56 61  z;.  }.  if( pVa
9a90: 6c 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  l->flags&MEM_Nul
9aa0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
9ab0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9ac0: 76 61 6c 75 65 54 6f 54 65 78 74 28 70 56 61 6c  valueToText(pVal
9ad0: 2c 20 65 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , enc);.}../*.**
9ae0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 71   Create a new sq
9af0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
9b00: 63 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ct..*/.sqlite3_v
9b10: 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 61 6c  alue *sqlite3Val
9b20: 75 65 4e 65 77 28 73 71 6c 69 74 65 33 20 2a 64  ueNew(sqlite3 *d
9b30: 62 29 7b 0a 20 20 4d 65 6d 20 2a 70 20 3d 20 73  b){.  Mem *p = s
9b40: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9b50: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
9b60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
9b70: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
9b80: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 64  M_Null;.    p->d
9b90: 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65  b = db;.  }.  re
9ba0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
9bb0: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
9bc0: 70 61 73 73 65 64 20 62 79 20 73 71 6c 69 74 65  passed by sqlite
9bd0: 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
9be0: 6c 75 65 28 29 20 74 68 72 6f 75 67 68 20 74 6f  lue() through to
9bf0: 20 0a 2a 2a 20 76 61 6c 75 65 4e 65 77 28 29 2e   .** valueNew().
9c00: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
9c10: 6f 76 65 20 76 61 6c 75 65 4e 65 77 28 29 20 66  ove valueNew() f
9c20: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73  or details..*/.s
9c30: 74 72 75 63 74 20 56 61 6c 75 65 4e 65 77 53 74  truct ValueNewSt
9c40: 61 74 34 43 74 78 20 7b 0a 20 20 50 61 72 73 65  at4Ctx {.  Parse
9c50: 20 2a 70 50 61 72 73 65 3b 0a 20 20 49 6e 64 65   *pParse;.  Inde
9c60: 78 20 2a 70 49 64 78 3b 0a 20 20 55 6e 70 61 63  x *pIdx;.  Unpac
9c70: 6b 65 64 52 65 63 6f 72 64 20 2a 2a 70 70 52 65  kedRecord **ppRe
9c80: 63 3b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 7d  c;.  int iVal;.}
9c90: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  ;../*.** Allocat
9ca0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
9cb0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
9cc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
9cd0: 6a 65 63 74 2e 20 49 66 0a 2a 2a 20 74 68 65 20  ject. If.** the 
9ce0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
9cf0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
9d00: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 6f 62   is NULL, the ob
9d10: 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
9d20: 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
9d30: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
9d40: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
9d50: 73 65 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  se, if the secon
9d60: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
9d70: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
9d80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
9d90: 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 69  * being called i
9da0: 6e 64 69 72 65 63 74 6c 79 20 62 79 20 73 71 6c  ndirectly by sql
9db0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
9dc0: 74 56 61 6c 75 65 28 29 2e 20 49 66 20 69 74 20  tValue(). If it 
9dd0: 68 61 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61  has not.** alrea
9de0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
9df0: 64 2c 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  d, allocate the 
9e00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
9e10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 0a 2a  tructure that .*
9e20: 2a 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  * that function 
9e30: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 6f 20 69  will return to i
9e40: 74 73 20 63 61 6c 6c 65 72 20 68 65 72 65 2e 20  ts caller here. 
9e50: 54 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  Then return a po
9e60: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 6e 20 73  inter to.** an s
9e70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 77 69 74  qlite3_value wit
9e80: 68 69 6e 20 74 68 65 20 55 6e 70 61 63 6b 65 64  hin the Unpacked
9e90: 52 65 63 6f 72 64 2e 61 5b 5d 20 61 72 72 61 79  Record.a[] array
9ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
9eb0: 74 65 33 5f 76 61 6c 75 65 20 2a 76 61 6c 75 65  te3_value *value
9ec0: 4e 65 77 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  New(sqlite3 *db,
9ed0: 20 73 74 72 75 63 74 20 56 61 6c 75 65 4e 65 77   struct ValueNew
9ee0: 53 74 61 74 34 43 74 78 20 2a 70 29 7b 0a 23 69  Stat4Ctx *p){.#i
9ef0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9f00: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
9f10: 34 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  4.  if( p ){.   
9f20: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
9f30: 2a 70 52 65 63 20 3d 20 70 2d 3e 70 70 52 65 63  *pRec = p->ppRec
9f40: 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 52  [0];..    if( pR
9f50: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  ec==0 ){.      I
9f60: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 2d 3e  ndex *pIdx = p->
9f70: 70 49 64 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e  pIdx;      /* In
9f80: 64 65 78 20 62 65 69 6e 67 20 70 72 6f 62 65 64  dex being probed
9f90: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
9fa0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
9fb0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
9fc0: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
9fd0: 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ate */.      int
9fe0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
a000: 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
a010: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
a020: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20   pIdx->nColumn; 
a030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
a040: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 69 6e 63  ndex columns inc
a050: 6c 75 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a  luding rowid */.
a060: 20 20 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d    .      nByte =
a070: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 20 2a 20 6e   sizeof(Mem) * n
a080: 43 6f 6c 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a  Col + ROUND8(siz
a090: 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
a0a0: 72 64 29 29 3b 0a 20 20 20 20 20 20 70 52 65 63  rd));.      pRec
a0b0: 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
a0c0: 72 64 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  rd*)sqlite3DbMal
a0d0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
a0e0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  e);.      if( pR
a0f0: 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  ec ){.        pR
a100: 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 73  ec->pKeyInfo = s
a110: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
a120: 6e 64 65 78 28 70 2d 3e 70 50 61 72 73 65 2c 20  ndex(p->pParse, 
a130: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
a140: 66 28 20 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66  f( pRec->pKeyInf
a150: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  o ){.          a
a160: 73 73 65 72 74 28 20 70 52 65 63 2d 3e 70 4b 65  ssert( pRec->pKe
a170: 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64  yInfo->nAllField
a180: 3d 3d 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ==nCol );.      
a190: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 63      assert( pRec
a1a0: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d  ->pKeyInfo->enc=
a1b0: 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20  =ENC(db) );.    
a1c0: 20 20 20 20 20 20 70 52 65 63 2d 3e 61 4d 65 6d        pRec->aMem
a1d0: 20 3d 20 28 4d 65 6d 20 2a 29 28 28 75 38 2a 29   = (Mem *)((u8*)
a1e0: 70 52 65 63 20 2b 20 52 4f 55 4e 44 38 28 73 69  pRec + ROUND8(si
a1f0: 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
a200: 6f 72 64 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ord)));.        
a210: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
a220: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
a230: 20 20 20 20 20 70 52 65 63 2d 3e 61 4d 65 6d 5b       pRec->aMem[
a240: 69 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  i].flags = MEM_N
a250: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
a260: 20 70 52 65 63 2d 3e 61 4d 65 6d 5b 69 5d 2e 64   pRec->aMem[i].d
a270: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 20 20  b = db;.        
a280: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
a290: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
a2a0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
a2b0: 20 70 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20   pRec);.        
a2c0: 20 20 70 52 65 63 20 3d 20 30 3b 0a 20 20 20 20    pRec = 0;.    
a2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a2e0: 20 20 20 20 69 66 28 20 70 52 65 63 3d 3d 30 20      if( pRec==0 
a2f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
a300: 20 20 70 2d 3e 70 70 52 65 63 5b 30 5d 20 3d 20    p->ppRec[0] = 
a310: 70 52 65 63 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pRec;.    }.  . 
a320: 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20     pRec->nField 
a330: 3d 20 70 2d 3e 69 56 61 6c 2b 31 3b 0a 20 20 20  = p->iVal+1;.   
a340: 20 72 65 74 75 72 6e 20 26 70 52 65 63 2d 3e 61   return &pRec->a
a350: 4d 65 6d 5b 70 2d 3e 69 56 61 6c 5d 3b 0a 20 20  Mem[p->iVal];.  
a360: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
a370: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
a380: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
a390: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
a3a0: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 29 20 2a  TAT3_OR_STAT4) *
a3b0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
a3c0: 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
a3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
a3e0: 72 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 20 69  ression object i
a3f0: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
a400: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
a410: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
a420: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
a430: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  SQL function. If
a440: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 66  .**.**   * all f
a450: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
a460: 73 20 61 72 65 20 53 51 4c 20 6c 69 74 65 72 61  s are SQL litera
a470: 6c 73 2c 0a 2a 2a 20 20 20 2a 20 6f 6e 65 20 6f  ls,.**   * one o
a480: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4e  f the SQLITE_FUN
a490: 43 5f 43 4f 4e 53 54 41 4e 54 20 6f 72 20 5f 53  C_CONSTANT or _S
a4a0: 4c 4f 43 48 4e 47 20 66 75 6e 63 74 69 6f 6e 20  LOCHNG function 
a4b0: 66 6c 61 67 73 20 69 73 20 73 65 74 2c 20 61 6e  flags is set, an
a4c0: 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 53 51 4c  d.**   * the SQL
a4d0: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
a4e0: 4c 20 66 75 6e 63 74 69 6f 6e 20 66 6c 61 67 20  L function flag 
a4f0: 69 73 20 6e 6f 74 20 73 65 74 2c 0a 2a 2a 0a 2a  is not set,.**.*
a500: 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
a510: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
a520: 69 6e 76 6f 6b 65 20 74 68 65 20 53 51 4c 20 66  invoke the SQL f
a530: 75 6e 63 74 69 6f 6e 2e 20 41 73 73 75 6d 69 6e  unction. Assumin
a540: 67 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  g no.** error oc
a550: 63 75 72 73 2c 20 6f 75 74 70 75 74 20 70 61 72  curs, output par
a560: 61 6d 65 74 65 72 20 28 2a 70 70 56 61 6c 29 20  ameter (*ppVal) 
a570: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
a580: 74 6f 20 61 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  to a value .** o
a590: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 69 6e 67  bject containing
a5a0: 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f   the result befo
a5b0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
a5c0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 41 66  ITE_OK..**.** Af
a5d0: 66 69 6e 69 74 79 20 61 66 66 20 69 73 20 61 70  finity aff is ap
a5e0: 70 6c 69 65 64 20 74 6f 20 74 68 65 20 72 65 73  plied to the res
a5f0: 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ult of the funct
a600: 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
a610: 6e 69 6e 67 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ning..** If the 
a620: 72 65 73 75 6c 74 20 69 73 20 61 20 74 65 78 74  result is a text
a630: 20 76 61 6c 75 65 2c 20 74 68 65 20 73 71 6c 69   value, the sqli
a640: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
a650: 20 75 73 65 73 20 65 6e 63 6f 64 69 6e 67 20 0a   uses encoding .
a660: 2a 2a 20 65 6e 63 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** enc..**.** If
a670: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
a680: 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65  above are not me
a690: 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
a6a0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
a6b0: 4f 4b 0a 2a 2a 20 61 6e 64 20 73 65 74 73 20 28  OK.** and sets (
a6c0: 2a 70 70 56 61 6c 29 20 74 6f 20 4e 55 4c 4c 2e  *ppVal) to NULL.
a6d0: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
a6e0: 20 6f 63 63 75 72 73 2c 20 28 2a 70 70 56 61 6c   occurs, (*ppVal
a6f0: 29 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 4e  ) is set to.** N
a700: 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74  ULL and an SQLit
a710: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  e error code ret
a720: 75 72 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  urned..*/.#ifdef
a730: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
a740: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 73 74  TAT3_OR_STAT4.st
a750: 61 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72  atic int valueFr
a760: 6f 6d 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  omFunction(.  sq
a770: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a790: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
a7a0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
a7b0: 70 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  pr *p,          
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a7e0: 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20  to evaluate */. 
a7f0: 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20   u8 enc,        
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20   /* Encoding to 
a820: 75 73 65 20 2a 2f 0a 20 20 75 38 20 61 66 66 2c  use */.  u8 aff,
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
a850: 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20  nity to use */. 
a860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
a870: 2a 70 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20  *ppVal,         
a880: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
a890: 77 20 76 61 6c 75 65 20 68 65 72 65 20 2a 2f 0a  w value here */.
a8a0: 20 20 73 74 72 75 63 74 20 56 61 6c 75 65 4e 65    struct ValueNe
a8b0: 77 53 74 61 74 34 43 74 78 20 2a 70 43 74 78 20  wStat4Ctx *pCtx 
a8c0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67 75    /* Second argu
a8d0: 6d 65 6e 74 20 66 6f 72 20 76 61 6c 75 65 4e 65  ment for valueNe
a8e0: 77 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  w() */.){.  sqli
a8f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b  te3_context ctx;
a900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a910: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
a920: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
a930: 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
a940: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
a950: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 46 75   = 0;      /* Fu
a960: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
a970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 20 3d   */.  int nVal =
a980: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a990: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a9a0: 20 61 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 2a   apVal[] array *
a9b0: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75  /.  FuncDef *pFu
a9c0: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
a9d0: 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
a9e0: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
a9f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
aa00: 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Val = 0;        
aa10: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 2a 2f 0a  /* New value */.
aa20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
aa30: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
aa40: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
aa50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
aa60: 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pList = 0;      
aa70: 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
aa80: 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
aa90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
aac0: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  iable */..  asse
aad0: 72 74 28 20 70 43 74 78 21 3d 30 20 29 3b 0a 20  rt( pCtx!=0 );. 
aae0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
aaf0: 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
ab00: 79 29 3d 3d 30 20 29 3b 0a 20 20 70 4c 69 73 74  y)==0 );.  pList
ab10: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20   = p->x.pList;. 
ab20: 20 69 66 28 20 70 4c 69 73 74 20 29 20 6e 56 61   if( pList ) nVa
ab30: 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
ab40: 3b 0a 20 20 70 46 75 6e 63 20 3d 20 73 71 6c 69  ;.  pFunc = sqli
ab50: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
ab60: 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  db, p->u.zToken,
ab70: 20 6e 56 61 6c 2c 20 65 6e 63 2c 20 30 29 3b 0a   nVal, enc, 0);.
ab80: 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 20    assert( pFunc 
ab90: 29 3b 0a 20 20 69 66 28 20 28 70 46 75 6e 63 2d  );.  if( (pFunc-
aba0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51  >funcFlags & (SQ
abb0: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41  LITE_FUNC_CONSTA
abc0: 4e 54 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 53  NT|SQLITE_FUNC_S
abd0: 4c 4f 43 48 4e 47 29 29 3d 3d 30 20 0a 20 20 20  LOCHNG))==0 .   
abe0: 7c 7c 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  || (pFunc->funcF
abf0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
ac00: 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 0a 20 20 29  NC_NEEDCOLL).  )
ac10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ac20: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
ac30: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
ac40: 61 70 56 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  apVal = (sqlite3
ac50: 5f 76 61 6c 75 65 2a 2a 29 73 71 6c 69 74 65 33  _value**)sqlite3
ac60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ac70: 20 73 69 7a 65 6f 66 28 61 70 56 61 6c 5b 30 5d   sizeof(apVal[0]
ac80: 29 20 2a 20 6e 56 61 6c 29 3b 0a 20 20 20 20 69  ) * nVal);.    i
ac90: 66 28 20 61 70 56 61 6c 3d 3d 30 20 29 7b 0a 20  f( apVal==0 ){. 
aca0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
acb0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
acc0: 20 20 20 67 6f 74 6f 20 76 61 6c 75 65 5f 66 72     goto value_fr
acd0: 6f 6d 5f 66 75 6e 63 74 69 6f 6e 5f 6f 75 74 3b  om_function_out;
ace0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
acf0: 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
ad00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
ad10: 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
ad20: 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
ad30: 5d 2e 70 45 78 70 72 2c 20 65 6e 63 2c 20 61 66  ].pExpr, enc, af
ad40: 66 2c 20 26 61 70 56 61 6c 5b 69 5d 29 3b 0a 20  f, &apVal[i]);. 
ad50: 20 20 20 20 20 69 66 28 20 61 70 56 61 6c 5b 69       if( apVal[i
ad60: 5d 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ]==0 || rc!=SQLI
ad70: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 76 61 6c  TE_OK ) goto val
ad80: 75 65 5f 66 72 6f 6d 5f 66 75 6e 63 74 69 6f 6e  ue_from_function
ad90: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
ada0: 0a 20 20 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e  .  pVal = valueN
adb0: 65 77 28 64 62 2c 20 70 43 74 78 29 3b 0a 20 20  ew(db, pCtx);.  
adc0: 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 7b 0a 20  if( pVal==0 ){. 
add0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
ade0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67  OMEM_BKPT;.    g
adf0: 6f 74 6f 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66  oto value_from_f
ae00: 75 6e 63 74 69 6f 6e 5f 6f 75 74 3b 0a 20 20 7d  unction_out;.  }
ae10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 74 78  ..  assert( pCtx
ae20: 2d 3e 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51  ->pParse->rc==SQ
ae30: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 6d 65 6d  LITE_OK );.  mem
ae40: 73 65 74 28 26 63 74 78 2c 20 30 2c 20 73 69 7a  set(&ctx, 0, siz
ae50: 65 6f 66 28 63 74 78 29 29 3b 0a 20 20 63 74 78  eof(ctx));.  ctx
ae60: 2e 70 4f 75 74 20 3d 20 70 56 61 6c 3b 0a 20 20  .pOut = pVal;.  
ae70: 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 46 75 6e  ctx.pFunc = pFun
ae80: 63 3b 0a 20 20 70 46 75 6e 63 2d 3e 78 53 46 75  c;.  pFunc->xSFu
ae90: 6e 63 28 26 63 74 78 2c 20 6e 56 61 6c 2c 20 61  nc(&ctx, nVal, a
aea0: 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 63 74 78  pVal);.  if( ctx
aeb0: 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  .isError ){.    
aec0: 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72  rc = ctx.isError
aed0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
aee0: 6f 72 4d 73 67 28 70 43 74 78 2d 3e 70 50 61 72  orMsg(pCtx->pPar
aef0: 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
af00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
af10: 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l));.  }else{.  
af20: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
af30: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 56 61 6c  plyAffinity(pVal
af40: 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
af50: 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  F8);.    assert(
af60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
af70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
af80: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
af90: 64 69 6e 67 28 70 56 61 6c 2c 20 65 6e 63 29 3b  ding(pVal, enc);
afa0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
afb0: 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
afc0: 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
afd0: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 63  Val) ){.      rc
afe0: 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47   = SQLITE_TOOBIG
aff0: 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 70 50  ;.      pCtx->pP
b000: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
b010: 20 20 7d 0a 20 20 7d 0a 20 20 70 43 74 78 2d 3e    }.  }.  pCtx->
b020: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b  pParse->rc = rc;
b030: 0a 0a 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66 75  .. value_from_fu
b040: 6e 63 74 69 6f 6e 5f 6f 75 74 3a 0a 20 20 69 66  nction_out:.  if
b050: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b060: 29 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20 30 3b  ){.    pVal = 0;
b070: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c  .  }.  if( apVal
b080: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
b090: 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nVal; i++){. 
b0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
b0b0: 65 46 72 65 65 28 61 70 56 61 6c 5b 69 5d 29 3b  eFree(apVal[i]);
b0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b0d0: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61  e3DbFreeNN(db, a
b0e0: 70 56 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  pVal);.  }..  *p
b0f0: 70 56 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72  pVal = pVal;.  r
b100: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
b110: 65 0a 23 20 64 65 66 69 6e 65 20 76 61 6c 75 65  e.# define value
b120: 46 72 6f 6d 46 75 6e 63 74 69 6f 6e 28 61 2c 62  FromFunction(a,b
b130: 2c 63 2c 64 2c 65 2c 66 29 20 53 51 4c 49 54 45  ,c,d,e,f) SQLITE
b140: 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  _OK.#endif /* de
b150: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b160: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
b170: 54 34 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78  T4) */../*.** Ex
b180: 74 72 61 63 74 20 61 20 76 61 6c 75 65 20 66 72  tract a value fr
b190: 6f 6d 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  om the supplied 
b1a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
b1b0: 65 20 6d 61 6e 6e 65 72 20 64 65 73 63 72 69 62  e manner describ
b1c0: 65 64 0a 2a 2a 20 61 62 6f 76 65 20 73 71 6c 69  ed.** above sqli
b1d0: 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
b1e0: 28 29 2e 20 41 6c 6c 6f 63 61 74 65 20 74 68 65  (). Allocate the
b1f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
b200: 62 6a 65 63 74 0a 2a 2a 20 75 73 69 6e 67 20 76  bject.** using v
b210: 61 6c 75 65 4e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a  alueNew()..**.**
b220: 20 49 66 20 70 43 74 78 20 69 73 20 4e 55 4c 4c   If pCtx is NULL
b230: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6f 63   and an error oc
b240: 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73  curs after the s
b250: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
b260: 65 63 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ect.** has been 
b270: 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
b280: 20 66 72 65 65 64 20 62 65 66 6f 72 65 20 72 65   freed before re
b290: 74 75 72 6e 69 6e 67 2e 20 4f 72 2c 20 69 66 20  turning. Or, if 
b2a0: 70 43 74 78 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pCtx is not.** N
b2b0: 55 4c 4c 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ULL, it is assum
b2c0: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
b2d0: 65 72 20 77 69 6c 6c 20 66 72 65 65 20 61 6e 79  er will free any
b2e0: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63   allocated objec
b2f0: 74 0a 2a 2a 20 69 6e 20 61 6c 6c 20 63 61 73 65  t.** in all case
b300: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b310: 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a   valueFromExpr(.
b320: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
b350: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
b360: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b390: 69 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ion to evaluate 
b3a0: 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20  */.  u8 enc,    
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67       /* Encoding
b3d0: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 75 38 20   to use */.  u8 
b3e0: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 20  affinity,       
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b400: 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  Affinity to use 
b410: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b420: 75 65 20 2a 2a 70 70 56 61 6c 2c 20 20 20 20 20  ue **ppVal,     
b430: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
b440: 65 20 6e 65 77 20 76 61 6c 75 65 20 68 65 72 65  e new value here
b450: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 56 61 6c   */.  struct Val
b460: 75 65 4e 65 77 53 74 61 74 34 43 74 78 20 2a 70  ueNewStat4Ctx *p
b470: 43 74 78 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  Ctx   /* Second 
b480: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 76 61 6c  argument for val
b490: 75 65 4e 65 77 28 29 20 2a 2f 0a 29 7b 0a 20 20  ueNew() */.){.  
b4a0: 69 6e 74 20 6f 70 3b 0a 20 20 63 68 61 72 20 2a  int op;.  char *
b4b0: 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  zVal = 0;.  sqli
b4c0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
b4d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67 49 6e  = 0;.  int negIn
b4e0: 74 20 3d 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63  t = 1;.  const c
b4f0: 68 61 72 20 2a 7a 4e 65 67 20 3d 20 22 22 3b 0a  har *zNeg = "";.
b500: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b510: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b520: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 77   pExpr!=0 );.  w
b530: 68 69 6c 65 28 20 28 6f 70 20 3d 20 70 45 78 70  hile( (op = pExp
b540: 72 2d 3e 6f 70 29 3d 3d 54 4b 5f 55 50 4c 55 53  r->op)==TK_UPLUS
b550: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20   || op==TK_SPAN 
b560: 29 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d  ) pExpr = pExpr-
b570: 3e 70 4c 65 66 74 3b 0a 23 69 66 20 64 65 66 69  >pLeft;.#if defi
b580: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b590: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
b5a0: 29 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ).  if( op==TK_R
b5b0: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
b5c0: 45 78 70 72 2d 3e 6f 70 32 3b 0a 23 65 6c 73 65  Expr->op2;.#else
b5d0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 70 3d  .  if( NEVER(op=
b5e0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 29 20 29 20  =TK_REGISTER) ) 
b5f0: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b  op = pExpr->op2;
b600: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
b610: 6d 70 72 65 73 73 65 64 20 65 78 70 72 65 73 73  mpressed express
b620: 69 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 65 61 72  ions only appear
b630: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
b640: 65 20 44 45 46 41 55 4c 54 20 63 6c 61 75 73 65  e DEFAULT clause
b650: 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
b660: 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
b670: 6f 6e 2c 20 61 6e 64 20 68 65 6e 63 65 20 6f 6e  on, and hence on
b680: 6c 79 20 77 68 65 6e 20 70 43 74 78 3d 3d 30 2e  ly when pCtx==0.
b690: 20 20 54 68 69 73 0a 20 20 2a 2a 20 63 68 65 63    This.  ** chec
b6a0: 6b 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  k ensures that a
b6b0: 6e 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 20 65  n EP_TokenOnly e
b6c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 65 76  xpression is nev
b6d0: 65 72 20 70 61 73 73 65 64 20 64 6f 77 6e 0a 20  er passed down. 
b6e0: 20 2a 2a 20 69 6e 74 6f 20 76 61 6c 75 65 46 72   ** into valueFr
b6f0: 6f 6d 46 75 6e 63 74 69 6f 6e 28 29 2e 20 2a 2f  omFunction(). */
b700: 0a 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70  .  assert( (pExp
b710: 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 54 6f  r->flags & EP_To
b720: 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 7c 7c 20 70  kenOnly)==0 || p
b730: 43 74 78 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Ctx==0 );..  if(
b740: 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a   op==TK_CAST ){.
b750: 20 20 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c      u8 aff = sql
b760: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
b770: 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
b780: 2c 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 76 61  ,0);.    rc = va
b790: 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20  lueFromExpr(db, 
b7a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 65 6e  pExpr->pLeft, en
b7b0: 63 2c 20 61 66 66 2c 20 70 70 56 61 6c 2c 20 70  c, aff, ppVal, p
b7c0: 43 74 78 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Ctx);.    testca
b7d0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
b7e0: 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 70  K );.    if( *pp
b7f0: 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Val ){.      sql
b800: 69 74 65 33 56 64 62 65 4d 65 6d 43 61 73 74 28  ite3VdbeMemCast(
b810: 2a 70 70 56 61 6c 2c 20 61 66 66 2c 20 53 51 4c  *ppVal, aff, SQL
b820: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
b830: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
b840: 6c 79 41 66 66 69 6e 69 74 79 28 2a 70 70 56 61  lyAffinity(*ppVa
b850: 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 53 51 4c  l, affinity, SQL
b860: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 7d  ITE_UTF8);.    }
b870: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b880: 20 20 7d 0a 0a 20 20 2f 2a 20 48 61 6e 64 6c 65    }..  /* Handle
b890: 20 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65   negative intege
b8a0: 72 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73  rs in a single s
b8b0: 74 65 70 2e 20 20 54 68 69 73 20 69 73 20 6e 65  tep.  This is ne
b8c0: 65 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  eded in the.  **
b8d0: 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 76   case when the v
b8e0: 61 6c 75 65 20 69 73 20 2d 39 32 32 33 33 37 32  alue is -9223372
b8f0: 30 33 36 38 35 34 37 37 35 38 30 38 2e 0a 20 20  036854775808..  
b900: 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
b910: 55 4d 49 4e 55 53 0a 20 20 20 26 26 20 28 70 45  UMINUS.   && (pE
b920: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
b930: 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 70 45  TK_INTEGER || pE
b940: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
b950: 54 4b 5f 46 4c 4f 41 54 29 20 29 7b 0a 20 20 20  TK_FLOAT) ){.   
b960: 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
b970: 70 4c 65 66 74 3b 0a 20 20 20 20 6f 70 20 3d 20  pLeft;.    op = 
b980: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 6e  pExpr->op;.    n
b990: 65 67 49 6e 74 20 3d 20 2d 31 3b 0a 20 20 20 20  egInt = -1;.    
b9a0: 7a 4e 65 67 20 3d 20 22 2d 22 3b 0a 20 20 7d 0a  zNeg = "-";.  }.
b9b0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 54  .  if( op==TK_ST
b9c0: 52 49 4e 47 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 46  RING || op==TK_F
b9d0: 4c 4f 41 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  LOAT || op==TK_I
b9e0: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 70 56  NTEGER ){.    pV
b9f0: 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28 64 62  al = valueNew(db
ba00: 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 69 66 28  , pCtx);.    if(
ba10: 20 70 56 61 6c 3d 3d 30 20 29 20 67 6f 74 6f 20   pVal==0 ) goto 
ba20: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 69 66 28 20  no_mem;.    if( 
ba30: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ba40: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
ba50: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ue) ){.      sql
ba60: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
ba70: 74 36 34 28 70 56 61 6c 2c 20 28 69 36 34 29 70  t64(pVal, (i64)p
ba80: 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 2a 6e  Expr->u.iValue*n
ba90: 65 67 49 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  egInt);.    }els
baa0: 65 7b 0a 20 20 20 20 20 20 7a 56 61 6c 20 3d 20  e{.      zVal = 
bab0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bac0: 62 2c 20 22 25 73 25 73 22 2c 20 7a 4e 65 67 2c  b, "%s%s", zNeg,
bad0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
bae0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 56 61  );.      if( zVa
baf0: 6c 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  l==0 ) goto no_m
bb00: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
bb10: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
bb20: 6c 2c 20 2d 31 2c 20 7a 56 61 6c 2c 20 53 51 4c  l, -1, zVal, SQL
bb30: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
bb40: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
bb50: 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b  .    if( (op==TK
bb60: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 6f 70 3d 3d  _INTEGER || op==
bb70: 54 4b 5f 46 4c 4f 41 54 20 29 20 26 26 20 61 66  TK_FLOAT ) && af
bb80: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
bb90: 46 46 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20  FF_BLOB ){.     
bba0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
bbb0: 6c 79 41 66 66 69 6e 69 74 79 28 70 56 61 6c 2c  lyAffinity(pVal,
bbc0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
bbd0: 52 49 43 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RIC, SQLITE_UTF8
bbe0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
bbf0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
bc00: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 56  ApplyAffinity(pV
bc10: 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 53 51  al, affinity, SQ
bc20: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
bc30: 7d 0a 20 20 20 20 69 66 28 20 70 56 61 6c 2d 3e  }.    if( pVal->
bc40: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74  flags & (MEM_Int
bc50: 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 20 70 56 61  |MEM_Real) ) pVa
bc60: 6c 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d  l->flags &= ~MEM
bc70: 5f 53 74 72 3b 0a 20 20 20 20 69 66 28 20 65 6e  _Str;.    if( en
bc80: 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29  c!=SQLITE_UTF8 )
bc90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
bca0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
bcb0: 63 6f 64 69 6e 67 28 70 56 61 6c 2c 20 65 6e 63  coding(pVal, enc
bcc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
bcd0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 55 4d 49 4e   if( op==TK_UMIN
bce0: 55 53 20 29 20 7b 0a 20 20 20 20 2f 2a 20 54 68  US ) {.    /* Th
bcf0: 69 73 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e  is branch happen
bd00: 73 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 6e  s for multiple n
bd10: 65 67 61 74 69 76 65 20 73 69 67 6e 73 2e 20 20  egative signs.  
bd20: 45 78 3a 20 2d 28 2d 35 29 20 2a 2f 0a 20 20 20  Ex: -(-5) */.   
bd30: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
bd40: 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62  valueFromExpr(db
bd50: 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 65 6e  ,pExpr->pLeft,en
bd60: 63 2c 61 66 66 69 6e 69 74 79 2c 26 70 56 61 6c  c,affinity,&pVal
bd70: 2c 70 43 74 78 29 20 0a 20 20 20 20 20 26 26 20  ,pCtx) .     && 
bd80: 70 56 61 6c 21 3d 30 0a 20 20 20 20 29 7b 0a 20  pVal!=0.    ){. 
bd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bda0: 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 56 61 6c  MemNumerify(pVal
bdb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 61  );.      if( pVa
bdc0: 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  l->flags & MEM_R
bdd0: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eal ){.        p
bde0: 56 61 6c 2d 3e 75 2e 72 20 3d 20 2d 70 56 61 6c  Val->u.r = -pVal
bdf0: 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 7d 65 6c  ->u.r;.      }el
be00: 73 65 20 69 66 28 20 70 56 61 6c 2d 3e 75 2e 69  se if( pVal->u.i
be10: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
be20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 56 61 6c   ){.        pVal
be30: 2d 3e 75 2e 72 20 3d 20 2d 28 64 6f 75 62 6c 65  ->u.r = -(double
be40: 29 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 3b  )SMALLEST_INT64;
be50: 0a 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74 54  .        MemSetT
be60: 79 70 65 46 6c 61 67 28 70 56 61 6c 2c 20 4d 45  ypeFlag(pVal, ME
be70: 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 7d  M_Real);.      }
be80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 56  else{.        pV
be90: 61 6c 2d 3e 75 2e 69 20 3d 20 2d 70 56 61 6c 2d  al->u.i = -pVal-
bea0: 3e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >u.i;.      }.  
beb0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
bec0: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 56  ApplyAffinity(pV
bed0: 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e  al, affinity, en
bee0: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c);.    }.  }els
bef0: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 4e 55 4c  e if( op==TK_NUL
bf00: 4c 20 29 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20  L ){.    pVal = 
bf10: 76 61 6c 75 65 4e 65 77 28 64 62 2c 20 70 43 74  valueNew(db, pCt
bf20: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  x);.    if( pVal
bf30: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
bf40: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
bf50: 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 56  beMemNumerify(pV
bf60: 61 6c 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  al);.  }.#ifndef
bf70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
bf80: 42 5f 4c 49 54 45 52 41 4c 0a 20 20 65 6c 73 65  B_LITERAL.  else
bf90: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 42 4c 4f 42   if( op==TK_BLOB
bfa0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c   ){.    int nVal
bfb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
bfc0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
bfd0: 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e  =='x' || pExpr->
bfe0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27  u.zToken[0]=='X'
bff0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c000: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
c010: 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
c020: 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28  pVal = valueNew(
c030: 64 62 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 69  db, pCtx);.    i
c040: 66 28 20 21 70 56 61 6c 20 29 20 67 6f 74 6f 20  f( !pVal ) goto 
c050: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7a 56 61 6c  no_mem;.    zVal
c060: 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   = &pExpr->u.zTo
c070: 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 6e 56 61 6c  ken[2];.    nVal
c080: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c090: 33 30 28 7a 56 61 6c 29 2d 31 3b 0a 20 20 20 20  30(zVal)-1;.    
c0a0: 61 73 73 65 72 74 28 20 7a 56 61 6c 5b 6e 56 61  assert( zVal[nVa
c0b0: 6c 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  l]=='\'' );.    
c0c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
c0d0: 74 53 74 72 28 70 56 61 6c 2c 20 73 71 6c 69 74  tStr(pVal, sqlit
c0e0: 65 33 48 65 78 54 6f 42 6c 6f 62 28 64 62 2c 20  e3HexToBlob(db, 
c0f0: 7a 56 61 6c 2c 20 6e 56 61 6c 29 2c 20 6e 56 61  zVal, nVal), nVa
c100: 6c 2f 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  l/2,.           
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
c120: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
c130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
c140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c150: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
c160: 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d  .  else if( op==
c170: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70  TK_FUNCTION && p
c180: 43 74 78 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  Ctx!=0 ){.    rc
c190: 20 3d 20 76 61 6c 75 65 46 72 6f 6d 46 75 6e 63   = valueFromFunc
c1a0: 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20  tion(db, pExpr, 
c1b0: 65 6e 63 2c 20 61 66 66 69 6e 69 74 79 2c 20 26  enc, affinity, &
c1c0: 70 56 61 6c 2c 20 70 43 74 78 29 3b 0a 20 20 7d  pVal, pCtx);.  }
c1d0: 0a 23 65 6e 64 69 66 0a 20 20 65 6c 73 65 20 69  .#endif.  else i
c1e0: 66 28 20 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41  f( op==TK_TRUEFA
c1f0: 4c 53 45 20 29 7b 0a 20 20 20 20 70 56 61 6c 20  LSE ){.    pVal 
c200: 3d 20 76 61 6c 75 65 4e 65 77 28 64 62 2c 20 70  = valueNew(db, p
c210: 43 74 78 29 3b 0a 20 20 20 20 69 66 28 20 70 56  Ctx);.    if( pV
c220: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 56 61 6c  al ){.      pVal
c230: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c240: 74 3b 0a 20 20 20 20 20 20 70 56 61 6c 2d 3e 75  t;.      pVal->u
c250: 2e 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  .i = pExpr->u.zT
c260: 6f 6b 65 6e 5b 34 5d 3d 3d 30 3b 0a 20 20 20 20  oken[4]==0;.    
c270: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 61 6c 20  }.  }..  *ppVal 
c280: 3d 20 70 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e  = pVal;.  return
c290: 20 72 63 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 0a 23 69   rc;..no_mem:.#i
c2a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c2b0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
c2c0: 34 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  4.  if( pCtx==0 
c2d0: 7c 7c 20 70 43 74 78 2d 3e 70 50 61 72 73 65 2d  || pCtx->pParse-
c2e0: 3e 6e 45 72 72 3d 3d 30 20 29 0a 23 65 6e 64 69  >nErr==0 ).#endi
c2f0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  f.    sqlite3Oom
c300: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 73 71 6c  Fault(db);.  sql
c310: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
c320: 56 61 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Val);.  assert( 
c330: 2a 70 70 56 61 6c 3d 3d 30 20 29 3b 0a 23 69 66  *ppVal==0 );.#if
c340: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c350: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
c360: 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29  .  if( pCtx==0 )
c370: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
c380: 65 28 70 56 61 6c 29 3b 0a 23 65 6c 73 65 0a 20  e(pVal);.#else. 
c390: 20 61 73 73 65 72 74 28 20 70 43 74 78 3d 3d 30   assert( pCtx==0
c3a0: 20 29 3b 20 73 71 6c 69 74 65 33 56 61 6c 75 65   ); sqlite3Value
c3b0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 23 65 6e 64  Free(pVal);.#end
c3c0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
c3d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 7d  TE_NOMEM_BKPT;.}
c3e0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
c3f0: 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 76 61 6c   new sqlite3_val
c400: 75 65 20 6f 62 6a 65 63 74 2c 20 63 6f 6e 74 61  ue object, conta
c410: 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
c420: 6f 66 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  of pExpr..**.** 
c430: 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  This only works 
c440: 66 6f 72 20 76 65 72 79 20 73 69 6d 70 6c 65 20  for very simple 
c450: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
c460: 20 63 6f 6e 73 69 73 74 20 6f 66 20 6f 6e 65 20   consist of one 
c470: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 6f 6b 65  constant.** toke
c480: 6e 20 28 69 2e 65 2e 20 22 35 22 2c 20 22 35 2e  n (i.e. "5", "5.
c490: 31 22 2c 20 22 27 61 20 73 74 72 69 6e 67 27 22  1", "'a string'"
c4a0: 29 2e 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ). If the expres
c4b0: 73 69 6f 6e 20 63 61 6e 0a 2a 2a 20 62 65 20 63  sion can.** be c
c4c0: 6f 6e 76 65 72 74 65 64 20 64 69 72 65 63 74 6c  onverted directl
c4d0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 75 65 2c 20  y into a value, 
c4e0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 69  then the value i
c4f0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a  s allocated and.
c500: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 77 72 69  ** a pointer wri
c510: 74 74 65 6e 20 74 6f 20 2a 70 70 56 61 6c 2e 20  tten to *ppVal. 
c520: 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
c530: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 64 65  sponsible for de
c540: 61 6c 6c 6f 63 61 74 69 6e 67 0a 2a 2a 20 74 68  allocating.** th
c550: 65 20 76 61 6c 75 65 20 62 79 20 70 61 73 73 69  e value by passi
c560: 6e 67 20 69 74 20 74 6f 20 73 71 6c 69 74 65 33  ng it to sqlite3
c570: 56 61 6c 75 65 46 72 65 65 28 29 20 6c 61 74 65  ValueFree() late
c580: 72 20 6f 6e 2e 20 49 66 20 74 68 65 20 65 78 70  r on. If the exp
c590: 72 65 73 73 69 6f 6e 0a 2a 2a 20 63 61 6e 6e 6f  ression.** canno
c5a0: 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
c5b0: 6f 20 61 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  o a value, then 
c5c0: 2a 70 70 56 61 6c 20 69 73 20 73 65 74 20 74 6f  *ppVal is set to
c5d0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71   NULL..*/.int sq
c5e0: 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
c5f0: 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
c600: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
c610: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
c620: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
c630: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
c640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c650: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 65   expression to e
c660: 76 61 6c 75 61 74 65 20 2a 2f 0a 20 20 75 38 20  valuate */.  u8 
c670: 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  enc,            
c680: 20 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 69         /* Encodi
c690: 6e 67 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 75  ng to use */.  u
c6a0: 38 20 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20  8 affinity,     
c6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69           /* Affi
c6c0: 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20  nity to use */. 
c6d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c6e0: 2a 70 70 56 61 6c 20 20 20 20 20 2f 2a 20 57 72  *ppVal     /* Wr
c6f0: 69 74 65 20 74 68 65 20 6e 65 77 20 76 61 6c 75  ite the new valu
c700: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 72  e here */.){.  r
c710: 65 74 75 72 6e 20 70 45 78 70 72 20 3f 20 76 61  eturn pExpr ? va
c720: 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20  lueFromExpr(db, 
c730: 70 45 78 70 72 2c 20 65 6e 63 2c 20 61 66 66 69  pExpr, enc, affi
c740: 6e 69 74 79 2c 20 70 70 56 61 6c 2c 20 30 29 20  nity, ppVal, 0) 
c750: 3a 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  : 0;.}..#ifdef S
c760: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c770: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
c780: 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
c790: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
c7a0: 74 65 5f 72 65 63 6f 72 64 28 29 20 66 75 6e 63  te_record() func
c7b0: 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
c7c0: 69 6f 6e 20 61 63 63 65 70 74 73 0a 2a 2a 20 61  ion accepts.** a
c7d0: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
c7e0: 20 6f 66 20 61 6e 79 20 74 79 70 65 2e 20 54 68   of any type. Th
c7f0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
c800: 73 20 61 20 66 6f 72 6d 61 74 74 65 64 20 64 61  s a formatted da
c810: 74 61 62 61 73 65 20 0a 2a 2a 20 72 65 63 6f 72  tabase .** recor
c820: 64 20 28 61 20 62 6c 6f 62 29 20 63 6f 6e 74 61  d (a blob) conta
c830: 69 6e 69 6e 67 20 74 68 65 20 61 72 67 75 6d 65  ining the argume
c840: 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  nt value..**.** 
c850: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
c860: 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
c870: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
c880: 27 73 61 6d 70 6c 65 27 20 63 6f 6c 75 6d 6e 20  'sample' column 
c890: 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  of the.** sqlite
c8a0: 5f 73 74 61 74 33 20 74 61 62 6c 65 20 74 6f 20  _stat3 table to 
c8b0: 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
c8c0: 74 20 53 51 4c 69 74 65 20 75 73 65 73 20 69 6e  t SQLite uses in
c8d0: 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61  ternally..*/.sta
c8e0: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 72 64 46  tic void recordF
c8f0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
c900: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
c910: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
c920: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c930: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69  rgv.){.  const i
c940: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d  nt file_format =
c950: 20 31 3b 0a 20 20 75 33 32 20 69 53 65 72 69 61   1;.  u32 iSeria
c960: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c970: 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
c980: 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  type */.  int nS
c990: 65 72 69 61 6c 3b 20 20 20 20 20 20 20 20 20 20  erial;          
c9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
c9b0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
c9c0: 69 53 65 72 69 61 6c 20 61 73 20 76 61 72 69 6e  iSerial as varin
c9d0: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 56 61 6c 3b  t */.  u32 nVal;
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
ca00: 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72 65  of space require
ca10: 64 20 66 6f 72 20 61 72 67 76 5b 30 5d 20 2a 2f  d for argv[0] */
ca20: 0a 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20 73  .  int nRet;.  s
ca30: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 75 38  qlite3 *db;.  u8
ca40: 20 2a 61 52 65 74 3b 0a 0a 20 20 55 4e 55 53 45   *aRet;..  UNUSE
ca50: 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72 67  D_PARAMETER( arg
ca60: 63 20 29 3b 0a 20 20 69 53 65 72 69 61 6c 20 3d  c );.  iSerial =
ca70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
ca80: 61 6c 54 79 70 65 28 61 72 67 76 5b 30 5d 2c 20  alType(argv[0], 
ca90: 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6e 56  file_format, &nV
caa0: 61 6c 29 3b 0a 20 20 6e 53 65 72 69 61 6c 20 3d  al);.  nSerial =
cab0: 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
cac0: 6e 28 69 53 65 72 69 61 6c 29 3b 0a 20 20 64 62  n(iSerial);.  db
cad0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
cae0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
caf0: 74 65 78 74 29 3b 0a 0a 20 20 6e 52 65 74 20 3d  text);..  nRet =
cb00: 20 31 20 2b 20 6e 53 65 72 69 61 6c 20 2b 20 6e   1 + nSerial + n
cb10: 56 61 6c 3b 0a 20 20 61 52 65 74 20 3d 20 73 71  Val;.  aRet = sq
cb20: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
cb30: 4e 4e 28 64 62 2c 20 6e 52 65 74 29 3b 0a 20 20  NN(db, nRet);.  
cb40: 69 66 28 20 61 52 65 74 3d 3d 30 20 29 7b 0a 20  if( aRet==0 ){. 
cb50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
cb60: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
cb70: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
cb80: 0a 20 20 20 20 61 52 65 74 5b 30 5d 20 3d 20 6e  .    aRet[0] = n
cb90: 53 65 72 69 61 6c 2b 31 3b 0a 20 20 20 20 70 75  Serial+1;.    pu
cba0: 74 56 61 72 69 6e 74 33 32 28 26 61 52 65 74 5b  tVarint32(&aRet[
cbb0: 31 5d 2c 20 69 53 65 72 69 61 6c 29 3b 0a 20 20  1], iSerial);.  
cbc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
cbd0: 69 61 6c 50 75 74 28 26 61 52 65 74 5b 31 2b 6e  ialPut(&aRet[1+n
cbe0: 53 65 72 69 61 6c 5d 2c 20 61 72 67 76 5b 30 5d  Serial], argv[0]
cbf0: 2c 20 69 53 65 72 69 61 6c 29 3b 0a 20 20 20 20  , iSerial);.    
cc00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
cc10: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 52 65  lob(context, aRe
cc20: 74 2c 20 6e 52 65 74 2c 20 53 51 4c 49 54 45 5f  t, nRet, SQLITE_
cc30: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cc40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
cc50: 64 62 2c 20 61 52 65 74 29 3b 0a 20 20 7d 0a 7d  db, aRet);.  }.}
cc60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
cc70: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
cc80: 6f 6e 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70  ons used to help
cc90: 20 72 65 61 64 20 41 4e 41 4c 59 5a 45 20 64 61   read ANALYZE da
cca0: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
ccb0: 74 65 33 41 6e 61 6c 79 7a 65 46 75 6e 63 74 69  te3AnalyzeFuncti
ccc0: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  ons(void){.  sta
ccd0: 74 69 63 20 46 75 6e 63 44 65 66 20 61 41 6e 61  tic FuncDef aAna
cce0: 6c 79 7a 65 54 61 62 6c 65 46 75 6e 63 73 5b 5d  lyzeTableFuncs[]
ccf0: 20 3d 20 7b 0a 20 20 20 20 46 55 4e 43 54 49 4f   = {.    FUNCTIO
cd00: 4e 28 73 71 6c 69 74 65 5f 72 65 63 6f 72 64 2c  N(sqlite_record,
cd10: 20 20 20 31 2c 20 30 2c 20 30 2c 20 72 65 63 6f     1, 0, 0, reco
cd20: 72 64 46 75 6e 63 29 2c 0a 20 20 7d 3b 0a 20 20  rdFunc),.  };.  
cd30: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69  sqlite3InsertBui
cd40: 6c 74 69 6e 46 75 6e 63 73 28 61 41 6e 61 6c 79  ltinFuncs(aAnaly
cd50: 7a 65 54 61 62 6c 65 46 75 6e 63 73 2c 20 41 72  zeTableFuncs, Ar
cd60: 72 61 79 53 69 7a 65 28 61 41 6e 61 6c 79 7a 65  raySize(aAnalyze
cd70: 54 61 62 6c 65 46 75 6e 63 73 29 29 3b 0a 7d 0a  TableFuncs));.}.
cd80: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
cd90: 6f 20 65 78 74 72 61 63 74 20 61 20 76 61 6c 75  o extract a valu
cda0: 65 20 66 72 6f 6d 20 70 45 78 70 72 20 61 6e 64  e from pExpr and
cdb0: 20 75 73 65 20 69 74 20 74 6f 20 63 6f 6e 73 74   use it to const
cdc0: 72 75 63 74 20 2a 70 70 56 61 6c 2e 0a 2a 2a 0a  ruct *ppVal..**.
cdd0: 2a 2a 20 49 66 20 70 41 6c 6c 6f 63 20 69 73 20  ** If pAlloc is 
cde0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61  not NULL, then a
cdf0: 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
ce00: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
ce10: 65 64 20 66 6f 72 0a 2a 2a 20 70 41 6c 6c 6f 63  ed for.** pAlloc
ce20: 20 69 66 20 6f 6e 65 20 64 6f 65 73 20 6e 6f 74   if one does not
ce30: 20 65 78 69 73 74 20 61 6e 64 20 74 68 65 20 6e   exist and the n
ce40: 65 77 20 76 61 6c 75 65 20 69 73 20 61 64 64 65  ew value is adde
ce50: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 55 6e 70 61  d to the.** Unpa
ce60: 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65 63  ckedRecord objec
ce70: 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 61 6c 75 65  t..**.** A value
ce80: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 69 6e   is extracted in
ce90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
cea0: 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 28  ases:.**.**  * (
ceb0: 70 45 78 70 72 3d 3d 30 29 2e 20 49 6e 20 74 68  pExpr==0). In th
cec0: 69 73 20 63 61 73 65 20 74 68 65 20 76 61 6c 75  is case the valu
ced0: 65 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  e is assumed to 
cee0: 62 65 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 0a  be an SQL NULL,.
cef0: 2a 2a 0a 2a 2a 20 20 2a 20 54 68 65 20 65 78 70  **.**  * The exp
cf00: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 62 6f 75  ression is a bou
cf10: 6e 64 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64  nd variable, and
cf20: 20 74 68 69 73 20 69 73 20 61 20 72 65 70 72 65   this is a repre
cf30: 70 61 72 65 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  pare, or.**.**  
cf40: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
cf50: 20 69 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61   is a literal va
cf60: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  lue..**.** On su
cf70: 63 63 65 73 73 2c 20 2a 70 70 56 61 6c 20 69 73  ccess, *ppVal is
cf80: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
cf90: 6f 20 74 68 65 20 65 78 74 72 61 63 74 65 64 20  o the extracted 
cfa0: 76 61 6c 75 65 2e 20 20 54 68 65 20 63 61 6c 6c  value.  The call
cfb0: 65 72 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  er.** is respons
cfc0: 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
cfd0: 67 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  g that the value
cfe0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
cff0: 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
d000: 69 6e 74 20 73 74 61 74 34 56 61 6c 75 65 46 72  int stat4ValueFr
d010: 6f 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20  omExpr(.  Parse 
d020: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d040: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
d050: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
d080: 6e 20 74 6f 20 65 78 74 72 61 63 74 20 61 20 76  n to extract a v
d090: 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  alue from */.  u
d0a0: 38 20 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20  8 affinity,     
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0c0: 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73  * Affinity to us
d0d0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 56 61  e */.  struct Va
d0e0: 6c 75 65 4e 65 77 53 74 61 74 34 43 74 78 20 2a  lueNewStat4Ctx *
d0f0: 70 41 6c 6c 6f 63 2c 2f 2a 20 48 6f 77 20 74 6f  pAlloc,/* How to
d100: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 2e   allocate space.
d110: 20 20 4f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 73    Or NULL */.  s
d120: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
d130: 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
d140: 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c 75 65  * OUT: New value
d150: 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c   object (or NULL
d160: 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
d170: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d180: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
d190: 56 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Val = 0;.  sqlit
d1a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d1b0: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 53 6b 69 70 20  >db;..  /* Skip 
d1c0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
d1d0: 41 54 45 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 70  ATE nodes */.  p
d1e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
d1f0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
d200: 78 70 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  xpr);..  assert(
d210: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 45 78   pExpr==0 || pEx
d220: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
d230: 54 45 52 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  TER || pExpr->op
d240: 32 21 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  2!=TK_VARIABLE )
d250: 3b 0a 20 20 69 66 28 20 21 70 45 78 70 72 20 29  ;.  if( !pExpr )
d260: 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61 6c  {.    pVal = val
d270: 75 65 4e 65 77 28 64 62 2c 20 70 41 6c 6c 6f 63  ueNew(db, pAlloc
d280: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
d290: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d2a0: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 28  VdbeMemSetNull((
d2b0: 4d 65 6d 2a 29 70 56 61 6c 29 3b 0a 20 20 20 20  Mem*)pVal);.    
d2c0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45  }.  }else if( pE
d2d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  xpr->op==TK_VARI
d2e0: 41 42 4c 45 20 26 26 20 28 64 62 2d 3e 66 6c 61  ABLE && (db->fla
d2f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62  gs & SQLITE_Enab
d300: 6c 65 51 50 53 47 29 3d 3d 30 20 29 7b 0a 20 20  leQPSG)==0 ){.  
d310: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69    Vdbe *v;.    i
d320: 6e 74 20 69 42 69 6e 64 56 61 72 20 3d 20 70 45  nt iBindVar = pE
d330: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
d340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d350: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
d360: 70 56 64 62 65 2c 20 69 42 69 6e 64 56 61 72 29  pVdbe, iBindVar)
d370: 3b 0a 20 20 20 20 69 66 28 20 28 76 20 3d 20 70  ;.    if( (v = p
d380: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
d390: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
d3a0: 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28 64  Val = valueNew(d
d3b0: 62 2c 20 70 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  b, pAlloc);.    
d3c0: 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20    if( pVal ){.  
d3d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d3e0: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
d3f0: 65 6d 2a 29 70 56 61 6c 2c 20 26 76 2d 3e 61 56  em*)pVal, &v->aV
d400: 61 72 5b 69 42 69 6e 64 56 61 72 2d 31 5d 29 3b  ar[iBindVar-1]);
d410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d420: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
d430: 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69 74  ty(pVal, affinit
d440: 79 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20  y, ENC(db));.   
d450: 20 20 20 20 20 70 56 61 6c 2d 3e 64 62 20 3d 20       pVal->db = 
d460: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
d470: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
d480: 65 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75  e{.    rc = valu
d490: 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 45  eFromExpr(db, pE
d4a0: 78 70 72 2c 20 45 4e 43 28 64 62 29 2c 20 61 66  xpr, ENC(db), af
d4b0: 66 69 6e 69 74 79 2c 20 26 70 56 61 6c 2c 20 70  finity, &pVal, p
d4c0: 41 6c 6c 6f 63 29 3b 0a 20 20 7d 0a 0a 20 20 61  Alloc);.  }..  a
d4d0: 73 73 65 72 74 28 20 70 56 61 6c 3d 3d 30 20 7c  ssert( pVal==0 |
d4e0: 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d 64 62 20 29  | pVal->db==db )
d4f0: 3b 0a 20 20 2a 70 70 56 61 6c 20 3d 20 70 56 61  ;.  *ppVal = pVa
d500: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  l;.  return rc;.
d510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d520: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
d530: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  o allocate and p
d540: 6f 70 75 6c 61 74 65 20 55 6e 70 61 63 6b 65 64  opulate Unpacked
d550: 52 65 63 6f 72 64 20 0a 2a 2a 20 73 74 72 75 63  Record .** struc
d560: 74 75 72 65 73 20 69 6e 74 65 6e 64 65 64 20 74  tures intended t
d570: 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 20 61 67  o be compared ag
d580: 61 69 6e 73 74 20 73 61 6d 70 6c 65 20 69 6e 64  ainst sample ind
d590: 65 78 20 6b 65 79 73 20 73 74 6f 72 65 64 20 0a  ex keys stored .
d5a0: 2a 2a 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ** in the sqlite
d5b0: 5f 73 74 61 74 34 20 74 61 62 6c 65 2e 0a 2a 2a  _stat4 table..**
d5c0: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 63 61 6c  .** A single cal
d5d0: 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
d5e0: 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 7a 65 72  on populates zer
d5f0: 6f 20 6f 72 20 6d 6f 72 65 20 66 69 65 6c 64 73  o or more fields
d600: 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72   of the.** recor
d610: 64 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  d starting with 
d620: 66 69 65 6c 64 20 69 56 61 6c 20 28 66 69 65 6c  field iVal (fiel
d630: 64 73 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ds are numbered 
d640: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 0a 2a 2a 20  from left to.** 
d650: 72 69 67 68 74 20 73 74 61 72 74 69 6e 67 20 77  right starting w
d660: 69 74 68 20 30 29 2e 20 41 20 73 69 6e 67 6c 65  ith 0). A single
d670: 20 66 69 65 6c 64 20 69 73 20 70 6f 70 75 6c 61   field is popula
d680: 74 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 2a  ted if:.**.**  *
d690: 20 28 70 45 78 70 72 3d 3d 30 29 2e 20 49 6e 20   (pExpr==0). In 
d6a0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 76 61  this case the va
d6b0: 6c 75 65 20 69 73 20 61 73 73 75 6d 65 64 20 74  lue is assumed t
d6c0: 6f 20 62 65 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  o be an SQL NULL
d6d0: 2c 0a 2a 2a 0a 2a 2a 20 20 2a 20 54 68 65 20 65  ,.**.**  * The e
d6e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 62  xpression is a b
d6f0: 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 2c 20 61  ound variable, a
d700: 6e 64 20 74 68 69 73 20 69 73 20 61 20 72 65 70  nd this is a rep
d710: 72 65 70 61 72 65 2c 20 6f 72 0a 2a 2a 0a 2a 2a  repare, or.**.**
d720: 20 20 2a 20 54 68 65 20 73 71 6c 69 74 65 33 56    * The sqlite3V
d730: 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 29 20 66  alueFromExpr() f
d740: 75 6e 63 74 69 6f 6e 20 69 73 20 61 62 6c 65 20  unction is able 
d750: 74 6f 20 65 78 74 72 61 63 74 20 61 20 76 61 6c  to extract a val
d760: 75 65 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74  ue .**    from t
d770: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 28 69  he expression (i
d780: 2e 65 2e 20 74 68 65 20 65 78 70 72 65 73 73 69  .e. the expressi
d790: 6f 6e 20 69 73 20 61 20 6c 69 74 65 72 61 6c 20  on is a literal 
d7a0: 76 61 6c 75 65 29 2e 0a 2a 2a 0a 2a 2a 20 4f 72  value)..**.** Or
d7b0: 2c 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20  , if pExpr is a 
d7c0: 54 4b 5f 56 45 43 54 4f 52 2c 20 6f 6e 65 20 66  TK_VECTOR, one f
d7d0: 69 65 6c 64 20 69 73 20 70 6f 70 75 6c 61 74 65  ield is populate
d7e0: 64 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  d for each of th
d7f0: 65 0a 2a 2a 20 76 65 63 74 6f 72 20 63 6f 6d 70  e.** vector comp
d800: 6f 6e 65 6e 74 73 20 74 68 61 74 20 6d 61 74 63  onents that matc
d810: 68 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  h either of the 
d820: 74 77 6f 20 6c 61 74 74 65 72 20 63 72 69 74 65  two latter crite
d830: 72 69 61 20 6c 69 73 74 65 64 0a 2a 2a 20 61 62  ria listed.** ab
d840: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ove..**.** Befor
d850: 65 20 61 6e 79 20 76 61 6c 75 65 20 69 73 20 61  e any value is a
d860: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 72  ppended to the r
d870: 65 63 6f 72 64 2c 20 74 68 65 20 61 66 66 69 6e  ecord, the affin
d880: 69 74 79 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63  ity of the .** c
d890: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c  orresponding col
d8a0: 75 6d 6e 20 77 69 74 68 69 6e 20 69 6e 64 65 78  umn within index
d8b0: 20 70 49 64 78 20 69 73 20 61 70 70 6c 69 65 64   pIdx is applied
d8c0: 20 74 6f 20 69 74 2e 20 42 65 66 6f 72 65 0a 2a   to it. Before.*
d8d0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
d8e0: 72 65 74 75 72 6e 73 2c 20 6f 75 74 70 75 74 20  returns, output 
d8f0: 70 61 72 61 6d 65 74 65 72 20 2a 70 6e 45 78 74  parameter *pnExt
d900: 72 61 63 74 20 69 73 20 73 65 74 20 74 6f 20 74  ract is set to t
d910: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
d920: 76 61 6c 75 65 73 20 61 70 70 65 6e 64 65 64 20  values appended 
d930: 74 6f 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 2a  to the record..*
d940: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
d950: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d960: 64 2c 20 2a 70 70 52 65 63 20 6d 75 73 74 20 65  d, *ppRec must e
d970: 69 74 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61  ither point to a
d980: 6e 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6c 6c 6f  n object.** allo
d990: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
d9a0: 69 65 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ier call to this
d9b0: 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 6d 75   function, or mu
d9c0: 73 74 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20 69  st be NULL. If i
d9d0: 74 0a 2a 2a 20 69 73 20 4e 55 4c 4c 20 61 6e 64  t.** is NULL and
d9e0: 20 61 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20   a value can be 
d9f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 65 78 74  successfully ext
da00: 72 61 63 74 65 64 2c 20 61 20 6e 65 77 20 55 6e  racted, a new Un
da10: 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
da20: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 28 61 6e  is allocated (an
da30: 64 20 2a 70 70 52 65 63 20 73 65 74 20 74 6f 20  d *ppRec set to 
da40: 70 6f 69 6e 74 20 74 6f 20 69 74 29 20 62 65 66  point to it) bef
da50: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
da60: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65  *.** Unless an e
da70: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
da80: 72 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  red, SQLITE_OK i
da90: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
daa0: 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20 65 72 72 6f  s not an.** erro
dab0: 72 20 69 66 20 61 20 76 61 6c 75 65 20 63 61 6e  r if a value can
dac0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
dad0: 20 66 72 6f 6d 20 70 45 78 70 72 2e 20 49 66 20   from pExpr. If 
dae0: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 0a 2a 2a  an error does.**
daf0: 20 6f 63 63 75 72 2c 20 61 6e 20 53 51 4c 69 74   occur, an SQLit
db00: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
db10: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
db20: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
db30: 62 65 53 65 74 56 61 6c 75 65 28 0a 20 20 50 61  beSetValue(.  Pa
db40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db60: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
db70: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 62 65 69      /* Index bei
dba0: 6e 67 20 70 72 6f 62 65 64 20 2a 2f 0a 20 20 55  ng probed */.  U
dbb0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 2a  npackedRecord **
dbc0: 70 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 2f  ppRec,         /
dbd0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 6f 62 65 20  * IN/OUT: Probe 
dbe0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 45 78 70 72  record */.  Expr
dbf0: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dc10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
dc20: 20 65 78 74 72 61 63 74 20 61 20 76 61 6c 75 65   extract a value
dc30: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
dc40: 45 6c 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Elem,           
dc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
dc60: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
dc70: 76 61 6c 75 65 73 20 74 6f 20 61 70 70 65 6e 64  values to append
dc80: 20 2a 2f 0a 20 20 69 6e 74 20 69 56 61 6c 2c 20   */.  int iVal, 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 65        /* Array e
dcb0: 6c 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  lement to popula
dcc0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  te */.  int *pnE
dcd0: 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20 20  xtract          
dce0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
dcf0: 56 61 6c 75 65 73 20 61 70 70 65 6e 64 65 64 20  Values appended 
dd00: 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  to the record */
dd10: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
dd20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
dd30: 6e 45 78 74 72 61 63 74 20 3d 20 30 3b 0a 0a 20  nExtract = 0;.. 
dd40: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
dd50: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 53   pExpr->op!=TK_S
dd60: 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 69 6e 74  ELECT ){.    int
dd70: 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 56   i;.    struct V
dd80: 61 6c 75 65 4e 65 77 53 74 61 74 34 43 74 78 20  alueNewStat4Ctx 
dd90: 61 6c 6c 6f 63 3b 0a 0a 20 20 20 20 61 6c 6c 6f  alloc;..    allo
dda0: 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  c.pParse = pPars
ddb0: 65 3b 0a 20 20 20 20 61 6c 6c 6f 63 2e 70 49 64  e;.    alloc.pId
ddc0: 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 61 6c  x = pIdx;.    al
ddd0: 6c 6f 63 2e 70 70 52 65 63 20 3d 20 70 70 52 65  loc.ppRec = ppRe
dde0: 63 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  c;..    for(i=0;
ddf0: 20 69 3c 6e 45 6c 65 6d 3b 20 69 2b 2b 29 7b 0a   i<nElem; i++){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
de10: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
de20: 20 20 20 20 20 45 78 70 72 20 2a 70 45 6c 65 6d       Expr *pElem
de30: 20 3d 20 28 70 45 78 70 72 20 3f 20 73 71 6c 69   = (pExpr ? sqli
de40: 74 65 33 56 65 63 74 6f 72 46 69 65 6c 64 53 75  te3VectorFieldSu
de50: 62 65 78 70 72 28 70 45 78 70 72 2c 20 69 29 20  bexpr(pExpr, i) 
de60: 3a 20 30 29 3b 0a 20 20 20 20 20 20 75 38 20 61  : 0);.      u8 a
de70: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
de80: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
de90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 64 78  pParse->db, pIdx
dea0: 2c 20 69 56 61 6c 2b 69 29 3b 0a 20 20 20 20 20  , iVal+i);.     
deb0: 20 61 6c 6c 6f 63 2e 69 56 61 6c 20 3d 20 69 56   alloc.iVal = iV
dec0: 61 6c 2b 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  al+i;.      rc =
ded0: 20 73 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45   stat4ValueFromE
dee0: 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6c 65  xpr(pParse, pEle
def0: 6d 2c 20 61 66 66 2c 20 26 61 6c 6c 6f 63 2c 20  m, aff, &alloc, 
df00: 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  &pVal);.      if
df10: 28 20 21 70 56 61 6c 20 29 20 62 72 65 61 6b 3b  ( !pVal ) break;
df20: 0a 20 20 20 20 20 20 6e 45 78 74 72 61 63 74 2b  .      nExtract+
df30: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
df40: 2a 70 6e 45 78 74 72 61 63 74 20 3d 20 6e 45 78  *pnExtract = nEx
df50: 74 72 61 63 74 3b 0a 20 20 72 65 74 75 72 6e 20  tract;.  return 
df60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
df70: 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74 20  empt to extract 
df80: 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 65 78 70  a value from exp
df90: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 75 73  ression pExpr us
dfa0: 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 73 0a  ing the methods.
dfb0: 2a 2a 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ** as described 
dfc0: 66 6f 72 20 73 71 6c 69 74 65 33 53 74 61 74 34  for sqlite3Stat4
dfd0: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 20  ProbeSetValue() 
dfe0: 61 62 6f 76 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  above. .**.** If
dff0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
e000: 20 2a 70 70 56 61 6c 20 74 6f 20 70 6f 69 6e 74   *ppVal to point
e010: 20 74 6f 20 61 20 6e 65 77 20 76 61 6c 75 65 20   to a new value 
e020: 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
e030: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  n .** SQLITE_OK.
e040: 20 49 66 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e   If no value can
e050: 20 62 65 20 65 78 74 72 61 63 74 65 64 2c 20 62   be extracted, b
e060: 75 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  ut no other erro
e070: 72 20 6f 63 63 75 72 73 0a 2a 2a 20 28 65 2e 67  r occurs.** (e.g
e080: 2e 20 4f 4f 4d 29 2c 20 72 65 74 75 72 6e 20 53  . OOM), return S
e090: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 73 65 74  QLITE_OK and set
e0a0: 20 2a 70 70 56 61 6c 20 74 6f 20 4e 55 4c 4c 2e   *ppVal to NULL.
e0b0: 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
e0c0: 0a 2a 2a 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  .** does occur, 
e0d0: 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
e0e0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
e0f0: 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
e100: 2a 70 70 56 61 6c 0a 2a 2a 20 69 73 20 75 6e 64  *ppVal.** is und
e110: 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
e120: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
e130: 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f  te3Stat4ValueFro
e140: 6d 45 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a  mExpr(.  Parse *
e150: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
e160: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
e170: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e context */.  E
e180: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e1a0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
e1b0: 20 74 6f 20 65 78 74 72 61 63 74 20 61 20 76 61   to extract a va
e1c0: 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 38  lue from */.  u8
e1d0: 20 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20   affinity,      
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1f0: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   Affinity to use
e200: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
e210: 6c 75 65 20 2a 2a 70 70 56 61 6c 20 20 20 20 20  lue **ppVal     
e220: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
e230: 77 20 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 28  w value object (
e240: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 29 7b 0a 20  or NULL) */.){. 
e250: 20 72 65 74 75 72 6e 20 73 74 61 74 34 56 61 6c   return stat4Val
e260: 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
e270: 65 2c 20 70 45 78 70 72 2c 20 61 66 66 69 6e 69  e, pExpr, affini
e280: 74 79 2c 20 30 2c 20 70 70 56 61 6c 29 3b 0a 7d  ty, 0, ppVal);.}
e290: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
e2a0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
e2b0: 6d 6e 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  mn from the nRec
e2c0: 2d 62 79 74 65 20 72 65 63 6f 72 64 20 69 6e 20  -byte record in 
e2d0: 70 52 65 63 2e 20 20 57 72 69 74 65 0a 2a 2a 20  pRec.  Write.** 
e2e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
e2f0: 20 69 6e 74 6f 20 2a 70 70 56 61 6c 2e 20 20 49   into *ppVal.  I
e300: 66 20 2a 70 70 56 61 6c 20 69 73 20 69 6e 69 74  f *ppVal is init
e310: 69 61 6c 6c 79 20 4e 55 4c 4c 20 74 68 65 6e 20  ially NULL then 
e320: 61 20 6e 65 77 0a 2a 2a 20 73 71 6c 69 74 65 33  a new.** sqlite3
e330: 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 69 73  _value object is
e340: 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
e350: 2a 20 49 66 20 2a 70 70 56 61 6c 20 69 73 20 69  * If *ppVal is i
e360: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 20 74 68  nitially NULL th
e370: 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  en the caller is
e380: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
e390: 20 0a 2a 2a 20 65 6e 73 75 72 69 6e 67 20 74 68   .** ensuring th
e3a0: 61 74 20 74 68 65 20 76 61 6c 75 65 20 77 72 69  at the value wri
e3b0: 74 74 65 6e 20 69 6e 74 6f 20 2a 70 70 56 61 6c  tten into *ppVal
e3c0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   is eventually f
e3d0: 72 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  reed..*/.int sql
e3e0: 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
e3f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
e420: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
e430: 20 76 6f 69 64 20 2a 70 52 65 63 2c 20 20 20 20   void *pRec,    
e440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
e450: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
e460: 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72  containing recor
e470: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 2c  d */.  int nRec,
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
e4a0: 66 20 62 75 66 66 65 72 20 70 52 65 63 20 69 6e  f buffer pRec in
e4b0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
e4c0: 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e4e0: 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
e4f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
e500: 6c 75 65 20 2a 2a 70 70 56 61 6c 20 20 20 20 20  lue **ppVal     
e510: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78        /* OUT: Ex
e520: 74 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f  tracted value */
e530: 0a 29 7b 0a 20 20 75 33 32 20 74 20 3d 20 30 3b  .){.  u32 t = 0;
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 20 20 20 2f 2a 20 61 20 63 6f 6c 75 6d        /* a colum
e560: 6e 20 74 79 70 65 20 63 6f 64 65 20 2a 2f 0a 20  n type code */. 
e570: 20 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20   int nHdr;      
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
e5a0: 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 72 65  header in the re
e5b0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 48  cord */.  int iH
e5c0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
e5e0: 74 20 75 6e 72 65 61 64 20 68 65 61 64 65 72 20  t unread header 
e5f0: 62 79 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 46  byte */.  int iF
e600: 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  ield;           
e610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
e620: 74 20 75 6e 72 65 61 64 20 64 61 74 61 20 62 79  t unread data by
e630: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 46 69  te */.  int szFi
e640: 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eld = 0;        
e650: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e660: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
e670: 61 74 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  ata field */.  i
e680: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6a0: 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 2a  * Column index *
e6b0: 2f 0a 20 20 75 38 20 2a 61 20 3d 20 28 75 38 2a  /.  u8 *a = (u8*
e6c0: 29 70 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  )pRec;          
e6d0: 20 20 20 20 2f 2a 20 54 79 70 65 63 61 73 74 20      /* Typecast 
e6e0: 62 79 74 65 20 61 72 72 61 79 20 2a 2f 0a 20 20  byte array */.  
e6f0: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 2a 70 70 56  Mem *pMem = *ppV
e700: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
e710: 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20  /* Write result 
e720: 69 6e 74 6f 20 74 68 69 73 20 4d 65 6d 20 6f 62  into this Mem ob
e730: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
e740: 74 28 20 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 69  t( iCol>0 );.  i
e750: 48 64 72 20 3d 20 67 65 74 56 61 72 69 6e 74 33  Hdr = getVarint3
e760: 32 28 61 2c 20 6e 48 64 72 29 3b 0a 20 20 69 66  2(a, nHdr);.  if
e770: 28 20 6e 48 64 72 3e 6e 52 65 63 20 7c 7c 20 69  ( nHdr>nRec || i
e780: 48 64 72 3e 3d 6e 48 64 72 20 29 20 72 65 74 75  Hdr>=nHdr ) retu
e790: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e7a0: 54 5f 42 4b 50 54 3b 0a 20 20 69 46 69 65 6c 64  T_BKPT;.  iField
e7b0: 20 3d 20 6e 48 64 72 3b 0a 20 20 66 6f 72 28 69   = nHdr;.  for(i
e7c0: 3d 30 3b 20 69 3c 3d 69 43 6f 6c 3b 20 69 2b 2b  =0; i<=iCol; i++
e7d0: 29 7b 0a 20 20 20 20 69 48 64 72 20 2b 3d 20 67  ){.    iHdr += g
e7e0: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 48  etVarint32(&a[iH
e7f0: 64 72 5d 2c 20 74 29 3b 0a 20 20 20 20 74 65 73  dr], t);.    tes
e800: 74 63 61 73 65 28 20 69 48 64 72 3d 3d 6e 48 64  tcase( iHdr==nHd
e810: 72 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  r );.    testcas
e820: 65 28 20 69 48 64 72 3d 3d 6e 48 64 72 2b 31 20  e( iHdr==nHdr+1 
e830: 29 3b 0a 20 20 20 20 69 66 28 20 69 48 64 72 3e  );.    if( iHdr>
e840: 6e 48 64 72 20 29 20 72 65 74 75 72 6e 20 53 51  nHdr ) return SQ
e850: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e860: 54 3b 0a 20 20 20 20 73 7a 46 69 65 6c 64 20 3d  T;.    szField =
e870: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
e880: 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20  alTypeLen(t);.  
e890: 20 20 69 46 69 65 6c 64 20 2b 3d 20 73 7a 46 69    iField += szFi
e8a0: 65 6c 64 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  eld;.  }.  testc
e8b0: 61 73 65 28 20 69 46 69 65 6c 64 3d 3d 6e 52 65  ase( iField==nRe
e8c0: 63 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  c );.  testcase(
e8d0: 20 69 46 69 65 6c 64 3d 3d 6e 52 65 63 2b 31 20   iField==nRec+1 
e8e0: 29 3b 0a 20 20 69 66 28 20 69 46 69 65 6c 64 3e  );.  if( iField>
e8f0: 6e 52 65 63 20 29 20 72 65 74 75 72 6e 20 53 51  nRec ) return SQ
e900: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e910: 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30  T;.  if( pMem==0
e920: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 20 3d 20 2a   ){.    pMem = *
e930: 70 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56  ppVal = sqlite3V
e940: 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
e950: 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 20 72   if( pMem==0 ) r
e960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e970: 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  EM_BKPT;.  }.  s
e980: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e990: 47 65 74 28 26 61 5b 69 46 69 65 6c 64 2d 73 7a  Get(&a[iField-sz
e9a0: 46 69 65 6c 64 5d 2c 20 74 2c 20 70 4d 65 6d 29  Field], t, pMem)
e9b0: 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20  ;.  pMem->enc = 
e9c0: 45 4e 43 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ENC(db);.  retur
e9d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e9e0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69 74 20  /*.** Unless it 
e9f0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 61 72 67  is NULL, the arg
ea00: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61 6e  ument must be an
ea10: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
ea20: 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 0a  object returned.
ea30: 2a 2a 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ** by an earlier
ea40: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ea50: 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
ea60: 75 65 28 29 2e 20 54 68 69 73 20 63 61 6c 6c 20  ue(). This call 
ea70: 64 65 6c 65 74 65 73 0a 2a 2a 20 74 68 65 20 6f  deletes.** the o
ea80: 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
ea90: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
eaa0: 46 72 65 65 28 55 6e 70 61 63 6b 65 64 52 65 63  Free(UnpackedRec
eab0: 6f 72 64 20 2a 70 52 65 63 29 7b 0a 20 20 69 66  ord *pRec){.  if
eac0: 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 69 6e  ( pRec ){.    in
ead0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  t i;.    int nCo
eae0: 6c 20 3d 20 70 52 65 63 2d 3e 70 4b 65 79 49 6e  l = pRec->pKeyIn
eaf0: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3b 0a 20  fo->nAllField;. 
eb00: 20 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 70     Mem *aMem = p
eb10: 52 65 63 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 73  Rec->aMem;.    s
eb20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 61 4d 65  qlite3 *db = aMe
eb30: 6d 5b 30 5d 2e 64 62 3b 0a 20 20 20 20 66 6f 72  m[0].db;.    for
eb40: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
eb50: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
eb60: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
eb70: 26 61 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 7d  &aMem[i]);.    }
eb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
eb90: 6e 66 6f 55 6e 72 65 66 28 70 52 65 63 2d 3e 70  nfoUnref(pRec->p
eba0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 73 71  KeyInfo);.    sq
ebb0: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
ebc0: 2c 20 70 52 65 63 29 3b 0a 20 20 7d 0a 7d 0a 23  , pRec);.  }.}.#
ebd0: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
ebe0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
ebf0: 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  T4 */../*.** Cha
ec00: 6e 67 65 20 74 68 65 20 73 74 72 69 6e 67 20 76  nge the string v
ec10: 61 6c 75 65 20 6f 66 20 61 6e 20 73 71 6c 69 74  alue of an sqlit
ec20: 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a  e3_value object.
ec30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ec40: 61 6c 75 65 53 65 74 53 74 72 28 0a 20 20 73 71  alueSetStr(.  sq
ec50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 76 2c 20  lite3_value *v, 
ec60: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
ec70: 62 65 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  be set */.  int 
ec80: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
ec90: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
eca0: 74 72 69 6e 67 20 7a 20 2a 2f 0a 20 20 63 6f 6e  tring z */.  con
ecb0: 73 74 20 76 6f 69 64 20 2a 7a 2c 20 20 20 20 20  st void *z,     
ecc0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
ecd0: 65 20 6e 65 77 20 73 74 72 69 6e 67 20 2a 2f 0a  e new string */.
ece0: 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20    u8 enc,       
ecf0: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64          /* Encod
ed00: 69 6e 67 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ing to use */.  
ed10: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
ed20: 64 2a 29 20 20 20 2f 2a 20 44 65 73 74 72 75 63  d*)   /* Destruc
ed30: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 72 69  tor for the stri
ed40: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 76  ng */.){.  if( v
ed50: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
ed60: 6d 53 65 74 53 74 72 28 28 4d 65 6d 20 2a 29 76  mSetStr((Mem *)v
ed70: 2c 20 7a 2c 20 6e 2c 20 65 6e 63 2c 20 78 44 65  , z, n, enc, xDe
ed80: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  l);.}../*.** Fre
ed90: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  e an sqlite3_val
eda0: 75 65 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  ue object.*/.voi
edb0: 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  d sqlite3ValueFr
edc0: 65 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ee(sqlite3_value
edd0: 20 2a 76 29 7b 0a 20 20 69 66 28 20 21 76 20 29   *v){.  if( !v )
ede0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
edf0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
ee00: 28 28 4d 65 6d 20 2a 29 76 29 3b 0a 20 20 73 71  ((Mem *)v);.  sq
ee10: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 28 28  lite3DbFreeNN(((
ee20: 4d 65 6d 2a 29 76 29 2d 3e 64 62 2c 20 76 29 3b  Mem*)v)->db, v);
ee30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  .}../*.** The sq
ee40: 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28  lite3ValueBytes(
ee50: 29 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ) routine return
ee60: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
ee70: 62 79 74 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  bytes in the.** 
ee80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
ee90: 6a 65 63 74 20 61 73 73 75 6d 69 6e 67 20 74 68  ject assuming th
eea0: 61 74 20 69 74 20 75 73 65 73 20 74 68 65 20 65  at it uses the e
eeb0: 6e 63 6f 64 69 6e 67 20 22 65 6e 63 22 2e 0a 2a  ncoding "enc"..*
eec0: 2a 20 54 68 65 20 76 61 6c 75 65 42 79 74 65 73  * The valueBytes
eed0: 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  () routine is a 
eee0: 68 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 2e  helper function.
eef0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
ef00: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76  E_NOINLINE int v
ef10: 61 6c 75 65 42 79 74 65 73 28 73 71 6c 69 74 65  alueBytes(sqlite
ef20: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 75  3_value *pVal, u
ef30: 38 20 65 6e 63 29 7b 0a 20 20 72 65 74 75 72 6e  8 enc){.  return
ef40: 20 76 61 6c 75 65 54 6f 54 65 78 74 28 70 56 61   valueToText(pVa
ef50: 6c 2c 20 65 6e 63 29 21 3d 30 20 3f 20 70 56 61  l, enc)!=0 ? pVa
ef60: 6c 2d 3e 6e 20 3a 20 30 3b 0a 7d 0a 69 6e 74 20  l->n : 0;.}.int 
ef70: 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65  sqlite3ValueByte
ef80: 73 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  s(sqlite3_value 
ef90: 2a 70 56 61 6c 2c 20 75 38 20 65 6e 63 29 7b 0a  *pVal, u8 enc){.
efa0: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
efb0: 29 70 56 61 6c 3b 0a 20 20 61 73 73 65 72 74 28  )pVal;.  assert(
efc0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d   (p->flags & MEM
efd0: 5f 4e 75 6c 6c 29 3d 3d 30 20 7c 7c 20 28 70 2d  _Null)==0 || (p-
efe0: 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  >flags & (MEM_St
eff0: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
f000: 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61  );.  if( (p->fla
f010: 67 73 20 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30  gs & MEM_Str)!=0
f020: 20 26 26 20 70 56 61 6c 2d 3e 65 6e 63 3d 3d 65   && pVal->enc==e
f030: 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nc ){.    return
f040: 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 69 66 28   p->n;.  }.  if(
f050: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d   (p->flags & MEM
f060: 5f 42 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  _Blob)!=0 ){.   
f070: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
f080: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
f090: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 20 2b 20    return p->n + 
f0a0: 70 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  p->u.nZero;.    
f0b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
f0c0: 75 72 6e 20 70 2d 3e 6e 3b 0a 20 20 20 20 7d 0a  urn p->n;.    }.
f0d0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61    }.  if( p->fla
f0e0: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20  gs & MEM_Null ) 
f0f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
f100: 72 6e 20 76 61 6c 75 65 42 79 74 65 73 28 70 56  rn valueBytes(pV
f110: 61 6c 2c 20 65 6e 63 29 3b 0a 7d 0a              al, enc);.}.