/ Hex Artifact Content
Login

Artifact 2f9d672af5260f0145787e1dc2c6985414987cc0dc575133a0dc17dda767d868:


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 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ob.             
0660: 20 20 20 20 20 20 20 20 20 20 20 20 7c 4d 45 4d              |MEM
0670: 5f 52 6f 77 53 65 74 7c 4d 45 4d 5f 46 72 61 6d  _RowSet|MEM_Fram
0680: 65 7c 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 5a 65  e|MEM_Agg|MEM_Ze
0690: 72 6f 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  ro))==0 );..    
06a0: 2f 2a 20 49 66 20 4d 45 4d 5f 4e 75 6c 6c 20 69  /* If MEM_Null i
06b0: 73 20 73 65 74 2c 20 74 68 65 6e 20 65 69 74 68  s set, then eith
06c0: 65 72 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  er the value is 
06d0: 61 20 70 75 72 65 20 4e 55 4c 4c 20 28 74 68 65  a pure NULL (the
06e0: 20 75 73 75 61 6c 0a 20 20 20 20 2a 2a 20 63 61   usual.    ** ca
06f0: 73 65 29 20 6f 72 20 69 74 20 69 73 20 61 20 70  se) or it is a p
0700: 6f 69 6e 74 65 72 20 73 65 74 20 75 73 69 6e 67  ointer set using
0710: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 6f   sqlite3_bind_po
0720: 69 6e 74 65 72 28 29 20 6f 72 0a 20 20 20 20 2a  inter() or.    *
0730: 2a 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  * sqlite3_result
0740: 5f 70 6f 69 6e 74 65 72 28 29 2e 20 20 49 66 20  _pointer().  If 
0750: 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 6e 20  a pointer, then 
0760: 4d 45 4d 5f 54 65 72 6d 20 6d 75 73 74 20 61 6c  MEM_Term must al
0770: 73 6f 20 62 65 0a 20 20 20 20 2a 2a 20 73 65 74  so be.    ** set
0780: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0790: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45   (p->flags & (ME
07a0: 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 75 62 74 79  M_Term|MEM_Subty
07b0: 70 65 29 29 3d 3d 28 4d 45 4d 5f 54 65 72 6d 7c  pe))==(MEM_Term|
07c0: 4d 45 4d 5f 53 75 62 74 79 70 65 29 20 29 7b 0a  MEM_Subtype) ){.
07d0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
07e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 79 70 65 2e   a pointer type.
07f0: 20 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 61    There may be a
0800: 20 66 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   flag to indicat
0810: 65 20 77 68 61 74 20 74 6f 0a 20 20 20 20 20 20  e what to.      
0820: 2a 2a 20 64 6f 20 77 69 74 68 20 74 68 65 20 70  ** do with the p
0830: 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  ointer. */.     
0840: 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 66 6c   assert( ((p->fl
0850: 61 67 73 26 4d 45 4d 5f 44 79 6e 29 21 3d 30 20  ags&MEM_Dyn)!=0 
0860: 3f 20 31 20 3a 20 30 29 20 2b 0a 20 20 20 20 20  ? 1 : 0) +.     
0870: 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 66 6c           ((p->fl
0880: 61 67 73 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d  ags&MEM_Ephem)!=
0890: 30 20 3f 20 31 20 3a 20 30 29 20 2b 0a 20 20 20  0 ? 1 : 0) +.   
08a0: 20 20 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e             ((p->
08b0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61 74 69 63  flags&MEM_Static
08c0: 29 21 3d 30 20 3f 20 31 20 3a 20 30 29 20 3c 3d  )!=0 ? 1 : 0) <=
08d0: 20 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   1 );..      /* 
08e0: 4e 6f 20 6f 74 68 65 72 20 62 69 74 73 20 73 65  No other bits se
08f0: 74 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  t */.      asser
0900: 74 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 7e  t( (p->flags & ~
0910: 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 54 65  (MEM_Null|MEM_Te
0920: 72 6d 7c 4d 45 4d 5f 53 75 62 74 79 70 65 0a 20  rm|MEM_Subtype. 
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 20 20 20 20 20 20 7c 4d 45 4d 5f 44            |MEM_D
0950: 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d  yn|MEM_Ephem|MEM
0960: 5f 53 74 61 74 69 63 29 29 3d 3d 30 20 29 3b 0a  _Static))==0 );.
0970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0980: 20 2f 2a 20 41 20 70 75 72 65 20 4e 55 4c 4c 20   /* A pure NULL 
0990: 6d 69 67 68 74 20 68 61 76 65 20 6f 74 68 65 72  might have other
09a0: 20 66 6c 61 67 73 2c 20 73 75 63 68 20 61 73 20   flags, such as 
09b0: 4d 45 4d 5f 53 74 61 74 69 63 2c 20 4d 45 4d 5f  MEM_Static, MEM_
09c0: 44 79 6e 2c 0a 20 20 20 20 20 20 2a 2a 20 4d 45  Dyn,.      ** ME
09d0: 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 43 6c 65  M_Ephem, MEM_Cle
09e0: 61 72 65 64 2c 20 6f 72 20 4d 45 4d 5f 53 75 62  ared, or MEM_Sub
09f0: 74 79 70 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  type */.    }.  
0a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
0a10: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
0a20: 74 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  t is only allowe
0a30: 64 20 6f 6e 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20  d on NULLs */.  
0a40: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c    assert( (p->fl
0a50: 61 67 73 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65  ags & MEM_Cleare
0a60: 64 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  d)==0 );.  }..  
0a70: 2f 2a 20 54 68 65 20 73 7a 4d 61 6c 6c 6f 63 20  /* The szMalloc 
0a80: 66 69 65 6c 64 20 68 6f 6c 64 73 20 74 68 65 20  field holds the 
0a90: 63 6f 72 72 65 63 74 20 6d 65 6d 6f 72 79 20 61  correct memory a
0aa0: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 2a  llocation size *
0ab0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
0ac0: 7a 4d 61 6c 6c 6f 63 3d 3d 30 0a 20 20 20 20 20  zMalloc==0.     
0ad0: 20 20 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63    || p->szMalloc
0ae0: 3d 3d 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  ==sqlite3DbMallo
0af0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 70 2d 3e 7a  cSize(p->db,p->z
0b00: 4d 61 6c 6c 6f 63 29 20 29 3b 0a 0a 20 20 2f 2a  Malloc) );..  /*
0b10: 20 49 66 20 70 20 68 6f 6c 64 73 20 61 20 73 74   If p holds a st
0b20: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68  ring or blob, th
0b30: 65 20 4d 65 6d 2e 7a 20 6d 75 73 74 20 70 6f 69  e Mem.z must poi
0b40: 6e 74 20 74 6f 20 65 78 61 63 74 6c 79 0a 20 20  nt to exactly.  
0b50: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ** one of the fo
0b60: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
0b70: 2a 2a 20 20 20 28 31 29 20 4d 65 6d 6f 72 79 20  **   (1) Memory 
0b80: 69 6e 20 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 61  in Mem.zMalloc a
0b90: 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  nd managed by th
0ba0: 65 20 4d 65 6d 20 6f 62 6a 65 63 74 0a 20 20 2a  e Mem object.  *
0bb0: 2a 20 20 20 28 32 29 20 4d 65 6d 6f 72 79 20 74  *   (2) Memory t
0bc0: 6f 20 62 65 20 66 72 65 65 64 20 75 73 69 6e 67  o be freed using
0bd0: 20 4d 65 6d 2e 78 44 65 6c 0a 20 20 2a 2a 20 20   Mem.xDel.  **  
0be0: 20 28 33 29 20 41 6e 20 65 70 68 65 6d 65 72 61   (3) An ephemera
0bf0: 6c 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  l string or blob
0c00: 0a 20 20 2a 2a 20 20 20 28 34 29 20 41 20 73 74  .  **   (4) A st
0c10: 61 74 69 63 20 73 74 72 69 6e 67 20 6f 72 20 62  atic string or b
0c20: 6c 6f 62 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  lob.  */.  if( (
0c30: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
0c40: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 20 26  Str|MEM_Blob)) &
0c50: 26 20 70 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  & p->n>0 ){.    
0c60: 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 28  assert( .      (
0c70: 28 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26  (p->szMalloc>0 &
0c80: 26 20 70 2d 3e 7a 3d 3d 70 2d 3e 7a 4d 61 6c 6c  & p->z==p->zMall
0c90: 6f 63 29 3f 20 31 20 3a 20 30 29 20 2b 0a 20 20  oc)? 1 : 0) +.  
0ca0: 20 20 20 20 28 28 70 2d 3e 66 6c 61 67 73 26 4d      ((p->flags&M
0cb0: 45 4d 5f 44 79 6e 29 21 3d 30 20 3f 20 31 20 3a  EM_Dyn)!=0 ? 1 :
0cc0: 20 30 29 20 2b 0a 20 20 20 20 20 20 28 28 70 2d   0) +.      ((p-
0cd0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 45 70 68 65 6d  >flags&MEM_Ephem
0ce0: 29 21 3d 30 20 3f 20 31 20 3a 20 30 29 20 2b 0a  )!=0 ? 1 : 0) +.
0cf0: 20 20 20 20 20 20 28 28 70 2d 3e 66 6c 61 67 73        ((p->flags
0d00: 26 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d 30 20  &MEM_Static)!=0 
0d10: 3f 20 31 20 3a 20 30 29 20 3d 3d 20 31 0a 20 20  ? 1 : 0) == 1.  
0d20: 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
0d30: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 1;.}.#endif...
0d40: 2f 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73  /*.** If pMem is
0d50: 20 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68 20   an object with 
0d60: 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72  a valid string r
0d70: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 74  epresentation, t
0d80: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  his routine.** e
0d90: 6e 73 75 72 65 73 20 74 68 65 20 69 6e 74 65 72  nsures the inter
0da0: 6e 61 6c 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  nal encoding for
0db0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
0dc0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a  esentation is.**
0dd0: 20 27 64 65 73 69 72 65 64 45 6e 63 27 2c 20 6f   'desiredEnc', o
0de0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
0df0: 38 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  8, SQLITE_UTF16L
0e00: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
0e10: 36 42 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4d  6BE..**.** If pM
0e20: 65 6d 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69  em is not a stri
0e30: 6e 67 20 6f 62 6a 65 63 74 2c 20 6f 72 20 74 68  ng object, or th
0e40: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
0e50: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 72 65 70 72  e string.** repr
0e60: 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c  esentation is al
0e70: 72 65 61 64 79 20 73 74 6f 72 65 64 20 75 73 69  ready stored usi
0e80: 6e 67 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ng the requested
0e90: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
0ea0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
0eb0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
0ec0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
0ed0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
0ee0: 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 73 75 63  onversion is suc
0ef0: 63 65 73 73 66 75 6c 20 28 6f 72 20 6e 6f 74 20  cessful (or not 
0f00: 72 65 71 75 69 72 65 64 29 2e 0a 2a 2a 20 53 51  required)..** SQ
0f10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 62  LITE_NOMEM may b
0f20: 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  e returned if a 
0f30: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 64  malloc() fails d
0f40: 75 72 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e  uring conversion
0f50: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 66 6f 72 6d  .** between form
0f60: 61 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ats..*/.int sqli
0f70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
0f80: 6f 64 69 6e 67 28 4d 65 6d 20 2a 70 4d 65 6d 2c  oding(Mem *pMem,
0f90: 20 69 6e 74 20 64 65 73 69 72 65 64 45 6e 63 29   int desiredEnc)
0fa0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
0fb0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 6e  _OMIT_UTF16.  in
0fc0: 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 61  t rc;.#endif.  a
0fd0: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
0fe0: 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  ags&MEM_RowSet)=
0ff0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1000: 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49  desiredEnc==SQLI
1010: 54 45 5f 55 54 46 38 20 7c 7c 20 64 65 73 69 72  TE_UTF8 || desir
1020: 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  edEnc==SQLITE_UT
1030: 46 31 36 4c 45 0a 20 20 20 20 20 20 20 20 20 20  F16LE.          
1040: 20 7c 7c 20 64 65 73 69 72 65 64 45 6e 63 3d 3d   || desiredEnc==
1050: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1060: 3b 0a 20 20 69 66 28 20 21 28 70 4d 65 6d 2d 3e  ;.  if( !(pMem->
1070: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 20 7c  flags&MEM_Str) |
1080: 7c 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 64 65 73  | pMem->enc==des
1090: 69 72 65 64 45 6e 63 20 29 7b 0a 20 20 20 20 72  iredEnc ){.    r
10a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10b0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10c0: 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Mem->db==0 || sq
10d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10e0: 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pMem->db->mutex
10f0: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
1100: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1120: 52 4f 52 3b 0a 23 65 6c 73 65 0a 0a 20 20 2f 2a  ROR;.#else..  /*
1130: 20 4d 65 6d 54 72 61 6e 73 6c 61 74 65 28 29 20   MemTranslate() 
1140: 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1150: 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 4e  E_OK or SQLITE_N
1160: 4f 4d 45 4d 2e 20 49 66 20 4e 4f 4d 45 4d 20 69  OMEM. If NOMEM i
1170: 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a  s returned,.  **
1180: 20 74 68 65 6e 20 74 68 65 20 65 6e 63 6f 64 69   then the encodi
1190: 6e 67 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ng of the value 
11a0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 63 68 61  may not have cha
11b0: 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nged..  */.  rc 
11c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
11d0: 54 72 61 6e 73 6c 61 74 65 28 70 4d 65 6d 2c 20  Translate(pMem, 
11e0: 28 75 38 29 64 65 73 69 72 65 64 45 6e 63 29 3b  (u8)desiredEnc);
11f0: 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1200: 4c 49 54 45 5f 4f 4b 20 20 20 20 7c 7c 20 72 63  LITE_OK    || rc
1210: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  ==SQLITE_NOMEM);
1220: 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1230: 4c 49 54 45 5f 4f 4b 20 20 20 20 7c 7c 20 70 4d  LITE_OK    || pM
1240: 65 6d 2d 3e 65 6e 63 21 3d 64 65 73 69 72 65 64  em->enc!=desired
1250: 45 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28 72  Enc);.  assert(r
1260: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1270: 7c 7c 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 64 65  || pMem->enc==de
1280: 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 72 65 74  siredEnc);.  ret
1290: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
12a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
12b0: 65 20 70 4d 65 6d 2d 3e 7a 20 70 6f 69 6e 74 73  e pMem->z points
12c0: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 61   to a writable a
12d0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 74 20  llocation of at 
12e0: 6c 65 61 73 74 20 0a 2a 2a 20 6d 69 6e 28 6e 2c  least .** min(n,
12f0: 33 32 29 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  32) bytes..**.**
1300: 20 49 66 20 74 68 65 20 62 50 72 65 73 65 72 76   If the bPreserv
1310: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  e argument is tr
1320: 75 65 2c 20 74 68 65 6e 20 63 6f 70 79 20 6f 66  ue, then copy of
1330: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
1340: 2a 2a 20 70 4d 65 6d 2d 3e 7a 20 69 6e 74 6f 20  ** pMem->z into 
1350: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
1360: 6f 6e 2e 20 20 70 4d 65 6d 20 6d 75 73 74 20 62  on.  pMem must b
1370: 65 20 65 69 74 68 65 72 20 61 20 73 74 72 69 6e  e either a strin
1380: 67 20 6f 72 0a 2a 2a 20 62 6c 6f 62 20 69 66 20  g or.** blob if 
1390: 62 50 72 65 73 65 72 76 65 20 69 73 20 74 72 75  bPreserve is tru
13a0: 65 2e 20 20 49 66 20 62 50 72 65 73 65 72 76 65  e.  If bPreserve
13b0: 20 69 73 20 66 61 6c 73 65 2c 20 61 6e 79 20 70   is false, any p
13c0: 72 69 6f 72 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  rior content.** 
13d0: 69 6e 20 70 4d 65 6d 2d 3e 7a 20 69 73 20 64 69  in pMem->z is di
13e0: 73 63 61 72 64 65 64 2e 0a 2a 2f 0a 53 51 4c 49  scarded..*/.SQLI
13f0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
1400: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
1410: 6f 77 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  ow(Mem *pMem, in
1420: 74 20 6e 2c 20 69 6e 74 20 62 50 72 65 73 65 72  t n, int bPreser
1430: 76 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ve){.  assert( s
1440: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
1450: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 4d 65  emInvariants(pMe
1460: 6d 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  m) );.  assert( 
1470: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pMem->flags&MEM
1480: 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
1490: 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
14a0: 3e 64 62 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db==0 );..  /* 
14b0: 49 66 20 74 68 65 20 62 50 72 65 73 65 72 76 65  If the bPreserve
14c0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
14d0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  true, then the m
14e0: 65 6d 6f 72 79 20 63 65 6c 6c 20 6d 75 73 74 20  emory cell must 
14f0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 63 6f 6e  already.  ** con
1500: 74 61 69 6e 20 61 20 76 61 6c 69 64 20 73 74 72  tain a valid str
1510: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ing or blob valu
1520: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1530: 20 62 50 72 65 73 65 72 76 65 3d 3d 30 20 7c 7c   bPreserve==0 ||
1540: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 28 4d 45   pMem->flags&(ME
1550: 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20  M_Blob|MEM_Str) 
1560: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 62  );.  testcase( b
1570: 50 72 65 73 65 72 76 65 20 26 26 20 70 4d 65 6d  Preserve && pMem
1580: 2d 3e 7a 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73  ->z==0 );..  ass
1590: 65 72 74 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  ert( pMem->szMal
15a0: 6c 6f 63 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  loc==0.       ||
15b0: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d   pMem->szMalloc=
15c0: 3d 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  =sqlite3DbMalloc
15d0: 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  Size(pMem->db, p
15e0: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 3b  Mem->zMalloc) );
15f0: 0a 20 20 69 66 28 20 6e 3c 33 32 20 29 20 6e 20  .  if( n<32 ) n 
1600: 3d 20 33 32 3b 0a 20 20 69 66 28 20 62 50 72 65  = 32;.  if( bPre
1610: 73 65 72 76 65 20 26 26 20 70 4d 65 6d 2d 3e 73  serve && pMem->s
1620: 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70 4d 65  zMalloc>0 && pMe
1630: 6d 2d 3e 7a 3d 3d 70 4d 65 6d 2d 3e 7a 4d 61 6c  m->z==pMem->zMal
1640: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  loc ){.    pMem-
1650: 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  >z = pMem->zMall
1660: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  oc = sqlite3DbRe
1670: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 4d 65 6d  allocOrFree(pMem
1680: 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6e  ->db, pMem->z, n
1690: 29 3b 0a 20 20 20 20 62 50 72 65 73 65 72 76 65  );.    bPreserve
16a0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16b0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 73 7a 4d     if( pMem->szM
16c0: 61 6c 6c 6f 63 3e 30 20 29 20 73 71 6c 69 74 65  alloc>0 ) sqlite
16d0: 33 44 62 46 72 65 65 4e 4e 28 70 4d 65 6d 2d 3e  3DbFreeNN(pMem->
16e0: 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  db, pMem->zMallo
16f0: 63 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d  c);.    pMem->zM
1700: 61 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  alloc = sqlite3D
1710: 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4d 65 6d 2d  bMallocRaw(pMem-
1720: 3e 64 62 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 69  >db, n);.  }.  i
1730: 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  f( pMem->zMalloc
1740: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1750: 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
1760: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d  (pMem);.    pMem
1770: 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  ->z = 0;.    pMe
1780: 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m->szMalloc = 0;
1790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17a0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
17b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d   }else{.    pMem
17c0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c  ->szMalloc = sql
17d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
17e0: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
17f0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 7d 0a 0a  >zMalloc);.  }..
1800: 20 20 69 66 28 20 62 50 72 65 73 65 72 76 65 20    if( bPreserve 
1810: 26 26 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 41 4c  && pMem->z && AL
1820: 57 41 59 53 28 70 4d 65 6d 2d 3e 7a 21 3d 70 4d  WAYS(pMem->z!=pM
1830: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 7b 0a  em->zMalloc) ){.
1840: 20 20 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d      memcpy(pMem-
1850: 3e 7a 4d 61 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e  >zMalloc, pMem->
1860: 7a 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 7d  z, pMem->n);.  }
1870: 0a 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c  .  if( (pMem->fl
1880: 61 67 73 26 4d 45 4d 5f 44 79 6e 29 21 3d 30 20  ags&MEM_Dyn)!=0 
1890: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18a0: 4d 65 6d 2d 3e 78 44 65 6c 21 3d 30 20 26 26 20  Mem->xDel!=0 && 
18b0: 70 4d 65 6d 2d 3e 78 44 65 6c 21 3d 53 51 4c 49  pMem->xDel!=SQLI
18c0: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
18d0: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 28 28 76 6f    pMem->xDel((vo
18e0: 69 64 20 2a 29 28 70 4d 65 6d 2d 3e 7a 29 29 3b  id *)(pMem->z));
18f0: 0a 20 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 7a 20  .  }..  pMem->z 
1900: 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b  = pMem->zMalloc;
1910: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  .  pMem->flags &
1920: 3d 20 7e 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  = ~(MEM_Dyn|MEM_
1930: 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63  Ephem|MEM_Static
1940: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1960: 43 68 61 6e 67 65 20 74 68 65 20 70 4d 65 6d 2d  Change the pMem-
1970: 3e 7a 4d 61 6c 6c 6f 63 20 61 6c 6c 6f 63 61 74  >zMalloc allocat
1980: 69 6f 6e 20 74 6f 20 62 65 20 61 74 20 6c 65 61  ion to be at lea
1990: 73 74 20 73 7a 4e 65 77 20 62 79 74 65 73 2e 0a  st szNew bytes..
19a0: 2a 2a 20 49 66 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ** If pMem->zMal
19b0: 6c 6f 63 20 61 6c 72 65 61 64 79 20 6d 65 65 74  loc already meet
19c0: 73 20 6f 72 20 65 78 63 65 65 64 73 20 74 68 65  s or exceeds the
19d0: 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 2c   requested size,
19e0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
19f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1a00: 2a 2a 20 41 6e 79 20 70 72 69 6f 72 20 73 74 72  ** Any prior str
1a10: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 74  ing or blob cont
1a20: 65 6e 74 20 69 6e 20 74 68 65 20 70 4d 65 6d 20  ent in the pMem 
1a30: 6f 62 6a 65 63 74 20 6d 61 79 20 62 65 20 64 69  object may be di
1a40: 73 63 61 72 64 65 64 2e 0a 2a 2a 20 54 68 65 20  scarded..** The 
1a50: 70 4d 65 6d 2d 3e 78 44 65 6c 20 64 65 73 74 72  pMem->xDel destr
1a60: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 2c  uctor is called,
1a70: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
1a80: 54 68 6f 75 67 68 20 4d 45 4d 5f 53 74 72 0a 2a  Though MEM_Str.*
1a90: 2a 20 61 6e 64 20 4d 45 4d 5f 42 6c 6f 62 20 76  * and MEM_Blob v
1aa0: 61 6c 75 65 73 20 6d 61 79 20 62 65 20 64 69 73  alues may be dis
1ab0: 63 61 72 64 65 64 2c 20 4d 45 4d 5f 49 6e 74 2c  carded, MEM_Int,
1ac0: 20 4d 45 4d 5f 52 65 61 6c 2c 20 61 6e 64 20 4d   MEM_Real, and M
1ad0: 45 4d 5f 4e 75 6c 6c 0a 2a 2a 20 76 61 6c 75 65  EM_Null.** value
1ae0: 73 20 61 72 65 20 70 72 65 73 65 72 76 65 64 2e  s are preserved.
1af0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1b00: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1b10: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1b20: 6f 64 65 20 28 70 72 6f 62 61 62 6c 79 20 53 51  ode (probably SQ
1b30: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 0a 2a 2a 20 69  LITE_NOMEM).** i
1b40: 66 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  f unable to comp
1b50: 6c 65 74 65 20 74 68 65 20 72 65 73 69 7a 69 6e  lete the resizin
1b60: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
1b70: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
1b80: 52 65 73 69 7a 65 28 4d 65 6d 20 2a 70 4d 65 6d  Resize(Mem *pMem
1b90: 2c 20 69 6e 74 20 73 7a 4e 65 77 29 7b 0a 20 20  , int szNew){.  
1ba0: 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3e 30 20  assert( szNew>0 
1bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  );.  assert( (pM
1bc0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
1bd0: 44 79 6e 29 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d  Dyn)==0 || pMem-
1be0: 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >szMalloc==0 );.
1bf0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61    if( pMem->szMa
1c00: 6c 6c 6f 63 3c 73 7a 4e 65 77 20 29 7b 0a 20 20  lloc<szNew ){.  
1c10: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c20: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
1c30: 2c 20 73 7a 4e 65 77 2c 20 30 29 3b 0a 20 20 7d  , szNew, 0);.  }
1c40: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
1c50: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
1c60: 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 4d 65 6d 2d  n)==0 );.  pMem-
1c70: 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  >z = pMem->zMall
1c80: 6f 63 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  oc;.  pMem->flag
1c90: 73 20 26 3d 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d  s &= (MEM_Null|M
1ca0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1cb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1cc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1cd0: 68 61 6e 67 65 20 70 4d 65 6d 20 73 6f 20 74 68  hange pMem so th
1ce0: 61 74 20 69 74 73 20 4d 45 4d 5f 53 74 72 20 6f  at its MEM_Str o
1cf0: 72 20 4d 45 4d 5f 42 6c 6f 62 20 76 61 6c 75 65  r MEM_Blob value
1d00: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
1d10: 20 4d 45 4d 2e 7a 4d 61 6c 6c 6f 63 2c 20 77 68   MEM.zMalloc, wh
1d20: 65 72 65 20 69 74 20 63 61 6e 20 62 65 20 73 61  ere it can be sa
1d30: 66 65 6c 79 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  fely written..**
1d40: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1d50: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1d60: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
1d70: 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
1d80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1d90: 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61  dbeMemMakeWritea
1da0: 62 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  ble(Mem *pMem){.
1db0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1dc0: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
1dd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d  _mutex_held(pMem
1de0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1df0: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
1e00: 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65  >flags&MEM_RowSe
1e10: 74 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  t)==0 );.  if( (
1e20: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
1e30: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1e40: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
1e50: 45 78 70 61 6e 64 42 6c 6f 62 28 70 4d 65 6d 29  ExpandBlob(pMem)
1e60: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e70: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66 28 20  _NOMEM;.    if( 
1e80: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d  pMem->szMalloc==
1e90: 30 20 7c 7c 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d  0 || pMem->z!=pM
1ea0: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  em->zMalloc ){. 
1eb0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ec0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
1ed0: 2c 20 70 4d 65 6d 2d 3e 6e 20 2b 20 32 2c 20 31  , pMem->n + 2, 1
1ee0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
1ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1f00: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
1f10: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65       pMem->z[pMe
1f20: 6d 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  m->n] = 0;.     
1f30: 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e   pMem->z[pMem->n
1f40: 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  +1] = 0;.      p
1f50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Mem->flags |= ME
1f60: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20  M_Term;.    }.  
1f70: 7d 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  }.  pMem->flags 
1f80: 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 23  &= ~MEM_Ephem;.#
1f90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1fa0: 55 47 0a 20 20 70 4d 65 6d 2d 3e 70 53 63 6f 70  UG.  pMem->pScop
1fb0: 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  yFrom = 0;.#endi
1fc0: 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
1fd0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fe0: 49 66 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d  If the given Mem
1ff0: 2a 20 68 61 73 20 61 20 7a 65 72 6f 2d 66 69 6c  * has a zero-fil
2000: 6c 65 64 20 74 61 69 6c 2c 20 74 75 72 6e 20 69  led tail, turn i
2010: 74 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69 6e 61  t into an ordina
2020: 72 79 0a 2a 2a 20 62 6c 6f 62 20 73 74 6f 72 65  ry.** blob store
2030: 64 20 69 6e 20 64 79 6e 61 6d 69 63 61 6c 6c 79  d in dynamically
2040: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
2050: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2060: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2070: 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  B.int sqlite3Vdb
2080: 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 4d  eMemExpandBlob(M
2090: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74  em *pMem){.  int
20a0: 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74   nByte;.  assert
20b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
20c0: 4d 45 4d 5f 5a 65 72 6f 20 29 3b 0a 20 20 61 73  MEM_Zero );.  as
20d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
20e0: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  s&MEM_Blob );.  
20f0: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
2100: 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65 74 29  lags&MEM_RowSet)
2110: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2120: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
2130: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2140: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
2150: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ex) );..  /* Set
2160: 20 6e 42 79 74 65 20 74 6f 20 74 68 65 20 6e 75   nByte to the nu
2170: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
2180: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
2190: 74 68 65 20 65 78 70 61 6e 64 65 64 20 62 6c 6f  the expanded blo
21a0: 62 2e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20  b. */.  nByte = 
21b0: 70 4d 65 6d 2d 3e 6e 20 2b 20 70 4d 65 6d 2d 3e  pMem->n + pMem->
21c0: 75 2e 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 6e  u.nZero;.  if( n
21d0: 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20 6e  Byte<=0 ){.    n
21e0: 42 79 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Byte = 1;.  }.  
21f0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
2200: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79  emGrow(pMem, nBy
2210: 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65  te, 1) ){.    re
2220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2230: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 6d  M_BKPT;.  }..  m
2240: 65 6d 73 65 74 28 26 70 4d 65 6d 2d 3e 7a 5b 70  emset(&pMem->z[p
2250: 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 70 4d 65 6d  Mem->n], 0, pMem
2260: 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20 70 4d  ->u.nZero);.  pM
2270: 65 6d 2d 3e 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75  em->n += pMem->u
2280: 2e 6e 5a 65 72 6f 3b 0a 20 20 70 4d 65 6d 2d 3e  .nZero;.  pMem->
2290: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 5a  flags &= ~(MEM_Z
22a0: 65 72 6f 7c 4d 45 4d 5f 54 65 72 6d 29 3b 0a 20  ero|MEM_Term);. 
22b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
22d0: 2a 2a 20 49 74 20 69 73 20 61 6c 72 65 61 64 79  ** It is already
22e0: 20 6b 6e 6f 77 6e 20 74 68 61 74 20 70 4d 65 6d   known that pMem
22f0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 74   contains an unt
2300: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
2310: 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 7a 65 72  ..** Add the zer
2320: 6f 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  o terminator..*/
2330: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2340: 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65  OINLINE int vdbe
2350: 4d 65 6d 41 64 64 54 65 72 6d 69 6e 61 74 6f 72  MemAddTerminator
2360: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
2370: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
2380: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 70 4d 65 6d  mGrow(pMem, pMem
2390: 2d 3e 6e 2b 32 2c 20 31 29 20 29 7b 0a 20 20 20  ->n+2, 1) ){.   
23a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23b0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
23c0: 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e   pMem->z[pMem->n
23d0: 5d 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e 7a  ] = 0;.  pMem->z
23e0: 5b 70 4d 65 6d 2d 3e 6e 2b 31 5d 20 3d 20 30 3b  [pMem->n+1] = 0;
23f0: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c  .  pMem->flags |
2400: 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 72 65  = MEM_Term;.  re
2410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2420: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
2430: 72 65 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d  re the given Mem
2440: 20 69 73 20 5c 75 30 30 30 30 20 74 65 72 6d 69   is \u0000 termi
2450: 6e 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nated..*/.int sq
2460: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54  lite3VdbeMemNulT
2470: 65 72 6d 69 6e 61 74 65 28 4d 65 6d 20 2a 70 4d  erminate(Mem *pM
2480: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  em){.  assert( p
2490: 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Mem->db==0 || sq
24a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24b0: 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pMem->db->mutex
24c0: 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
24d0: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
24e0: 28 4d 45 4d 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74  (MEM_Term|MEM_St
24f0: 72 29 29 3d 3d 28 4d 45 4d 5f 54 65 72 6d 7c 4d  r))==(MEM_Term|M
2500: 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 74 65 73  EM_Str) );.  tes
2510: 74 63 61 73 65 28 20 28 70 4d 65 6d 2d 3e 66 6c  tcase( (pMem->fl
2520: 61 67 73 20 26 20 28 4d 45 4d 5f 54 65 72 6d 7c  ags & (MEM_Term|
2530: 4d 45 4d 5f 53 74 72 29 29 3d 3d 30 20 29 3b 0a  MEM_Str))==0 );.
2540: 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61    if( (pMem->fla
2550: 67 73 20 26 20 28 4d 45 4d 5f 54 65 72 6d 7c 4d  gs & (MEM_Term|M
2560: 45 4d 5f 53 74 72 29 29 21 3d 4d 45 4d 5f 53 74  EM_Str))!=MEM_St
2570: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2580: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
2590: 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  Nothing to do */
25a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
25b0: 74 75 72 6e 20 76 64 62 65 4d 65 6d 41 64 64 54  turn vdbeMemAddT
25c0: 65 72 6d 69 6e 61 74 6f 72 28 70 4d 65 6d 29 3b  erminator(pMem);
25d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
25e0: 64 20 4d 45 4d 5f 53 74 72 20 74 6f 20 74 68 65  d MEM_Str to the
25f0: 20 73 65 74 20 6f 66 20 72 65 70 72 65 73 65 6e   set of represen
2600: 74 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20  tations for the 
2610: 67 69 76 65 6e 20 4d 65 6d 2e 20 20 4e 75 6d 62  given Mem.  Numb
2620: 65 72 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65  ers.** are conve
2630: 72 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  rted using sqlit
2640: 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 2e 20 20  e3_snprintf().  
2650: 43 6f 6e 76 65 72 74 69 6e 67 20 61 20 42 4c 4f  Converting a BLO
2660: 42 20 74 6f 20 61 20 73 74 72 69 6e 67 0a 2a 2a  B to a string.**
2670: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2680: 2a 2a 20 45 78 69 73 74 69 6e 67 20 72 65 70 72  ** Existing repr
2690: 65 73 65 6e 74 61 74 69 6f 6e 73 20 4d 45 4d 5f  esentations MEM_
26a0: 49 6e 74 20 61 6e 64 20 4d 45 4d 5f 52 65 61 6c  Int and MEM_Real
26b0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
26c0: 20 69 66 0a 2a 2a 20 62 46 6f 72 63 65 20 69 73   if.** bForce is
26d0: 20 74 72 75 65 20 62 75 74 20 61 72 65 20 72 65   true but are re
26e0: 74 61 69 6e 65 64 20 69 66 20 62 46 6f 72 63 65  tained if bForce
26f0: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
2700: 20 41 20 4d 45 4d 5f 4e 75 6c 6c 20 76 61 6c 75   A MEM_Null valu
2710: 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
2720: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
2730: 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  unction. This fu
2740: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 73 65  nction is.** use
2750: 64 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67  d for converting
2760: 20 76 61 6c 75 65 73 20 74 6f 20 74 65 78 74 20   values to text 
2770: 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  for returning to
2780: 20 74 68 65 20 75 73 65 72 20 28 69 2e 65 2e 20   the user (i.e. 
2790: 76 69 61 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  via.** sqlite3_v
27a0: 61 6c 75 65 5f 74 65 78 74 28 29 29 2c 20 6f 72  alue_text()), or
27b0: 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
27c0: 61 74 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  at values to be 
27d0: 75 73 65 64 20 61 73 20 62 74 72 65 65 0a 2a 2a  used as btree.**
27e0: 20 6b 65 79 73 20 61 72 65 20 73 74 72 69 6e 67   keys are string
27f0: 73 2e 20 49 6e 20 74 68 65 20 66 6f 72 6d 65 72  s. In the former
2800: 20 63 61 73 65 20 61 20 4e 55 4c 4c 20 70 6f 69   case a NULL poi
2810: 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  nter is returned
2820: 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 61 6e 64   the.** user and
2830: 20 74 68 65 20 6c 61 74 74 65 72 20 69 73 20 61   the latter is a
2840: 6e 20 69 6e 74 65 72 6e 61 6c 20 70 72 6f 67 72  n internal progr
2850: 61 6d 6d 69 6e 67 20 65 72 72 6f 72 2e 0a 2a 2f  amming error..*/
2860: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2870: 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 4d 65 6d  MemStringify(Mem
2880: 20 2a 70 4d 65 6d 2c 20 75 38 20 65 6e 63 2c 20   *pMem, u8 enc, 
2890: 75 38 20 62 46 6f 72 63 65 29 7b 0a 20 20 69 6e  u8 bForce){.  in
28a0: 74 20 66 67 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  t fg = pMem->fla
28b0: 67 73 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  gs;.  const int 
28c0: 6e 42 79 74 65 20 3d 20 33 32 3b 0a 0a 20 20 61  nByte = 32;..  a
28d0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d  ssert( pMem->db=
28e0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
28f0: 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64  tex_held(pMem->d
2900: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2910: 73 73 65 72 74 28 20 21 28 66 67 26 4d 45 4d 5f  ssert( !(fg&MEM_
2920: 5a 65 72 6f 29 20 29 3b 0a 20 20 61 73 73 65 72  Zero) );.  asser
2930: 74 28 20 21 28 66 67 26 28 4d 45 4d 5f 53 74 72  t( !(fg&(MEM_Str
2940: 7c 4d 45 4d 5f 42 6c 6f 62 29 29 20 29 3b 0a 20  |MEM_Blob)) );. 
2950: 20 61 73 73 65 72 74 28 20 66 67 26 28 4d 45 4d   assert( fg&(MEM
2960: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
2970: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65  ;.  assert( (pMe
2980: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77  m->flags&MEM_Row
2990: 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Set)==0 );.  ass
29a0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
29b0: 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
29c0: 29 3b 0a 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  );...  if( sqlit
29d0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
29e0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42  dResize(pMem, nB
29f0: 79 74 65 29 20 29 7b 0a 20 20 20 20 70 4d 65 6d  yte) ){.    pMem
2a00: 2d 3e 65 6e 63 20 3d 20 30 3b 0a 20 20 20 20 72  ->enc = 0;.    r
2a10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a20: 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
2a30: 2f 2a 20 46 6f 72 20 61 20 52 65 61 6c 20 6f 72  /* For a Real or
2a40: 20 49 6e 74 65 67 65 72 2c 20 75 73 65 20 73 71   Integer, use sq
2a50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29  lite3_snprintf()
2a60: 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20   to produce the 
2a70: 55 54 46 2d 38 0a 20 20 2a 2a 20 73 74 72 69 6e  UTF-8.  ** strin
2a80: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2a90: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 54   of the value. T
2aa0: 68 65 6e 2c 20 69 66 20 74 68 65 20 72 65 71 75  hen, if the requ
2ab0: 69 72 65 64 20 65 6e 63 6f 64 69 6e 67 0a 20 20  ired encoding.  
2ac0: 2a 2a 20 69 73 20 55 54 46 2d 31 36 6c 65 20 6f  ** is UTF-16le o
2ad0: 72 20 55 54 46 2d 31 36 62 65 20 64 6f 20 61 20  r UTF-16be do a 
2ae0: 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 0a 20 20 2a  translation..  *
2af0: 2a 20 0a 20 20 2a 2a 20 46 49 58 20 4d 45 3a 20  * .  ** FIX ME: 
2b00: 49 74 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74  It would be bett
2b10: 65 72 20 69 66 20 73 71 6c 69 74 65 33 5f 73 6e  er if sqlite3_sn
2b20: 70 72 69 6e 74 66 28 29 20 63 6f 75 6c 64 20 64  printf() could d
2b30: 6f 20 55 54 46 2d 31 36 2e 0a 20 20 2a 2f 0a 20  o UTF-16..  */. 
2b40: 20 69 66 28 20 66 67 20 26 20 4d 45 4d 5f 49 6e   if( fg & MEM_In
2b50: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b60: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2c  _snprintf(nByte,
2b70: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 6c 6c 64 22   pMem->z, "%lld"
2b80: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
2b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2ba0: 74 28 20 66 67 20 26 20 4d 45 4d 5f 52 65 61 6c  t( fg & MEM_Real
2bb0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
2bc0: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2c 20  snprintf(nByte, 
2bd0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 21 2e 31 35 67  pMem->z, "%!.15g
2be0: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20  ", pMem->u.r);. 
2bf0: 20 7d 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73   }.  pMem->n = s
2c00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
2c10: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 70 4d 65 6d 2d  Mem->z);.  pMem-
2c20: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
2c30: 46 38 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  F8;.  pMem->flag
2c40: 73 20 7c 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s |= MEM_Str|MEM
2c50: 5f 54 65 72 6d 3b 0a 20 20 69 66 28 20 62 46 6f  _Term;.  if( bFo
2c60: 72 63 65 20 29 20 70 4d 65 6d 2d 3e 66 6c 61 67  rce ) pMem->flag
2c70: 73 20 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d  s &= ~(MEM_Int|M
2c80: 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 73 71 6c 69  EM_Real);.  sqli
2c90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
2ca0: 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 29  oding(pMem, enc)
2cb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2cc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
2cd0: 65 6d 6f 72 79 20 63 65 6c 6c 20 70 4d 65 6d 20  emory cell pMem 
2ce0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e  contains the con
2cf0: 74 65 78 74 20 6f 66 20 61 6e 20 61 67 67 72 65  text of an aggre
2d00: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  gate function..*
2d10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2d20: 61 6c 6c 73 20 74 68 65 20 66 69 6e 61 6c 69 7a  alls the finaliz
2d30: 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61  e method for tha
2d40: 74 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  t function.  The
2d50: 0a 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 74 68  .** result of th
2d60: 65 20 61 67 67 72 65 67 61 74 65 20 69 73 20 73  e aggregate is s
2d70: 74 6f 72 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  tored back into 
2d80: 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  pMem..**.** Retu
2d90: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2da0: 69 66 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72  if the finalizer
2db0: 20 72 65 70 6f 72 74 73 20 61 6e 20 65 72 72 6f   reports an erro
2dc0: 72 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  r.  SQLITE_OK.**
2dd0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
2de0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
2df0: 6d 46 69 6e 61 6c 69 7a 65 28 4d 65 6d 20 2a 70  mFinalize(Mem *p
2e00: 4d 65 6d 2c 20 46 75 6e 63 44 65 66 20 2a 70 46  Mem, FuncDef *pF
2e10: 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
2e20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2e30: 28 20 41 4c 57 41 59 53 28 70 46 75 6e 63 20 26  ( ALWAYS(pFunc &
2e40: 26 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69  & pFunc->xFinali
2e50: 7a 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ze) ){.    sqlit
2e60: 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a  e3_context ctx;.
2e70: 20 20 20 20 4d 65 6d 20 74 3b 0a 20 20 20 20 61      Mem t;.    a
2e80: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
2e90: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21  ags & MEM_Null)!
2ea0: 3d 30 20 7c 7c 20 70 46 75 6e 63 3d 3d 70 4d 65  =0 || pFunc==pMe
2eb0: 6d 2d 3e 75 2e 70 44 65 66 20 29 3b 0a 20 20 20  m->u.pDef );.   
2ec0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
2ed0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
2ee0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
2ef0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2f00: 20 20 20 6d 65 6d 73 65 74 28 26 63 74 78 2c 20     memset(&ctx, 
2f10: 30 2c 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b  0, sizeof(ctx));
2f20: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 2c 20  .    memset(&t, 
2f30: 30 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  0, sizeof(t));. 
2f40: 20 20 20 74 2e 66 6c 61 67 73 20 3d 20 4d 45 4d     t.flags = MEM
2f50: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 74 2e 64 62 20  _Null;.    t.db 
2f60: 3d 20 70 4d 65 6d 2d 3e 64 62 3b 0a 20 20 20 20  = pMem->db;.    
2f70: 63 74 78 2e 70 4f 75 74 20 3d 20 26 74 3b 0a 20  ctx.pOut = &t;. 
2f80: 20 20 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d     ctx.pMem = pM
2f90: 65 6d 3b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e  em;.    ctx.pFun
2fa0: 63 20 3d 20 70 46 75 6e 63 3b 0a 20 20 20 20 70  c = pFunc;.    p
2fb0: 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 28  Func->xFinalize(
2fc0: 26 63 74 78 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  &ctx); /* IMP: R
2fd0: 2d 32 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a  -24505-23230 */.
2fe0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
2ff0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  m->flags & MEM_D
3000: 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  yn)==0 );.    if
3010: 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  ( pMem->szMalloc
3020: 3e 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  >0 ) sqlite3DbFr
3030: 65 65 4e 4e 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  eeNN(pMem->db, p
3040: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  Mem->zMalloc);. 
3050: 20 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2c 20     memcpy(pMem, 
3060: 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
3070: 20 20 20 20 72 63 20 3d 20 63 74 78 2e 69 73 45      rc = ctx.isE
3080: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rror;.  }.  retu
3090: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30a0: 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  If the memory ce
30b0: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61  ll contains a va
30c0: 6c 75 65 20 74 68 61 74 20 6d 75 73 74 20 62 65  lue that must be
30d0: 20 66 72 65 65 64 20 62 79 0a 2a 2a 20 69 6e 76   freed by.** inv
30e0: 6f 6b 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e  oking the extern
30f0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 69 6e 20 4d  al callback in M
3100: 65 6d 2e 78 44 65 6c 2c 20 74 68 65 6e 20 74 68  em.xDel, then th
3110: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69  is routine.** wi
3120: 6c 6c 20 66 72 65 65 20 74 68 61 74 20 76 61 6c  ll free that val
3130: 75 65 2e 20 20 49 74 20 61 6c 73 6f 20 73 65 74  ue.  It also set
3140: 73 20 4d 65 6d 2e 66 6c 61 67 73 20 74 6f 20 4d  s Mem.flags to M
3150: 45 4d 5f 4e 75 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  EM_Null..**.** T
3160: 68 69 73 20 69 73 20 61 20 68 65 6c 70 65 72 20  his is a helper 
3170: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c 69  routine for sqli
3180: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
3190: 6c 28 29 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 73  l() and.** for s
31a0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
31b0: 65 61 73 65 28 29 2e 20 20 55 73 65 20 74 68 6f  ease().  Use tho
31c0: 73 65 20 6f 74 68 65 72 20 72 6f 75 74 69 6e 65  se other routine
31d0: 73 20 61 73 20 74 68 65 0a 2a 2a 20 65 6e 74 72  s as the.** entr
31e0: 79 20 70 6f 69 6e 74 20 66 6f 72 20 72 65 6c 65  y point for rele
31f0: 61 73 69 6e 67 20 4d 65 6d 20 72 65 73 6f 75 72  asing Mem resour
3200: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ces..*/.static S
3210: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
3220: 6f 69 64 20 76 64 62 65 4d 65 6d 43 6c 65 61 72  oid vdbeMemClear
3230: 45 78 74 65 72 6e 41 6e 64 53 65 74 4e 75 6c 6c  ExternAndSetNull
3240: 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61 73 73 65  (Mem *p){.  asse
3250: 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
3260: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3270: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
3280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64   );.  assert( Vd
3290: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 29 20  beMemDynamic(p) 
32a0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  );.  if( p->flag
32b0: 73 26 4d 45 4d 5f 41 67 67 20 29 7b 0a 20 20 20  s&MEM_Agg ){.   
32c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
32d0: 69 6e 61 6c 69 7a 65 28 70 2c 20 70 2d 3e 75 2e  inalize(p, p->u.
32e0: 70 44 65 66 29 3b 0a 20 20 20 20 61 73 73 65 72  pDef);.    asser
32f0: 74 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d  t( (p->flags & M
3300: 45 4d 5f 41 67 67 29 3d 3d 30 20 29 3b 0a 20 20  EM_Agg)==0 );.  
3310: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
3320: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
3330: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66  ;.  }.  if( p->f
3340: 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a  lags&MEM_Dyn ){.
3350: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
3360: 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65 74  flags&MEM_RowSet
3370: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
3380: 72 74 28 20 70 2d 3e 78 44 65 6c 21 3d 53 51 4c  rt( p->xDel!=SQL
3390: 49 54 45 5f 44 59 4e 41 4d 49 43 20 26 26 20 70  ITE_DYNAMIC && p
33a0: 2d 3e 78 44 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ->xDel!=0 );.   
33b0: 20 70 2d 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a   p->xDel((void *
33c0: 29 70 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 20  )p->z);.  }else 
33d0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 4d 45 4d  if( p->flags&MEM
33e0: 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 73  _RowSet ){.    s
33f0: 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61  qlite3RowSetClea
3400: 72 28 70 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b  r(p->u.pRowSet);
3410: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3420: 66 6c 61 67 73 26 4d 45 4d 5f 46 72 61 6d 65 20  flags&MEM_Frame 
3430: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
3440: 20 2a 70 46 72 61 6d 65 20 3d 20 70 2d 3e 75 2e   *pFrame = p->u.
3450: 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 46 72 61  pFrame;.    pFra
3460: 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 46  me->pParent = pF
3470: 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61  rame->v->pDelFra
3480: 6d 65 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  me;.    pFrame->
3490: 76 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  v->pDelFrame = p
34a0: 46 72 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Frame;.  }.  p->
34b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
34c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
34d0: 73 65 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  se memory held b
34e0: 79 20 74 68 65 20 4d 65 6d 20 70 2c 20 62 6f 74  y the Mem p, bot
34f0: 68 20 65 78 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  h external memor
3500: 79 20 63 6c 65 61 72 65 64 0a 2a 2a 20 62 79 20  y cleared.** by 
3510: 70 2d 3e 78 44 65 6c 20 61 6e 64 20 6d 65 6d 6f  p->xDel and memo
3520: 72 79 20 69 6e 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  ry in p->zMalloc
3530: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
3540: 61 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  a helper routine
3550: 20 69 6e 76 6f 6b 65 64 20 62 79 20 73 71 6c 69   invoked by sqli
3560: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
3570: 65 28 29 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  e() in.** the un
3580: 75 73 75 61 6c 20 63 61 73 65 20 77 68 65 72 65  usual case where
3590: 20 74 68 65 72 65 20 72 65 61 6c 6c 79 20 69 73   there really is
35a0: 20 6d 65 6d 6f 72 79 20 69 6e 20 70 20 74 68 61   memory in p tha
35b0: 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65  t needs.** to be
35c0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
35d0: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
35e0: 45 20 76 6f 69 64 20 76 64 62 65 4d 65 6d 43 6c  E void vdbeMemCl
35f0: 65 61 72 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 69  ear(Mem *p){.  i
3600: 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  f( VdbeMemDynami
3610: 63 28 70 29 20 29 7b 0a 20 20 20 20 76 64 62 65  c(p) ){.    vdbe
3620: 4d 65 6d 43 6c 65 61 72 45 78 74 65 72 6e 41 6e  MemClearExternAn
3630: 64 53 65 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 7d  dSetNull(p);.  }
3640: 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c  .  if( p->szMall
3650: 6f 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  oc ){.    sqlite
3660: 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c  3DbFreeNN(p->db,
3670: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
3680: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20    p->szMalloc = 
3690: 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 20 3d 20  0;.  }.  p->z = 
36a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
36b0: 61 73 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 72  ase any memory r
36c0: 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62 79  esources held by
36d0: 20 74 68 65 20 4d 65 6d 2e 20 20 42 6f 74 68 20   the Mem.  Both 
36e0: 74 68 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  the memory that 
36f0: 69 73 0a 2a 2a 20 66 72 65 65 20 62 79 20 4d 65  is.** free by Me
3700: 6d 2e 78 44 65 6c 20 61 6e 64 20 74 68 65 20 4d  m.xDel and the M
3710: 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 61 6c 6c 6f 63  em.zMalloc alloc
3720: 61 74 69 6f 6e 20 61 72 65 20 66 72 65 65 64 2e  ation are freed.
3730: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
3740: 72 6f 75 74 69 6e 65 20 70 72 69 6f 72 20 74 6f  routine prior to
3750: 20 63 6c 65 61 6e 20 75 70 20 70 72 69 6f 72 20   clean up prior 
3760: 74 6f 20 61 62 61 6e 64 6f 6e 69 6e 67 20 61 20  to abandoning a 
3770: 4d 65 6d 2c 20 6f 72 20 74 6f 0a 2a 2a 20 72 65  Mem, or to.** re
3780: 73 65 74 20 61 20 4d 65 6d 20 62 61 63 6b 20 74  set a Mem back t
3790: 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 6d 65  o its minimum me
37a0: 6d 6f 72 79 20 75 74 69 6c 69 7a 61 74 69 6f 6e  mory utilization
37b0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73 71 6c 69  ..**.** Use sqli
37c0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
37d0: 6c 28 29 20 74 6f 20 72 65 6c 65 61 73 65 20 6a  l() to release j
37e0: 75 73 74 20 74 68 65 20 4d 65 6d 2e 78 44 65 6c  ust the Mem.xDel
37f0: 20 73 70 61 63 65 0a 2a 2a 20 70 72 69 6f 72 20   space.** prior 
3800: 74 6f 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  to inserting new
3810: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
3820: 65 20 4d 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e Mem..*/.void s
3830: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
3840: 65 61 73 65 28 4d 65 6d 20 2a 70 29 7b 0a 20 20  ease(Mem *p){.  
3850: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
3860: 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
3870: 69 61 6e 74 73 28 70 29 20 29 3b 0a 20 20 69 66  iants(p) );.  if
3880: 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
3890: 28 70 29 20 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c  (p) || p->szMall
38a0: 6f 63 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65  oc ){.    vdbeMe
38b0: 6d 43 6c 65 61 72 28 70 29 3b 0a 20 20 7d 0a 7d  mClear(p);.  }.}
38c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
38d0: 61 20 36 34 2d 62 69 74 20 49 45 45 45 20 64 6f  a 64-bit IEEE do
38e0: 75 62 6c 65 20 69 6e 74 6f 20 61 20 36 34 2d 62  uble into a 64-b
38f0: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3900: 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 64 6f 75  r..** If the dou
3910: 62 6c 65 20 69 73 20 6f 75 74 20 6f 66 20 72 61  ble is out of ra
3920: 6e 67 65 20 6f 66 20 61 20 36 34 2d 62 69 74 20  nge of a 64-bit 
3930: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
3940: 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  hen.** return th
3950: 65 20 63 6c 6f 73 65 73 74 20 61 76 61 69 6c 61  e closest availa
3960: 62 6c 65 20 36 34 2d 62 69 74 20 73 69 67 6e 65  ble 64-bit signe
3970: 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  d integer..*/.st
3980: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
3990: 4c 49 4e 45 20 69 36 34 20 64 6f 75 62 6c 65 54  LINE i64 doubleT
39a0: 6f 49 6e 74 36 34 28 64 6f 75 62 6c 65 20 72 29  oInt64(double r)
39b0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
39c0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
39d0: 49 4e 54 0a 20 20 2f 2a 20 57 68 65 6e 20 66 6c  INT.  /* When fl
39e0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 69 73 20  oating-point is 
39f0: 6f 6d 69 74 74 65 64 2c 20 64 6f 75 62 6c 65 20  omitted, double 
3a00: 61 6e 64 20 69 6e 74 36 34 20 61 72 65 20 74 68  and int64 are th
3a10: 65 20 73 61 6d 65 20 74 68 69 6e 67 20 2a 2f 0a  e same thing */.
3a20: 20 20 72 65 74 75 72 6e 20 72 3b 0a 23 65 6c 73    return r;.#els
3a30: 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6e 79  e.  /*.  ** Many
3a40: 20 63 6f 6d 70 69 6c 65 72 73 20 77 65 20 65 6e   compilers we en
3a50: 63 6f 75 6e 74 65 72 20 64 6f 20 6e 6f 74 20 64  counter do not d
3a60: 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
3a70: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 69 6e  for the.  ** min
3a80: 69 6d 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d  imum and maximum
3a90: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
3aa0: 2c 20 6f 72 20 74 68 65 79 20 64 65 66 69 6e 65  , or they define
3ab0: 20 74 68 65 6d 0a 20 20 2a 2a 20 69 6e 63 6f 6e   them.  ** incon
3ac0: 73 69 73 74 65 6e 74 6c 79 2e 20 20 41 6e 64 20  sistently.  And 
3ad0: 6d 61 6e 79 20 64 6f 20 6e 6f 74 20 75 6e 64 65  many do not unde
3ae0: 72 73 74 61 6e 64 20 74 68 65 20 22 4c 4c 22 20  rstand the "LL" 
3af0: 6e 6f 74 61 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  notation..  ** S
3b00: 6f 20 77 65 20 64 65 66 69 6e 65 20 6f 75 72 20  o we define our 
3b10: 6f 77 6e 20 73 74 61 74 69 63 20 63 6f 6e 73 74  own static const
3b20: 61 6e 74 73 20 68 65 72 65 20 75 73 69 6e 67 20  ants here using 
3b30: 6e 6f 74 68 69 6e 67 0a 20 20 2a 2a 20 6c 61 72  nothing.  ** lar
3b40: 67 65 72 20 74 68 61 6e 20 61 20 33 32 2d 62 69  ger than a 32-bi
3b50: 74 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  t integer consta
3b60: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  nt..  */.  stati
3b70: 63 20 63 6f 6e 73 74 20 69 36 34 20 6d 61 78 49  c const i64 maxI
3b80: 6e 74 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54  nt = LARGEST_INT
3b90: 36 34 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  64;.  static con
3ba0: 73 74 20 69 36 34 20 6d 69 6e 49 6e 74 20 3d 20  st i64 minInt = 
3bb0: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 3b 0a  SMALLEST_INT64;.
3bc0: 0a 20 20 69 66 28 20 72 3c 3d 28 64 6f 75 62 6c  .  if( r<=(doubl
3bd0: 65 29 6d 69 6e 49 6e 74 20 29 7b 0a 20 20 20 20  e)minInt ){.    
3be0: 72 65 74 75 72 6e 20 6d 69 6e 49 6e 74 3b 0a 20  return minInt;. 
3bf0: 20 7d 65 6c 73 65 20 69 66 28 20 72 3e 3d 28 64   }else if( r>=(d
3c00: 6f 75 62 6c 65 29 6d 61 78 49 6e 74 20 29 7b 0a  ouble)maxInt ){.
3c10: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 78 49 6e      return maxIn
3c20: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
3c30: 72 65 74 75 72 6e 20 28 69 36 34 29 72 3b 0a 20  return (i64)r;. 
3c40: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
3c50: 2a 2a 20 52 65 74 75 72 6e 20 73 6f 6d 65 20 6b  ** Return some k
3c60: 69 6e 64 20 6f 66 20 69 6e 74 65 67 65 72 20 76  ind of integer v
3c70: 61 6c 75 65 20 77 68 69 63 68 20 69 73 20 74 68  alue which is th
3c80: 65 20 62 65 73 74 20 77 65 20 63 61 6e 20 64 6f  e best we can do
3c90: 0a 2a 2a 20 61 74 20 72 65 70 72 65 73 65 6e 74  .** at represent
3ca0: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 74 68  ing the value th
3cb0: 61 74 20 2a 70 4d 65 6d 20 64 65 73 63 72 69 62  at *pMem describ
3cc0: 65 73 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  es as an integer
3cd0: 2e 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20  ..** If pMem is 
3ce0: 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e  an integer, then
3cf0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 65 78   the value is ex
3d00: 61 63 74 2e 20 20 49 66 20 70 4d 65 6d 20 69 73  act.  If pMem is
3d10: 0a 2a 2a 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70  .** a floating-p
3d20: 6f 69 6e 74 20 74 68 65 6e 20 74 68 65 20 76 61  oint then the va
3d30: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3d40: 74 68 65 20 69 6e 74 65 67 65 72 20 70 61 72 74  the integer part
3d50: 2e 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20  ..** If pMem is 
3d60: 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
3d70: 2c 20 74 68 65 6e 20 77 65 20 6d 61 6b 65 20 61  , then we make a
3d80: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e  n attempt to con
3d90: 76 65 72 74 0a 2a 2a 20 69 74 20 69 6e 74 6f 20  vert.** it into 
3da0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72  an integer and r
3db0: 65 74 75 72 6e 20 74 68 61 74 2e 20 20 49 66 20  eturn that.  If 
3dc0: 70 4d 65 6d 20 72 65 70 72 65 73 65 6e 74 73 20  pMem represents 
3dd0: 61 6e 0a 2a 2a 20 61 6e 20 53 51 4c 2d 4e 55 4c  an.** an SQL-NUL
3de0: 4c 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 20  L value, return 
3df0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d  0..**.** If pMem
3e00: 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 73 74   represents a st
3e10: 72 69 6e 67 20 76 61 6c 75 65 2c 20 69 74 73 20  ring value, its 
3e20: 65 6e 63 6f 64 69 6e 67 20 6d 69 67 68 74 20 62  encoding might b
3e30: 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  e changed..*/.st
3e40: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
3e50: 4c 49 4e 45 20 69 36 34 20 6d 65 6d 49 6e 74 56  LINE i64 memIntV
3e60: 61 6c 75 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b  alue(Mem *pMem){
3e70: 0a 20 20 69 36 34 20 76 61 6c 75 65 20 3d 20 30  .  i64 value = 0
3e80: 3b 0a 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36  ;.  sqlite3Atoi6
3e90: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 76 61 6c 75  4(pMem->z, &valu
3ea0: 65 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d  e, pMem->n, pMem
3eb0: 2d 3e 65 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  ->enc);.  return
3ec0: 20 76 61 6c 75 65 3b 0a 7d 0a 69 36 34 20 73 71   value;.}.i64 sq
3ed0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
3ee0: 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  e(Mem *pMem){.  
3ef0: 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 61 73 73  int flags;.  ass
3f00: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
3f10: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
3f20: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
3f30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
3f40: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
3f50: 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
3f60: 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 4d 65  );.  flags = pMe
3f70: 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  m->flags;.  if( 
3f80: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
3f90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d  ){.    return pM
3fa0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65  em->u.i;.  }else
3fb0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
3fc0: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
3fd0: 75 72 6e 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36  urn doubleToInt6
3fe0: 34 28 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20  4(pMem->u.r);.  
3ff0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
4000: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
4010: 6c 6f 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65  lob) ){.    asse
4020: 72 74 28 20 70 4d 65 6d 2d 3e 7a 20 7c 7c 20 70  rt( pMem->z || p
4030: 4d 65 6d 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Mem->n==0 );.   
4040: 20 72 65 74 75 72 6e 20 6d 65 6d 49 6e 74 56 61   return memIntVa
4050: 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 65 6c  lue(pMem);.  }el
4060: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
4070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4080: 65 74 75 72 6e 20 74 68 65 20 62 65 73 74 20 72  eturn the best r
4090: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
40a0: 20 70 4d 65 6d 20 74 68 61 74 20 77 65 20 63 61   pMem that we ca
40b0: 6e 20 67 65 74 20 69 6e 74 6f 20 61 0a 2a 2a 20  n get into a.** 
40c0: 64 6f 75 62 6c 65 2e 20 20 49 66 20 70 4d 65 6d  double.  If pMem
40d0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 64 6f   is already a do
40e0: 75 62 6c 65 20 6f 72 20 61 6e 20 69 6e 74 65 67  uble or an integ
40f0: 65 72 2c 20 72 65 74 75 72 6e 20 69 74 73 0a 2a  er, return its.*
4100: 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 69 74 20  * value.  If it 
4110: 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62  is a string or b
4120: 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76  lob, try to conv
4130: 65 72 74 20 69 74 20 74 6f 20 61 20 64 6f 75 62  ert it to a doub
4140: 6c 65 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  le..** If it is 
4150: 61 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  a NULL, return 0
4160: 2e 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  .0..*/.static SQ
4170: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 6f  LITE_NOINLINE do
4180: 75 62 6c 65 20 6d 65 6d 52 65 61 6c 56 61 6c 75  uble memRealValu
4190: 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  e(Mem *pMem){.  
41a0: 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20  /* (double)0 In 
41b0: 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
41c0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
41d0: 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 64 6f 75 62 6c  NT... */.  doubl
41e0: 65 20 76 61 6c 20 3d 20 28 64 6f 75 62 6c 65 29  e val = (double)
41f0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 41 74 6f 46  0;.  sqlite3AtoF
4200: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 76 61 6c 2c 20  (pMem->z, &val, 
4210: 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65  pMem->n, pMem->e
4220: 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 76 61  nc);.  return va
4230: 6c 3b 0a 7d 0a 64 6f 75 62 6c 65 20 73 71 6c 69  l;.}.double sqli
4240: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
4250: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61  (Mem *pMem){.  a
4260: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d  ssert( pMem->db=
4270: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
4280: 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64  tex_held(pMem->d
4290: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
42a0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
42b0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
42c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d  ) );.  if( pMem-
42d0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
42e0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
42f0: 70 4d 65 6d 2d 3e 75 2e 72 3b 0a 20 20 7d 65 6c  pMem->u.r;.  }el
4300: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
4310: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
4320: 20 20 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62      return (doub
4330: 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20  le)pMem->u.i;.  
4340: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
4350: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
4360: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20  |MEM_Blob) ){.  
4370: 20 20 72 65 74 75 72 6e 20 6d 65 6d 52 65 61 6c    return memReal
4380: 56 61 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 7d  Value(pMem);.  }
4390: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 28 64 6f  else{.    /* (do
43a0: 75 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f  uble)0 In case o
43b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
43c0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
43d0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 28 64  */.    return (d
43e0: 6f 75 62 6c 65 29 30 3b 0a 20 20 7d 0a 7d 0a 0a  ouble)0;.  }.}..
43f0: 2f 2a 0a 2a 2a 20 54 68 65 20 4d 45 4d 20 73 74  /*.** The MEM st
4400: 72 75 63 74 75 72 65 20 69 73 20 61 6c 72 65 61  ructure is alrea
4410: 64 79 20 61 20 4d 45 4d 5f 52 65 61 6c 2e 20 20  dy a MEM_Real.  
4420: 54 72 79 20 74 6f 20 61 6c 73 6f 20 6d 61 6b 65  Try to also make
4430: 20 69 74 20 61 0a 2a 2a 20 4d 45 4d 5f 49 6e 74   it a.** MEM_Int
4440: 20 69 66 20 77 65 20 63 61 6e 2e 0a 2a 2f 0a 76   if we can..*/.v
4450: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
4460: 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28 4d  ntegerAffinity(M
4470: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 36 34  em *pMem){.  i64
4480: 20 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70   ix;.  assert( p
4490: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
44a0: 5f 52 65 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  _Real );.  asser
44b0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
44c0: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
44d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
44e0: 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  em->db==0 || sql
44f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4500: 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  pMem->db->mutex)
4510: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
4520: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
4530: 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 69  NT(pMem) );..  i
4540: 78 20 3d 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36  x = doubleToInt6
4550: 34 28 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 0a 20  4(pMem->u.r);.. 
4560: 20 2f 2a 20 4f 6e 6c 79 20 6d 61 72 6b 20 74 68   /* Only mark th
4570: 65 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  e value as an in
4580: 74 65 67 65 72 20 69 66 0a 20 20 2a 2a 0a 20 20  teger if.  **.  
4590: 2a 2a 20 20 20 20 28 31 29 20 74 68 65 20 72 6f  **    (1) the ro
45a0: 75 6e 64 2d 74 72 69 70 20 63 6f 6e 76 65 72 73  und-trip convers
45b0: 69 6f 6e 20 72 65 61 6c 2d 3e 69 6e 74 2d 3e 72  ion real->int->r
45c0: 65 61 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20  eal is a no-op, 
45d0: 61 6e 64 0a 20 20 2a 2a 20 20 20 20 28 32 29 20  and.  **    (2) 
45e0: 54 68 65 20 69 6e 74 65 67 65 72 20 69 73 20 6e  The integer is n
45f0: 65 69 74 68 65 72 20 74 68 65 20 6c 61 72 67 65  either the large
4600: 73 74 20 6e 6f 72 20 74 68 65 20 73 6d 61 6c 6c  st nor the small
4610: 65 73 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  est.  **        
4620: 70 6f 73 73 69 62 6c 65 20 69 6e 74 65 67 65 72  possible integer
4630: 20 28 74 69 63 6b 65 74 20 23 33 39 32 32 29 0a   (ticket #3922).
4640: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
4650: 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 74  cond and third t
4660: 65 72 6d 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  erms in the foll
4670: 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 61  owing conditiona
4680: 6c 20 65 6e 66 6f 72 63 65 73 0a 20 20 2a 2a 20  l enforces.  ** 
4690: 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6e 64 69  the second condi
46a0: 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 61  tion under the a
46b0: 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 20 61  ssumption that a
46c0: 64 64 69 74 69 6f 6e 20 6f 76 65 72 66 6c 6f 77  ddition overflow
46d0: 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 76 61 6c   causes.  ** val
46e0: 75 65 73 20 74 6f 20 77 72 61 70 20 61 72 6f 75  ues to wrap arou
46f0: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
4700: 4d 65 6d 2d 3e 75 2e 72 3d 3d 69 78 20 26 26 20  Mem->u.r==ix && 
4710: 69 78 3e 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  ix>SMALLEST_INT6
4720: 34 20 26 26 20 69 78 3c 4c 41 52 47 45 53 54 5f  4 && ix<LARGEST_
4730: 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 70 4d 65  INT64 ){.    pMe
4740: 6d 2d 3e 75 2e 69 20 3d 20 69 78 3b 0a 20 20 20  m->u.i = ix;.   
4750: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
4760: 70 4d 65 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pMem, MEM_Int);.
4770: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
4780: 76 65 72 74 20 70 4d 65 6d 20 74 6f 20 74 79 70  vert pMem to typ
4790: 65 20 69 6e 74 65 67 65 72 2e 20 20 49 6e 76 61  e integer.  Inva
47a0: 6c 69 64 61 74 65 20 61 6e 79 20 70 72 69 6f 72  lidate any prior
47b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73   representations
47c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
47d0: 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
47e0: 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  y(Mem *pMem){.  
47f0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
4800: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
4810: 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e  utex_held(pMem->
4820: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
4830: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
4840: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
4850: 74 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  t)==0 );.  asser
4860: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
4870: 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
4880: 0a 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20  ..  pMem->u.i = 
4890: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
48a0: 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 4d 65 6d  lue(pMem);.  Mem
48b0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d  SetTypeFlag(pMem
48c0: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 72 65  , MEM_Int);.  re
48d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
48e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
48f0: 20 70 4d 65 6d 20 73 6f 20 74 68 61 74 20 69 74   pMem so that it
4900: 20 69 73 20 6f 66 20 74 79 70 65 20 4d 45 4d 5f   is of type MEM_
4910: 52 65 61 6c 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64  Real..** Invalid
4920: 61 74 65 20 61 6e 79 20 70 72 69 6f 72 20 72 65  ate any prior re
4930: 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  presentations..*
4940: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4950: 65 4d 65 6d 52 65 61 6c 69 66 79 28 4d 65 6d 20  eMemRealify(Mem 
4960: 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74  *pMem){.  assert
4970: 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c  ( pMem->db==0 ||
4980: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
4990: 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75  eld(pMem->db->mu
49a0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
49b0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
49c0: 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
49d0: 0a 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 73  .  pMem->u.r = s
49e0: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
49f0: 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 4d 65 6d  lue(pMem);.  Mem
4a00: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d  SetTypeFlag(pMem
4a10: 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 72  , MEM_Real);.  r
4a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
4a40: 74 20 70 4d 65 6d 20 73 6f 20 74 68 61 74 20 69  t pMem so that i
4a50: 74 20 68 61 73 20 74 79 70 65 73 20 4d 45 4d 5f  t has types MEM_
4a60: 52 65 61 6c 20 6f 72 20 4d 45 4d 5f 49 6e 74 20  Real or MEM_Int 
4a70: 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 49 6e 76 61  or both..** Inva
4a80: 6c 69 64 61 74 65 20 61 6e 79 20 70 72 69 6f 72  lidate any prior
4a90: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73   representations
4aa0: 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 65 66  ..**.** Every ef
4ab0: 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
4ac0: 66 6f 72 63 65 20 74 68 65 20 63 6f 6e 76 65 72  force the conver
4ad0: 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20 74 68  sion, even if th
4ae0: 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 61 20  e input.** is a 
4af0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 6f 65 73  string that does
4b00: 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6f 6d 70 6c 65   not look comple
4b10: 74 65 6c 79 20 6c 69 6b 65 20 61 20 6e 75 6d 62  tely like a numb
4b20: 65 72 2e 20 20 43 6f 6e 76 65 72 74 0a 2a 2a 20  er.  Convert.** 
4b30: 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73  as much of the s
4b40: 74 72 69 6e 67 20 61 73 20 77 65 20 63 61 6e 20  tring as we can 
4b50: 61 6e 64 20 69 67 6e 6f 72 65 20 74 68 65 20 72  and ignore the r
4b60: 65 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  est..*/.int sqli
4b70: 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69  te3VdbeMemNumeri
4b80: 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  fy(Mem *pMem){. 
4b90: 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67   if( (pMem->flag
4ba0: 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  s & (MEM_Int|MEM
4bb0: 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29  _Real|MEM_Null))
4bc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
4bd0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4be0: 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f  & (MEM_Blob|MEM_
4bf0: 53 74 72 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  Str))!=0 );.    
4c00: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
4c10: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
4c20: 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e  utex_held(pMem->
4c30: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
4c40: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
4c50: 41 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20  Atoi64(pMem->z, 
4c60: 26 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d  &pMem->u.i, pMem
4c70: 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 20  ->n, pMem->enc) 
4c80: 29 7b 0a 20 20 20 20 20 20 4d 65 6d 53 65 74 54  ){.      MemSetT
4c90: 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45  ypeFlag(pMem, ME
4ca0: 4d 5f 49 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  M_Int);.    }els
4cb0: 65 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  e{.      pMem->u
4cc0: 2e 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  .r = sqlite3Vdbe
4cd0: 52 65 61 6c 56 61 6c 75 65 28 70 4d 65 6d 29 3b  RealValue(pMem);
4ce0: 0a 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70  .      MemSetTyp
4cf0: 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f  eFlag(pMem, MEM_
4d00: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Real);.      sql
4d10: 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41  ite3VdbeIntegerA
4d20: 66 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a 20  ffinity(pMem);. 
4d30: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
4d40: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4d50: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
4d60: 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 21 3d  eal|MEM_Null))!=
4d70: 30 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61  0 );.  pMem->fla
4d80: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 53 74 72 7c  gs &= ~(MEM_Str|
4d90: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72  MEM_Blob|MEM_Zer
4da0: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  o);.  return SQL
4db0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4dc0: 20 43 61 73 74 20 74 68 65 20 64 61 74 61 74 79   Cast the dataty
4dd0: 70 65 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  pe of the value 
4de0: 69 6e 20 70 4d 65 6d 20 61 63 63 6f 72 64 69 6e  in pMem accordin
4df0: 67 20 74 6f 20 74 68 65 20 61 66 66 69 6e 69 74  g to the affinit
4e00: 79 0a 2a 2a 20 22 61 66 66 22 2e 20 20 43 61 73  y.** "aff".  Cas
4e10: 74 69 6e 67 20 69 73 20 64 69 66 66 65 72 65 6e  ting is differen
4e20: 74 20 66 72 6f 6d 20 61 70 70 6c 79 69 6e 67 20  t from applying 
4e30: 61 66 66 69 6e 69 74 79 20 69 6e 20 74 68 61 74  affinity in that
4e40: 20 61 20 63 61 73 74 0a 2a 2a 20 69 73 20 66 6f   a cast.** is fo
4e50: 72 63 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20  rced.  In other 
4e60: 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65  words, the value
4e70: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
4e80: 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
4e90: 2a 20 61 66 66 69 6e 69 74 79 20 65 76 65 6e 20  * affinity even 
4ea0: 69 66 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  if that results 
4eb0: 69 6e 20 6c 6f 73 73 20 6f 66 20 64 61 74 61 2e  in loss of data.
4ec0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
4ed0: 73 0a 2a 2a 20 75 73 65 64 20 28 66 6f 72 20 65  s.** used (for e
4ee0: 78 61 6d 70 6c 65 29 20 74 6f 20 69 6d 70 6c 65  xample) to imple
4ef0: 6d 65 6e 74 20 74 68 65 20 53 51 4c 20 22 63 61  ment the SQL "ca
4f00: 73 74 28 29 22 20 6f 70 65 72 61 74 6f 72 2e 0a  st()" operator..
4f10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4f20: 64 62 65 4d 65 6d 43 61 73 74 28 4d 65 6d 20 2a  dbeMemCast(Mem *
4f30: 70 4d 65 6d 2c 20 75 38 20 61 66 66 2c 20 75 38  pMem, u8 aff, u8
4f40: 20 65 6e 63 6f 64 69 6e 67 29 7b 0a 20 20 69 66   encoding){.  if
4f50: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
4f60: 4d 45 4d 5f 4e 75 6c 6c 20 29 20 72 65 74 75 72  MEM_Null ) retur
4f70: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  n;.  switch( aff
4f80: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
4f90: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 20 7b 20  ITE_AFF_BLOB: { 
4fa0: 20 20 2f 2a 20 52 65 61 6c 6c 79 20 61 20 63 61    /* Really a ca
4fb0: 73 74 20 74 6f 20 42 4c 4f 42 20 2a 2f 0a 20 20  st to BLOB */.  
4fc0: 20 20 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66      if( (pMem->f
4fd0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29  lags & MEM_Blob)
4fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4ff0: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
5000: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 53  Affinity(pMem, S
5010: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20  QLITE_AFF_TEXT, 
5020: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20  encoding);.     
5030: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
5040: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
5050: 20 7c 7c 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61   || pMem->db->ma
5060: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5070: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
5080: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
5090: 29 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67  ) MemSetTypeFlag
50a0: 28 70 4d 65 6d 2c 20 4d 45 4d 5f 42 6c 6f 62 29  (pMem, MEM_Blob)
50b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
50c0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
50d0: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65  gs &= ~(MEM_Type
50e0: 4d 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b  Mask&~MEM_Blob);
50f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5110: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
5120: 4e 55 4d 45 52 49 43 3a 20 7b 0a 20 20 20 20 20  NUMERIC: {.     
5130: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
5140: 75 6d 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20  umerify(pMem);. 
5150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5160: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
5170: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 7b  E_AFF_INTEGER: {
5180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5190: 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
51a0: 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  pMem);.      bre
51b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
51c0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  se SQLITE_AFF_RE
51d0: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
51e0: 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66  te3VdbeMemRealif
51f0: 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62  y(pMem);.      b
5200: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5210: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5220: 20 61 73 73 65 72 74 28 20 61 66 66 3d 3d 53 51   assert( aff==SQ
5230: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
5240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
5250: 45 4d 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42 6c 6f  EM_Str==(MEM_Blo
5260: 62 3e 3e 33 29 20 29 3b 0a 20 20 20 20 20 20 70  b>>3) );.      p
5270: 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  Mem->flags |= (p
5280: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Mem->flags&MEM_B
5290: 6c 6f 62 29 3e 3e 33 3b 0a 20 20 20 20 20 20 73  lob)>>3;.      s
52a0: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
52b0: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 53  Affinity(pMem, S
52c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20  QLITE_AFF_TEXT, 
52d0: 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20  encoding);.     
52e0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
52f0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c  lags & MEM_Str |
5300: 7c 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  | pMem->db->mall
5310: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
5320: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d    pMem->flags &=
5330: 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52   ~(MEM_Int|MEM_R
5340: 65 61 6c 7c 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  eal|MEM_Blob|MEM
5350: 5f 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20 62 72  _Zero);.      br
5360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
5370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
5380: 7a 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 74  ze bulk memory t
5390: 6f 20 62 65 20 61 20 63 6f 6e 73 69 73 74 65 6e  o be a consisten
53a0: 74 20 4d 65 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  t Mem object..**
53b0: 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
53c0: 61 6d 6f 75 6e 74 20 6f 66 20 69 6e 69 74 69 61  amount of initia
53d0: 6c 69 7a 61 74 69 6f 6e 20 66 65 61 73 69 62 6c  lization feasibl
53e0: 65 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  e is performed..
53f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5400: 64 62 65 4d 65 6d 49 6e 69 74 28 4d 65 6d 20 2a  dbeMemInit(Mem *
5410: 70 4d 65 6d 2c 20 73 71 6c 69 74 65 33 20 2a 64  pMem, sqlite3 *d
5420: 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20  b, u16 flags){. 
5430: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
5440: 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  & ~MEM_TypeMask)
5450: 3d 3d 30 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66  ==0 );.  pMem->f
5460: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
5470: 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pMem->db = db;. 
5480: 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20   pMem->szMalloc 
5490: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  = 0;.}.../*.** D
54a0: 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76 69 6f  elete any previo
54b0: 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73 65 74  us value and set
54c0: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
54d0: 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20 4e 55  d in *pMem to NU
54e0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
54f0: 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65  outine calls the
5500: 20 4d 65 6d 2e 78 44 65 6c 20 64 65 73 74 72 75   Mem.xDel destru
5510: 63 74 6f 72 20 74 6f 20 64 69 73 70 6f 73 65 20  ctor to dispose 
5520: 6f 66 20 76 61 6c 75 65 73 20 74 68 61 74 0a 2a  of values that.*
5530: 2a 20 72 65 71 75 69 72 65 20 74 68 65 20 64 65  * require the de
5540: 73 74 72 75 63 74 6f 72 2e 20 20 42 75 74 20 69  structor.  But i
5550: 74 20 70 72 65 73 65 72 76 65 73 20 74 68 65 20  t preserves the 
5560: 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 6d 65 6d 6f  Mem.zMalloc memo
5570: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ry allocation..*
5580: 2a 20 54 6f 20 66 72 65 65 20 61 6c 6c 20 72 65  * To free all re
5590: 73 6f 75 72 63 65 73 2c 20 75 73 65 20 73 71 6c  sources, use sql
55a0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
55b0: 73 65 28 29 2c 20 77 68 69 63 68 20 62 6f 74 68  se(), which both
55c0: 20 63 61 6c 6c 73 20 74 68 69 73 0a 2a 2a 20 72   calls this.** r
55d0: 6f 75 74 69 6e 65 20 74 6f 20 69 6e 76 6f 6b 65  outine to invoke
55e0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
55f0: 61 6e 64 20 64 65 61 6c 6c 6f 63 61 74 65 73 20  and deallocates 
5600: 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2a 0a  Mem.zMalloc..**.
5610: 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
5620: 69 6e 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  ine to reset the
5630: 20 4d 65 6d 20 70 72 69 6f 72 20 74 6f 20 69 6e   Mem prior to in
5640: 73 65 72 74 20 61 20 6e 65 77 20 76 61 6c 75 65  sert a new value
5650: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73 71 6c 69  ..**.** Use sqli
5660: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5670: 65 28 29 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  e() to complete 
5680: 65 72 61 73 65 20 74 68 65 20 4d 65 6d 20 70 72  erase the Mem pr
5690: 69 6f 72 20 74 6f 20 61 62 61 6e 64 6f 6e 69 6e  ior to abandonin
56a0: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
56b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
56c0: 75 6c 6c 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a  ull(Mem *pMem){.
56d0: 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e    if( VdbeMemDyn
56e0: 61 6d 69 63 28 70 4d 65 6d 29 20 29 7b 0a 20 20  amic(pMem) ){.  
56f0: 20 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78    vdbeMemClearEx
5700: 74 65 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 70  ternAndSetNull(p
5710: 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
5720: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5730: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 7d   MEM_Null;.  }.}
5740: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c  .void sqlite3Val
5750: 75 65 53 65 74 4e 75 6c 6c 28 73 71 6c 69 74 65  ueSetNull(sqlite
5760: 33 5f 76 61 6c 75 65 20 2a 70 29 7b 0a 20 20 73  3_value *p){.  s
5770: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
5780: 4e 75 6c 6c 28 28 4d 65 6d 2a 29 70 29 3b 20 0a  Null((Mem*)p); .
5790: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
57a0: 61 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c  any previous val
57b0: 75 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76  ue and set the v
57c0: 61 6c 75 65 20 74 6f 20 62 65 20 61 20 42 4c 4f  alue to be a BLO
57d0: 42 20 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 6e  B of length.** n
57e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
57f0: 7a 65 72 6f 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  zeros..*/.void s
5800: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
5810: 5a 65 72 6f 42 6c 6f 62 28 4d 65 6d 20 2a 70 4d  ZeroBlob(Mem *pM
5820: 65 6d 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 73 71  em, int n){.  sq
5830: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
5840: 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65  ase(pMem);.  pMe
5850: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
5860: 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20  lob|MEM_Zero;.  
5870: 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 69  pMem->n = 0;.  i
5880: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a  f( n<0 ) n = 0;.
5890: 20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20    pMem->u.nZero 
58a0: 3d 20 6e 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63  = n;.  pMem->enc
58b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
58c0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 7d    pMem->z = 0;.}
58d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 4d 65 6d  ../*.** The pMem
58e0: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 63 6f 6e   is known to con
58f0: 74 61 69 6e 20 63 6f 6e 74 65 6e 74 20 74 68 61  tain content tha
5900: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  t needs to be de
5910: 73 74 72 6f 79 65 64 20 70 72 69 6f 72 0a 2a 2a  stroyed prior.**
5920: 20 74 6f 20 61 20 76 61 6c 75 65 20 63 68 61 6e   to a value chan
5930: 67 65 2e 20 20 53 6f 20 69 6e 76 6f 6b 65 20 74  ge.  So invoke t
5940: 68 65 20 64 65 73 74 72 75 63 74 6f 72 2c 20 74  he destructor, t
5950: 68 65 6e 20 73 65 74 20 74 68 65 20 76 61 6c 75  hen set the valu
5960: 65 20 74 6f 0a 2a 2a 20 61 20 36 34 2d 62 69 74  e to.** a 64-bit
5970: 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
5980: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
5990: 49 4e 45 20 76 6f 69 64 20 76 64 62 65 52 65 6c  INE void vdbeRel
59a0: 65 61 73 65 41 6e 64 53 65 74 49 6e 74 36 34 28  easeAndSetInt64(
59b0: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 36 34 20 76  Mem *pMem, i64 v
59c0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
59d0: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65  beMemSetNull(pMe
59e0: 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  m);.  pMem->u.i 
59f0: 3d 20 76 61 6c 3b 0a 20 20 70 4d 65 6d 2d 3e 66  = val;.  pMem->f
5a00: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
5a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
5a20: 61 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c  any previous val
5a30: 75 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76  ue and set the v
5a40: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a  alue stored in *
5a50: 70 4d 65 6d 20 74 6f 20 76 61 6c 2c 0a 2a 2a 20  pMem to val,.** 
5a60: 6d 61 6e 69 66 65 73 74 20 74 79 70 65 20 49 4e  manifest type IN
5a70: 54 45 47 45 52 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TEGER..*/.void s
5a80: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
5a90: 49 6e 74 36 34 28 4d 65 6d 20 2a 70 4d 65 6d 2c  Int64(Mem *pMem,
5aa0: 20 69 36 34 20 76 61 6c 29 7b 0a 20 20 69 66 28   i64 val){.  if(
5ab0: 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28   VdbeMemDynamic(
5ac0: 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 76 64 62  pMem) ){.    vdb
5ad0: 65 52 65 6c 65 61 73 65 41 6e 64 53 65 74 49 6e  eReleaseAndSetIn
5ae0: 74 36 34 28 70 4d 65 6d 2c 20 76 61 6c 29 3b 0a  t64(pMem, val);.
5af0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65    }else{.    pMe
5b00: 6d 2d 3e 75 2e 69 20 3d 20 76 61 6c 3b 0a 20 20  m->u.i = val;.  
5b10: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5b20: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 7d 0a 0a  MEM_Int;.  }.}..
5b30: 2f 2a 20 41 20 6e 6f 2d 6f 70 20 64 65 73 74 72  /* A no-op destr
5b40: 75 63 74 6f 72 20 2a 2f 0a 73 74 61 74 69 63 20  uctor */.static 
5b50: 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 6f 6f 70  void sqlite3Noop
5b60: 44 65 73 74 72 75 63 74 6f 72 28 76 6f 69 64 20  Destructor(void 
5b70: 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41  *p){ UNUSED_PARA
5b80: 4d 45 54 45 52 28 70 29 3b 20 7d 0a 0a 2f 2a 0a  METER(p); }../*.
5b90: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
5ba0: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d   stored in *pMem
5bb0: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
5bc0: 62 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 20 41 6c  be a NULL..** Al
5bd0: 73 6f 20 73 74 6f 72 65 20 61 20 70 6f 69 6e 74  so store a point
5be0: 65 72 20 74 6f 20 67 6f 20 77 69 74 68 20 69 74  er to go with it
5bf0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5c00: 33 56 64 62 65 4d 65 6d 53 65 74 50 6f 69 6e 74  3VdbeMemSetPoint
5c10: 65 72 28 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 2c  er(.  Mem *pMem,
5c20: 0a 20 20 76 6f 69 64 20 2a 70 50 74 72 2c 0a 20  .  void *pPtr,. 
5c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 54   const char *zPT
5c40: 79 70 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  ype,.  void (*xD
5c50: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
5c60: 29 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ).){.  assert( p
5c70: 4d 65 6d 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  Mem->flags==MEM_
5c80: 4e 75 6c 6c 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e  Null );.  pMem->
5c90: 75 2e 7a 50 54 79 70 65 20 3d 20 7a 50 54 79 70  u.zPType = zPTyp
5ca0: 65 20 3f 20 7a 50 54 79 70 65 20 3a 20 22 22 3b  e ? zPType : "";
5cb0: 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 50 74  .  pMem->z = pPt
5cc0: 72 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  r;.  pMem->flags
5cd0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f   = MEM_Null|MEM_
5ce0: 44 79 6e 7c 4d 45 4d 5f 53 75 62 74 79 70 65 7c  Dyn|MEM_Subtype|
5cf0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4d 65 6d  MEM_Term;.  pMem
5d00: 2d 3e 65 53 75 62 74 79 70 65 20 3d 20 27 70 27  ->eSubtype = 'p'
5d10: 3b 0a 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d  ;.  pMem->xDel =
5d20: 20 78 44 65 73 74 72 75 63 74 6f 72 20 3f 20 78   xDestructor ? x
5d30: 44 65 73 74 72 75 63 74 6f 72 20 3a 20 73 71 6c  Destructor : sql
5d40: 69 74 65 33 4e 6f 6f 70 44 65 73 74 72 75 63 74  ite3NoopDestruct
5d50: 6f 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  or;.}..#ifndef S
5d60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
5d70: 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
5d80: 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76 69  Delete any previ
5d90: 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73 65  ous value and se
5da0: 74 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  t the value stor
5db0: 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20 76  ed in *pMem to v
5dc0: 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73 74 20  al,.** manifest 
5dd0: 74 79 70 65 20 52 45 41 4c 2e 0a 2a 2f 0a 76 6f  type REAL..*/.vo
5de0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  id sqlite3VdbeMe
5df0: 6d 53 65 74 44 6f 75 62 6c 65 28 4d 65 6d 20 2a  mSetDouble(Mem *
5e00: 70 4d 65 6d 2c 20 64 6f 75 62 6c 65 20 76 61 6c  pMem, double val
5e10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5e20: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d 29  MemSetNull(pMem)
5e30: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
5e40: 49 73 4e 61 4e 28 76 61 6c 29 20 29 7b 0a 20 20  IsNaN(val) ){.  
5e50: 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 76 61    pMem->u.r = va
5e60: 6c 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  l;.    pMem->fla
5e70: 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20  gs = MEM_Real;. 
5e80: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5e90: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72  ** Delete any pr
5ea0: 65 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64  evious value and
5eb0: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
5ec0: 66 20 70 4d 65 6d 20 74 6f 20 62 65 20 61 6e 0a  f pMem to be an.
5ed0: 2a 2a 20 65 6d 70 74 79 20 62 6f 6f 6c 65 61 6e  ** empty boolean
5ee0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
5ef0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
5f00: 74 52 6f 77 53 65 74 28 4d 65 6d 20 2a 70 4d 65  tRowSet(Mem *pMe
5f10: 6d 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  m){.  sqlite3 *d
5f20: 62 20 3d 20 70 4d 65 6d 2d 3e 64 62 3b 0a 20 20  b = pMem->db;.  
5f30: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
5f40: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
5f50: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
5f60: 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20 73 71  wSet)==0 );.  sq
5f70: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
5f80: 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65  ase(pMem);.  pMe
5f90: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c  m->zMalloc = sql
5fa0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
5fb0: 4e 28 64 62 2c 20 36 34 29 3b 0a 20 20 69 66 28  N(db, 64);.  if(
5fc0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5fd0: 64 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  d ){.    pMem->f
5fe0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
5ff0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
6000: 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  loc = 0;.  }else
6010: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
6020: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  em->zMalloc );. 
6030: 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
6040: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6050: 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4d 65 6d  locSize(db, pMem
6060: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
6070: 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 20  pMem->u.pRowSet 
6080: 3d 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49  = sqlite3RowSetI
6090: 6e 69 74 28 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d  nit(db, pMem->zM
60a0: 61 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e 73 7a 4d  alloc, pMem->szM
60b0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 61 73 73 65  alloc);.    asse
60c0: 72 74 28 20 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77  rt( pMem->u.pRow
60d0: 53 65 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d  Set!=0 );.    pM
60e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
60f0: 52 6f 77 53 65 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f  RowSet;.  }.}../
6100: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
6110: 20 69 66 20 74 68 65 20 4d 65 6d 20 6f 62 6a 65   if the Mem obje
6120: 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 54 45  ct contains a TE
6130: 58 54 20 6f 72 20 42 4c 4f 42 20 74 68 61 74 20  XT or BLOB that 
6140: 69 73 0a 2a 2a 20 74 6f 6f 20 6c 61 72 67 65 20  is.** too large 
6150: 2d 20 77 68 6f 73 65 20 73 69 7a 65 20 65 78 63  - whose size exc
6160: 65 65 64 73 20 53 51 4c 49 54 45 5f 4d 41 58 5f  eeds SQLITE_MAX_
6170: 4c 45 4e 47 54 48 2e 0a 2a 2f 0a 69 6e 74 20 73  LENGTH..*/.int s
6180: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f  qlite3VdbeMemToo
6190: 42 69 67 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61  Big(Mem *p){.  a
61a0: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
61b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  );.  if( p->flag
61c0: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
61d0: 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 69 6e  _Blob) ){.    in
61e0: 74 20 6e 20 3d 20 70 2d 3e 6e 3b 0a 20 20 20 20  t n = p->n;.    
61f0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
6200: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
6210: 20 6e 20 2b 3d 20 70 2d 3e 75 2e 6e 5a 65 72 6f   n += p->u.nZero
6220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
6230: 72 6e 20 6e 3e 70 2d 3e 64 62 2d 3e 61 4c 69 6d  rn n>p->db->aLim
6240: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
6250: 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 72  LENGTH];.  }.  r
6260: 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 23 69 66  eturn 0; .}..#if
6270: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6280: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6290: 69 6e 65 20 70 72 65 70 61 72 65 73 20 61 20 6d  ine prepares a m
62a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 66 6f 72 20 6d  emory cell for m
62b0: 6f 64 69 66 69 63 61 74 69 6f 6e 20 62 79 20 62  odification by b
62c0: 72 65 61 6b 69 6e 67 0a 2a 2a 20 69 74 73 20 6c  reaking.** its l
62d0: 69 6e 6b 20 74 6f 20 61 20 73 68 61 6c 6c 6f 77  ink to a shallow
62e0: 20 63 6f 70 79 20 61 6e 64 20 62 79 20 6d 61 72   copy and by mar
62f0: 6b 69 6e 67 20 61 6e 79 20 63 75 72 72 65 6e 74  king any current
6300: 20 73 68 61 6c 6c 6f 77 0a 2a 2a 20 63 6f 70 69   shallow.** copi
6310: 65 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  es of this cell 
6320: 61 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  as invalid..**.*
6330: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66  * This is used f
6340: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
6350: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 20 2d 20  ebugging only - 
6360: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 73 68 61  to make sure sha
6370: 6c 6c 6f 77 0a 2a 2a 20 63 6f 70 69 65 73 20 61  llow.** copies a
6380: 72 65 20 6e 6f 74 20 6d 69 73 75 73 65 64 2e 0a  re not misused..
6390: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
63a0: 64 62 65 4d 65 6d 41 62 6f 75 74 54 6f 43 68 61  dbeMemAboutToCha
63b0: 6e 67 65 28 56 64 62 65 20 2a 70 56 64 62 65 2c  nge(Vdbe *pVdbe,
63c0: 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69   Mem *pMem){.  i
63d0: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b  nt i;.  Mem *pX;
63e0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 58 3d 70  .  for(i=0, pX=p
63f0: 56 64 62 65 2d 3e 61 4d 65 6d 3b 20 69 3c 70 56  Vdbe->aMem; i<pV
6400: 64 62 65 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 2c 20  dbe->nMem; i++, 
6410: 70 58 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  pX++){.    if( p
6420: 58 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 70  X->pScopyFrom==p
6430: 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 58 2d  Mem ){.      pX-
6440: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 55 6e  >flags |= MEM_Un
6450: 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20 70  defined;.      p
6460: 58 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20  X->pScopyFrom = 
6470: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  0;.    }.  }.  p
6480: 4d 65 6d 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Mem->pScopyFrom 
6490: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
64a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
64b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e  .../*.** Make an
64c0: 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66   shallow copy of
64d0: 20 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e   pFrom into pTo.
64e0: 20 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74 73    Prior contents
64f0: 20 6f 66 0a 2a 2a 20 70 54 6f 20 61 72 65 20 66   of.** pTo are f
6500: 72 65 65 64 2e 20 20 54 68 65 20 70 46 72 6f 6d  reed.  The pFrom
6510: 2d 3e 7a 20 66 69 65 6c 64 20 69 73 20 6e 6f 74  ->z field is not
6520: 20 64 75 70 6c 69 63 61 74 65 64 2e 20 20 49 66   duplicated.  If
6530: 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 7a 20 69 73 20  .** pFrom->z is 
6540: 75 73 65 64 2c 20 74 68 65 6e 20 70 54 6f 2d 3e  used, then pTo->
6550: 7a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  z points to the 
6560: 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 70 46  same thing as pF
6570: 72 6f 6d 2d 3e 7a 0a 2a 2a 20 61 6e 64 20 66 6c  rom->z.** and fl
6580: 61 67 73 20 67 65 74 73 20 73 72 63 54 79 70 65  ags gets srcType
6590: 20 28 65 69 74 68 65 72 20 4d 45 4d 5f 45 70 68   (either MEM_Eph
65a0: 65 6d 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69 63  em or MEM_Static
65b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
65c0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
65d0: 64 20 76 64 62 65 43 6c 72 43 6f 70 79 28 4d 65  d vdbeClrCopy(Me
65e0: 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 4d 65  m *pTo, const Me
65f0: 6d 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 65 54  m *pFrom, int eT
6600: 79 70 65 29 7b 0a 20 20 76 64 62 65 4d 65 6d 43  ype){.  vdbeMemC
6610: 6c 65 61 72 45 78 74 65 72 6e 41 6e 64 53 65 74  learExternAndSet
6620: 4e 75 6c 6c 28 70 54 6f 29 3b 0a 20 20 61 73 73  Null(pTo);.  ass
6630: 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44 79 6e  ert( !VdbeMemDyn
6640: 61 6d 69 63 28 70 54 6f 29 20 29 3b 0a 20 20 73  amic(pTo) );.  s
6650: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
6660: 6c 6c 6f 77 43 6f 70 79 28 70 54 6f 2c 20 70 46  llowCopy(pTo, pF
6670: 72 6f 6d 2c 20 65 54 79 70 65 29 3b 0a 7d 0a 76  rom, eType);.}.v
6680: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
6690: 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 4d 65  emShallowCopy(Me
66a0: 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 4d 65  m *pTo, const Me
66b0: 6d 20 2a 70 46 72 6f 6d 2c 20 69 6e 74 20 73 72  m *pFrom, int sr
66c0: 63 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  cType){.  assert
66d0: 28 20 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 20  ( (pFrom->flags 
66e0: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
66f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
6700: 6f 2d 3e 64 62 3d 3d 70 46 72 6f 6d 2d 3e 64 62  o->db==pFrom->db
6710: 20 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65   );.  if( VdbeMe
6720: 6d 44 79 6e 61 6d 69 63 28 70 54 6f 29 20 29 7b  mDynamic(pTo) ){
6730: 20 76 64 62 65 43 6c 72 43 6f 70 79 28 70 54 6f   vdbeClrCopy(pTo
6740: 2c 70 46 72 6f 6d 2c 73 72 63 54 79 70 65 29 3b  ,pFrom,srcType);
6750: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 6d 65 6d   return; }.  mem
6760: 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20  cpy(pTo, pFrom, 
6770: 4d 45 4d 43 45 4c 4c 53 49 5a 45 29 3b 0a 20 20  MEMCELLSIZE);.  
6780: 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 6c 61 67  if( (pFrom->flag
6790: 73 26 4d 45 4d 5f 53 74 61 74 69 63 29 3d 3d 30  s&MEM_Static)==0
67a0: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 66 6c 61   ){.    pTo->fla
67b0: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 44 79 6e 7c  gs &= ~(MEM_Dyn|
67c0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45  MEM_Static|MEM_E
67d0: 70 68 65 6d 29 3b 0a 20 20 20 20 61 73 73 65 72  phem);.    asser
67e0: 74 28 20 73 72 63 54 79 70 65 3d 3d 4d 45 4d 5f  t( srcType==MEM_
67f0: 45 70 68 65 6d 20 7c 7c 20 73 72 63 54 79 70 65  Ephem || srcType
6800: 3d 3d 4d 45 4d 5f 53 74 61 74 69 63 20 29 3b 0a  ==MEM_Static );.
6810: 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20 7c      pTo->flags |
6820: 3d 20 73 72 63 54 79 70 65 3b 0a 20 20 7d 0a 7d  = srcType;.  }.}
6830: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 66  ../*.** Make a f
6840: 75 6c 6c 20 63 6f 70 79 20 6f 66 20 70 46 72 6f  ull copy of pFro
6850: 6d 20 69 6e 74 6f 20 70 54 6f 2e 20 20 50 72 69  m into pTo.  Pri
6860: 6f 72 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  or contents of p
6870: 54 6f 20 61 72 65 0a 2a 2a 20 66 72 65 65 64 20  To are.** freed 
6880: 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20  before the copy 
6890: 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a 69 6e 74 20  is made..*/.int 
68a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
68b0: 70 79 28 4d 65 6d 20 2a 70 54 6f 2c 20 63 6f 6e  py(Mem *pTo, con
68c0: 73 74 20 4d 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  st Mem *pFrom){.
68d0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
68e0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
68f0: 20 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 20 26   (pFrom->flags &
6900: 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
6910: 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d  );.  if( VdbeMem
6920: 44 79 6e 61 6d 69 63 28 70 54 6f 29 20 29 20 76  Dynamic(pTo) ) v
6930: 64 62 65 4d 65 6d 43 6c 65 61 72 45 78 74 65 72  dbeMemClearExter
6940: 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 70 54 6f 29  nAndSetNull(pTo)
6950: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  ;.  memcpy(pTo, 
6960: 70 46 72 6f 6d 2c 20 4d 45 4d 43 45 4c 4c 53 49  pFrom, MEMCELLSI
6970: 5a 45 29 3b 0a 20 20 70 54 6f 2d 3e 66 6c 61 67  ZE);.  pTo->flag
6980: 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b 0a 20  s &= ~MEM_Dyn;. 
6990: 20 69 66 28 20 70 54 6f 2d 3e 66 6c 61 67 73 26   if( pTo->flags&
69a0: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
69b0: 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  b) ){.    if( 0=
69c0: 3d 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 26 4d  =(pFrom->flags&M
69d0: 45 4d 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20  EM_Static) ){.  
69e0: 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20 7c      pTo->flags |
69f0: 3d 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  = MEM_Ephem;.   
6a00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
6a10: 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61  dbeMemMakeWritea
6a20: 62 6c 65 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  ble(pTo);.    }.
6a30: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
6a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
6a50: 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  fer the contents
6a60: 20 6f 66 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f   of pFrom to pTo
6a70: 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 76  . Any existing v
6a80: 61 6c 75 65 20 69 6e 20 70 54 6f 20 69 73 0a 2a  alue in pTo is.*
6a90: 2a 20 66 72 65 65 64 2e 20 49 66 20 70 46 72 6f  * freed. If pFro
6aa0: 6d 20 63 6f 6e 74 61 69 6e 73 20 65 70 68 65 6d  m contains ephem
6ab0: 65 72 61 6c 20 64 61 74 61 2c 20 61 20 63 6f 70  eral data, a cop
6ac0: 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2a 0a 2a 2a  y is made..**.**
6ad0: 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 73 20   pFrom contains 
6ae0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 77 68 65 6e  an SQL NULL when
6af0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
6b00: 74 75 72 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  turns..*/.void s
6b10: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
6b20: 65 28 4d 65 6d 20 2a 70 54 6f 2c 20 4d 65 6d 20  e(Mem *pTo, Mem 
6b30: 2a 70 46 72 6f 6d 29 7b 0a 20 20 61 73 73 65 72  *pFrom){.  asser
6b40: 74 28 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30 20  t( pFrom->db==0 
6b50: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
6b60: 5f 68 65 6c 64 28 70 46 72 6f 6d 2d 3e 64 62 2d  _held(pFrom->db-
6b70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
6b80: 65 72 74 28 20 70 54 6f 2d 3e 64 62 3d 3d 30 20  ert( pTo->db==0 
6b90: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
6ba0: 5f 68 65 6c 64 28 70 54 6f 2d 3e 64 62 2d 3e 6d  _held(pTo->db->m
6bb0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
6bc0: 74 28 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30 20  t( pFrom->db==0 
6bd0: 7c 7c 20 70 54 6f 2d 3e 64 62 3d 3d 30 20 7c 7c  || pTo->db==0 ||
6be0: 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 70 54 6f 2d   pFrom->db==pTo-
6bf0: 3e 64 62 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  >db );..  sqlite
6c00: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
6c10: 70 54 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  pTo);.  memcpy(p
6c20: 54 6f 2c 20 70 46 72 6f 6d 2c 20 73 69 7a 65 6f  To, pFrom, sizeo
6c30: 66 28 4d 65 6d 29 29 3b 0a 20 20 70 46 72 6f 6d  f(Mem));.  pFrom
6c40: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
6c50: 6c 6c 3b 0a 20 20 70 46 72 6f 6d 2d 3e 73 7a 4d  ll;.  pFrom->szM
6c60: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  alloc = 0;.}../*
6c70: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6c80: 61 6c 75 65 20 6f 66 20 61 20 4d 65 6d 20 74 6f  alue of a Mem to
6c90: 20 62 65 20 61 20 73 74 72 69 6e 67 20 6f 72 20   be a string or 
6ca0: 61 20 42 4c 4f 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  a BLOB..**.** Th
6cb0: 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  e memory managem
6cc0: 65 6e 74 20 73 74 72 61 74 65 67 79 20 64 65 70  ent strategy dep
6cd0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
6ce0: 65 20 6f 66 20 74 68 65 20 78 44 65 6c 0a 2a 2a  e of the xDel.**
6cf0: 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 74   parameter. If t
6d00: 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
6d10: 69 73 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  is SQLITE_TRANSI
6d20: 45 4e 54 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ENT, then the .*
6d30: 2a 20 73 74 72 69 6e 67 20 69 73 20 63 6f 70 69  * string is copi
6d40: 65 64 20 69 6e 74 6f 20 61 20 28 70 6f 73 73 69  ed into a (possi
6d50: 62 6c 79 20 65 78 69 73 74 69 6e 67 29 20 62 75  bly existing) bu
6d60: 66 66 65 72 20 6d 61 6e 61 67 65 64 20 62 79 20  ffer managed by 
6d70: 74 68 65 20 0a 2a 2a 20 4d 65 6d 20 73 74 72 75  the .** Mem stru
6d80: 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65  cture. Otherwise
6d90: 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 62  , any existing b
6da0: 75 66 66 65 72 20 69 73 20 66 72 65 65 64 20 61  uffer is freed a
6db0: 6e 64 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65  nd the.** pointe
6dc0: 72 20 63 6f 70 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  r copied..**.** 
6dd0: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  If the string is
6de0: 20 74 6f 6f 20 6c 61 72 67 65 20 28 69 66 20 69   too large (if i
6df0: 74 20 65 78 63 65 65 64 73 20 74 68 65 20 53 51  t exceeds the SQ
6e00: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
6e10: 48 0a 2a 2a 20 73 69 7a 65 20 6c 69 6d 69 74 29  H.** size limit)
6e20: 20 74 68 65 6e 20 6e 6f 20 6d 65 6d 6f 72 79 20   then no memory 
6e30: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 63 63 75 72  allocation occur
6e40: 73 2e 20 20 49 66 20 74 68 65 20 73 74 72 69 6e  s.  If the strin
6e50: 67 20 63 61 6e 20 62 65 0a 2a 2a 20 73 74 6f 72  g can be.** stor
6e60: 65 64 20 77 69 74 68 6f 75 74 20 61 6c 6c 6f 63  ed without alloc
6e70: 61 74 69 6e 67 20 6d 65 6d 6f 72 79 2c 20 74 68  ating memory, th
6e80: 65 6e 20 69 74 20 69 73 2e 20 20 49 66 20 61 20  en it is.  If a 
6e90: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6ea0: 6e 0a 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64  n.** is required
6eb0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 74   to store the st
6ec0: 72 69 6e 67 2c 20 74 68 65 6e 20 76 61 6c 75 65  ring, then value
6ed0: 20 6f 66 20 70 4d 65 6d 20 69 73 20 75 6e 63 68   of pMem is unch
6ee0: 61 6e 67 65 64 2e 20 20 49 6e 0a 2a 2a 20 65 69  anged.  In.** ei
6ef0: 74 68 65 72 20 63 61 73 65 2c 20 53 51 4c 49 54  ther case, SQLIT
6f00: 45 5f 54 4f 4f 42 49 47 20 69 73 20 72 65 74 75  E_TOOBIG is retu
6f10: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
6f20: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
6f30: 72 28 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  r(.  Mem *pMem, 
6f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
6f50: 72 79 20 63 65 6c 6c 20 74 6f 20 73 65 74 20 74  ry cell to set t
6f60: 6f 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 2a  o string value *
6f70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6f80: 7a 2c 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e  z,      /* Strin
6f90: 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  g pointer */.  i
6fa0: 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
6fb0: 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 73     /* Bytes in s
6fc0: 74 72 69 6e 67 2c 20 6f 72 20 6e 65 67 61 74 69  tring, or negati
6fd0: 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20  ve */.  u8 enc, 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6ff0: 6e 63 6f 64 69 6e 67 20 6f 66 20 7a 2e 20 20 30  ncoding of z.  0
7000: 20 66 6f 72 20 42 4c 4f 42 73 20 2a 2f 0a 20 20   for BLOBs */.  
7010: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
7020: 64 2a 29 20 2f 2a 20 44 65 73 74 72 75 63 74 6f  d*) /* Destructo
7030: 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  r function */.){
7040: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e  .  int nByte = n
7050: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 61  ;      /* New va
7060: 6c 75 65 20 66 6f 72 20 70 4d 65 6d 2d 3e 6e 20  lue for pMem->n 
7070: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  */.  int iLimit;
7080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
7090: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 74 72 69  mum allowed stri
70a0: 6e 67 20 6f 72 20 62 6c 6f 62 20 73 69 7a 65 20  ng or blob size 
70b0: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 20 3d  */.  u16 flags =
70c0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20   0;      /* New 
70d0: 76 61 6c 75 65 20 66 6f 72 20 70 4d 65 6d 2d 3e  value for pMem->
70e0: 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 61 73 73 65  flags */..  asse
70f0: 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20  rt( pMem->db==0 
7100: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
7110: 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e  _held(pMem->db->
7120: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
7130: 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
7140: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
7150: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 7a 20  0 );..  /* If z 
7160: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
7170: 72 2c 20 73 65 74 20 70 4d 65 6d 20 74 6f 20 63  r, set pMem to c
7180: 6f 6e 74 61 69 6e 20 61 6e 20 53 51 4c 20 4e 55  ontain an SQL NU
7190: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 21 7a 20  LL. */.  if( !z 
71a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
71b0: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65  beMemSetNull(pMe
71c0: 6d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  m);.    return S
71d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
71e0: 20 69 66 28 20 70 4d 65 6d 2d 3e 64 62 20 29 7b   if( pMem->db ){
71f0: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 4d  .    iLimit = pM
7200: 65 6d 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  em->db->aLimit[S
7210: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
7220: 54 48 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  TH];.  }else{.  
7230: 20 20 69 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54    iLimit = SQLIT
7240: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3b 0a 20 20  E_MAX_LENGTH;.  
7250: 7d 0a 20 20 66 6c 61 67 73 20 3d 20 28 65 6e 63  }.  flags = (enc
7260: 3d 3d 30 3f 4d 45 4d 5f 42 6c 6f 62 3a 4d 45 4d  ==0?MEM_Blob:MEM
7270: 5f 53 74 72 29 3b 0a 20 20 69 66 28 20 6e 42 79  _Str);.  if( nBy
7280: 74 65 3c 30 20 29 7b 0a 20 20 20 20 61 73 73 65  te<0 ){.    asse
7290: 72 74 28 20 65 6e 63 21 3d 30 20 29 3b 0a 20 20  rt( enc!=0 );.  
72a0: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
72b0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20  E_UTF8 ){.      
72c0: 6e 42 79 74 65 20 3d 20 30 78 37 66 66 66 66 66  nByte = 0x7fffff
72d0: 66 66 20 26 20 28 69 6e 74 29 73 74 72 6c 65 6e  ff & (int)strlen
72e0: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
72f0: 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 20 6e 42  Byte>iLimit ) nB
7300: 79 74 65 20 3d 20 69 4c 69 6d 69 74 2b 31 3b 0a  yte = iLimit+1;.
7310: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7320: 20 66 6f 72 28 6e 42 79 74 65 3d 30 3b 20 6e 42   for(nByte=0; nB
7330: 79 74 65 3c 3d 69 4c 69 6d 69 74 20 26 26 20 28  yte<=iLimit && (
7340: 7a 5b 6e 42 79 74 65 5d 20 7c 20 7a 5b 6e 42 79  z[nByte] | z[nBy
7350: 74 65 2b 31 5d 29 3b 20 6e 42 79 74 65 2b 3d 32  te+1]); nByte+=2
7360: 29 7b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6c  ){}.    }.    fl
7370: 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b  ags |= MEM_Term;
7380: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
7390: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
73a0: 65 74 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75  ets the new valu
73b0: 65 73 20 6f 66 20 4d 65 6d 2e 7a 20 61 6e 64 20  es of Mem.z and 
73c0: 4d 65 6d 2e 78 44 65 6c 2e 20 49 74 0a 20 20 2a  Mem.xDel. It.  *
73d0: 2a 20 61 6c 73 6f 20 73 65 74 73 20 61 20 66 6c  * also sets a fl
73e0: 61 67 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  ag in local vari
73f0: 61 62 6c 65 20 22 66 6c 61 67 73 22 20 74 6f 20  able "flags" to 
7400: 69 6e 64 69 63 61 74 65 20 74 68 65 20 6d 65 6d  indicate the mem
7410: 6f 72 79 0a 20 20 2a 2a 20 6d 61 6e 61 67 65 6d  ory.  ** managem
7420: 65 6e 74 20 28 6f 6e 65 20 6f 66 20 4d 45 4d 5f  ent (one of MEM_
7430: 44 79 6e 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69  Dyn or MEM_Stati
7440: 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 78  c)..  */.  if( x
7450: 44 65 6c 3d 3d 53 51 4c 49 54 45 5f 54 52 41 4e  Del==SQLITE_TRAN
7460: 53 49 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74  SIENT ){.    int
7470: 20 6e 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 3b   nAlloc = nByte;
7480: 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 26 4d  .    if( flags&M
7490: 45 4d 5f 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  EM_Term ){.     
74a0: 20 6e 41 6c 6c 6f 63 20 2b 3d 20 28 65 6e 63 3d   nAlloc += (enc=
74b0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32  =SQLITE_UTF8?1:2
74c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
74d0: 20 6e 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 7b   nByte>iLimit ){
74e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
74f0: 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 20  LITE_TOOBIG;.   
7500: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
7510: 20 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20   nAlloc==0 );.  
7520: 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 6c 6c    testcase( nAll
7530: 6f 63 3d 3d 33 31 20 29 3b 0a 20 20 20 20 74 65  oc==31 );.    te
7540: 73 74 63 61 73 65 28 20 6e 41 6c 6c 6f 63 3d 3d  stcase( nAlloc==
7550: 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  32 );.    if( sq
7560: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
7570: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
7580: 20 4d 41 58 28 6e 41 6c 6c 6f 63 2c 33 32 29 29   MAX(nAlloc,32))
7590: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
75a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
75b0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  PT;.    }.    me
75c0: 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 7a 2c  mcpy(pMem->z, z,
75d0: 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 7d 65 6c 73   nAlloc);.  }els
75e0: 65 20 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c 49  e if( xDel==SQLI
75f0: 54 45 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  TE_DYNAMIC ){.  
7600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7610: 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
7620: 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
7630: 20 3d 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68   = pMem->z = (ch
7640: 61 72 20 2a 29 7a 3b 0a 20 20 20 20 70 4d 65 6d  ar *)z;.    pMem
7650: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c  ->szMalloc = sql
7660: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
7670: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
7680: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 7d 65 6c  >zMalloc);.  }el
7690: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
76a0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
76b0: 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  em);.    pMem->z
76c0: 20 3d 20 28 63 68 61 72 20 2a 29 7a 3b 0a 20 20   = (char *)z;.  
76d0: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 78    pMem->xDel = x
76e0: 44 65 6c 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c  Del;.    flags |
76f0: 3d 20 28 28 78 44 65 6c 3d 3d 53 51 4c 49 54 45  = ((xDel==SQLITE
7700: 5f 53 54 41 54 49 43 29 3f 4d 45 4d 5f 53 74 61  _STATIC)?MEM_Sta
7710: 74 69 63 3a 4d 45 4d 5f 44 79 6e 29 3b 0a 20 20  tic:MEM_Dyn);.  
7720: 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6e  }..  pMem->n = n
7730: 42 79 74 65 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c  Byte;.  pMem->fl
7740: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 70  ags = flags;.  p
7750: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 28 65 6e 63 3d  Mem->enc = (enc=
7760: 3d 30 20 3f 20 53 51 4c 49 54 45 5f 55 54 46 38  =0 ? SQLITE_UTF8
7770: 20 3a 20 65 6e 63 29 3b 0a 0a 23 69 66 6e 64 65   : enc);..#ifnde
7780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
7790: 46 31 36 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e  F16.  if( pMem->
77a0: 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc!=SQLITE_UTF8
77b0: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4d   && sqlite3VdbeM
77c0: 65 6d 48 61 6e 64 6c 65 42 6f 6d 28 70 4d 65 6d  emHandleBom(pMem
77d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
77e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
77f0: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
7800: 20 69 66 28 20 6e 42 79 74 65 3e 69 4c 69 6d 69   if( nByte>iLimi
7810: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
7820: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a 20  SQLITE_TOOBIG;. 
7830: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
7840: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7850: 20 4d 6f 76 65 20 64 61 74 61 20 6f 75 74 20 6f   Move data out o
7860: 66 20 61 20 62 74 72 65 65 20 6b 65 79 20 6f 72  f a btree key or
7870: 20 64 61 74 61 20 66 69 65 6c 64 20 61 6e 64 20   data field and 
7880: 69 6e 74 6f 20 61 20 4d 65 6d 20 73 74 72 75 63  into a Mem struc
7890: 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 64 61 74  ture..** The dat
78a0: 61 20 69 73 20 70 61 79 6c 6f 61 64 20 66 72 6f  a is payload fro
78b0: 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
78c0: 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74   pCur is current
78d0: 6c 79 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ly pointing.** t
78e0: 6f 2e 20 20 6f 66 66 73 65 74 20 61 6e 64 20 61  o.  offset and a
78f0: 6d 74 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61  mt determine wha
7900: 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
7910: 20 64 61 74 61 20 6f 72 20 6b 65 79 20 74 6f 20   data or key to 
7920: 72 65 74 72 69 65 76 65 2e 0a 2a 2a 20 54 68 65  retrieve..** The
7930: 20 72 65 73 75 6c 74 20 69 73 20 77 72 69 74 74   result is writt
7940: 65 6e 20 69 6e 74 6f 20 74 68 65 20 70 4d 65 6d  en into the pMem
7950: 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   element..**.** 
7960: 54 68 65 20 70 4d 65 6d 20 6f 62 6a 65 63 74 20  The pMem object 
7970: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 69  must have been i
7980: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 69  nitialized.  Thi
7990: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
79a0: 73 65 0a 2a 2a 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  se.** pMem->zMal
79b0: 6c 6f 63 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  loc to hold the 
79c0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
79d0: 20 62 74 72 65 65 2c 20 69 66 20 70 6f 73 73 69   btree, if possi
79e0: 62 6c 65 2e 20 20 4e 65 77 0a 2a 2a 20 70 4d 65  ble.  New.** pMe
79f0: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 73 70 61 63 65  m->zMalloc space
7a00: 20 77 69 6c 6c 20 62 65 20 61 6c 6c 6f 63 61 74   will be allocat
7a10: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ed if necessary.
7a20: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f    The calling ro
7a30: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 72 65 73 70  utine.** is resp
7a40: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
7a50: 6e 67 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ng sure that the
7a60: 20 70 4d 65 6d 20 6f 62 6a 65 63 74 20 69 73 20   pMem object is 
7a70: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 64 65  eventually.** de
7a80: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  stroyed..**.** I
7a90: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
7aa0: 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
7ab0: 73 6f 6e 20 28 6d 61 6c 6c 6f 63 20 72 65 74 75  son (malloc retu
7ac0: 72 6e 73 20 4e 55 4c 4c 20 6f 72 20 75 6e 61 62  rns NULL or unab
7ad0: 6c 65 0a 2a 2a 20 74 6f 20 72 65 61 64 20 66 72  le.** to read fr
7ae0: 6f 6d 20 74 68 65 20 64 69 73 6b 29 20 74 68 65  om the disk) the
7af0: 6e 20 74 68 65 20 70 4d 65 6d 20 69 73 20 6c 65  n the pMem is le
7b00: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
7b10: 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 2a 2f 0a  stent state..*/.
7b20: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
7b30: 49 4e 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 4d  INLINE int vdbeM
7b40: 65 6d 46 72 6f 6d 42 74 72 65 65 52 65 73 69 7a  emFromBtreeResiz
7b50: 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  e(.  BtCursor *p
7b60: 43 75 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72  Cur,   /* Cursor
7b70: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 72 65 63   pointing at rec
7b80: 6f 72 64 20 74 6f 20 72 65 74 72 69 65 76 65 2e  ord to retrieve.
7b90: 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
7ba0: 2c 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ,       /* Offse
7bb0: 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  t from the start
7bc0: 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 74 75   of data to retu
7bd0: 72 6e 20 62 79 74 65 73 20 66 72 6f 6d 2e 20 2a  rn bytes from. *
7be0: 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
7bf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7c00: 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 74 75  of bytes to retu
7c10: 72 6e 2e 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  rn. */.  Mem *pM
7c20: 65 6d 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  em         /* OU
7c30: 54 3a 20 52 65 74 75 72 6e 20 64 61 74 61 20 69  T: Return data i
7c40: 6e 20 74 68 69 73 20 4d 65 6d 20 73 74 72 75 63  n this Mem struc
7c50: 74 75 72 65 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ture. */.){.  in
7c60: 74 20 72 63 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c  t rc;.  pMem->fl
7c70: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
7c80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
7c90: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64  =(rc = sqlite3Vd
7ca0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
7cb0: 69 7a 65 28 70 4d 65 6d 2c 20 61 6d 74 2b 32 29  ize(pMem, amt+2)
7cc0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
7cd0: 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
7ce0: 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
7cf0: 61 6d 74 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  amt, pMem->z);. 
7d00: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7d10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4d  E_OK ){.      pM
7d20: 65 6d 2d 3e 7a 5b 61 6d 74 5d 20 3d 20 30 3b 0a  em->z[amt] = 0;.
7d30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 61 6d        pMem->z[am
7d40: 74 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t+1] = 0;.      
7d50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
7d60: 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 54 65 72 6d 3b  M_Blob|MEM_Term;
7d70: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
7d80: 20 28 69 6e 74 29 61 6d 74 3b 0a 20 20 20 20 7d   (int)amt;.    }
7d90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
7da0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7db0: 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(pMem);.    }. 
7dc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7dd0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
7de0: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 0a 20  eMemFromBtree(. 
7df0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
7e00: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
7e10: 6e 74 69 6e 67 20 61 74 20 72 65 63 6f 72 64 20  nting at record 
7e20: 74 6f 20 72 65 74 72 69 65 76 65 2e 20 2a 2f 0a  to retrieve. */.
7e30: 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
7e40: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
7e50: 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
7e60: 64 61 74 61 20 74 6f 20 72 65 74 75 72 6e 20 62  data to return b
7e70: 79 74 65 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ytes from. */.  
7e80: 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
7e90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7ea0: 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 2e 20  ytes to return. 
7eb0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
7ec0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
7ed0: 65 74 75 72 6e 20 64 61 74 61 20 69 6e 20 74 68  eturn data in th
7ee0: 69 73 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65  is Mem structure
7ef0: 2e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  . */.){.  char *
7f00: 7a 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a  zData;        /*
7f10: 20 44 61 74 61 20 66 72 6f 6d 20 74 68 65 20 62   Data from the b
7f20: 74 72 65 65 20 6c 61 79 65 72 20 2a 2f 0a 20 20  tree layer */.  
7f30: 75 33 32 20 61 76 61 69 6c 61 62 6c 65 20 3d 20  u32 available = 
7f40: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
7f50: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
7f60: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 62 74   on the local bt
7f70: 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ree page */.  in
7f80: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7f90: 3b 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  ; /* Return code
7fa0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
7fb0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7fc0: 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
7fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 56 64 62  ;.  assert( !Vdb
7fe0: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4d 65 6d  eMemDynamic(pMem
7ff0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 3a  ) );..  /* Note:
8000: 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 42 74   the calls to Bt
8010: 72 65 65 4b 65 79 46 65 74 63 68 28 29 20 61 6e  reeKeyFetch() an
8020: 64 20 44 61 74 61 46 65 74 63 68 28 29 20 62 65  d DataFetch() be
8030: 6c 6f 77 20 61 73 73 65 72 74 28 29 20 0a 20 20  low assert() .  
8040: 2a 2a 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  ** that both the
8050: 20 42 74 53 68 61 72 65 64 20 61 6e 64 20 64 61   BtShared and da
8060: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6d 75  tabase handle mu
8070: 74 65 78 65 73 20 61 72 65 20 68 65 6c 64 2e 20  texes are held. 
8080: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  */.  assert( (pM
8090: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
80a0: 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20  RowSet)==0 );.  
80b0: 7a 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  zData = (char *)
80c0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
80d0: 6f 61 64 46 65 74 63 68 28 70 43 75 72 2c 20 26  oadFetch(pCur, &
80e0: 61 76 61 69 6c 61 62 6c 65 29 3b 0a 20 20 61 73  available);.  as
80f0: 73 65 72 74 28 20 7a 44 61 74 61 21 3d 30 20 29  sert( zData!=0 )
8100: 3b 0a 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b  ;..  if( offset+
8110: 61 6d 74 3c 3d 61 76 61 69 6c 61 62 6c 65 20 29  amt<=available )
8120: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  {.    pMem->z = 
8130: 26 7a 44 61 74 61 5b 6f 66 66 73 65 74 5d 3b 0a  &zData[offset];.
8140: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
8150: 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  = MEM_Blob|MEM_E
8160: 70 68 65 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  phem;.    pMem->
8170: 6e 20 3d 20 28 69 6e 74 29 61 6d 74 3b 0a 20 20  n = (int)amt;.  
8180: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
8190: 76 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  vdbeMemFromBtree
81a0: 52 65 73 69 7a 65 28 70 43 75 72 2c 20 6f 66 66  Resize(pCur, off
81b0: 73 65 74 2c 20 61 6d 74 2c 20 70 4d 65 6d 29 3b  set, amt, pMem);
81c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
81d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
81e0: 70 56 61 6c 20 61 72 67 75 6d 65 6e 74 20 69 73  pVal argument is
81f0: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 61 20 76   known to be a v
8200: 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20  alue other than 
8210: 4e 55 4c 4c 2e 0a 2a 2a 20 43 6f 6e 76 65 72 74  NULL..** Convert
8220: 20 69 74 20 69 6e 74 6f 20 61 20 73 74 72 69 6e   it into a strin
8230: 67 20 77 69 74 68 20 65 6e 63 6f 64 69 6e 67 20  g with encoding 
8240: 65 6e 63 20 61 6e 64 20 72 65 74 75 72 6e 20 61  enc and return a
8250: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
8260: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
8270: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74   version of that
8280: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
8290: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
82a0: 4e 45 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76  NE const void *v
82b0: 61 6c 75 65 54 6f 54 65 78 74 28 73 71 6c 69 74  alueToText(sqlit
82c0: 65 33 5f 76 61 6c 75 65 2a 20 70 56 61 6c 2c 20  e3_value* pVal, 
82d0: 75 38 20 65 6e 63 29 7b 0a 20 20 61 73 73 65 72  u8 enc){.  asser
82e0: 74 28 20 70 56 61 6c 21 3d 30 20 29 3b 0a 20 20  t( pVal!=0 );.  
82f0: 61 73 73 65 72 74 28 20 70 56 61 6c 2d 3e 64 62  assert( pVal->db
8300: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
8310: 75 74 65 78 5f 68 65 6c 64 28 70 56 61 6c 2d 3e  utex_held(pVal->
8320: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
8330: 61 73 73 65 72 74 28 20 28 65 6e 63 26 33 29 3d  assert( (enc&3)=
8340: 3d 28 65 6e 63 26 7e 53 51 4c 49 54 45 5f 55 54  =(enc&~SQLITE_UT
8350: 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 29 3b 0a  F16_ALIGNED) );.
8360: 20 20 61 73 73 65 72 74 28 20 28 70 56 61 6c 2d    assert( (pVal-
8370: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
8380: 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Set)==0 );.  ass
8390: 65 72 74 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67  ert( (pVal->flag
83a0: 73 20 26 20 28 4d 45 4d 5f 4e 75 6c 6c 29 29 3d  s & (MEM_Null))=
83b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c  =0 );.  if( pVal
83c0: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42  ->flags & (MEM_B
83d0: 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a  lob|MEM_Str) ){.
83e0: 20 20 20 20 69 66 28 20 45 78 70 61 6e 64 42 6c      if( ExpandBl
83f0: 6f 62 28 70 56 61 6c 29 20 29 20 72 65 74 75 72  ob(pVal) ) retur
8400: 6e 20 30 3b 0a 20 20 20 20 70 56 61 6c 2d 3e 66  n 0;.    pVal->f
8410: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 72 3b  lags |= MEM_Str;
8420: 0a 20 20 20 20 69 66 28 20 70 56 61 6c 2d 3e 65  .    if( pVal->e
8430: 6e 63 20 21 3d 20 28 65 6e 63 20 26 20 7e 53 51  nc != (enc & ~SQ
8440: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
8450: 45 44 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ED) ){.      sql
8460: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
8470: 63 6f 64 69 6e 67 28 70 56 61 6c 2c 20 65 6e 63  coding(pVal, enc
8480: 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
8490: 5f 41 4c 49 47 4e 45 44 29 3b 0a 20 20 20 20 7d  _ALIGNED);.    }
84a0: 0a 20 20 20 20 69 66 28 20 28 65 6e 63 20 26 20  .    if( (enc & 
84b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
84c0: 47 4e 45 44 29 21 3d 30 20 26 26 20 31 3d 3d 28  GNED)!=0 && 1==(
84d0: 31 26 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  1&SQLITE_PTR_TO_
84e0: 49 4e 54 28 70 56 61 6c 2d 3e 7a 29 29 20 29 7b  INT(pVal->z)) ){
84f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
8500: 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pVal->flags & (M
8510: 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61  EM_Ephem|MEM_Sta
8520: 74 69 63 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  tic))!=0 );.    
8530: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
8540: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
8550: 65 28 70 56 61 6c 29 21 3d 53 51 4c 49 54 45 5f  e(pVal)!=SQLITE_
8560: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
8570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
8580: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8590: 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69  3VdbeMemNulTermi
85a0: 6e 61 74 65 28 70 56 61 6c 29 3b 20 2f 2a 20 49  nate(pVal); /* I
85b0: 4d 50 3a 20 52 2d 33 31 32 37 35 2d 34 34 30 36  MP: R-31275-4406
85c0: 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 */.  }else{.  
85d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
85e0: 53 74 72 69 6e 67 69 66 79 28 70 56 61 6c 2c 20  Stringify(pVal, 
85f0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  enc, 0);.    ass
8600: 65 72 74 28 20 30 3d 3d 28 31 26 53 51 4c 49 54  ert( 0==(1&SQLIT
8610: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 61  E_PTR_TO_INT(pVa
8620: 6c 2d 3e 7a 29 29 20 29 3b 0a 20 20 7d 0a 20 20  l->z)) );.  }.  
8630: 61 73 73 65 72 74 28 70 56 61 6c 2d 3e 65 6e 63  assert(pVal->enc
8640: 3d 3d 28 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  ==(enc & ~SQLITE
8650: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20  _UTF16_ALIGNED) 
8660: 7c 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d 30 0a 20  || pVal->db==0. 
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
8680: 70 56 61 6c 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pVal->db->malloc
8690: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
86a0: 70 56 61 6c 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20  pVal->enc==(enc 
86b0: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
86c0: 41 4c 49 47 4e 45 44 29 20 29 7b 0a 20 20 20 20  ALIGNED) ){.    
86d0: 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 7a 3b 0a  return pVal->z;.
86e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
86f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
8700: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
8710: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
8720: 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 20 69 74 20   internally, it 
8730: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 74  is not part of t
8740: 68 65 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 41  he.** external A
8750: 50 49 2e 20 49 74 20 77 6f 72 6b 73 20 69 6e 20  PI. It works in 
8760: 61 20 73 69 6d 69 6c 61 72 20 77 61 79 20 74 6f  a similar way to
8770: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
8780: 65 78 74 28 29 2c 0a 2a 2a 20 65 78 63 65 70 74  ext(),.** except
8790: 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
87a0: 65 64 20 69 73 20 69 6e 20 74 68 65 20 65 6e 63  ed is in the enc
87b0: 6f 64 69 6e 67 20 73 70 65 63 69 66 69 65 64 20  oding specified 
87c0: 62 79 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  by the second.**
87d0: 20 70 61 72 61 6d 65 74 65 72 2c 20 77 68 69 63   parameter, whic
87e0: 68 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  h must be one of
87f0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
8800: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
8810: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  or.** SQLITE_UTF
8820: 38 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 36 2d 30  8..**.** (2006-0
8830: 32 2d 31 36 3a 29 20 20 54 68 65 20 65 6e 63 20  2-16:)  The enc 
8840: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 6f 72 2d  value can be or-
8850: 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 55  ed with SQLITE_U
8860: 54 46 31 36 5f 41 4c 49 47 4e 45 44 2e 0a 2a 2a  TF16_ALIGNED..**
8870: 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
8880: 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  case, then the r
8890: 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 6c  esult must be al
88a0: 69 67 6e 65 64 20 6f 6e 20 61 6e 20 65 76 65 6e  igned on an even
88b0: 20 62 79 74 65 0a 2a 2a 20 62 6f 75 6e 64 61 72   byte.** boundar
88c0: 79 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  y..*/.const void
88d0: 20 2a 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65   *sqlite3ValueTe
88e0: 78 74 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  xt(sqlite3_value
88f0: 2a 20 70 56 61 6c 2c 20 75 38 20 65 6e 63 29 7b  * pVal, u8 enc){
8900: 0a 20 20 69 66 28 20 21 70 56 61 6c 20 29 20 72  .  if( !pVal ) r
8910: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
8920: 74 28 20 70 56 61 6c 2d 3e 64 62 3d 3d 30 20 7c  t( pVal->db==0 |
8930: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
8940: 68 65 6c 64 28 70 56 61 6c 2d 3e 64 62 2d 3e 6d  held(pVal->db->m
8950: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
8960: 74 28 20 28 65 6e 63 26 33 29 3d 3d 28 65 6e 63  t( (enc&3)==(enc
8970: 26 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  &~SQLITE_UTF16_A
8980: 4c 49 47 4e 45 44 29 20 29 3b 0a 20 20 61 73 73  LIGNED) );.  ass
8990: 65 72 74 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67  ert( (pVal->flag
89a0: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
89b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 56 61  =0 );.  if( (pVa
89c0: 6c 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  l->flags&(MEM_St
89d0: 72 7c 4d 45 4d 5f 54 65 72 6d 29 29 3d 3d 28 4d  r|MEM_Term))==(M
89e0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 29  EM_Str|MEM_Term)
89f0: 20 26 26 20 70 56 61 6c 2d 3e 65 6e 63 3d 3d 65   && pVal->enc==e
8a00: 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nc ){.    return
8a10: 20 70 56 61 6c 2d 3e 7a 3b 0a 20 20 7d 0a 20 20   pVal->z;.  }.  
8a20: 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 26  if( pVal->flags&
8a30: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
8a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
8a50: 72 65 74 75 72 6e 20 76 61 6c 75 65 54 6f 54 65  return valueToTe
8a60: 78 74 28 70 56 61 6c 2c 20 65 6e 63 29 3b 0a 7d  xt(pVal, enc);.}
8a70: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
8a80: 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 76 61 6c   new sqlite3_val
8a90: 75 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 71  ue object..*/.sq
8aa0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
8ab0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 73 71 6c  ite3ValueNew(sql
8ac0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 4d 65 6d  ite3 *db){.  Mem
8ad0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
8ae0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
8af0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
8b00: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61   p ){.    p->fla
8b10: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
8b20: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
8b30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8b40: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
8b50: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 62 79  object passed by
8b60: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
8b70: 62 65 53 65 74 56 61 6c 75 65 28 29 20 74 68 72  beSetValue() thr
8b80: 6f 75 67 68 20 74 6f 20 0a 2a 2a 20 76 61 6c 75  ough to .** valu
8b90: 65 4e 65 77 28 29 2e 20 53 65 65 20 63 6f 6d 6d  eNew(). See comm
8ba0: 65 6e 74 73 20 61 62 6f 76 65 20 76 61 6c 75 65  ents above value
8bb0: 4e 65 77 28 29 20 66 6f 72 20 64 65 74 61 69 6c  New() for detail
8bc0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 56 61 6c  s..*/.struct Val
8bd0: 75 65 4e 65 77 53 74 61 74 34 43 74 78 20 7b 0a  ueNewStat4Ctx {.
8be0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
8bf0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
8c00: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
8c10: 20 2a 2a 70 70 52 65 63 3b 0a 20 20 69 6e 74 20   **ppRec;.  int 
8c20: 69 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  iVal;.};../*.** 
8c30: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
8c40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8c50: 20 61 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 76   a new sqlite3_v
8c60: 61 6c 75 65 20 6f 62 6a 65 63 74 2e 20 49 66 0a  alue object. If.
8c70: 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  ** the second ar
8c80: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
8c90: 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
8ca0: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 61   the object is a
8cb0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 63  llocated.** by c
8cc0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56 61  alling sqlite3Va
8cd0: 6c 75 65 4e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20  lueNew()..**.** 
8ce0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
8cf0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8d00: 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
8d10: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
8d20: 6e 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 63  n is .** being c
8d30: 61 6c 6c 65 64 20 69 6e 64 69 72 65 63 74 6c 79  alled indirectly
8d40: 20 62 79 20 73 71 6c 69 74 65 33 53 74 61 74 34   by sqlite3Stat4
8d50: 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 29 2e  ProbeSetValue().
8d60: 20 49 66 20 69 74 20 68 61 73 20 6e 6f 74 0a 2a   If it has not.*
8d70: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  * already been a
8d80: 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
8d90: 74 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52  te the UnpackedR
8da0: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
8db0: 74 68 61 74 20 0a 2a 2a 20 74 68 61 74 20 66 75  that .** that fu
8dc0: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
8dd0: 72 6e 20 74 6f 20 69 74 73 20 63 61 6c 6c 65 72  rn to its caller
8de0: 20 68 65 72 65 2e 20 54 68 65 6e 20 72 65 74 75   here. Then retu
8df0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
8e00: 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  ** an sqlite3_va
8e10: 6c 75 65 20 77 69 74 68 69 6e 20 74 68 65 20 55  lue within the U
8e20: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2e 61 5b  npackedRecord.a[
8e30: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
8e40: 69 63 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ic sqlite3_value
8e50: 20 2a 76 61 6c 75 65 4e 65 77 28 73 71 6c 69 74   *valueNew(sqlit
8e60: 65 33 20 2a 64 62 2c 20 73 74 72 75 63 74 20 56  e3 *db, struct V
8e70: 61 6c 75 65 4e 65 77 53 74 61 74 34 43 74 78 20  alueNewStat4Ctx 
8e80: 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
8e90: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8ea0: 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
8eb0: 20 29 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64   ){.    Unpacked
8ec0: 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
8ed0: 2d 3e 70 70 52 65 63 5b 30 5d 3b 0a 0a 20 20 20  ->ppRec[0];..   
8ee0: 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 7b 0a   if( pRec==0 ){.
8ef0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
8f00: 78 20 3d 20 70 2d 3e 70 49 64 78 3b 20 20 20 20  x = p->pIdx;    
8f10: 20 20 2f 2a 20 49 6e 64 65 78 20 62 65 69 6e 67    /* Index being
8f20: 20 70 72 6f 62 65 64 20 2a 2f 0a 20 20 20 20 20   probed */.     
8f30: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f50: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
8f60: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
8f70: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
8fa0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
8fb0: 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
8fc0: 6f 6c 75 6d 6e 3b 20 20 20 2f 2a 20 4e 75 6d 62  olumn;   /* Numb
8fd0: 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  er of index colu
8fe0: 6d 6e 73 20 69 6e 63 6c 75 64 69 6e 67 20 72 6f  mns including ro
8ff0: 77 69 64 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  wid */.  .      
9000: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d  nByte = sizeof(M
9010: 65 6d 29 20 2a 20 6e 43 6f 6c 20 2b 20 52 4f 55  em) * nCol + ROU
9020: 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
9030: 6b 65 64 52 65 63 6f 72 64 29 29 3b 0a 20 20 20  kedRecord));.   
9040: 20 20 20 70 52 65 63 20 3d 20 28 55 6e 70 61 63     pRec = (Unpac
9050: 6b 65 64 52 65 63 6f 72 64 2a 29 73 71 6c 69 74  kedRecord*)sqlit
9060: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
9070: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
9080: 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20   if( pRec ){.   
9090: 20 20 20 20 20 70 52 65 63 2d 3e 70 4b 65 79 49       pRec->pKeyI
90a0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
90b0: 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 2d 3e 70  InfoOfIndex(p->p
90c0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
90d0: 20 20 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e        if( pRec->
90e0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
90f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
9100: 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  ec->pKeyInfo->nA
9110: 6c 6c 46 69 65 6c 64 3d 3d 6e 43 6f 6c 20 29 3b  llField==nCol );
9120: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
9130: 74 28 20 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66  t( pRec->pKeyInf
9140: 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20  o->enc==ENC(db) 
9150: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  );.          pRe
9160: 63 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 20 2a  c->aMem = (Mem *
9170: 29 28 28 75 38 2a 29 70 52 65 63 20 2b 20 52 4f  )((u8*)pRec + RO
9180: 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
9190: 63 6b 65 64 52 65 63 6f 72 64 29 29 29 3b 0a 20  ckedRecord)));. 
91a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
91b0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65 63              pRec
91d0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20  ->aMem[i].flags 
91e0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
91f0: 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 61 4d          pRec->aM
9200: 65 6d 5b 69 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[i].db = db;. 
9210: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9230: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9240: 65 4e 4e 28 64 62 2c 20 70 52 65 63 29 3b 0a 20  eNN(db, pRec);. 
9250: 20 20 20 20 20 20 20 20 20 70 52 65 63 20 3d 20           pRec = 
9260: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
9270: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9280: 52 65 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Rec==0 ) return 
9290: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 70 52 65  0;.      p->ppRe
92a0: 63 5b 30 5d 20 3d 20 70 52 65 63 3b 0a 20 20 20  c[0] = pRec;.   
92b0: 20 7d 0a 20 20 0a 20 20 20 20 70 52 65 63 2d 3e   }.  .    pRec->
92c0: 6e 46 69 65 6c 64 20 3d 20 70 2d 3e 69 56 61 6c  nField = p->iVal
92d0: 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  +1;.    return &
92e0: 70 52 65 63 2d 3e 61 4d 65 6d 5b 70 2d 3e 69 56  pRec->aMem[p->iV
92f0: 61 6c 5d 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  al];.  }.#else. 
9300: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9310: 52 28 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  R(p);.#endif /* 
9320: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9330: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
9340: 54 41 54 34 29 20 2a 2f 0a 20 20 72 65 74 75 72  TAT4) */.  retur
9350: 6e 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  n sqlite3ValueNe
9360: 77 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w(db);.}../*.** 
9370: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
9380: 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20  bject indicated 
9390: 62 79 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  by the second ar
93a0: 67 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61 6e  gument is guaran
93b0: 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 61 20  teed.** to be a 
93c0: 73 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74  scalar SQL funct
93d0: 69 6f 6e 2e 20 49 66 0a 2a 2a 0a 2a 2a 20 20 20  ion. If.**.**   
93e0: 2a 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61  * all function a
93f0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 53 51 4c  rguments are SQL
9400: 20 6c 69 74 65 72 61 6c 73 2c 0a 2a 2a 20 20 20   literals,.**   
9410: 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c  * one of the SQL
9420: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e  ITE_FUNC_CONSTAN
9430: 54 20 6f 72 20 5f 53 4c 4f 43 48 4e 47 20 66 75  T or _SLOCHNG fu
9440: 6e 63 74 69 6f 6e 20 66 6c 61 67 73 20 69 73 20  nction flags is 
9450: 73 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  set, and.**   * 
9460: 74 68 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  the SQLITE_FUNC_
9470: 4e 45 45 44 43 4f 4c 4c 20 66 75 6e 63 74 69 6f  NEEDCOLL functio
9480: 6e 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65  n flag is not se
9490: 74 2c 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  t,.**.** then th
94a0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
94b0: 70 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  pts to invoke th
94c0: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  e SQL function. 
94d0: 41 73 73 75 6d 69 6e 67 20 6e 6f 0a 2a 2a 20 65  Assuming no.** e
94e0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 75 74  rror occurs, out
94f0: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a  put parameter (*
9500: 70 70 56 61 6c 29 20 69 73 20 73 65 74 20 74 6f  ppVal) is set to
9510: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 75   point to a valu
9520: 65 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 63 6f 6e  e .** object con
9530: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  taining the resu
9540: 6c 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  lt before return
9550: 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ing SQLITE_OK..*
9560: 2a 0a 2a 2a 20 41 66 66 69 6e 69 74 79 20 61 66  *.** Affinity af
9570: 66 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20  f is applied to 
9580: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
9590: 65 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72  e function befor
95a0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
95b0: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  If the result is
95c0: 20 61 20 74 65 78 74 20 76 61 6c 75 65 2c 20 74   a text value, t
95d0: 68 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  he sqlite3_value
95e0: 20 6f 62 6a 65 63 74 20 75 73 65 73 20 65 6e 63   object uses enc
95f0: 6f 64 69 6e 67 20 0a 2a 2a 20 65 6e 63 2e 0a 2a  oding .** enc..*
9600: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
9610: 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
9620: 20 6e 6f 74 20 6d 65 74 2c 20 74 68 69 73 20 66   not met, this f
9630: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
9640: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 61 6e 64  SQLITE_OK.** and
9650: 20 73 65 74 73 20 28 2a 70 70 56 61 6c 29 20 74   sets (*ppVal) t
9660: 6f 20 4e 55 4c 4c 2e 20 4f 72 2c 20 69 66 20 61  o NULL. Or, if a
9670: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
9680: 28 2a 70 70 56 61 6c 29 20 69 73 20 73 65 74 20  (*ppVal) is set 
9690: 74 6f 0a 2a 2a 20 4e 55 4c 4c 20 61 6e 64 20 61  to.** NULL and a
96a0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
96b0: 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ode returned..*/
96c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
96d0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
96e0: 54 41 54 34 0a 73 74 61 74 69 63 20 69 6e 74 20  TAT4.static int 
96f0: 76 61 6c 75 65 46 72 6f 6d 46 75 6e 63 74 69 6f  valueFromFunctio
9700: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
9710: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9720: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
9730: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9740: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20  */.  Expr *p,   
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
9770: 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75 61  ession to evalua
9780: 74 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20  te */.  u8 enc, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64          /* Encod
97b0: 69 6e 67 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ing to use */.  
97c0: 75 38 20 61 66 66 2c 20 20 20 20 20 20 20 20 20  u8 aff,         
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75  /* Affinity to u
97f0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
9800: 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 2c 20 20  value **ppVal,  
9810: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
9820: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 68   the new value h
9830: 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
9840: 56 61 6c 75 65 4e 65 77 53 74 61 74 34 43 74 78  ValueNewStat4Ctx
9850: 20 2a 70 43 74 78 20 20 20 2f 2a 20 53 65 63 6f   *pCtx   /* Seco
9860: 6e 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  nd argument for 
9870: 76 61 6c 75 65 4e 65 77 28 29 20 2a 2f 0a 29 7b  valueNew() */.){
9880: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
9890: 78 74 20 63 74 78 3b 20 20 20 20 20 20 20 20 20  xt ctx;         
98a0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
98b0: 6a 65 63 74 20 66 6f 72 20 66 75 6e 63 74 69 6f  ject for functio
98c0: 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  n invocation */.
98d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
98e0: 2a 2a 61 70 56 61 6c 20 3d 20 30 3b 20 20 20 20  **apVal = 0;    
98f0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
9900: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  guments */.  int
9910: 20 6e 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20   nVal = 0;      
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9930: 53 69 7a 65 20 6f 66 20 61 70 56 61 6c 5b 5d 20  Size of apVal[] 
9940: 61 72 72 61 79 20 2a 2f 0a 20 20 46 75 6e 63 44  array */.  FuncD
9950: 65 66 20 2a 70 46 75 6e 63 20 3d 20 30 3b 20 20  ef *pFunc = 0;  
9960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
9970: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
9980: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
9990: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
99a0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 61         /* New va
99b0: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  lue */.  int rc 
99c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
99d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
99e0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70  rn code */.  Exp
99f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
9a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9a10: 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  Function argumen
9a20: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ts */.  int i;  
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
9a50: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
9a60: 0a 20 20 61 73 73 65 72 74 28 20 70 43 74 78 21  .  assert( pCtx!
9a70: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9a80: 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 54  (p->flags & EP_T
9a90: 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20 29 3b 0a  okenOnly)==0 );.
9aa0: 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 78 2e 70    pList = p->x.p
9ab0: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
9ac0: 74 20 29 20 6e 56 61 6c 20 3d 20 70 4c 69 73 74  t ) nVal = pList
9ad0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 46 75 6e 63  ->nExpr;.  pFunc
9ae0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
9af0: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 75 2e  nction(db, p->u.
9b00: 7a 54 6f 6b 65 6e 2c 20 6e 56 61 6c 2c 20 65 6e  zToken, nVal, en
9b10: 63 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 0);.  assert(
9b20: 20 70 46 75 6e 63 20 29 3b 0a 20 20 69 66 28 20   pFunc );.  if( 
9b30: 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  (pFunc->funcFlag
9b40: 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
9b50: 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c 49 54 45  _CONSTANT|SQLITE
9b60: 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e 47 29 29 3d  _FUNC_SLOCHNG))=
9b70: 3d 30 20 0a 20 20 20 7c 7c 20 28 70 46 75 6e 63  =0 .   || (pFunc
9b80: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
9b90: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
9ba0: 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  LL).  ){.    ret
9bb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9bc0: 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20   }..  if( pList 
9bd0: 29 7b 0a 20 20 20 20 61 70 56 61 6c 20 3d 20 28  ){.    apVal = (
9be0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
9bf0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
9c00: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
9c10: 70 56 61 6c 5b 30 5d 29 20 2a 20 6e 56 61 6c 29  pVal[0]) * nVal)
9c20: 3b 0a 20 20 20 20 69 66 28 20 61 70 56 61 6c 3d  ;.    if( apVal=
9c30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
9c40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
9c50: 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76  PT;.      goto v
9c60: 61 6c 75 65 5f 66 72 6f 6d 5f 66 75 6e 63 74 69  alue_from_functi
9c70: 6f 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  on_out;.    }.  
9c80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
9c90: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  l; i++){.      r
9ca0: 63 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  c = sqlite3Value
9cb0: 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 4c 69  FromExpr(db, pLi
9cc0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
9cd0: 65 6e 63 2c 20 61 66 66 2c 20 26 61 70 56 61 6c  enc, aff, &apVal
9ce0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
9cf0: 61 70 56 61 6c 5b 69 5d 3d 3d 30 20 7c 7c 20 72  apVal[i]==0 || r
9d00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9d10: 6f 74 6f 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66  oto value_from_f
9d20: 75 6e 63 74 69 6f 6e 5f 6f 75 74 3b 0a 20 20 20  unction_out;.   
9d30: 20 7d 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d   }.  }..  pVal =
9d40: 20 76 61 6c 75 65 4e 65 77 28 64 62 2c 20 70 43   valueNew(db, pC
9d50: 74 78 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d  tx);.  if( pVal=
9d60: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
9d70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
9d80: 3b 0a 20 20 20 20 67 6f 74 6f 20 76 61 6c 75 65  ;.    goto value
9d90: 5f 66 72 6f 6d 5f 66 75 6e 63 74 69 6f 6e 5f 6f  _from_function_o
9da0: 75 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ut;.  }..  asser
9db0: 74 28 20 70 43 74 78 2d 3e 70 50 61 72 73 65 2d  t( pCtx->pParse-
9dc0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9dd0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 74 78 2c  ;.  memset(&ctx,
9de0: 20 30 2c 20 73 69 7a 65 6f 66 28 63 74 78 29 29   0, sizeof(ctx))
9df0: 3b 0a 20 20 63 74 78 2e 70 4f 75 74 20 3d 20 70  ;.  ctx.pOut = p
9e00: 56 61 6c 3b 0a 20 20 63 74 78 2e 70 46 75 6e 63  Val;.  ctx.pFunc
9e10: 20 3d 20 70 46 75 6e 63 3b 0a 20 20 70 46 75 6e   = pFunc;.  pFun
9e20: 63 2d 3e 78 53 46 75 6e 63 28 26 63 74 78 2c 20  c->xSFunc(&ctx, 
9e30: 6e 56 61 6c 2c 20 61 70 56 61 6c 29 3b 0a 20 20  nVal, apVal);.  
9e40: 69 66 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20  if( ctx.isError 
9e50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 74 78 2e  ){.    rc = ctx.
9e60: 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 73 71 6c  isError;.    sql
9e70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 43 74  ite3ErrorMsg(pCt
9e80: 78 2d 3e 70 50 61 72 73 65 2c 20 22 25 73 22 2c  x->pParse, "%s",
9e90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
9ea0: 65 78 74 28 70 56 61 6c 29 29 3b 0a 20 20 7d 65  ext(pVal));.  }e
9eb0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
9ec0: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
9ed0: 74 79 28 70 56 61 6c 2c 20 61 66 66 2c 20 53 51  ty(pVal, aff, SQ
9ee0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
9ef0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
9f00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
9f10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  = sqlite3VdbeCha
9f20: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 56 61 6c  ngeEncoding(pVal
9f30: 2c 20 65 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  , enc);.    if( 
9f40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
9f50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
9f60: 6f 6f 42 69 67 28 70 56 61 6c 29 20 29 7b 0a 20  ooBig(pVal) ){. 
9f70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9f80: 5f 54 4f 4f 42 49 47 3b 0a 20 20 20 20 20 20 70  _TOOBIG;.      p
9f90: 43 74 78 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72  Ctx->pParse->nEr
9fa0: 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  r++;.    }.  }. 
9fb0: 20 70 43 74 78 2d 3e 70 50 61 72 73 65 2d 3e 72   pCtx->pParse->r
9fc0: 63 20 3d 20 72 63 3b 0a 0a 20 76 61 6c 75 65 5f  c = rc;.. value_
9fd0: 66 72 6f 6d 5f 66 75 6e 63 74 69 6f 6e 5f 6f 75  from_function_ou
9fe0: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
9ff0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 56  ITE_OK ){.    pV
a000: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
a010: 28 20 61 70 56 61 6c 20 29 7b 0a 20 20 20 20 66  ( apVal ){.    f
a020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20  or(i=0; i<nVal; 
a030: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
a040: 74 65 33 56 61 6c 75 65 46 72 65 65 28 61 70 56  te3ValueFree(apV
a050: 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  al[i]);.    }.  
a060: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
a070: 4e 28 64 62 2c 20 61 70 56 61 6c 29 3b 0a 20 20  N(db, apVal);.  
a080: 7d 0a 0a 20 20 2a 70 70 56 61 6c 20 3d 20 70 56  }..  *ppVal = pV
a090: 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  al;.  return rc;
a0a0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
a0b0: 65 20 76 61 6c 75 65 46 72 6f 6d 46 75 6e 63 74  e valueFromFunct
a0c0: 69 6f 6e 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29  ion(a,b,c,d,e,f)
a0d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
a0e0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
a0f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
a100: 5f 4f 52 5f 53 54 41 54 34 29 20 2a 2f 0a 0a 2f  _OR_STAT4) */../
a110: 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 61 20 76  *.** Extract a v
a120: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 75  alue from the su
a130: 70 70 6c 69 65 64 20 65 78 70 72 65 73 73 69 6f  pplied expressio
a140: 6e 20 69 6e 20 74 68 65 20 6d 61 6e 6e 65 72 20  n in the manner 
a150: 64 65 73 63 72 69 62 65 64 0a 2a 2a 20 61 62 6f  described.** abo
a160: 76 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ve sqlite3ValueF
a170: 72 6f 6d 45 78 70 72 28 29 2e 20 41 6c 6c 6f 63  romExpr(). Alloc
a180: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
a190: 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  value object.** 
a1a0: 75 73 69 6e 67 20 76 61 6c 75 65 4e 65 77 28 29  using valueNew()
a1b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 74 78 20  ..**.** If pCtx 
a1c0: 69 73 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 65  is NULL and an e
a1d0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 66 74 65  rror occurs afte
a1e0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 61  r the sqlite3_va
a1f0: 6c 75 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 68 61  lue object.** ha
a200: 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
a210: 2c 20 69 74 20 69 73 20 66 72 65 65 64 20 62 65  , it is freed be
a220: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
a230: 4f 72 2c 20 69 66 20 70 43 74 78 20 69 73 20 6e  Or, if pCtx is n
a240: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 69  ot.** NULL, it i
a250: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
a260: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66  he caller will f
a270: 72 65 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 65  ree any allocate
a280: 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 6e 20 61  d object.** in a
a290: 6c 6c 20 63 61 73 65 73 2e 0a 2a 2f 0a 73 74 61  ll cases..*/.sta
a2a0: 74 69 63 20 69 6e 74 20 76 61 6c 75 65 46 72 6f  tic int valueFro
a2b0: 6d 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  mExpr(.  sqlite3
a2c0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
a2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a2e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
a2f0: 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
a300: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
a310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a320: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 65 76  expression to ev
a330: 61 6c 75 61 74 65 20 2a 2f 0a 20 20 75 38 20 65  aluate */.  u8 e
a340: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
a350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
a360: 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73 65 20 2a  ncoding to use *
a370: 2f 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c  /.  u8 affinity,
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
a3a0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  to use */.  sqli
a3b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61  te3_value **ppVa
a3c0: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l,          /* W
a3d0: 72 69 74 65 20 74 68 65 20 6e 65 77 20 76 61 6c  rite the new val
a3e0: 75 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ue here */.  str
a3f0: 75 63 74 20 56 61 6c 75 65 4e 65 77 53 74 61 74  uct ValueNewStat
a400: 34 43 74 78 20 2a 70 43 74 78 20 20 20 2f 2a 20  4Ctx *pCtx   /* 
a410: 53 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  Second argument 
a420: 66 6f 72 20 76 61 6c 75 65 4e 65 77 28 29 20 2a  for valueNew() *
a430: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  /.){.  int op;. 
a440: 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 30 3b   char *zVal = 0;
a450: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
a460: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pVal = 0;.  in
a470: 74 20 6e 65 67 49 6e 74 20 3d 20 31 3b 0a 20 20  t negInt = 1;.  
a480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 67  const char *zNeg
a490: 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 72 63 20   = "";.  int rc 
a4a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
a4b0: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
a4c0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 6f 70   );.  while( (op
a4d0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 29 3d 3d 54   = pExpr->op)==T
a4e0: 4b 5f 55 50 4c 55 53 20 7c 7c 20 6f 70 3d 3d 54  K_UPLUS || op==T
a4f0: 4b 5f 53 50 41 4e 20 29 20 70 45 78 70 72 20 3d  K_SPAN ) pExpr =
a500: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
a510: 20 69 66 28 20 4e 45 56 45 52 28 6f 70 3d 3d 54   if( NEVER(op==T
a520: 4b 5f 52 45 47 49 53 54 45 52 29 20 29 20 6f 70  K_REGISTER) ) op
a530: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 0a   = pExpr->op2;..
a540: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 65 64 20    /* Compressed 
a550: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 6e 6c 79  expressions only
a560: 20 61 70 70 65 61 72 20 77 68 65 6e 20 70 61 72   appear when par
a570: 73 69 6e 67 20 74 68 65 20 44 45 46 41 55 4c 54  sing the DEFAULT
a580: 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 6f 6e 20   clause.  ** on 
a590: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64  a table column d
a5a0: 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e 64 20 68  efinition, and h
a5b0: 65 6e 63 65 20 6f 6e 6c 79 20 77 68 65 6e 20 70  ence only when p
a5c0: 43 74 78 3d 3d 30 2e 20 20 54 68 69 73 0a 20 20  Ctx==0.  This.  
a5d0: 2a 2a 20 63 68 65 63 6b 20 65 6e 73 75 72 65 73  ** check ensures
a5e0: 20 74 68 61 74 20 61 6e 20 45 50 5f 54 6f 6b 65   that an EP_Toke
a5f0: 6e 4f 6e 6c 79 20 65 78 70 72 65 73 73 69 6f 6e  nOnly expression
a600: 20 69 73 20 6e 65 76 65 72 20 70 61 73 73 65 64   is never passed
a610: 20 64 6f 77 6e 0a 20 20 2a 2a 20 69 6e 74 6f 20   down.  ** into 
a620: 76 61 6c 75 65 46 72 6f 6d 46 75 6e 63 74 69 6f  valueFromFunctio
a630: 6e 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  n(). */.  assert
a640: 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  ( (pExpr->flags 
a650: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
a660: 3d 30 20 7c 7c 20 70 43 74 78 3d 3d 30 20 29 3b  =0 || pCtx==0 );
a670: 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43  ..  if( op==TK_C
a680: 41 53 54 20 29 7b 0a 20 20 20 20 75 38 20 61 66  AST ){.    u8 af
a690: 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
a6a0: 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75  ityType(pExpr->u
a6b0: 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
a6c0: 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
a6d0: 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  pr(db, pExpr->pL
a6e0: 65 66 74 2c 20 65 6e 63 2c 20 61 66 66 2c 20 70  eft, enc, aff, p
a6f0: 70 56 61 6c 2c 20 70 43 74 78 29 3b 0a 20 20 20  pVal, pCtx);.   
a700: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
a710: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a720: 69 66 28 20 2a 70 70 56 61 6c 20 29 7b 0a 20 20  if( *ppVal ){.  
a730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a740: 65 6d 43 61 73 74 28 2a 70 70 56 61 6c 2c 20 61  emCast(*ppVal, a
a750: 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
a760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a770: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
a780: 79 28 2a 70 70 56 61 6c 2c 20 61 66 66 69 6e 69  y(*ppVal, affini
a790: 74 79 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ty, SQLITE_UTF8)
a7a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
a7b0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
a7c0: 20 48 61 6e 64 6c 65 20 6e 65 67 61 74 69 76 65   Handle negative
a7d0: 20 69 6e 74 65 67 65 72 73 20 69 6e 20 61 20 73   integers in a s
a7e0: 69 6e 67 6c 65 20 73 74 65 70 2e 20 20 54 68 69  ingle step.  Thi
a7f0: 73 20 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74  s is needed in t
a800: 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 77 68 65  he.  ** case whe
a810: 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 2d  n the value is -
a820: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
a830: 38 30 38 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  808..  */.  if( 
a840: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 0a 20 20  op==TK_UMINUS.  
a850: 20 26 26 20 28 70 45 78 70 72 2d 3e 70 4c 65 66   && (pExpr->pLef
a860: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
a870: 52 20 7c 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66  R || pExpr->pLef
a880: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 29  t->op==TK_FLOAT)
a890: 20 29 7b 0a 20 20 20 20 70 45 78 70 72 20 3d 20   ){.    pExpr = 
a8a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
a8b0: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
a8c0: 3b 0a 20 20 20 20 6e 65 67 49 6e 74 20 3d 20 2d  ;.    negInt = -
a8d0: 31 3b 0a 20 20 20 20 7a 4e 65 67 20 3d 20 22 2d  1;.    zNeg = "-
a8e0: 22 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70  ";.  }..  if( op
a8f0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 7c 7c 20 6f  ==TK_STRING || o
a900: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 6f  p==TK_FLOAT || o
a910: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
a920: 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61 6c 75  .    pVal = valu
a930: 65 4e 65 77 28 64 62 2c 20 70 43 74 78 29 3b 0a  eNew(db, pCtx);.
a940: 20 20 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20      if( pVal==0 
a950: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
a960: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
a970: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a980: 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a 20 20  _IntValue) ){.  
a990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a9a0: 65 6d 53 65 74 49 6e 74 36 34 28 70 56 61 6c 2c  emSetInt64(pVal,
a9b0: 20 28 69 36 34 29 70 45 78 70 72 2d 3e 75 2e 69   (i64)pExpr->u.i
a9c0: 56 61 6c 75 65 2a 6e 65 67 49 6e 74 29 3b 0a 20  Value*negInt);. 
a9d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a9e0: 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zVal = sqlite3MP
a9f0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 25 73 22  rintf(db, "%s%s"
aa00: 2c 20 7a 4e 65 67 2c 20 70 45 78 70 72 2d 3e 75  , zNeg, pExpr->u
aa10: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
aa20: 69 66 28 20 7a 56 61 6c 3d 3d 30 20 29 20 67 6f  if( zVal==0 ) go
aa30: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
aa40: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
aa50: 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 56  Str(pVal, -1, zV
aa60: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  al, SQLITE_UTF8,
aa70: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
aa80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
aa90: 28 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  (op==TK_INTEGER 
aaa0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  || op==TK_FLOAT 
aab0: 29 20 26 26 20 61 66 66 69 6e 69 74 79 3d 3d 53  ) && affinity==S
aac0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
aad0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
aae0: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
aaf0: 79 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 41  y(pVal, SQLITE_A
ab00: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 53 51 4c 49  FF_NUMERIC, SQLI
ab10: 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 7d 65  TE_UTF8);.    }e
ab20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
ab30: 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
ab40: 6e 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e  nity(pVal, affin
ab50: 69 74 79 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ity, SQLITE_UTF8
ab60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ab70: 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28   pVal->flags & (
ab80: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
ab90: 29 20 29 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20  ) ) pVal->flags 
aba0: 26 3d 20 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  &= ~MEM_Str;.   
abb0: 20 69 66 28 20 65 6e 63 21 3d 53 51 4c 49 54 45   if( enc!=SQLITE
abc0: 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 20 20 72  _UTF8 ){.      r
abd0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
abe0: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 56  hangeEncoding(pV
abf0: 61 6c 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a  al, enc);.    }.
ac00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
ac10: 54 4b 5f 55 4d 49 4e 55 53 20 29 20 7b 0a 20 20  TK_UMINUS ) {.  
ac20: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
ac30: 20 68 61 70 70 65 6e 73 20 66 6f 72 20 6d 75 6c   happens for mul
ac40: 74 69 70 6c 65 20 6e 65 67 61 74 69 76 65 20 73  tiple negative s
ac50: 69 67 6e 73 2e 20 20 45 78 3a 20 2d 28 2d 35 29  igns.  Ex: -(-5)
ac60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
ac70: 54 45 5f 4f 4b 3d 3d 76 61 6c 75 65 46 72 6f 6d  TE_OK==valueFrom
ac80: 45 78 70 72 28 64 62 2c 70 45 78 70 72 2d 3e 70  Expr(db,pExpr->p
ac90: 4c 65 66 74 2c 65 6e 63 2c 61 66 66 69 6e 69 74  Left,enc,affinit
aca0: 79 2c 26 70 56 61 6c 2c 70 43 74 78 29 20 0a 20  y,&pVal,pCtx) . 
acb0: 20 20 20 20 26 26 20 70 56 61 6c 21 3d 30 0a 20      && pVal!=0. 
acc0: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
acd0: 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69  te3VdbeMemNumeri
ace0: 66 79 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20  fy(pVal);.      
acf0: 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20  if( pVal->flags 
ad00: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
ad10: 20 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e 72 20        pVal->u.r 
ad20: 3d 20 2d 70 56 61 6c 2d 3e 75 2e 72 3b 0a 20 20  = -pVal->u.r;.  
ad30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 56      }else if( pV
ad40: 61 6c 2d 3e 75 2e 69 3d 3d 53 4d 41 4c 4c 45 53  al->u.i==SMALLES
ad50: 54 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 20  T_INT64 ){.     
ad60: 20 20 20 70 56 61 6c 2d 3e 75 2e 72 20 3d 20 2d     pVal->u.r = -
ad70: 28 64 6f 75 62 6c 65 29 53 4d 41 4c 4c 45 53 54  (double)SMALLEST
ad80: 5f 49 4e 54 36 34 3b 0a 20 20 20 20 20 20 20 20  _INT64;.        
ad90: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
ada0: 56 61 6c 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a  Val, MEM_Real);.
adb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
adc0: 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e 69 20 3d       pVal->u.i =
add0: 20 2d 70 56 61 6c 2d 3e 75 2e 69 3b 0a 20 20 20   -pVal->u.i;.   
ade0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
adf0: 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69  e3ValueApplyAffi
ae00: 6e 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e  nity(pVal, affin
ae10: 69 74 79 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d  ity, enc);.    }
ae20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
ae30: 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  =TK_NULL ){.    
ae40: 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28  pVal = valueNew(
ae50: 64 62 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 69  db, pCtx);.    i
ae60: 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 67 6f 74  f( pVal==0 ) got
ae70: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73 71  o no_mem;.    sq
ae80: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65  lite3VdbeMemNume
ae90: 72 69 66 79 28 70 56 61 6c 29 3b 0a 20 20 7d 0a  rify(pVal);.  }.
aea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aeb0: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
aec0: 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d  .  else if( op==
aed0: 54 4b 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 69  TK_BLOB ){.    i
aee0: 6e 74 20 6e 56 61 6c 3b 0a 20 20 20 20 61 73 73  nt nVal;.    ass
aef0: 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
af00: 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
af10: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
af20: 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 61  0]=='X' );.    a
af30: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
af40: 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
af50: 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61  );.    pVal = va
af60: 6c 75 65 4e 65 77 28 64 62 2c 20 70 43 74 78 29  lueNew(db, pCtx)
af70: 3b 0a 20 20 20 20 69 66 28 20 21 70 56 61 6c 20  ;.    if( !pVal 
af80: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
af90: 20 20 20 7a 56 61 6c 20 3d 20 26 70 45 78 70 72     zVal = &pExpr
afa0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
afb0: 20 20 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65     nVal = sqlite
afc0: 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 2d  3Strlen30(zVal)-
afd0: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  1;.    assert( z
afe0: 56 61 6c 5b 6e 56 61 6c 5d 3d 3d 27 5c 27 27 20  Val[nVal]=='\'' 
aff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b000: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 56 61 6c  beMemSetStr(pVal
b010: 2c 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c  , sqlite3HexToBl
b020: 6f 62 28 64 62 2c 20 7a 56 61 6c 2c 20 6e 56 61  ob(db, zVal, nVa
b030: 6c 29 2c 20 6e 56 61 6c 2f 32 2c 0a 20 20 20 20  l), nVal/2,.    
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b050: 20 20 20 20 20 30 2c 20 53 51 4c 49 54 45 5f 44       0, SQLITE_D
b060: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
b070: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
b080: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
b090: 4f 52 5f 53 54 41 54 34 0a 20 20 65 6c 73 65 20  OR_STAT4.  else 
b0a0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54  if( op==TK_FUNCT
b0b0: 49 4f 4e 20 26 26 20 70 43 74 78 21 3d 30 20 29  ION && pCtx!=0 )
b0c0: 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65  {.    rc = value
b0d0: 46 72 6f 6d 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FromFunction(db,
b0e0: 20 70 45 78 70 72 2c 20 65 6e 63 2c 20 61 66 66   pExpr, enc, aff
b0f0: 69 6e 69 74 79 2c 20 26 70 56 61 6c 2c 20 70 43  inity, &pVal, pC
b100: 74 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  tx);.  }.#endif.
b110: 0a 20 20 2a 70 70 56 61 6c 20 3d 20 70 56 61 6c  .  *ppVal = pVal
b120: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
b130: 6e 6f 5f 6d 65 6d 3a 0a 20 20 73 71 6c 69 74 65  no_mem:.  sqlite
b140: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b150: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b160: 62 2c 20 7a 56 61 6c 29 3b 0a 20 20 61 73 73 65  b, zVal);.  asse
b170: 72 74 28 20 2a 70 70 56 61 6c 3d 3d 30 20 29 3b  rt( *ppVal==0 );
b180: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b190: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
b1a0: 54 41 54 34 0a 20 20 69 66 28 20 70 43 74 78 3d  TAT4.  if( pCtx=
b1b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 61 6c 75  =0 ) sqlite3Valu
b1c0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 23 65 6c  eFree(pVal);.#el
b1d0: 73 65 0a 20 20 61 73 73 65 72 74 28 20 70 43 74  se.  assert( pCt
b1e0: 78 3d 3d 30 20 29 3b 20 73 71 6c 69 74 65 33 56  x==0 ); sqlite3V
b1f0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
b200: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
b210: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
b220: 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  T;.}../*.** Crea
b230: 74 65 20 61 20 6e 65 77 20 73 71 6c 69 74 65 33  te a new sqlite3
b240: 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 2c 20 63  _value object, c
b250: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
b260: 6c 75 65 20 6f 66 20 70 45 78 70 72 2e 0a 2a 2a  lue of pExpr..**
b270: 0a 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  .** This only wo
b280: 72 6b 73 20 66 6f 72 20 76 65 72 79 20 73 69 6d  rks for very sim
b290: 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ple expressions 
b2a0: 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  that consist of 
b2b0: 6f 6e 65 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  one constant.** 
b2c0: 74 6f 6b 65 6e 20 28 69 2e 65 2e 20 22 35 22 2c  token (i.e. "5",
b2d0: 20 22 35 2e 31 22 2c 20 22 27 61 20 73 74 72 69   "5.1", "'a stri
b2e0: 6e 67 27 22 29 2e 20 49 66 20 74 68 65 20 65 78  ng'"). If the ex
b2f0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 0a 2a 2a 20  pression can.** 
b300: 62 65 20 63 6f 6e 76 65 72 74 65 64 20 64 69 72  be converted dir
b310: 65 63 74 6c 79 20 69 6e 74 6f 20 61 20 76 61 6c  ectly into a val
b320: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ue, then the val
b330: 75 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ue is allocated 
b340: 61 6e 64 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  and.** a pointer
b350: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70 56   written to *ppV
b360: 61 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  al. The caller i
b370: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
b380: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 0a 2a  r deallocating.*
b390: 2a 20 74 68 65 20 76 61 6c 75 65 20 62 79 20 70  * the value by p
b3a0: 61 73 73 69 6e 67 20 69 74 20 74 6f 20 73 71 6c  assing it to sql
b3b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 20  ite3ValueFree() 
b3c0: 6c 61 74 65 72 20 6f 6e 2e 20 49 66 20 74 68 65  later on. If the
b3d0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63   expression.** c
b3e0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  annot be convert
b3f0: 65 64 20 74 6f 20 61 20 76 61 6c 75 65 2c 20 74  ed to a value, t
b400: 68 65 6e 20 2a 70 70 56 61 6c 20 69 73 20 73 65  hen *ppVal is se
b410: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
b420: 74 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  t sqlite3ValueFr
b430: 6f 6d 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  omExpr(.  sqlite
b440: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
b450: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
b460: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b470: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b490: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
b4a0: 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20  to evaluate */. 
b4b0: 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20   u8 enc,        
b4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
b4d0: 63 6f 64 69 6e 67 20 74 6f 20 75 73 65 20 2a 2f  coding to use */
b4e0: 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c 20  .  u8 affinity, 
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b500: 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  Affinity to use 
b510: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b520: 75 65 20 2a 2a 70 70 56 61 6c 20 20 20 20 20 2f  ue **ppVal     /
b530: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
b540: 76 61 6c 75 65 20 68 65 72 65 20 2a 2f 0a 29 7b  value here */.){
b550: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 20  .  return pExpr 
b560: 3f 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  ? valueFromExpr(
b570: 64 62 2c 20 70 45 78 70 72 2c 20 65 6e 63 2c 20  db, pExpr, enc, 
b580: 61 66 66 69 6e 69 74 79 2c 20 70 70 56 61 6c 2c  affinity, ppVal,
b590: 20 30 29 20 3a 20 30 3b 0a 7d 0a 0a 23 69 66 64   0) : 0;.}..#ifd
b5a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b5b0: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
b5c0: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
b5d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b5e0: 73 71 6c 69 74 65 5f 72 65 63 6f 72 64 28 29 20  sqlite_record() 
b5f0: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20 66  function. This f
b600: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 0a  unction accepts.
b610: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75  ** a single argu
b620: 6d 65 6e 74 20 6f 66 20 61 6e 79 20 74 79 70 65  ment of any type
b630: 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
b640: 75 65 20 69 73 20 61 20 66 6f 72 6d 61 74 74 65  ue is a formatte
b650: 64 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 72  d database .** r
b660: 65 63 6f 72 64 20 28 61 20 62 6c 6f 62 29 20 63  ecord (a blob) c
b670: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72  ontaining the ar
b680: 67 75 6d 65 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a  gument value..**
b690: 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64  .** This is used
b6a0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
b6b0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
b6c0: 74 68 65 20 27 73 61 6d 70 6c 65 27 20 63 6f 6c  the 'sample' col
b6d0: 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71  umn of the.** sq
b6e0: 6c 69 74 65 5f 73 74 61 74 33 20 74 61 62 6c 65  lite_stat3 table
b6f0: 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 66   to the record f
b700: 6f 72 6d 61 74 20 53 51 4c 69 74 65 20 75 73 65  ormat SQLite use
b710: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
b720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
b730: 6f 72 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ordFunc(.  sqlit
b740: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
b750: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
b760: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b770: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
b780: 73 74 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  st int file_form
b790: 61 74 20 3d 20 31 3b 0a 20 20 75 33 32 20 69 53  at = 1;.  u32 iS
b7a0: 65 72 69 61 6c 3b 20 20 20 20 20 20 20 20 20 20  erial;          
b7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
b7c0: 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20 69 6e  ial type */.  in
b7d0: 74 20 6e 53 65 72 69 61 6c 3b 20 20 20 20 20 20  t nSerial;      
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b7f0: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
b800: 66 6f 72 20 69 53 65 72 69 61 6c 20 61 73 20 76  for iSerial as v
b810: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
b820: 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
b830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
b840: 74 65 73 20 6f 66 20 73 70 61 63 65 20 72 65 71  tes of space req
b850: 75 69 72 65 64 20 66 6f 72 20 61 72 67 76 5b 30  uired for argv[0
b860: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 3b  ] */.  int nRet;
b870: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b880: 20 20 75 38 20 2a 61 52 65 74 3b 0a 0a 20 20 55    u8 *aRet;..  U
b890: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
b8a0: 20 61 72 67 63 20 29 3b 0a 20 20 69 53 65 72 69   argc );.  iSeri
b8b0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  al = sqlite3Vdbe
b8c0: 53 65 72 69 61 6c 54 79 70 65 28 61 72 67 76 5b  SerialType(argv[
b8d0: 30 5d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  0], file_format,
b8e0: 20 26 6e 56 61 6c 29 3b 0a 20 20 6e 53 65 72 69   &nVal);.  nSeri
b8f0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 72 69  al = sqlite3Vari
b900: 6e 74 4c 65 6e 28 69 53 65 72 69 61 6c 29 3b 0a  ntLen(iSerial);.
b910: 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63    db = sqlite3_c
b920: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
b930: 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 6e 52  (context);..  nR
b940: 65 74 20 3d 20 31 20 2b 20 6e 53 65 72 69 61 6c  et = 1 + nSerial
b950: 20 2b 20 6e 56 61 6c 3b 0a 20 20 61 52 65 74 20   + nVal;.  aRet 
b960: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b970: 63 52 61 77 4e 4e 28 64 62 2c 20 6e 52 65 74 29  cRawNN(db, nRet)
b980: 3b 0a 20 20 69 66 28 20 61 52 65 74 3d 3d 30 20  ;.  if( aRet==0 
b990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
b9a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
b9b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  m(context);.  }e
b9c0: 6c 73 65 7b 0a 20 20 20 20 61 52 65 74 5b 30 5d  lse{.    aRet[0]
b9d0: 20 3d 20 6e 53 65 72 69 61 6c 2b 31 3b 0a 20 20   = nSerial+1;.  
b9e0: 20 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 61    putVarint32(&a
b9f0: 52 65 74 5b 31 5d 2c 20 69 53 65 72 69 61 6c 29  Ret[1], iSerial)
ba00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ba10: 65 53 65 72 69 61 6c 50 75 74 28 26 61 52 65 74  eSerialPut(&aRet
ba20: 5b 31 2b 6e 53 65 72 69 61 6c 5d 2c 20 61 72 67  [1+nSerial], arg
ba30: 76 5b 30 5d 2c 20 69 53 65 72 69 61 6c 29 3b 0a  v[0], iSerial);.
ba40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
ba50: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
ba60: 20 61 52 65 74 2c 20 6e 52 65 74 2c 20 53 51 4c   aRet, nRet, SQL
ba70: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
ba80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ba90: 65 4e 4e 28 64 62 2c 20 61 52 65 74 29 3b 0a 20  eNN(db, aRet);. 
baa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69   }.}../*.** Regi
bab0: 73 74 65 72 20 62 75 69 6c 74 2d 69 6e 20 66 75  ster built-in fu
bac0: 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74 6f 20  nctions used to 
bad0: 68 65 6c 70 20 72 65 61 64 20 41 4e 41 4c 59 5a  help read ANALYZ
bae0: 45 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  E data..*/.void 
baf0: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 46 75  sqlite3AnalyzeFu
bb00: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
bb10: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
bb20: 61 41 6e 61 6c 79 7a 65 54 61 62 6c 65 46 75 6e  aAnalyzeTableFun
bb30: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 46 55 4e  cs[] = {.    FUN
bb40: 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f 72 65 63  CTION(sqlite_rec
bb50: 6f 72 64 2c 20 20 20 31 2c 20 30 2c 20 30 2c 20  ord,   1, 0, 0, 
bb60: 72 65 63 6f 72 64 46 75 6e 63 29 2c 0a 20 20 7d  recordFunc),.  }
bb70: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
bb80: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 41  tBuiltinFuncs(aA
bb90: 6e 61 6c 79 7a 65 54 61 62 6c 65 46 75 6e 63 73  nalyzeTableFuncs
bba0: 2c 20 41 72 72 61 79 53 69 7a 65 28 61 41 6e 61  , ArraySize(aAna
bbb0: 6c 79 7a 65 54 61 62 6c 65 46 75 6e 63 73 29 29  lyzeTableFuncs))
bbc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
bbd0: 70 74 20 74 6f 20 65 78 74 72 61 63 74 20 61 20  pt to extract a 
bbe0: 76 61 6c 75 65 20 66 72 6f 6d 20 70 45 78 70 72  value from pExpr
bbf0: 20 61 6e 64 20 75 73 65 20 69 74 20 74 6f 20 63   and use it to c
bc00: 6f 6e 73 74 72 75 63 74 20 2a 70 70 56 61 6c 2e  onstruct *ppVal.
bc10: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 6c 6c 6f 63  .**.** If pAlloc
bc20: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
bc30: 65 6e 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65  en an UnpackedRe
bc40: 63 6f 72 64 20 6f 62 6a 65 63 74 20 69 73 20 63  cord object is c
bc50: 72 65 61 74 65 64 20 66 6f 72 0a 2a 2a 20 70 41  reated for.** pA
bc60: 6c 6c 6f 63 20 69 66 20 6f 6e 65 20 64 6f 65 73  lloc if one does
bc70: 20 6e 6f 74 20 65 78 69 73 74 20 61 6e 64 20 74   not exist and t
bc80: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
bc90: 61 64 64 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  added to the.** 
bca0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f  UnpackedRecord o
bcb0: 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 76  bject..**.** A v
bcc0: 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
bcd0: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
bce0: 6e 67 20 63 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng cases:.**.** 
bcf0: 20 2a 20 28 70 45 78 70 72 3d 3d 30 29 2e 20 49   * (pExpr==0). I
bd00: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
bd10: 76 61 6c 75 65 20 69 73 20 61 73 73 75 6d 65 64  value is assumed
bd20: 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20 4e 55   to be an SQL NU
bd30: 4c 4c 2c 0a 2a 2a 0a 2a 2a 20 20 2a 20 54 68 65  LL,.**.**  * The
bd40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bd50: 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c 65 2c   bound variable,
bd60: 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 72   and this is a r
bd70: 65 70 72 65 70 61 72 65 2c 20 6f 72 0a 2a 2a 0a  eprepare, or.**.
bd80: 2a 2a 20 20 2a 20 54 68 65 20 65 78 70 72 65 73  **  * The expres
bd90: 73 69 6f 6e 20 69 73 20 61 20 6c 69 74 65 72 61  sion is a litera
bda0: 6c 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f  l value..**.** O
bdb0: 6e 20 73 75 63 63 65 73 73 2c 20 2a 70 70 56 61  n success, *ppVa
bdc0: 6c 20 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69  l is made to poi
bdd0: 6e 74 20 74 6f 20 74 68 65 20 65 78 74 72 61 63  nt to the extrac
bde0: 74 65 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20  ted value.  The 
bdf0: 63 61 6c 6c 65 72 0a 2a 2a 20 69 73 20 72 65 73  caller.** is res
be00: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
be10: 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20 76  uring that the v
be20: 61 6c 75 65 20 69 73 20 65 76 65 6e 74 75 61 6c  alue is eventual
be30: 6c 79 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ly freed..*/.sta
be40: 74 69 63 20 69 6e 74 20 73 74 61 74 34 56 61 6c  tic int stat4Val
be50: 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61  ueFromExpr(.  Pa
be60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be80: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
be90: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
bec0: 73 73 69 6f 6e 20 74 6f 20 65 78 74 72 61 63 74  ssion to extract
bed0: 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f   a value from */
bee0: 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c 20  .  u8 affinity, 
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
bf10: 6f 20 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  o use */.  struc
bf20: 74 20 56 61 6c 75 65 4e 65 77 53 74 61 74 34 43  t ValueNewStat4C
bf30: 74 78 20 2a 70 41 6c 6c 6f 63 2c 2f 2a 20 48 6f  tx *pAlloc,/* Ho
bf40: 77 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  w to allocate sp
bf50: 61 63 65 2e 20 20 4f 72 20 4e 55 4c 4c 20 2a 2f  ace.  Or NULL */
bf60: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
bf70: 20 2a 2a 70 70 56 61 6c 20 20 20 20 20 20 20 20   **ppVal        
bf80: 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 76     /* OUT: New v
bf90: 61 6c 75 65 20 6f 62 6a 65 63 74 20 28 6f 72 20  alue object (or 
bfa0: 4e 55 4c 4c 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  NULL) */.){.  in
bfb0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bfc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
bfd0: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 73  e *pVal = 0;.  s
bfe0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
bff0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 53  rse->db;..  /* S
c000: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
c010: 43 4f 4c 4c 41 54 45 20 6e 6f 64 65 73 20 2a 2f  COLLATE nodes */
c020: 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
c030: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
c040: 65 28 70 45 78 70 72 29 3b 0a 0a 20 20 61 73 73  e(pExpr);..  ass
c050: 65 72 74 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c  ert( pExpr==0 ||
c060: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
c070: 45 47 49 53 54 45 52 20 7c 7c 20 70 45 78 70 72  EGISTER || pExpr
c080: 2d 3e 6f 70 32 21 3d 54 4b 5f 56 41 52 49 41 42  ->op2!=TK_VARIAB
c090: 4c 45 20 29 3b 0a 20 20 69 66 28 20 21 70 45 78  LE );.  if( !pEx
c0a0: 70 72 20 29 7b 0a 20 20 20 20 70 56 61 6c 20 3d  pr ){.    pVal =
c0b0: 20 76 61 6c 75 65 4e 65 77 28 64 62 2c 20 70 41   valueNew(db, pA
c0c0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
c0d0: 56 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Val ){.      sql
c0e0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75  ite3VdbeMemSetNu
c0f0: 6c 6c 28 28 4d 65 6d 2a 29 70 56 61 6c 29 3b 0a  ll((Mem*)pVal);.
c100: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c110: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
c120: 56 41 52 49 41 42 4c 45 20 26 26 20 28 64 62 2d  VARIABLE && (db-
c130: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
c140: 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29  EnableQPSG)==0 )
c150: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
c160: 20 20 20 69 6e 74 20 69 42 69 6e 64 56 61 72 20     int iBindVar 
c170: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
c180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c190: 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
c1a0: 73 65 2d 3e 70 56 64 62 65 2c 20 69 42 69 6e 64  se->pVdbe, iBind
c1b0: 56 61 72 29 3b 0a 20 20 20 20 69 66 28 20 28 76  Var);.    if( (v
c1c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72   = pParse->pRepr
c1d0: 65 70 61 72 65 29 21 3d 30 20 29 7b 0a 20 20 20  epare)!=0 ){.   
c1e0: 20 20 20 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e     pVal = valueN
c1f0: 65 77 28 64 62 2c 20 70 41 6c 6c 6f 63 29 3b 0a  ew(db, pAlloc);.
c200: 20 20 20 20 20 20 69 66 28 20 70 56 61 6c 20 29        if( pVal )
c210: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c220: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
c230: 79 28 28 4d 65 6d 2a 29 70 56 61 6c 2c 20 26 76  y((Mem*)pVal, &v
c240: 2d 3e 61 56 61 72 5b 69 42 69 6e 64 56 61 72 2d  ->aVar[iBindVar-
c250: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
c260: 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
c270: 66 69 6e 69 74 79 28 70 56 61 6c 2c 20 61 66 66  finity(pVal, aff
c280: 69 6e 69 74 79 2c 20 45 4e 43 28 64 62 29 29 3b  inity, ENC(db));
c290: 0a 20 20 20 20 20 20 20 20 70 56 61 6c 2d 3e 64  .        pVal->d
c2a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
c2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c2c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
c2d0: 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62  valueFromExpr(db
c2e0: 2c 20 70 45 78 70 72 2c 20 45 4e 43 28 64 62 29  , pExpr, ENC(db)
c2f0: 2c 20 61 66 66 69 6e 69 74 79 2c 20 26 70 56 61  , affinity, &pVa
c300: 6c 2c 20 70 41 6c 6c 6f 63 29 3b 0a 20 20 7d 0a  l, pAlloc);.  }.
c310: 0a 20 20 61 73 73 65 72 74 28 20 70 56 61 6c 3d  .  assert( pVal=
c320: 3d 30 20 7c 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d  =0 || pVal->db==
c330: 64 62 20 29 3b 0a 20 20 2a 70 70 56 61 6c 20 3d  db );.  *ppVal =
c340: 20 70 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20   pVal;.  return 
c350: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
c360: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
c370: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ed to allocate a
c380: 6e 64 20 70 6f 70 75 6c 61 74 65 20 55 6e 70 61  nd populate Unpa
c390: 63 6b 65 64 52 65 63 6f 72 64 20 0a 2a 2a 20 73  ckedRecord .** s
c3a0: 74 72 75 63 74 75 72 65 73 20 69 6e 74 65 6e 64  tructures intend
c3b0: 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  ed to be compare
c3c0: 64 20 61 67 61 69 6e 73 74 20 73 61 6d 70 6c 65  d against sample
c3d0: 20 69 6e 64 65 78 20 6b 65 79 73 20 73 74 6f 72   index keys stor
c3e0: 65 64 20 0a 2a 2a 20 69 6e 20 74 68 65 20 73 71  ed .** in the sq
c3f0: 6c 69 74 65 5f 73 74 61 74 34 20 74 61 62 6c 65  lite_stat4 table
c400: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
c410: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75   call to this fu
c420: 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
c430: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 66 69   zero or more fi
c440: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72  elds of the.** r
c450: 65 63 6f 72 64 20 73 74 61 72 74 69 6e 67 20 77  ecord starting w
c460: 69 74 68 20 66 69 65 6c 64 20 69 56 61 6c 20 28  ith field iVal (
c470: 66 69 65 6c 64 73 20 61 72 65 20 6e 75 6d 62 65  fields are numbe
c480: 72 65 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  red from left to
c490: 0a 2a 2a 20 72 69 67 68 74 20 73 74 61 72 74 69  .** right starti
c4a0: 6e 67 20 77 69 74 68 20 30 29 2e 20 41 20 73 69  ng with 0). A si
c4b0: 6e 67 6c 65 20 66 69 65 6c 64 20 69 73 20 70 6f  ngle field is po
c4c0: 70 75 6c 61 74 65 64 20 69 66 3a 0a 2a 2a 0a 2a  pulated if:.**.*
c4d0: 2a 20 20 2a 20 28 70 45 78 70 72 3d 3d 30 29 2e  *  * (pExpr==0).
c4e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c4f0: 65 20 76 61 6c 75 65 20 69 73 20 61 73 73 75 6d  e value is assum
c500: 65 64 20 74 6f 20 62 65 20 61 6e 20 53 51 4c 20  ed to be an SQL 
c510: 4e 55 4c 4c 2c 0a 2a 2a 0a 2a 2a 20 20 2a 20 54  NULL,.**.**  * T
c520: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
c530: 20 61 20 62 6f 75 6e 64 20 76 61 72 69 61 62 6c   a bound variabl
c540: 65 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61  e, and this is a
c550: 20 72 65 70 72 65 70 61 72 65 2c 20 6f 72 0a 2a   reprepare, or.*
c560: 2a 0a 2a 2a 20 20 2a 20 54 68 65 20 73 71 6c 69  *.**  * The sqli
c570: 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
c580: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  () function is a
c590: 62 6c 65 20 74 6f 20 65 78 74 72 61 63 74 20 61  ble to extract a
c5a0: 20 76 61 6c 75 65 20 0a 2a 2a 20 20 20 20 66 72   value .**    fr
c5b0: 6f 6d 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  om the expressio
c5c0: 6e 20 28 69 2e 65 2e 20 74 68 65 20 65 78 70 72  n (i.e. the expr
c5d0: 65 73 73 69 6f 6e 20 69 73 20 61 20 6c 69 74 65  ession is a lite
c5e0: 72 61 6c 20 76 61 6c 75 65 29 2e 0a 2a 2a 0a 2a  ral value)..**.*
c5f0: 2a 20 4f 72 2c 20 69 66 20 70 45 78 70 72 20 69  * Or, if pExpr i
c600: 73 20 61 20 54 4b 5f 56 45 43 54 4f 52 2c 20 6f  s a TK_VECTOR, o
c610: 6e 65 20 66 69 65 6c 64 20 69 73 20 70 6f 70 75  ne field is popu
c620: 6c 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  lated for each o
c630: 66 20 74 68 65 0a 2a 2a 20 76 65 63 74 6f 72 20  f the.** vector 
c640: 63 6f 6d 70 6f 6e 65 6e 74 73 20 74 68 61 74 20  components that 
c650: 6d 61 74 63 68 20 65 69 74 68 65 72 20 6f 66 20  match either of 
c660: 74 68 65 20 74 77 6f 20 6c 61 74 74 65 72 20 63  the two latter c
c670: 72 69 74 65 72 69 61 20 6c 69 73 74 65 64 0a 2a  riteria listed.*
c680: 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 42  * above..**.** B
c690: 65 66 6f 72 65 20 61 6e 79 20 76 61 6c 75 65 20  efore any value 
c6a0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
c6b0: 68 65 20 72 65 63 6f 72 64 2c 20 74 68 65 20 61  he record, the a
c6c0: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 0a  ffinity of the .
c6d0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
c6e0: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 69 6e 20 69   column within i
c6f0: 6e 64 65 78 20 70 49 64 78 20 69 73 20 61 70 70  ndex pIdx is app
c700: 6c 69 65 64 20 74 6f 20 69 74 2e 20 42 65 66 6f  lied to it. Befo
c710: 72 65 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  re.** this funct
c720: 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 6f 75 74  ion returns, out
c730: 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
c740: 6e 45 78 74 72 61 63 74 20 69 73 20 73 65 74 20  nExtract is set 
c750: 74 6f 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  to the.** number
c760: 20 6f 66 20 76 61 6c 75 65 73 20 61 70 70 65 6e   of values appen
c770: 64 65 64 20 74 6f 20 74 68 65 20 72 65 63 6f 72  ded to the recor
c780: 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  d..**.** When th
c790: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
c7a0: 61 6c 6c 65 64 2c 20 2a 70 70 52 65 63 20 6d 75  alled, *ppRec mu
c7b0: 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e 74 20  st either point 
c7c0: 74 6f 20 61 6e 20 6f 62 6a 65 63 74 0a 2a 2a 20  to an object.** 
c7d0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  allocated by an 
c7e0: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
c7f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
c800: 72 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  r must be NULL. 
c810: 49 66 20 69 74 0a 2a 2a 20 69 73 20 4e 55 4c 4c  If it.** is NULL
c820: 20 61 6e 64 20 61 20 76 61 6c 75 65 20 63 61 6e   and a value can
c830: 20 62 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79   be successfully
c840: 20 65 78 74 72 61 63 74 65 64 2c 20 61 20 6e 65   extracted, a ne
c850: 77 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  w UnpackedRecord
c860: 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  .** is allocated
c870: 20 28 61 6e 64 20 2a 70 70 52 65 63 20 73 65 74   (and *ppRec set
c880: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 69 74 29   to point to it)
c890: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
c8a0: 67 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  g..**.** Unless 
c8b0: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
c8c0: 75 6e 74 65 72 65 64 2c 20 53 51 4c 49 54 45 5f  untered, SQLITE_
c8d0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
c8e0: 49 74 20 69 73 20 6e 6f 74 20 61 6e 0a 2a 2a 20  It is not an.** 
c8f0: 65 72 72 6f 72 20 69 66 20 61 20 76 61 6c 75 65  error if a value
c900: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
c910: 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 2e  cted from pExpr.
c920: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
c930: 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 61 6e 20 53  s.** occur, an S
c940: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
c950: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c960: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 61 74  .int sqlite3Stat
c970: 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 0a  4ProbeSetValue(.
c980: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
c9b0: 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
c9c0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c9e0: 20 62 65 69 6e 67 20 70 72 6f 62 65 64 20 2a 2f   being probed */
c9f0: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
ca00: 64 20 2a 2a 70 70 52 65 63 2c 20 20 20 20 20 20  d **ppRec,      
ca10: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
ca20: 6f 62 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  obe record */.  
ca30: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ca60: 6e 20 74 6f 20 65 78 74 72 61 63 74 20 61 20 76  n to extract a v
ca70: 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  alue from */.  i
ca80: 6e 74 20 6e 45 6c 65 6d 2c 20 20 20 20 20 20 20  nt nElem,       
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
caa0: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
cab0: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61 70   of values to ap
cac0: 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 56  pend */.  int iV
cad0: 61 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  al,             
cae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
caf0: 61 79 20 65 6c 65 6d 65 6e 74 20 74 6f 20 70 6f  ay element to po
cb00: 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  pulate */.  int 
cb10: 2a 70 6e 45 78 74 72 61 63 74 20 20 20 20 20 20  *pnExtract      
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
cb30: 55 54 3a 20 56 61 6c 75 65 73 20 61 70 70 65 6e  UT: Values appen
cb40: 64 65 64 20 74 6f 20 74 68 65 20 72 65 63 6f 72  ded to the recor
cb50: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
cb60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
cb70: 69 6e 74 20 6e 45 78 74 72 61 63 74 20 3d 20 30  int nExtract = 0
cb80: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
cb90: 30 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d  0 || pExpr->op!=
cba0: 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
cbb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
cbc0: 63 74 20 56 61 6c 75 65 4e 65 77 53 74 61 74 34  ct ValueNewStat4
cbd0: 43 74 78 20 61 6c 6c 6f 63 3b 0a 0a 20 20 20 20  Ctx alloc;..    
cbe0: 61 6c 6c 6f 63 2e 70 50 61 72 73 65 20 3d 20 70  alloc.pParse = p
cbf0: 50 61 72 73 65 3b 0a 20 20 20 20 61 6c 6c 6f 63  Parse;.    alloc
cc00: 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
cc10: 20 20 61 6c 6c 6f 63 2e 70 70 52 65 63 20 3d 20    alloc.ppRec = 
cc20: 70 70 52 65 63 3b 0a 0a 20 20 20 20 66 6f 72 28  ppRec;..    for(
cc30: 69 3d 30 3b 20 69 3c 6e 45 6c 65 6d 3b 20 69 2b  i=0; i<nElem; i+
cc40: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
cc50: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  3_value *pVal = 
cc60: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  0;.      Expr *p
cc70: 45 6c 65 6d 20 3d 20 28 70 45 78 70 72 20 3f 20  Elem = (pExpr ? 
cc80: 73 71 6c 69 74 65 33 56 65 63 74 6f 72 46 69 65  sqlite3VectorFie
cc90: 6c 64 53 75 62 65 78 70 72 28 70 45 78 70 72 2c  ldSubexpr(pExpr,
cca0: 20 69 29 20 3a 20 30 29 3b 0a 20 20 20 20 20 20   i) : 0);.      
ccb0: 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  u8 aff = sqlite3
ccc0: 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69 6e  IndexColumnAffin
ccd0: 69 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ity(pParse->db, 
cce0: 70 49 64 78 2c 20 69 56 61 6c 2b 69 29 3b 0a 20  pIdx, iVal+i);. 
ccf0: 20 20 20 20 20 61 6c 6c 6f 63 2e 69 56 61 6c 20       alloc.iVal 
cd00: 3d 20 69 56 61 6c 2b 69 3b 0a 20 20 20 20 20 20  = iVal+i;.      
cd10: 72 63 20 3d 20 73 74 61 74 34 56 61 6c 75 65 46  rc = stat4ValueF
cd20: 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20  romExpr(pParse, 
cd30: 70 45 6c 65 6d 2c 20 61 66 66 2c 20 26 61 6c 6c  pElem, aff, &all
cd40: 6f 63 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20  oc, &pVal);.    
cd50: 20 20 69 66 28 20 21 70 56 61 6c 20 29 20 62 72    if( !pVal ) br
cd60: 65 61 6b 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  eak;.      nExtr
cd70: 61 63 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  act++;.    }.  }
cd80: 0a 0a 20 20 2a 70 6e 45 78 74 72 61 63 74 20 3d  ..  *pnExtract =
cd90: 20 6e 45 78 74 72 61 63 74 3b 0a 20 20 72 65 74   nExtract;.  ret
cda0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cdb0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
cdc0: 61 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d  act a value from
cdd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
cde0: 72 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  r using the meth
cdf0: 6f 64 73 0a 2a 2a 20 61 73 20 64 65 73 63 72 69  ods.** as descri
ce00: 62 65 64 20 66 6f 72 20 73 71 6c 69 74 65 33 53  bed for sqlite3S
ce10: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
ce20: 65 28 29 20 61 62 6f 76 65 2e 20 0a 2a 2a 0a 2a  e() above. .**.*
ce30: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
ce40: 20 73 65 74 20 2a 70 70 56 61 6c 20 74 6f 20 70   set *ppVal to p
ce50: 6f 69 6e 74 20 74 6f 20 61 20 6e 65 77 20 76 61  oint to a new va
ce60: 6c 75 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  lue object and r
ce70: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
ce80: 5f 4f 4b 2e 20 49 66 20 6e 6f 20 76 61 6c 75 65  _OK. If no value
ce90: 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65   can be extracte
cea0: 64 2c 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20  d, but no other 
ceb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
cec0: 28 65 2e 67 2e 20 4f 4f 4d 29 2c 20 72 65 74 75  (e.g. OOM), retu
ced0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
cee0: 20 73 65 74 20 2a 70 70 56 61 6c 20 74 6f 20 4e   set *ppVal to N
cef0: 55 4c 4c 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ULL. Or, if an e
cf00: 72 72 6f 72 0a 2a 2a 20 64 6f 65 73 20 6f 63 63  rror.** does occ
cf10: 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
cf20: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
cf30: 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   The final value
cf40: 20 6f 66 20 2a 70 70 56 61 6c 0a 2a 2a 20 69 73   of *ppVal.** is
cf50: 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
cf60: 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
cf70: 73 71 6c 69 74 65 33 53 74 61 74 34 56 61 6c 75  sqlite3Stat4Valu
cf80: 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61 72  eFromExpr(.  Par
cf90: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cfb0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
cfc0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
cff0: 73 69 6f 6e 20 74 6f 20 65 78 74 72 61 63 74 20  sion to extract 
d000: 61 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  a value from */.
d010: 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c 20 20    u8 affinity,  
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f    /* Affinity to
d040: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
d050: 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 20  3_value **ppVal 
d060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
d070: 3a 20 4e 65 77 20 76 61 6c 75 65 20 6f 62 6a 65  : New value obje
d080: 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ct (or NULL) */.
d090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 74 61 74  ){.  return stat
d0a0: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
d0b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66  Parse, pExpr, af
d0c0: 66 69 6e 69 74 79 2c 20 30 2c 20 70 70 56 61 6c  finity, 0, ppVal
d0d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72  );.}../*.** Extr
d0e0: 61 63 74 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  act the iCol-th 
d0f0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 74 68 65 20  column from the 
d100: 6e 52 65 63 2d 62 79 74 65 20 72 65 63 6f 72 64  nRec-byte record
d110: 20 69 6e 20 70 52 65 63 2e 20 20 57 72 69 74 65   in pRec.  Write
d120: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  .** the column v
d130: 61 6c 75 65 20 69 6e 74 6f 20 2a 70 70 56 61 6c  alue into *ppVal
d140: 2e 20 20 49 66 20 2a 70 70 56 61 6c 20 69 73 20  .  If *ppVal is 
d150: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 20 74  initially NULL t
d160: 68 65 6e 20 61 20 6e 65 77 0a 2a 2a 20 73 71 6c  hen a new.** sql
d170: 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63  ite3_value objec
d180: 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  t is allocated..
d190: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 70 56 61 6c 20  **.** If *ppVal 
d1a0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  is initially NUL
d1b0: 4c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  L then the calle
d1c0: 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
d1d0: 20 66 6f 72 20 0a 2a 2a 20 65 6e 73 75 72 69 6e   for .** ensurin
d1e0: 67 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  g that the value
d1f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
d200: 70 56 61 6c 20 69 73 20 65 76 65 6e 74 75 61 6c  pVal is eventual
d210: 6c 79 20 66 72 65 65 64 2e 0a 2a 2f 0a 69 6e 74  ly freed..*/.int
d220: 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
d230: 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  umn(.  sqlite3 *
d240: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d250: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
d260: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
d270: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 52 65 63 2c  onst void *pRec,
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d290: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
d2a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72  fer containing r
d2b0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
d2c0: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
d2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
d2e0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 52 65  ze of buffer pRe
d2f0: 63 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  c in bytes */.  
d300: 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  /* Column to ext
d330: 72 61 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ract */.  sqlite
d340: 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 20  3_value **ppVal 
d350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
d360: 3a 20 45 78 74 72 61 63 74 65 64 20 76 61 6c 75  : Extracted valu
d370: 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 74 3b  e */.){.  u32 t;
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 20 63            /* a c
d3a0: 6f 6c 75 6d 6e 20 74 79 70 65 20 63 6f 64 65 20  olumn type code 
d3b0: 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b 20 20  */.  int nHdr;  
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d3e0: 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
d3f0: 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  e record */.  in
d400: 74 20 69 48 64 72 3b 20 20 20 20 20 20 20 20 20  t iHdr;         
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d420: 20 4e 65 78 74 20 75 6e 72 65 61 64 20 68 65 61   Next unread hea
d430: 64 65 72 20 62 79 74 65 20 2a 2f 0a 20 20 69 6e  der byte */.  in
d440: 74 20 69 46 69 65 6c 64 3b 20 20 20 20 20 20 20  t iField;       
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d460: 20 4e 65 78 74 20 75 6e 72 65 61 64 20 64 61 74   Next unread dat
d470: 61 20 62 79 74 65 20 2a 2f 0a 20 20 69 6e 74 20  a byte */.  int 
d480: 73 7a 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20  szField;        
d490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d4a0: 69 7a 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ize of the curre
d4b0: 6e 74 20 64 61 74 61 20 66 69 65 6c 64 20 2a 2f  nt data field */
d4c0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64     /* Column ind
d4f0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20  ex */.  u8 *a = 
d500: 28 75 38 2a 29 70 52 65 63 3b 20 20 20 20 20 20  (u8*)pRec;      
d510: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 63          /* Typec
d520: 61 73 74 20 62 79 74 65 20 61 72 72 61 79 20 2a  ast byte array *
d530: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
d540: 2a 70 70 56 61 6c 3b 20 20 20 20 20 20 20 20 20  *ppVal;         
d550: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
d560: 75 6c 74 20 69 6e 74 6f 20 74 68 69 73 20 4d 65  ult into this Me
d570: 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  m object */..  a
d580: 73 73 65 72 74 28 20 69 43 6f 6c 3e 30 20 29 3b  ssert( iCol>0 );
d590: 0a 20 20 69 48 64 72 20 3d 20 67 65 74 56 61 72  .  iHdr = getVar
d5a0: 69 6e 74 33 32 28 61 2c 20 6e 48 64 72 29 3b 0a  int32(a, nHdr);.
d5b0: 20 20 69 66 28 20 6e 48 64 72 3e 6e 52 65 63 20    if( nHdr>nRec 
d5c0: 7c 7c 20 69 48 64 72 3e 3d 6e 48 64 72 20 29 20  || iHdr>=nHdr ) 
d5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d5e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 46  RRUPT_BKPT;.  iF
d5f0: 69 65 6c 64 20 3d 20 6e 48 64 72 3b 0a 20 20 66  ield = nHdr;.  f
d600: 6f 72 28 69 3d 30 3b 20 69 3c 3d 69 43 6f 6c 3b  or(i=0; i<=iCol;
d610: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 48 64 72 20   i++){.    iHdr 
d620: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
d630: 61 5b 69 48 64 72 5d 2c 20 74 29 3b 0a 20 20 20  a[iHdr], t);.   
d640: 20 74 65 73 74 63 61 73 65 28 20 69 48 64 72 3d   testcase( iHdr=
d650: 3d 6e 48 64 72 20 29 3b 0a 20 20 20 20 74 65 73  =nHdr );.    tes
d660: 74 63 61 73 65 28 20 69 48 64 72 3d 3d 6e 48 64  tcase( iHdr==nHd
d670: 72 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69  r+1 );.    if( i
d680: 48 64 72 3e 6e 48 64 72 20 29 20 72 65 74 75 72  Hdr>nHdr ) retur
d690: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d6a0: 5f 42 4b 50 54 3b 0a 20 20 20 20 73 7a 46 69 65  _BKPT;.    szFie
d6b0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ld = sqlite3Vdbe
d6c0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29  SerialTypeLen(t)
d6d0: 3b 0a 20 20 20 20 69 46 69 65 6c 64 20 2b 3d 20  ;.    iField += 
d6e0: 73 7a 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 74  szField;.  }.  t
d6f0: 65 73 74 63 61 73 65 28 20 69 46 69 65 6c 64 3d  estcase( iField=
d700: 3d 6e 52 65 63 20 29 3b 0a 20 20 74 65 73 74 63  =nRec );.  testc
d710: 61 73 65 28 20 69 46 69 65 6c 64 3d 3d 6e 52 65  ase( iField==nRe
d720: 63 2b 31 20 29 3b 0a 20 20 69 66 28 20 69 46 69  c+1 );.  if( iFi
d730: 65 6c 64 3e 6e 52 65 63 20 29 20 72 65 74 75 72  eld>nRec ) retur
d740: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d750: 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
d760: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4d 65 6d  m==0 ){.    pMem
d770: 20 3d 20 2a 70 70 56 61 6c 20 3d 20 73 71 6c 69   = *ppVal = sqli
d780: 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
d790: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30  .    if( pMem==0
d7a0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d7b0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
d7c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
d7d0: 72 69 61 6c 47 65 74 28 26 61 5b 69 46 69 65 6c  rialGet(&a[iFiel
d7e0: 64 2d 73 7a 46 69 65 6c 64 5d 2c 20 74 2c 20 70  d-szField], t, p
d7f0: 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e  Mem);.  pMem->en
d800: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 72  c = ENC(db);.  r
d810: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
d830: 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65   it is NULL, the
d840: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
d850: 65 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  e an UnpackedRec
d860: 6f 72 64 20 6f 62 6a 65 63 74 20 72 65 74 75 72  ord object retur
d870: 6e 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 61 72  ned.** by an ear
d880: 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
d890: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d8a0: 74 56 61 6c 75 65 28 29 2e 20 54 68 69 73 20 63  tValue(). This c
d8b0: 61 6c 6c 20 64 65 6c 65 74 65 73 0a 2a 2a 20 74  all deletes.** t
d8c0: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  he object..*/.vo
d8d0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  id sqlite3Stat4P
d8e0: 72 6f 62 65 46 72 65 65 28 55 6e 70 61 63 6b 65  robeFree(Unpacke
d8f0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 29 7b 0a  dRecord *pRec){.
d900: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
d910: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d920: 20 6e 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 70 4b   nCol = pRec->pK
d930: 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
d940: 64 3b 0a 20 20 20 20 4d 65 6d 20 2a 61 4d 65 6d  d;.    Mem *aMem
d950: 20 3d 20 70 52 65 63 2d 3e 61 4d 65 6d 3b 0a 20   = pRec->aMem;. 
d960: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
d970: 20 61 4d 65 6d 5b 30 5d 2e 64 62 3b 0a 20 20 20   aMem[0].db;.   
d980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
d990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
d9a0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
d9b0: 61 73 65 28 26 61 4d 65 6d 5b 69 5d 29 3b 0a 20  ase(&aMem[i]);. 
d9c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d9d0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 52 65  KeyInfoUnref(pRe
d9e0: 63 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  c->pKeyInfo);.  
d9f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
da00: 4e 28 64 62 2c 20 70 52 65 63 29 3b 0a 20 20 7d  N(db, pRec);.  }
da10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  .}.#endif /* ifd
da20: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
da30: 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
da40: 20 43 68 61 6e 67 65 20 74 68 65 20 73 74 72 69   Change the stri
da50: 6e 67 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 73  ng value of an s
da60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
da70: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
da80: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 0a  te3ValueSetStr(.
da90: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
daa0: 2a 76 2c 20 20 20 20 20 2f 2a 20 56 61 6c 75 65  *v,     /* Value
dab0: 20 74 6f 20 62 65 20 73 65 74 20 2a 2f 0a 20 20   to be set */.  
dac0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
dad0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
dae0: 6f 66 20 73 74 72 69 6e 67 20 7a 20 2a 2f 0a 20  of string z */. 
daf0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 20   const void *z, 
db00: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
db10: 66 20 74 68 65 20 6e 65 77 20 73 74 72 69 6e 67  f the new string
db20: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20   */.  u8 enc,   
db30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
db40: 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73 65 20 2a  ncoding to use *
db50: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
db60: 28 76 6f 69 64 2a 29 20 20 20 2f 2a 20 44 65 73  (void*)   /* Des
db70: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
db80: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
db90: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
dba0: 62 65 4d 65 6d 53 65 74 53 74 72 28 28 4d 65 6d  beMemSetStr((Mem
dbb0: 20 2a 29 76 2c 20 7a 2c 20 6e 2c 20 65 6e 63 2c   *)v, z, n, enc,
dbc0: 20 78 44 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDel);.}../*.**
dbd0: 20 46 72 65 65 20 61 6e 20 73 71 6c 69 74 65 33   Free an sqlite3
dbe0: 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a 2a 2f  _value object.*/
dbf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c  .void sqlite3Val
dc00: 75 65 46 72 65 65 28 73 71 6c 69 74 65 33 5f 76  ueFree(sqlite3_v
dc10: 61 6c 75 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  alue *v){.  if( 
dc20: 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !v ) return;.  s
dc30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
dc40: 65 61 73 65 28 28 4d 65 6d 20 2a 29 76 29 3b 0a  ease((Mem *)v);.
dc50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
dc60: 4e 28 28 28 4d 65 6d 2a 29 76 29 2d 3e 64 62 2c  N(((Mem*)v)->db,
dc70: 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   v);.}../*.** Th
dc80: 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79  e sqlite3ValueBy
dc90: 74 65 73 28 29 20 72 6f 75 74 69 6e 65 20 72 65  tes() routine re
dca0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
dcb0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
dcc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  .** sqlite3_valu
dcd0: 65 20 6f 62 6a 65 63 74 20 61 73 73 75 6d 69 6e  e object assumin
dce0: 67 20 74 68 61 74 20 69 74 20 75 73 65 73 20 74  g that it uses t
dcf0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 22 65 6e 63  he encoding "enc
dd00: 22 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 42  "..** The valueB
dd10: 79 74 65 73 28 29 20 72 6f 75 74 69 6e 65 20 69  ytes() routine i
dd20: 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63 74  s a helper funct
dd30: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ion..*/.static S
dd40: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
dd50: 6e 74 20 76 61 6c 75 65 42 79 74 65 73 28 73 71  nt valueBytes(sq
dd60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
dd70: 6c 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 72 65  l, u8 enc){.  re
dd80: 74 75 72 6e 20 76 61 6c 75 65 54 6f 54 65 78 74  turn valueToText
dd90: 28 70 56 61 6c 2c 20 65 6e 63 29 21 3d 30 20 3f  (pVal, enc)!=0 ?
dda0: 20 70 56 61 6c 2d 3e 6e 20 3a 20 30 3b 0a 7d 0a   pVal->n : 0;.}.
ddb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75 65  int sqlite3Value
ddc0: 42 79 74 65 73 28 73 71 6c 69 74 65 33 5f 76 61  Bytes(sqlite3_va
ddd0: 6c 75 65 20 2a 70 56 61 6c 2c 20 75 38 20 65 6e  lue *pVal, u8 en
dde0: 63 29 7b 0a 20 20 4d 65 6d 20 2a 70 20 3d 20 28  c){.  Mem *p = (
ddf0: 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20 20 61 73 73  Mem*)pVal;.  ass
de00: 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 20 26  ert( (p->flags &
de10: 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 7c 7c   MEM_Null)==0 ||
de20: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45   (p->flags & (ME
de30: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29  M_Str|MEM_Blob))
de40: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 2d  ==0 );.  if( (p-
de50: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
de60: 29 21 3d 30 20 26 26 20 70 56 61 6c 2d 3e 65 6e  )!=0 && pVal->en
de70: 63 3d 3d 65 6e 63 20 29 7b 0a 20 20 20 20 72 65  c==enc ){.    re
de80: 74 75 72 6e 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 20  turn p->n;.  }. 
de90: 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
dea0: 20 4d 45 4d 5f 42 6c 6f 62 29 21 3d 30 20 29 7b   MEM_Blob)!=0 ){
deb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
dec0: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
ded0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
dee0: 6e 20 2b 20 70 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a  n + p->u.nZero;.
def0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df00: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 3b 0a 20 20   return p->n;.  
df10: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
df20: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
df30: 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
df40: 72 65 74 75 72 6e 20 76 61 6c 75 65 42 79 74 65  return valueByte
df50: 73 28 70 56 61 6c 2c 20 65 6e 63 29 3b 0a 7d 0a  s(pVal, enc);.}.