/ Hex Artifact Content
Login

Artifact fdd1578e47bea61390d472de53c565781d81e045:


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 69 73 20 6d 69 67 68  Mem.xDel is migh
03c0: 74 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  t not be initial
03d0: 69 7a 65 64 20 69 66 20 4d 45 4d 5f 44 79 6e 20  ized if MEM_Dyn 
03e0: 69 73 20 63 6c 65 61 72 2e 0a 20 20 2a 2f 0a 20  is clear..  */. 
03f0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61   assert( (p->fla
0400: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30  gs & MEM_Dyn)==0
0410: 20 7c 7c 20 70 2d 3e 78 44 65 6c 21 3d 30 20 29   || p->xDel!=0 )
0420: 3b 0a 0a 20 20 2f 2a 20 4d 45 4d 5f 44 79 6e 20  ;..  /* MEM_Dyn 
0430: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65 74 20  may only be set 
0440: 69 66 20 4d 65 6d 2e 73 7a 4d 61 6c 6c 6f 63 3d  if Mem.szMalloc=
0450: 3d 30 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  =0.  In this way
0460: 20 77 65 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   we.  ** ensure 
0470: 74 68 61 74 20 69 66 20 4d 65 6d 2e 73 7a 4d 61  that if Mem.szMa
0480: 6c 6c 6f 63 3e 30 20 74 68 65 6e 20 69 74 20 69  lloc>0 then it i
0490: 73 20 73 61 66 65 20 74 6f 20 64 6f 0a 20 20 2a  s safe to do.  *
04a0: 2a 20 4d 65 6d 2e 7a 20 3d 20 4d 65 6d 2e 7a 4d  * Mem.z = Mem.zM
04b0: 61 6c 6c 6f 63 20 77 69 74 68 6f 75 74 20 68 61  alloc without ha
04c0: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 4d 65  ving to check Me
04d0: 6d 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 2e  m.flags&MEM_Dyn.
04e0: 0a 20 20 2a 2a 20 54 68 61 74 20 73 61 76 65 73  .  ** That saves
04f0: 20 61 20 66 65 77 20 63 79 63 6c 65 73 20 69 6e   a few cycles in
0500: 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 2e 20 2a 2f   inner loops. */
0510: 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 66  .  assert( (p->f
0520: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d  lags & MEM_Dyn)=
0530: 3d 30 20 7c 7c 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  =0 || p->szMallo
0540: 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  c==0 );..  /* Ca
0550: 6e 6e 6f 74 20 62 65 20 62 6f 74 68 20 4d 45 4d  nnot be both MEM
0560: 5f 49 6e 74 20 61 6e 64 20 4d 45 4d 5f 52 65 61  _Int and MEM_Rea
0570: 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
0580: 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  me */.  assert( 
0590: 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  (p->flags & (MEM
05a0: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21  _Int|MEM_Real))!
05b0: 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  =(MEM_Int|MEM_Re
05c0: 61 6c 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  al) );..  /* The
05d0: 20 73 7a 4d 61 6c 6c 6f 63 20 66 69 65 6c 64 20   szMalloc field 
05e0: 68 6f 6c 64 73 20 74 68 65 20 63 6f 72 72 65 63  holds the correc
05f0: 74 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  t memory allocat
0600: 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  ion size */.  as
0610: 73 65 72 74 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  sert( p->szMallo
0620: 63 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70  c==0.       || p
0630: 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69  ->szMalloc==sqli
0640: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0650: 70 2d 3e 64 62 2c 70 2d 3e 7a 4d 61 6c 6c 6f 63  p->db,p->zMalloc
0660: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 20  ) );..  /* If p 
0670: 68 6f 6c 64 73 20 61 20 73 74 72 69 6e 67 20 6f  holds a string o
0680: 72 20 62 6c 6f 62 2c 20 74 68 65 20 4d 65 6d 2e  r blob, the Mem.
0690: 7a 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  z must point to 
06a0: 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 6f 6e 65  exactly.  ** one
06b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
06c0: 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  g:.  **.  **   (
06d0: 31 29 20 4d 65 6d 6f 72 79 20 69 6e 20 4d 65 6d  1) Memory in Mem
06e0: 2e 7a 4d 61 6c 6c 6f 63 20 61 6e 64 20 6d 61 6e  .zMalloc and man
06f0: 61 67 65 64 20 62 79 20 74 68 65 20 4d 65 6d 20  aged by the Mem 
0700: 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 20 20 28 32  object.  **   (2
0710: 29 20 4d 65 6d 6f 72 79 20 74 6f 20 62 65 20 66  ) Memory to be f
0720: 72 65 65 64 20 75 73 69 6e 67 20 4d 65 6d 2e 78  reed using Mem.x
0730: 44 65 6c 0a 20 20 2a 2a 20 20 20 28 33 29 20 41  Del.  **   (3) A
0740: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
0750: 6e 67 20 6f 72 20 62 6c 6f 62 0a 20 20 2a 2a 20  ng or blob.  ** 
0760: 20 20 28 34 29 20 41 20 73 74 61 74 69 63 20 73    (4) A static s
0770: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 0a 20 20  tring or blob.  
0780: 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61  */.  if( (p->fla
0790: 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45  gs & (MEM_Str|ME
07a0: 4d 5f 42 6c 6f 62 29 29 20 26 26 20 70 2d 3e 6e  M_Blob)) && p->n
07b0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
07c0: 28 20 0a 20 20 20 20 20 20 28 28 70 2d 3e 73 7a  ( .      ((p->sz
07d0: 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70 2d 3e 7a  Malloc>0 && p->z
07e0: 3d 3d 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3f 20 31  ==p->zMalloc)? 1
07f0: 20 3a 20 30 29 20 2b 0a 20 20 20 20 20 20 28 28   : 0) +.      ((
0800: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  p->flags&MEM_Dyn
0810: 29 21 3d 30 20 3f 20 31 20 3a 20 30 29 20 2b 0a  )!=0 ? 1 : 0) +.
0820: 20 20 20 20 20 20 28 28 70 2d 3e 66 6c 61 67 73        ((p->flags
0830: 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d 30 20 3f  &MEM_Ephem)!=0 ?
0840: 20 31 20 3a 20 30 29 20 2b 0a 20 20 20 20 20 20   1 : 0) +.      
0850: 28 28 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  ((p->flags&MEM_S
0860: 74 61 74 69 63 29 21 3d 30 20 3f 20 31 20 3a 20  tatic)!=0 ? 1 : 
0870: 30 29 20 3d 3d 20 31 0a 20 20 20 20 29 3b 0a 20  0) == 1.    );. 
0880: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
0890: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
08a0: 49 66 20 70 4d 65 6d 20 69 73 20 61 6e 20 6f 62  If pMem is an ob
08b0: 6a 65 63 74 20 77 69 74 68 20 61 20 76 61 6c 69  ject with a vali
08c0: 64 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  d string represe
08d0: 6e 74 61 74 69 6f 6e 2c 20 74 68 69 73 20 72 6f  ntation, this ro
08e0: 75 74 69 6e 65 0a 2a 2a 20 65 6e 73 75 72 65 73  utine.** ensures
08f0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 65 6e   the internal en
0900: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 73  coding for the s
0910: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
0920: 74 69 6f 6e 20 69 73 0a 2a 2a 20 27 64 65 73 69  tion is.** 'desi
0930: 72 65 64 45 6e 63 27 2c 20 6f 6e 65 20 6f 66 20  redEnc', one of 
0940: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
0950: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
0960: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2e 0a 2a  QLITE_UTF16BE..*
0970: 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20  *.** If pMem is 
0980: 6e 6f 74 20 61 20 73 74 72 69 6e 67 20 6f 62 6a  not a string obj
0990: 65 63 74 2c 20 6f 72 20 74 68 65 20 65 6e 63 6f  ect, or the enco
09a0: 64 69 6e 67 20 6f 66 20 74 68 65 20 73 74 72 69  ding of the stri
09b0: 6e 67 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61  ng.** representa
09c0: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
09d0: 73 74 6f 72 65 64 20 75 73 69 6e 67 20 74 68 65  stored using the
09e0: 20 72 65 71 75 65 73 74 65 64 20 65 6e 63 6f 64   requested encod
09f0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  ing, then this.*
0a00: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  * routine is a n
0a10: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
0a20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
0a30: 64 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  d if the convers
0a40: 69 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75  ion is successfu
0a50: 6c 20 28 6f 72 20 6e 6f 74 20 72 65 71 75 69 72  l (or not requir
0a60: 65 64 29 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ed)..** SQLITE_N
0a70: 4f 4d 45 4d 20 6d 61 79 20 62 65 20 72 65 74 75  OMEM may be retu
0a80: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
0a90: 28 29 20 66 61 69 6c 73 20 64 75 72 69 6e 67 20  () fails during 
0aa0: 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 62 65  conversion.** be
0ab0: 74 77 65 65 6e 20 66 6f 72 6d 61 74 73 2e 0a 2a  tween formats..*
0ac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0ad0: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
0ae0: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 64  Mem *pMem, int d
0af0: 65 73 69 72 65 64 45 6e 63 29 7b 0a 23 69 66 6e  esiredEnc){.#ifn
0b00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b10: 55 54 46 31 36 0a 20 20 69 6e 74 20 72 63 3b 0a  UTF16.  int rc;.
0b20: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
0b30: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45   (pMem->flags&ME
0b40: 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
0b50: 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
0b60: 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  dEnc==SQLITE_UTF
0b70: 38 20 7c 7c 20 64 65 73 69 72 65 64 45 6e 63 3d  8 || desiredEnc=
0b80: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 0a  =SQLITE_UTF16LE.
0b90: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 64 65             || de
0ba0: 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45  siredEnc==SQLITE
0bb0: 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66  _UTF16BE );.  if
0bc0: 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  ( !(pMem->flags&
0bd0: 4d 45 4d 5f 53 74 72 29 20 7c 7c 20 70 4d 65 6d  MEM_Str) || pMem
0be0: 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64 45 6e  ->enc==desiredEn
0bf0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
0c00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
0c10: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
0c20: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
0c30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
0c40: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 23  >db->mutex) );.#
0c50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0c60: 54 5f 55 54 46 31 36 0a 20 20 72 65 74 75 72 6e  T_UTF16.  return
0c70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23   SQLITE_ERROR;.#
0c80: 65 6c 73 65 0a 0a 20 20 2f 2a 20 4d 65 6d 54 72  else..  /* MemTr
0c90: 61 6e 73 6c 61 74 65 28 29 20 6d 61 79 20 72 65  anslate() may re
0ca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
0cb0: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  r SQLITE_NOMEM. 
0cc0: 49 66 20 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  If NOMEM is retu
0cd0: 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  rned,.  ** then 
0ce0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
0cf0: 74 68 65 20 76 61 6c 75 65 20 6d 61 79 20 6e 6f  the value may no
0d00: 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  t have changed..
0d10: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
0d20: 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c  te3VdbeMemTransl
0d30: 61 74 65 28 70 4d 65 6d 2c 20 28 75 38 29 64 65  ate(pMem, (u8)de
0d40: 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 61 73 73  siredEnc);.  ass
0d50: 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
0d60: 4b 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  K    || rc==SQLI
0d70: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 61 73 73  TE_NOMEM);.  ass
0d80: 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
0d90: 4b 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 65 6e  K    || pMem->en
0da0: 63 21 3d 64 65 73 69 72 65 64 45 6e 63 29 3b 0a  c!=desiredEnc);.
0db0: 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
0dc0: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 4d 65  ITE_NOMEM || pMe
0dd0: 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64 45  m->enc==desiredE
0de0: 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
0df0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
0e00: 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 4d 65 6d  * Make sure pMem
0e10: 2d 3e 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ->z points to a 
0e20: 77 72 69 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  writable allocat
0e30: 69 6f 6e 20 6f 66 20 61 74 20 6c 65 61 73 74 20  ion of at least 
0e40: 0a 2a 2a 20 6d 69 6e 28 6e 2c 33 32 29 20 62 79  .** min(n,32) by
0e50: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  tes..**.** If th
0e60: 65 20 62 50 72 65 73 65 72 76 65 20 61 72 67 75  e bPreserve argu
0e70: 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  ment is true, th
0e80: 65 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  en copy of the c
0e90: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 70 4d 65  ontent of.** pMe
0ea0: 6d 2d 3e 7a 20 69 6e 74 6f 20 74 68 65 20 6e 65  m->z into the ne
0eb0: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 70  w allocation.  p
0ec0: 4d 65 6d 20 6d 75 73 74 20 62 65 20 65 69 74 68  Mem must be eith
0ed0: 65 72 20 61 20 73 74 72 69 6e 67 20 6f 72 0a 2a  er a string or.*
0ee0: 2a 20 62 6c 6f 62 20 69 66 20 62 50 72 65 73 65  * blob if bPrese
0ef0: 72 76 65 20 69 73 20 74 72 75 65 2e 20 20 49 66  rve is true.  If
0f00: 20 62 50 72 65 73 65 72 76 65 20 69 73 20 66 61   bPreserve is fa
0f10: 6c 73 65 2c 20 61 6e 79 20 70 72 69 6f 72 20 63  lse, any prior c
0f20: 6f 6e 74 65 6e 74 0a 2a 2a 20 69 6e 20 70 4d 65  ontent.** in pMe
0f30: 6d 2d 3e 7a 20 69 73 20 64 69 73 63 61 72 64 65  m->z is discarde
0f40: 64 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 4e 4f 49  d..*/.SQLITE_NOI
0f50: 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65  NLINE int sqlite
0f60: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 4d 65 6d  3VdbeMemGrow(Mem
0f70: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 6e 2c 20 69   *pMem, int n, i
0f80: 6e 74 20 62 50 72 65 73 65 72 76 65 29 7b 0a 20  nt bPreserve){. 
0f90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0fa0: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
0fb0: 72 69 61 6e 74 73 28 70 4d 65 6d 29 20 29 3b 0a  riants(pMem) );.
0fc0: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
0fd0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65  >flags&MEM_RowSe
0fe0: 74 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  t)==0 );..  /* I
0ff0: 66 20 74 68 65 20 62 50 72 65 73 65 72 76 65 20  f the bPreserve 
1000: 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
1010: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 65  rue, then the me
1020: 6d 6f 72 79 20 63 65 6c 6c 20 6d 75 73 74 20 61  mory cell must a
1030: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 63 6f 6e 74  lready.  ** cont
1040: 61 69 6e 20 61 20 76 61 6c 69 64 20 73 74 72 69  ain a valid stri
1050: 6e 67 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  ng or blob value
1060: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1070: 62 50 72 65 73 65 72 76 65 3d 3d 30 20 7c 7c 20  bPreserve==0 || 
1080: 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  pMem->flags&(MEM
1090: 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20 29  _Blob|MEM_Str) )
10a0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 62 50  ;.  testcase( bP
10b0: 72 65 73 65 72 76 65 20 26 26 20 70 4d 65 6d 2d  reserve && pMem-
10c0: 3e 7a 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  >z==0 );..  asse
10d0: 72 74 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  rt( pMem->szMall
10e0: 6f 63 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  oc==0.       || 
10f0: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3d 3d  pMem->szMalloc==
1100: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1110: 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d  ize(pMem->db, pM
1120: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 20 29 3b 0a  em->zMalloc) );.
1130: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61    if( pMem->szMa
1140: 6c 6c 6f 63 3c 6e 20 29 7b 0a 20 20 20 20 69 66  lloc<n ){.    if
1150: 28 20 6e 3c 33 32 20 29 20 6e 20 3d 20 33 32 3b  ( n<32 ) n = 32;
1160: 0a 20 20 20 20 69 66 28 20 62 50 72 65 73 65 72  .    if( bPreser
1170: 76 65 20 26 26 20 70 4d 65 6d 2d 3e 73 7a 4d 61  ve && pMem->szMa
1180: 6c 6c 6f 63 3e 30 20 26 26 20 70 4d 65 6d 2d 3e  lloc>0 && pMem->
1190: 7a 3d 3d 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  z==pMem->zMalloc
11a0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
11b0: 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  z = pMem->zMallo
11c0: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  c = sqlite3DbRea
11d0: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 4d 65 6d 2d  llocOrFree(pMem-
11e0: 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6e 29  >db, pMem->z, n)
11f0: 3b 0a 20 20 20 20 20 20 62 50 72 65 73 65 72 76  ;.      bPreserv
1200: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
1210: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1220: 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 29 20 73  ->szMalloc>0 ) s
1230: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 4d 65  qlite3DbFree(pMe
1240: 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61  m->db, pMem->zMa
1250: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 70 4d 65  lloc);.      pMe
1260: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c  m->zMalloc = sql
1270: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1280: 70 4d 65 6d 2d 3e 64 62 2c 20 6e 29 3b 0a 20 20  pMem->db, n);.  
1290: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 65 6d    }.    if( pMem
12a0: 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 7b 0a  ->zMalloc==0 ){.
12b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12c0: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
12d0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  );.      pMem->z
12e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d   = 0;.      pMem
12f0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1310: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1320: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4d 65 6d  else{.      pMem
1330: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c  ->szMalloc = sql
1340: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
1350: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
1360: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d  >zMalloc);.    }
1370: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 72 65  .  }..  if( bPre
1380: 73 65 72 76 65 20 26 26 20 70 4d 65 6d 2d 3e 7a  serve && pMem->z
1390: 20 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65   && pMem->z!=pMe
13a0: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  m->zMalloc ){.  
13b0: 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a    memcpy(pMem->z
13c0: 4d 61 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e 7a 2c  Malloc, pMem->z,
13d0: 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 7d 0a 20   pMem->n);.  }. 
13e0: 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67   if( (pMem->flag
13f0: 73 26 4d 45 4d 5f 44 79 6e 29 21 3d 30 20 29 7b  s&MEM_Dyn)!=0 ){
1400: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1410: 6d 2d 3e 78 44 65 6c 21 3d 30 20 26 26 20 70 4d  m->xDel!=0 && pM
1420: 65 6d 2d 3e 78 44 65 6c 21 3d 53 51 4c 49 54 45  em->xDel!=SQLITE
1430: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
1440: 70 4d 65 6d 2d 3e 78 44 65 6c 28 28 76 6f 69 64  pMem->xDel((void
1450: 20 2a 29 28 70 4d 65 6d 2d 3e 7a 29 29 3b 0a 20   *)(pMem->z));. 
1460: 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20   }..  pMem->z = 
1470: 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20  pMem->zMalloc;. 
1480: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20   pMem->flags &= 
1490: 7e 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70  ~(MEM_Dyn|MEM_Ep
14a0: 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29 3b  hem|MEM_Static);
14b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
14d0: 61 6e 67 65 20 74 68 65 20 70 4d 65 6d 2d 3e 7a  ange the pMem->z
14e0: 4d 61 6c 6c 6f 63 20 61 6c 6c 6f 63 61 74 69 6f  Malloc allocatio
14f0: 6e 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  n to be at least
1500: 20 73 7a 4e 65 77 20 62 79 74 65 73 2e 0a 2a 2a   szNew bytes..**
1510: 20 49 66 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f   If pMem->zMallo
1520: 63 20 61 6c 72 65 61 64 79 20 6d 65 65 74 73 20  c already meets 
1530: 6f 72 20 65 78 63 65 65 64 73 20 74 68 65 20 72  or exceeds the r
1540: 65 71 75 65 73 74 65 64 20 73 69 7a 65 2c 20 74  equested size, t
1550: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
1560: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1570: 20 41 6e 79 20 70 72 69 6f 72 20 73 74 72 69 6e   Any prior strin
1580: 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 74 65 6e  g or blob conten
1590: 74 20 69 6e 20 74 68 65 20 70 4d 65 6d 20 6f 62  t in the pMem ob
15a0: 6a 65 63 74 20 6d 61 79 20 62 65 20 64 69 73 63  ject may be disc
15b0: 61 72 64 65 64 2e 0a 2a 2a 20 54 68 65 20 70 4d  arded..** The pM
15c0: 65 6d 2d 3e 78 44 65 6c 20 64 65 73 74 72 75 63  em->xDel destruc
15d0: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  tor is called, i
15e0: 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 54 68  f it exists.  Th
15f0: 6f 75 67 68 20 4d 45 4d 5f 53 74 72 0a 2a 2a 20  ough MEM_Str.** 
1600: 61 6e 64 20 4d 45 4d 5f 42 6c 6f 62 20 76 61 6c  and MEM_Blob val
1610: 75 65 73 20 6d 61 79 20 62 65 20 64 69 73 63 61  ues may be disca
1620: 72 64 65 64 2c 20 4d 45 4d 5f 49 6e 74 2c 20 4d  rded, MEM_Int, M
1630: 45 4d 5f 52 65 61 6c 2c 20 61 6e 64 20 4d 45 4d  EM_Real, and MEM
1640: 5f 4e 75 6c 6c 0a 2a 2a 20 76 61 6c 75 65 73 20  _Null.** values 
1650: 61 72 65 20 70 72 65 73 65 72 76 65 64 2e 0a 2a  are preserved..*
1660: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1670: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1680: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1690: 65 20 28 70 72 6f 62 61 62 6c 79 20 53 51 4c 49  e (probably SQLI
16a0: 54 45 5f 4e 4f 4d 45 4d 29 0a 2a 2a 20 69 66 20  TE_NOMEM).** if 
16b0: 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
16c0: 74 65 20 74 68 65 20 72 65 73 69 7a 69 6e 67 2e  te the resizing.
16d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16e0: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
16f0: 73 69 7a 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  size(Mem *pMem, 
1700: 69 6e 74 20 73 7a 4e 65 77 29 7b 0a 20 20 61 73  int szNew){.  as
1710: 73 65 72 74 28 20 73 7a 4e 65 77 3e 30 20 29 3b  sert( szNew>0 );
1720: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
1730: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
1740: 6e 29 3d 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 73  n)==0 || pMem->s
1750: 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  zMalloc==0 );.  
1760: 69 66 28 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  if( pMem->szMall
1770: 6f 63 3c 73 7a 4e 65 77 20 29 7b 0a 20 20 20 20  oc<szNew ){.    
1780: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1790: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
17a0: 73 7a 4e 65 77 2c 20 30 29 3b 0a 20 20 7d 0a 20  szNew, 0);.  }. 
17b0: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e   assert( (pMem->
17c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29  flags & MEM_Dyn)
17d0: 3d 3d 30 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 7a  ==0 );.  pMem->z
17e0: 20 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63   = pMem->zMalloc
17f0: 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  ;.  pMem->flags 
1800: 26 3d 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  &= (MEM_Null|MEM
1810: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 3b 0a  _Int|MEM_Real);.
1820: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1830: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
1840: 6e 67 65 20 70 4d 65 6d 20 73 6f 20 74 68 61 74  nge pMem so that
1850: 20 69 74 73 20 4d 45 4d 5f 53 74 72 20 6f 72 20   its MEM_Str or 
1860: 4d 45 4d 5f 42 6c 6f 62 20 76 61 6c 75 65 20 69  MEM_Blob value i
1870: 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 4d  s stored in.** M
1880: 45 4d 2e 7a 4d 61 6c 6c 6f 63 2c 20 77 68 65 72  EM.zMalloc, wher
1890: 65 20 69 74 20 63 61 6e 20 62 65 20 73 61 66 65  e it can be safe
18a0: 6c 79 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  ly written..**.*
18b0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18c0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
18d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
18e0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
18f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1900: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
1910: 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  e(Mem *pMem){.  
1920: 69 6e 74 20 66 3b 0a 20 20 61 73 73 65 72 74 28  int f;.  assert(
1930: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
1940: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1950: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
1960: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1970: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45   (pMem->flags&ME
1980: 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
1990: 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 4d 65    ExpandBlob(pMe
19a0: 6d 29 3b 0a 20 20 66 20 3d 20 70 4d 65 6d 2d 3e  m);.  f = pMem->
19b0: 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66 26  flags;.  if( (f&
19c0: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
19d0: 62 29 29 20 26 26 20 28 70 4d 65 6d 2d 3e 73 7a  b)) && (pMem->sz
19e0: 4d 61 6c 6c 6f 63 3d 3d 30 20 7c 7c 20 70 4d 65  Malloc==0 || pMe
19f0: 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 4d 61 6c  m->z!=pMem->zMal
1a00: 6c 6f 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20  loc) ){.    if( 
1a10: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
1a20: 6f 77 28 70 4d 65 6d 2c 20 70 4d 65 6d 2d 3e 6e  ow(pMem, pMem->n
1a30: 20 2b 20 32 2c 20 31 29 20 29 7b 0a 20 20 20 20   + 2, 1) ){.    
1a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
1a60: 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e   pMem->z[pMem->n
1a70: 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  ] = 0;.    pMem-
1a80: 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b 31 5d 20 3d 20  >z[pMem->n+1] = 
1a90: 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  0;.    pMem->fla
1aa0: 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
1ab0: 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67    }.  pMem->flag
1ac0: 73 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b  s &= ~MEM_Ephem;
1ad0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ae0: 45 42 55 47 0a 20 20 70 4d 65 6d 2d 3e 70 53 63  EBUG.  pMem->pSc
1af0: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e  opyFrom = 0;.#en
1b00: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
1b10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b20: 2a 20 49 66 20 74 68 65 20 67 69 76 65 6e 20 4d  * If the given M
1b30: 65 6d 2a 20 68 61 73 20 61 20 7a 65 72 6f 2d 66  em* has a zero-f
1b40: 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 75 72 6e  illed tail, turn
1b50: 20 69 74 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69   it into an ordi
1b60: 6e 61 72 79 0a 2a 2a 20 62 6c 6f 62 20 73 74 6f  nary.** blob sto
1b70: 72 65 64 20 69 6e 20 64 79 6e 61 6d 69 63 61 6c  red in dynamical
1b80: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  ly allocated spa
1b90: 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ce..*/.#ifndef S
1ba0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1bb0: 4c 4f 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  LOB.int sqlite3V
1bc0: 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62  dbeMemExpandBlob
1bd0: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
1be0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
1bf0: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1c00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
1c10: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
1c20: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  ags&MEM_Blob );.
1c30: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
1c40: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77  m->flags&MEM_Row
1c50: 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Set)==0 );.    a
1c60: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d  ssert( pMem->db=
1c70: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
1c80: 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64  tex_held(pMem->d
1c90: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
1ca0: 20 20 2f 2a 20 53 65 74 20 6e 42 79 74 65 20 74    /* Set nByte t
1cb0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1cc0: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
1cd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 65 78 70 61  o store the expa
1ce0: 6e 64 65 64 20 62 6c 6f 62 2e 20 2a 2f 0a 20 20  nded blob. */.  
1cf0: 20 20 6e 42 79 74 65 20 3d 20 70 4d 65 6d 2d 3e    nByte = pMem->
1d00: 6e 20 2b 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  n + pMem->u.nZer
1d10: 6f 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  o;.    if( nByte
1d20: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  <=0 ){.      nBy
1d30: 74 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  te = 1;.    }.  
1d40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
1d50: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
1d60: 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  Byte, 1) ){.    
1d70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d80: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
1d90: 20 20 6d 65 6d 73 65 74 28 26 70 4d 65 6d 2d 3e    memset(&pMem->
1da0: 7a 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 70  z[pMem->n], 0, p
1db0: 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20  Mem->u.nZero);. 
1dc0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 2b 3d 20 70 4d     pMem->n += pM
1dd0: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
1de0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20   pMem->flags &= 
1df0: 7e 28 4d 45 4d 5f 5a 65 72 6f 7c 4d 45 4d 5f 54  ~(MEM_Zero|MEM_T
1e00: 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erm);.  }.  retu
1e10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 74  #endif../*.** It
1e30: 20 69 73 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   is already know
1e40: 6e 20 74 68 61 74 20 70 4d 65 6d 20 63 6f 6e 74  n that pMem cont
1e50: 61 69 6e 73 20 61 6e 20 75 6e 74 65 72 6d 69 6e  ains an untermin
1e60: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 20  ated string..** 
1e70: 41 64 64 20 74 68 65 20 7a 65 72 6f 20 74 65 72  Add the zero ter
1e80: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
1e90: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1ea0: 4e 45 20 69 6e 74 20 76 64 62 65 4d 65 6d 41 64  NE int vdbeMemAd
1eb0: 64 54 65 72 6d 69 6e 61 74 6f 72 28 4d 65 6d 20  dTerminator(Mem 
1ec0: 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 73 71  *pMem){.  if( sq
1ed0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
1ee0: 28 70 4d 65 6d 2c 20 70 4d 65 6d 2d 3e 6e 2b 32  (pMem, pMem->n+2
1ef0: 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 1) ){.    retu
1f00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f10: 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 7a 5b 70  .  }.  pMem->z[p
1f20: 4d 65 6d 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70  Mem->n] = 0;.  p
1f30: 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b 31  Mem->z[pMem->n+1
1f40: 5d 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e 66  ] = 0;.  pMem->f
1f50: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
1f60: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f70: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1f80: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 69 76  ake sure the giv
1f90: 65 6e 20 4d 65 6d 20 69 73 20 5c 75 30 30 30 30  en Mem is \u0000
1fa0: 20 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a   terminated..*/.
1fb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
1fc0: 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 4d  emNulTerminate(M
1fd0: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73  em *pMem){.  ass
1fe0: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
1ff0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
2000: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
2010: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 73  >mutex) );.  tes
2020: 74 63 61 73 65 28 20 28 70 4d 65 6d 2d 3e 66 6c  tcase( (pMem->fl
2030: 61 67 73 20 26 20 28 4d 45 4d 5f 54 65 72 6d 7c  ags & (MEM_Term|
2040: 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f  MEM_Str))==(MEM_
2050: 54 65 72 6d 7c 4d 45 4d 5f 53 74 72 29 20 29 3b  Term|MEM_Str) );
2060: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 70 4d  .  testcase( (pM
2070: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  em->flags & (MEM
2080: 5f 54 65 72 6d 7c 4d 45 4d 5f 53 74 72 29 29 3d  _Term|MEM_Str))=
2090: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 4d 65  =0 );.  if( (pMe
20a0: 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  m->flags & (MEM_
20b0: 54 65 72 6d 7c 4d 45 4d 5f 53 74 72 29 29 21 3d  Term|MEM_Str))!=
20c0: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 72  MEM_Str ){.    r
20d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20e0: 20 20 20 2f 2a 20 4e 6f 74 68 69 6e 67 20 74 6f     /* Nothing to
20f0: 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
2100: 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 4d      return vdbeM
2110: 65 6d 41 64 64 54 65 72 6d 69 6e 61 74 6f 72 28  emAddTerminator(
2120: 70 4d 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pMem);.  }.}../*
2130: 0a 2a 2a 20 41 64 64 20 4d 45 4d 5f 53 74 72 20  .** Add MEM_Str 
2140: 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 72 65  to the set of re
2150: 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 66 6f  presentations fo
2160: 72 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d 2e  r the given Mem.
2170: 20 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 72 65    Numbers.** are
2180: 20 63 6f 6e 76 65 72 74 65 64 20 75 73 69 6e 67   converted using
2190: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
21a0: 66 28 29 2e 20 20 43 6f 6e 76 65 72 74 69 6e 67  f().  Converting
21b0: 20 61 20 42 4c 4f 42 20 74 6f 20 61 20 73 74 72   a BLOB to a str
21c0: 69 6e 67 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ing.** is a no-o
21d0: 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 69 73 74 69 6e  p..**.** Existin
21e0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
21f0: 73 20 4d 45 4d 5f 49 6e 74 20 61 6e 64 20 4d 45  s MEM_Int and ME
2200: 4d 5f 52 65 61 6c 20 61 72 65 20 69 6e 76 61 6c  M_Real are inval
2210: 69 64 61 74 65 64 20 69 66 0a 2a 2a 20 62 46 6f  idated if.** bFo
2220: 72 63 65 20 69 73 20 74 72 75 65 20 62 75 74 20  rce is true but 
2230: 61 72 65 20 72 65 74 61 69 6e 65 64 20 69 66 20  are retained if 
2240: 62 46 6f 72 63 65 20 69 73 20 66 61 6c 73 65 2e  bForce is false.
2250: 0a 2a 2a 0a 2a 2a 20 41 20 4d 45 4d 5f 4e 75 6c  .**.** A MEM_Nul
2260: 6c 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 65 76  l value will nev
2270: 65 72 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  er be passed to 
2280: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2290: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
22a0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 76  ** used for conv
22b0: 65 72 74 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  erting values to
22c0: 20 74 65 78 74 20 66 6f 72 20 72 65 74 75 72 6e   text for return
22d0: 69 6e 67 20 74 6f 20 74 68 65 20 75 73 65 72 20  ing to the user 
22e0: 28 69 2e 65 2e 20 76 69 61 0a 2a 2a 20 73 71 6c  (i.e. via.** sql
22f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
2300: 29 29 2c 20 6f 72 20 66 6f 72 20 65 6e 73 75 72  )), or for ensur
2310: 69 6e 67 20 74 68 61 74 20 76 61 6c 75 65 73 20  ing that values 
2320: 74 6f 20 62 65 20 75 73 65 64 20 61 73 20 62 74  to be used as bt
2330: 72 65 65 0a 2a 2a 20 6b 65 79 73 20 61 72 65 20  ree.** keys are 
2340: 73 74 72 69 6e 67 73 2e 20 49 6e 20 74 68 65 20  strings. In the 
2350: 66 6f 72 6d 65 72 20 63 61 73 65 20 61 20 4e 55  former case a NU
2360: 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65  LL pointer is re
2370: 74 75 72 6e 65 64 20 74 68 65 0a 2a 2a 20 75 73  turned the.** us
2380: 65 72 20 61 6e 64 20 74 68 65 20 6c 61 74 74 65  er and the latte
2390: 72 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r is an internal
23a0: 20 70 72 6f 67 72 61 6d 6d 69 6e 67 20 65 72 72   programming err
23b0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
23c0: 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69  e3VdbeMemStringi
23d0: 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 38  fy(Mem *pMem, u8
23e0: 20 65 6e 63 2c 20 75 38 20 62 46 6f 72 63 65 29   enc, u8 bForce)
23f0: 7b 0a 20 20 69 6e 74 20 66 67 20 3d 20 70 4d 65  {.  int fg = pMe
2400: 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6e 73  m->flags;.  cons
2410: 74 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 33 32  t int nByte = 32
2420: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  ;..  assert( pMe
2430: 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  m->db==0 || sqli
2440: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2450: 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  Mem->db->mutex) 
2460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 66  );.  assert( !(f
2470: 67 26 4d 45 4d 5f 5a 65 72 6f 29 20 29 3b 0a 20  g&MEM_Zero) );. 
2480: 20 61 73 73 65 72 74 28 20 21 28 66 67 26 28 4d   assert( !(fg&(M
2490: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
24a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
24b0: 67 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  g&(MEM_Int|MEM_R
24c0: 65 61 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  eal) );.  assert
24d0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d  ( (pMem->flags&M
24e0: 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
24f0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2500: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2510: 70 4d 65 6d 29 20 29 3b 0a 0a 0a 20 20 69 66 28  pMem) );...  if(
2520: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
2530: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
2540: 65 6d 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  em, nByte) ){.  
2550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2560: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2570: 20 46 6f 72 20 61 20 52 65 61 6c 20 6f 72 20 49   For a Real or I
2580: 6e 74 65 67 65 72 2c 20 75 73 65 20 73 71 6c 69  nteger, use sqli
2590: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 74  te3_snprintf() t
25a0: 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 55 54  o produce the UT
25b0: 46 2d 38 0a 20 20 2a 2a 20 73 74 72 69 6e 67 20  F-8.  ** string 
25c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
25d0: 66 20 74 68 65 20 76 61 6c 75 65 2e 20 54 68 65  f the value. The
25e0: 6e 2c 20 69 66 20 74 68 65 20 72 65 71 75 69 72  n, if the requir
25f0: 65 64 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a  ed encoding.  **
2600: 20 69 73 20 55 54 46 2d 31 36 6c 65 20 6f 72 20   is UTF-16le or 
2610: 55 54 46 2d 31 36 62 65 20 64 6f 20 61 20 74 72  UTF-16be do a tr
2620: 61 6e 73 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2a 20  anslation..  ** 
2630: 0a 20 20 2a 2a 20 46 49 58 20 4d 45 3a 20 49 74  .  ** FIX ME: It
2640: 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72   would be better
2650: 20 69 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72   if sqlite3_snpr
2660: 69 6e 74 66 28 29 20 63 6f 75 6c 64 20 64 6f 20  intf() could do 
2670: 55 54 46 2d 31 36 2e 0a 20 20 2a 2f 0a 20 20 69  UTF-16..  */.  i
2680: 66 28 20 66 67 20 26 20 4d 45 4d 5f 49 6e 74 20  f( fg & MEM_Int 
2690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
26a0: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2c 20 70  nprintf(nByte, p
26b0: 4d 65 6d 2d 3e 7a 2c 20 22 25 6c 6c 64 22 2c 20  Mem->z, "%lld", 
26c0: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65  pMem->u.i);.  }e
26d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
26e0: 20 66 67 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29   fg & MEM_Real )
26f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2700: 70 72 69 6e 74 66 28 6e 42 79 74 65 2c 20 70 4d  printf(nByte, pM
2710: 65 6d 2d 3e 7a 2c 20 22 25 21 2e 31 35 67 22 2c  em->z, "%!.15g",
2720: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 7d   pMem->u.r);.  }
2730: 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c  .  pMem->n = sql
2740: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
2750: 6d 2d 3e 7a 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65  m->z);.  pMem->e
2760: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
2770: 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  ;.  pMem->flags 
2780: 7c 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  |= MEM_Str|MEM_T
2790: 65 72 6d 3b 0a 20 20 69 66 28 20 62 46 6f 72 63  erm;.  if( bForc
27a0: 65 20 29 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  e ) pMem->flags 
27b0: 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  &= ~(MEM_Int|MEM
27c0: 5f 52 65 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  _Real);.  sqlite
27d0: 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
27e0: 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 29 3b 0a  ing(pMem, enc);.
27f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2800: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  OK;.}../*.** Mem
2810: 6f 72 79 20 63 65 6c 6c 20 70 4d 65 6d 20 63 6f  ory cell pMem co
2820: 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65  ntains the conte
2830: 78 74 20 6f 66 20 61 6e 20 61 67 67 72 65 67 61  xt of an aggrega
2840: 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  te function..** 
2850: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c  This routine cal
2860: 6c 73 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20  ls the finalize 
2870: 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20  method for that 
2880: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 0a 2a  function.  The.*
2890: 2a 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  * result of the 
28a0: 61 67 67 72 65 67 61 74 65 20 69 73 20 73 74 6f  aggregate is sto
28b0: 72 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 70 4d  red back into pM
28c0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  em..**.** Return
28d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
28e0: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 72   the finalizer r
28f0: 65 70 6f 72 74 73 20 61 6e 20 65 72 72 6f 72 2e  eports an error.
2900: 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f    SQLITE_OK.** o
2910: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
2920: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
2930: 69 6e 61 6c 69 7a 65 28 4d 65 6d 20 2a 70 4d 65  inalize(Mem *pMe
2940: 6d 2c 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e  m, FuncDef *pFun
2950: 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
2960: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2970: 41 4c 57 41 59 53 28 70 46 75 6e 63 20 26 26 20  ALWAYS(pFunc && 
2980: 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65  pFunc->xFinalize
2990: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
29a0: 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20  _context ctx;.  
29b0: 20 20 4d 65 6d 20 74 3b 0a 20 20 20 20 61 73 73    Mem t;.    ass
29c0: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
29d0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
29e0: 20 7c 7c 20 70 46 75 6e 63 3d 3d 70 4d 65 6d 2d   || pFunc==pMem-
29f0: 3e 75 2e 70 44 65 66 20 29 3b 0a 20 20 20 20 61  >u.pDef );.    a
2a00: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d  ssert( pMem->db=
2a10: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
2a20: 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64  tex_held(pMem->d
2a30: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  b->mutex) );.   
2a40: 20 6d 65 6d 73 65 74 28 26 63 74 78 2c 20 30 2c   memset(&ctx, 0,
2a50: 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b 0a 20   sizeof(ctx));. 
2a60: 20 20 20 6d 65 6d 73 65 74 28 26 74 2c 20 30 2c     memset(&t, 0,
2a70: 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
2a80: 20 74 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e   t.flags = MEM_N
2a90: 75 6c 6c 3b 0a 20 20 20 20 74 2e 64 62 20 3d 20  ull;.    t.db = 
2aa0: 70 4d 65 6d 2d 3e 64 62 3b 0a 20 20 20 20 63 74  pMem->db;.    ct
2ab0: 78 2e 70 4f 75 74 20 3d 20 26 74 3b 0a 20 20 20  x.pOut = &t;.   
2ac0: 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d 65 6d   ctx.pMem = pMem
2ad0: 3b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e 63 20  ;.    ctx.pFunc 
2ae0: 3d 20 70 46 75 6e 63 3b 0a 20 20 20 20 70 46 75  = pFunc;.    pFu
2af0: 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 28 26 63  nc->xFinalize(&c
2b00: 74 78 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  tx); /* IMP: R-2
2b10: 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 20 20  4505-23230 */.  
2b20: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
2b30: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
2b40: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
2b50: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 3e 30  pMem->szMalloc>0
2b60: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
2b70: 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d  (pMem->db, pMem-
2b80: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 6d  >zMalloc);.    m
2b90: 65 6d 63 70 79 28 70 4d 65 6d 2c 20 26 74 2c 20  emcpy(pMem, &t, 
2ba0: 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
2bb0: 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72  rc = ctx.isError
2bc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2bd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
2be0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 63  he memory cell c
2bf0: 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c 75 65 20  ontains a value 
2c00: 74 68 61 74 20 6d 75 73 74 20 62 65 20 66 72 65  that must be fre
2c10: 65 64 20 62 79 0a 2a 2a 20 69 6e 76 6f 6b 69 6e  ed by.** invokin
2c20: 67 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 63  g the external c
2c30: 61 6c 6c 62 61 63 6b 20 69 6e 20 4d 65 6d 2e 78  allback in Mem.x
2c40: 44 65 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 72  Del, then this r
2c50: 6f 75 74 69 6e 65 0a 2a 2a 20 77 69 6c 6c 20 66  outine.** will f
2c60: 72 65 65 20 74 68 61 74 20 76 61 6c 75 65 2e 20  ree that value. 
2c70: 20 49 74 20 61 6c 73 6f 20 73 65 74 73 20 4d 65   It also sets Me
2c80: 6d 2e 66 6c 61 67 73 20 74 6f 20 4d 45 4d 5f 4e  m.flags to MEM_N
2c90: 75 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ull..**.** This 
2ca0: 69 73 20 61 20 68 65 6c 70 65 72 20 72 6f 75 74  is a helper rout
2cb0: 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 56  ine for sqlite3V
2cc0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 29 20  dbeMemSetNull() 
2cd0: 61 6e 64 0a 2a 2a 20 66 6f 72 20 73 71 6c 69 74  and.** for sqlit
2ce0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
2cf0: 28 29 2e 20 20 55 73 65 20 74 68 6f 73 65 20 6f  ().  Use those o
2d00: 74 68 65 72 20 72 6f 75 74 69 6e 65 73 20 61 73  ther routines as
2d10: 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 70 6f   the.** entry po
2d20: 69 6e 74 20 66 6f 72 20 72 65 6c 65 61 73 69 6e  int for releasin
2d30: 67 20 4d 65 6d 20 72 65 73 6f 75 72 63 65 73 2e  g Mem resources.
2d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2d50: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
2d60: 76 64 62 65 4d 65 6d 43 6c 65 61 72 45 78 74 65  vdbeMemClearExte
2d70: 72 6e 41 6e 64 53 65 74 4e 75 6c 6c 28 4d 65 6d  rnAndSetNull(Mem
2d80: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
2d90: 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  p->db==0 || sqli
2da0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2db0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2dc0: 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d 65    assert( VdbeMe
2dd0: 6d 44 79 6e 61 6d 69 63 28 70 29 20 29 3b 0a 20  mDynamic(p) );. 
2de0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 4d 45   if( p->flags&ME
2df0: 4d 5f 41 67 67 20 29 7b 0a 20 20 20 20 73 71 6c  M_Agg ){.    sql
2e00: 69 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c  ite3VdbeMemFinal
2e10: 69 7a 65 28 70 2c 20 70 2d 3e 75 2e 70 44 65 66  ize(p, p->u.pDef
2e20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2e30: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41  p->flags & MEM_A
2e40: 67 67 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65  gg)==0 );.    te
2e50: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
2e60: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
2e70: 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  }.  if( p->flags
2e80: 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20  &MEM_Dyn ){.    
2e90: 61 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67  assert( (p->flag
2ea0: 73 26 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  s&MEM_RowSet)==0
2eb0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ec0: 70 2d 3e 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  p->xDel!=SQLITE_
2ed0: 44 59 4e 41 4d 49 43 20 26 26 20 70 2d 3e 78 44  DYNAMIC && p->xD
2ee0: 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  el!=0 );.    p->
2ef0: 78 44 65 6c 28 28 76 6f 69 64 20 2a 29 70 2d 3e  xDel((void *)p->
2f00: 7a 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  z);.  }else if( 
2f10: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77  p->flags&MEM_Row
2f20: 53 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Set ){.    sqlit
2f30: 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28 70 2d  e3RowSetClear(p-
2f40: 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 7d  >u.pRowSet);.  }
2f50: 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67  else if( p->flag
2f60: 73 26 4d 45 4d 5f 46 72 61 6d 65 20 29 7b 0a 20  s&MEM_Frame ){. 
2f70: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
2f80: 72 61 6d 65 20 3d 20 70 2d 3e 75 2e 70 46 72 61  rame = p->u.pFra
2f90: 6d 65 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  me;.    pFrame->
2fa0: 70 50 61 72 65 6e 74 20 3d 20 70 46 72 61 6d 65  pParent = pFrame
2fb0: 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  ->v->pDelFrame;.
2fc0: 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 2d 3e 70      pFrame->v->p
2fd0: 44 65 6c 46 72 61 6d 65 20 3d 20 70 46 72 61 6d  DelFrame = pFram
2fe0: 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67  e;.  }.  p->flag
2ff0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 7d 0a  s = MEM_Null;.}.
3000: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
3010: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
3020: 65 20 4d 65 6d 20 70 2c 20 62 6f 74 68 20 65 78  e Mem p, both ex
3030: 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 63 6c  ternal memory cl
3040: 65 61 72 65 64 0a 2a 2a 20 62 79 20 70 2d 3e 78  eared.** by p->x
3050: 44 65 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 20 69  Del and memory i
3060: 6e 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2a  n p->zMalloc..**
3070: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 68 65  .** This is a he
3080: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 6e 76  lper routine inv
3090: 6f 6b 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  oked by sqlite3V
30a0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  dbeMemRelease() 
30b0: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 75 73 75 61  in.** the unusua
30c0: 6c 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  l case where the
30d0: 72 65 20 72 65 61 6c 6c 79 20 69 73 20 6d 65 6d  re really is mem
30e0: 6f 72 79 20 69 6e 20 70 20 74 68 61 74 20 6e 65  ory in p that ne
30f0: 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 66 72 65  eds.** to be fre
3100: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ed..*/.static SQ
3110: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
3120: 69 64 20 76 64 62 65 4d 65 6d 43 6c 65 61 72 28  id vdbeMemClear(
3130: 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 56  Mem *p){.  if( V
3140: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 29  dbeMemDynamic(p)
3150: 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65 6d 43   ){.    vdbeMemC
3160: 6c 65 61 72 45 78 74 65 72 6e 41 6e 64 53 65 74  learExternAndSet
3170: 4e 75 6c 6c 28 70 29 3b 0a 20 20 7d 0a 20 20 69  Null(p);.  }.  i
3180: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
3190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
31a0: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 4d  ree(p->db, p->zM
31b0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 70 2d 3e 73  alloc);.    p->s
31c0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  zMalloc = 0;.  }
31d0: 0a 20 20 70 2d 3e 7a 20 3d 20 30 3b 0a 7d 0a 0a  .  p->z = 0;.}..
31e0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
31f0: 79 20 6d 65 6d 6f 72 79 20 72 65 73 6f 75 72 63  y memory resourc
3200: 65 73 20 68 65 6c 64 20 62 79 20 74 68 65 20 4d  es held by the M
3210: 65 6d 2e 20 20 42 6f 74 68 20 74 68 65 20 6d 65  em.  Both the me
3220: 6d 6f 72 79 20 74 68 61 74 20 69 73 0a 2a 2a 20  mory that is.** 
3230: 66 72 65 65 20 62 79 20 4d 65 6d 2e 78 44 65 6c  free by Mem.xDel
3240: 20 61 6e 64 20 74 68 65 20 4d 65 6d 2e 7a 4d 61   and the Mem.zMa
3250: 6c 6c 6f 63 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  lloc allocation 
3260: 61 72 65 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  are freed..**.**
3270: 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
3280: 65 20 70 72 69 6f 72 20 74 6f 20 63 6c 65 61 6e  e prior to clean
3290: 20 75 70 20 70 72 69 6f 72 20 74 6f 20 61 62 61   up prior to aba
32a0: 6e 64 6f 6e 69 6e 67 20 61 20 4d 65 6d 2c 20 6f  ndoning a Mem, o
32b0: 72 20 74 6f 0a 2a 2a 20 72 65 73 65 74 20 61 20  r to.** reset a 
32c0: 4d 65 6d 20 62 61 63 6b 20 74 6f 20 69 74 73 20  Mem back to its 
32d0: 6d 69 6e 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 75  minimum memory u
32e0: 74 69 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  tilization..**.*
32f0: 2a 20 55 73 65 20 73 71 6c 69 74 65 33 56 64 62  * Use sqlite3Vdb
3300: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 29 20 74 6f  eMemSetNull() to
3310: 20 72 65 6c 65 61 73 65 20 6a 75 73 74 20 74 68   release just th
3320: 65 20 4d 65 6d 2e 78 44 65 6c 20 73 70 61 63 65  e Mem.xDel space
3330: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 69 6e 73  .** prior to ins
3340: 65 72 74 69 6e 67 20 6e 65 77 20 63 6f 6e 74 65  erting new conte
3350: 6e 74 20 69 6e 74 6f 20 74 68 65 20 4d 65 6d 2e  nt into the Mem.
3360: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3370: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 4d  VdbeMemRelease(M
3380: 65 6d 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  em *p){.  assert
3390: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
33a0: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
33b0: 70 29 20 29 3b 0a 20 20 69 66 28 20 56 64 62 65  p) );.  if( Vdbe
33c0: 4d 65 6d 44 79 6e 61 6d 69 63 28 70 29 20 7c 7c  MemDynamic(p) ||
33d0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a   p->szMalloc ){.
33e0: 20 20 20 20 76 64 62 65 4d 65 6d 43 6c 65 61 72      vdbeMemClear
33f0: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3400: 2a 20 43 6f 6e 76 65 72 74 20 61 20 36 34 2d 62  * Convert a 64-b
3410: 69 74 20 49 45 45 45 20 64 6f 75 62 6c 65 20 69  it IEEE double i
3420: 6e 74 6f 20 61 20 36 34 2d 62 69 74 20 73 69 67  nto a 64-bit sig
3430: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20  ned integer..** 
3440: 49 66 20 74 68 65 20 64 6f 75 62 6c 65 20 69 73  If the double is
3450: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 66   out of range of
3460: 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
3470: 20 69 6e 74 65 67 65 72 20 74 68 65 6e 0a 2a 2a   integer then.**
3480: 20 72 65 74 75 72 6e 20 74 68 65 20 63 6c 6f 73   return the clos
3490: 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 36 34  est available 64
34a0: 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
34b0: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
34c0: 36 34 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34  64 doubleToInt64
34d0: 28 64 6f 75 62 6c 65 20 72 29 7b 0a 23 69 66 64  (double r){.#ifd
34e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
34f0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
3500: 2f 2a 20 57 68 65 6e 20 66 6c 6f 61 74 69 6e 67  /* When floating
3510: 2d 70 6f 69 6e 74 20 69 73 20 6f 6d 69 74 74 65  -point is omitte
3520: 64 2c 20 64 6f 75 62 6c 65 20 61 6e 64 20 69 6e  d, double and in
3530: 74 36 34 20 61 72 65 20 74 68 65 20 73 61 6d 65  t64 are the same
3540: 20 74 68 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75   thing */.  retu
3550: 72 6e 20 72 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn r;.#else.  /*
3560: 0a 20 20 2a 2a 20 4d 61 6e 79 20 63 6f 6d 70 69  .  ** Many compi
3570: 6c 65 72 73 20 77 65 20 65 6e 63 6f 75 6e 74 65  lers we encounte
3580: 72 20 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20  r do not define 
3590: 63 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 74 68  constants for th
35a0: 65 0a 20 20 2a 2a 20 6d 69 6e 69 6d 75 6d 20 61  e.  ** minimum a
35b0: 6e 64 20 6d 61 78 69 6d 75 6d 20 36 34 2d 62 69  nd maximum 64-bi
35c0: 74 20 69 6e 74 65 67 65 72 73 2c 20 6f 72 20 74  t integers, or t
35d0: 68 65 79 20 64 65 66 69 6e 65 20 74 68 65 6d 0a  hey define them.
35e0: 20 20 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e    ** inconsisten
35f0: 74 6c 79 2e 20 20 41 6e 64 20 6d 61 6e 79 20 64  tly.  And many d
3600: 6f 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  o not understand
3610: 20 74 68 65 20 22 4c 4c 22 20 6e 6f 74 61 74 69   the "LL" notati
3620: 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 77 65 20 64  on..  ** So we d
3630: 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 20 73 74  efine our own st
3640: 61 74 69 63 20 63 6f 6e 73 74 61 6e 74 73 20 68  atic constants h
3650: 65 72 65 20 75 73 69 6e 67 20 6e 6f 74 68 69 6e  ere using nothin
3660: 67 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68  g.  ** larger th
3670: 61 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  an a 32-bit inte
3680: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20  ger constant..  
3690: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
36a0: 74 20 69 36 34 20 6d 61 78 49 6e 74 20 3d 20 4c  t i64 maxInt = L
36b0: 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
36c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 36 34  static const i64
36d0: 20 6d 69 6e 49 6e 74 20 3d 20 53 4d 41 4c 4c 45   minInt = SMALLE
36e0: 53 54 5f 49 4e 54 36 34 3b 0a 0a 20 20 69 66 28  ST_INT64;..  if(
36f0: 20 72 3c 3d 28 64 6f 75 62 6c 65 29 6d 69 6e 49   r<=(double)minI
3700: 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
3710: 20 6d 69 6e 49 6e 74 3b 0a 20 20 7d 65 6c 73 65   minInt;.  }else
3720: 20 69 66 28 20 72 3e 3d 28 64 6f 75 62 6c 65 29   if( r>=(double)
3730: 6d 61 78 49 6e 74 20 29 7b 0a 20 20 20 20 72 65  maxInt ){.    re
3740: 74 75 72 6e 20 6d 61 78 49 6e 74 3b 0a 20 20 7d  turn maxInt;.  }
3750: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3760: 20 28 69 36 34 29 72 3b 0a 20 20 7d 0a 23 65 6e   (i64)r;.  }.#en
3770: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
3780: 75 72 6e 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66  urn some kind of
3790: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77   integer value w
37a0: 68 69 63 68 20 69 73 20 74 68 65 20 62 65 73 74  hich is the best
37b0: 20 77 65 20 63 61 6e 20 64 6f 0a 2a 2a 20 61 74   we can do.** at
37c0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
37d0: 65 20 76 61 6c 75 65 20 74 68 61 74 20 2a 70 4d  e value that *pM
37e0: 65 6d 20 64 65 73 63 72 69 62 65 73 20 61 73 20  em describes as 
37f0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 49  an integer..** I
3800: 66 20 70 4d 65 6d 20 69 73 20 61 6e 20 69 6e 74  f pMem is an int
3810: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 76  eger, then the v
3820: 61 6c 75 65 20 69 73 20 65 78 61 63 74 2e 20 20  alue is exact.  
3830: 49 66 20 70 4d 65 6d 20 69 73 0a 2a 2a 20 61 20  If pMem is.** a 
3840: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 74  floating-point t
3850: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
3860: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 69 6e  turned is the in
3870: 74 65 67 65 72 20 70 61 72 74 2e 0a 2a 2a 20 49  teger part..** I
3880: 66 20 70 4d 65 6d 20 69 73 20 61 20 73 74 72 69  f pMem is a stri
3890: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e  ng or blob, then
38a0: 20 77 65 20 6d 61 6b 65 20 61 6e 20 61 74 74 65   we make an atte
38b0: 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 0a 2a  mpt to convert.*
38c0: 2a 20 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 74  * it into an int
38d0: 65 67 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  eger and return 
38e0: 74 68 61 74 2e 20 20 49 66 20 70 4d 65 6d 20 72  that.  If pMem r
38f0: 65 70 72 65 73 65 6e 74 73 20 61 6e 0a 2a 2a 20  epresents an.** 
3900: 61 6e 20 53 51 4c 2d 4e 55 4c 4c 20 76 61 6c 75  an SQL-NULL valu
3910: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  e, return 0..**.
3920: 2a 2a 20 49 66 20 70 4d 65 6d 20 72 65 70 72 65  ** If pMem repre
3930: 73 65 6e 74 73 20 61 20 73 74 72 69 6e 67 20 76  sents a string v
3940: 61 6c 75 65 2c 20 69 74 73 20 65 6e 63 6f 64 69  alue, its encodi
3950: 6e 67 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  ng might be chan
3960: 67 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ged..*/.i64 sqli
3970: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
3980: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e  Mem *pMem){.  in
3990: 74 20 66 6c 61 67 73 3b 0a 20 20 61 73 73 65 72  t flags;.  asser
39a0: 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c  t( pMem->db==0 |
39b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
39c0: 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  held(pMem->db->m
39d0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
39e0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
39f0: 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
3a00: 0a 20 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  .  flags = pMem-
3a10: 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 66 6c  >flags;.  if( fl
3a20: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
3a30: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d  .    return pMem
3a40: 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 20 69  ->u.i;.  }else i
3a50: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  f( flags & MEM_R
3a60: 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
3a70: 6e 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28  n doubleToInt64(
3a80: 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 7d 65  pMem->u.r);.  }e
3a90: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
3aa0: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
3ab0: 62 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61  b) ){.    i64 va
3ac0: 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  lue = 0;.    ass
3ad0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 20 7c 7c 20  ert( pMem->z || 
3ae0: 70 4d 65 6d 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  pMem->n==0 );.  
3af0: 20 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28    sqlite3Atoi64(
3b00: 70 4d 65 6d 2d 3e 7a 2c 20 26 76 61 6c 75 65 2c  pMem->z, &value,
3b10: 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d 3e   pMem->n, pMem->
3b20: 65 6e 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  enc);.    return
3b30: 20 76 61 6c 75 65 3b 0a 20 20 7d 65 6c 73 65 7b   value;.  }else{
3b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3b50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
3b60: 72 6e 20 74 68 65 20 62 65 73 74 20 72 65 70 72  rn the best repr
3b70: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 4d  esentation of pM
3b80: 65 6d 20 74 68 61 74 20 77 65 20 63 61 6e 20 67  em that we can g
3b90: 65 74 20 69 6e 74 6f 20 61 0a 2a 2a 20 64 6f 75  et into a.** dou
3ba0: 62 6c 65 2e 20 20 49 66 20 70 4d 65 6d 20 69 73  ble.  If pMem is
3bb0: 20 61 6c 72 65 61 64 79 20 61 20 64 6f 75 62 6c   already a doubl
3bc0: 65 20 6f 72 20 61 6e 20 69 6e 74 65 67 65 72 2c  e or an integer,
3bd0: 20 72 65 74 75 72 6e 20 69 74 73 0a 2a 2a 20 76   return its.** v
3be0: 61 6c 75 65 2e 20 20 49 66 20 69 74 20 69 73 20  alue.  If it is 
3bf0: 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
3c00: 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74  , try to convert
3c10: 20 69 74 20 74 6f 20 61 20 64 6f 75 62 6c 65 2e   it to a double.
3c20: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 61 20 4e  .** If it is a N
3c30: 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 30 2e  ULL, return 0.0.
3c40: 0a 2a 2f 0a 64 6f 75 62 6c 65 20 73 71 6c 69 74  .*/.double sqlit
3c50: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
3c60: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73  Mem *pMem){.  as
3c70: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d  sert( pMem->db==
3c80: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
3c90: 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62  ex_held(pMem->db
3ca0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
3cb0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
3cc0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
3cd0: 20 29 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e   );.  if( pMem->
3ce0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
3cf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3d00: 4d 65 6d 2d 3e 75 2e 72 3b 0a 20 20 7d 65 6c 73  Mem->u.r;.  }els
3d10: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
3d20: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
3d30: 20 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c     return (doubl
3d40: 65 29 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  e)pMem->u.i;.  }
3d50: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
3d60: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
3d70: 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20  MEM_Blob) ){.   
3d80: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
3d90: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
3da0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
3db0: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 64 6f  INT... */.    do
3dc0: 75 62 6c 65 20 76 61 6c 20 3d 20 28 64 6f 75 62  uble val = (doub
3dd0: 6c 65 29 30 3b 0a 20 20 20 20 73 71 6c 69 74 65  le)0;.    sqlite
3de0: 33 41 74 6f 46 28 70 4d 65 6d 2d 3e 7a 2c 20 26  3AtoF(pMem->z, &
3df0: 76 61 6c 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d  val, pMem->n, pM
3e00: 65 6d 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 72 65  em->enc);.    re
3e10: 74 75 72 6e 20 76 61 6c 3b 0a 20 20 7d 65 6c 73  turn val;.  }els
3e20: 65 7b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c  e{.    /* (doubl
3e30: 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)0 In case of S
3e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
3e50: 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
3e60: 20 20 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62      return (doub
3e70: 6c 65 29 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  le)0;.  }.}../*.
3e80: 2a 2a 20 54 68 65 20 4d 45 4d 20 73 74 72 75 63  ** The MEM struc
3e90: 74 75 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  ture is already 
3ea0: 61 20 4d 45 4d 5f 52 65 61 6c 2e 20 20 54 72 79  a MEM_Real.  Try
3eb0: 20 74 6f 20 61 6c 73 6f 20 6d 61 6b 65 20 69 74   to also make it
3ec0: 20 61 0a 2a 2a 20 4d 45 4d 5f 49 6e 74 20 69 66   a.** MEM_Int if
3ed0: 20 77 65 20 63 61 6e 2e 0a 2a 2f 0a 76 6f 69 64   we can..*/.void
3ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65   sqlite3VdbeInte
3ef0: 67 65 72 41 66 66 69 6e 69 74 79 28 4d 65 6d 20  gerAffinity(Mem 
3f00: 2a 70 4d 65 6d 29 7b 0a 20 20 69 36 34 20 69 78  *pMem){.  i64 ix
3f10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
3f20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
3f30: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
3f40: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
3f50: 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
3f60: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
3f70: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
3f80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65  3_mutex_held(pMe
3f90: 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  m->db->mutex) );
3fa0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
3fb0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
3fc0: 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 69 78 20 3d  pMem) );..  ix =
3fd0: 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 70   doubleToInt64(p
3fe0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 0a 20 20 2f 2a  Mem->u.r);..  /*
3ff0: 20 4f 6e 6c 79 20 6d 61 72 6b 20 74 68 65 20 76   Only mark the v
4000: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
4010: 65 72 20 69 66 0a 20 20 2a 2a 0a 20 20 2a 2a 20  er if.  **.  ** 
4020: 20 20 20 28 31 29 20 74 68 65 20 72 6f 75 6e 64     (1) the round
4030: 2d 74 72 69 70 20 63 6f 6e 76 65 72 73 69 6f 6e  -trip conversion
4040: 20 72 65 61 6c 2d 3e 69 6e 74 2d 3e 72 65 61 6c   real->int->real
4050: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 61 6e 64   is a no-op, and
4060: 0a 20 20 2a 2a 20 20 20 20 28 32 29 20 54 68 65  .  **    (2) The
4070: 20 69 6e 74 65 67 65 72 20 69 73 20 6e 65 69 74   integer is neit
4080: 68 65 72 20 74 68 65 20 6c 61 72 67 65 73 74 20  her the largest 
4090: 6e 6f 72 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  nor the smallest
40a0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 70 6f 73  .  **        pos
40b0: 73 69 62 6c 65 20 69 6e 74 65 67 65 72 20 28 74  sible integer (t
40c0: 69 63 6b 65 74 20 23 33 39 32 32 29 0a 20 20 2a  icket #3922).  *
40d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
40e0: 64 20 61 6e 64 20 74 68 69 72 64 20 74 65 72 6d  d and third term
40f0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
4100: 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 65  ng conditional e
4110: 6e 66 6f 72 63 65 73 0a 20 20 2a 2a 20 74 68 65  nforces.  ** the
4120: 20 73 65 63 6f 6e 64 20 63 6f 6e 64 69 74 69 6f   second conditio
4130: 6e 20 75 6e 64 65 72 20 74 68 65 20 61 73 73 75  n under the assu
4140: 6d 70 74 69 6f 6e 20 74 68 61 74 20 61 64 64 69  mption that addi
4150: 74 69 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 63 61  tion overflow ca
4160: 75 73 65 73 0a 20 20 2a 2a 20 76 61 6c 75 65 73  uses.  ** values
4170: 20 74 6f 20 77 72 61 70 20 61 72 6f 75 6e 64 2e   to wrap around.
4180: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 65 6d  .  */.  if( pMem
4190: 2d 3e 75 2e 72 3d 3d 69 78 20 26 26 20 69 78 3e  ->u.r==ix && ix>
41a0: 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26  SMALLEST_INT64 &
41b0: 26 20 69 78 3c 4c 41 52 47 45 53 54 5f 49 4e 54  & ix<LARGEST_INT
41c0: 36 34 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  64 ){.    pMem->
41d0: 75 2e 69 20 3d 20 69 78 3b 0a 20 20 20 20 4d 65  u.i = ix;.    Me
41e0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65  mSetTypeFlag(pMe
41f0: 6d 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  m, MEM_Int);.  }
4200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
4210: 74 20 70 4d 65 6d 20 74 6f 20 74 79 70 65 20 69  t pMem to type i
4220: 6e 74 65 67 65 72 2e 20 20 49 6e 76 61 6c 69 64  nteger.  Invalid
4230: 61 74 65 20 61 6e 79 20 70 72 69 6f 72 20 72 65  ate any prior re
4240: 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  presentations..*
4250: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4260: 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 4d  eMemIntegerify(M
4270: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73  em *pMem){.  ass
4280: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
4290: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
42a0: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
42b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
42c0: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
42d0: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
42e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
42f0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
4300: 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  MENT(pMem) );.. 
4310: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 71 6c   pMem->u.i = sql
4320: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
4330: 28 70 4d 65 6d 29 3b 0a 20 20 4d 65 6d 53 65 74  (pMem);.  MemSet
4340: 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d  TypeFlag(pMem, M
4350: 45 4d 5f 49 6e 74 29 3b 0a 20 20 72 65 74 75 72  EM_Int);.  retur
4360: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4370: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d  /*.** Convert pM
4380: 65 6d 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  em so that it is
4390: 20 6f 66 20 74 79 70 65 20 4d 45 4d 5f 52 65 61   of type MEM_Rea
43a0: 6c 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  l..** Invalidate
43b0: 20 61 6e 79 20 70 72 69 6f 72 20 72 65 70 72 65   any prior repre
43c0: 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 69  sentations..*/.i
43d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
43e0: 6d 52 65 61 6c 69 66 79 28 4d 65 6d 20 2a 70 4d  mRealify(Mem *pM
43f0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  em){.  assert( p
4400: 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Mem->db==0 || sq
4410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4420: 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pMem->db->mutex
4430: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
4440: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
4450: 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20  ENT(pMem) );..  
4460: 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 73 71 6c 69  pMem->u.r = sqli
4470: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
4480: 28 70 4d 65 6d 29 3b 0a 20 20 4d 65 6d 53 65 74  (pMem);.  MemSet
4490: 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d  TypeFlag(pMem, M
44a0: 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 72 65 74 75  EM_Real);.  retu
44b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
44c0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 70  ./*.** Convert p
44d0: 4d 65 6d 20 73 6f 20 74 68 61 74 20 69 74 20 68  Mem so that it h
44e0: 61 73 20 74 79 70 65 73 20 4d 45 4d 5f 52 65 61  as types MEM_Rea
44f0: 6c 20 6f 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 20  l or MEM_Int or 
4500: 62 6f 74 68 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64  both..** Invalid
4510: 61 74 65 20 61 6e 79 20 70 72 69 6f 72 20 72 65  ate any prior re
4520: 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  presentations..*
4530: 2a 0a 2a 2a 20 45 76 65 72 79 20 65 66 66 6f 72  *.** Every effor
4540: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 6f 72  t is made to for
4550: 63 65 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  ce the conversio
4560: 6e 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 69  n, even if the i
4570: 6e 70 75 74 0a 2a 2a 20 69 73 20 61 20 73 74 72  nput.** is a str
4580: 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
4590: 74 20 6c 6f 6f 6b 20 63 6f 6d 70 6c 65 74 65 6c  t look completel
45a0: 79 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2e  y like a number.
45b0: 20 20 43 6f 6e 76 65 72 74 0a 2a 2a 20 61 73 20    Convert.** as 
45c0: 6d 75 63 68 20 6f 66 20 74 68 65 20 73 74 72 69  much of the stri
45d0: 6e 67 20 61 73 20 77 65 20 63 61 6e 20 61 6e 64  ng as we can and
45e0: 20 69 67 6e 6f 72 65 20 74 68 65 20 72 65 73 74   ignore the rest
45f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4600: 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79 28  VdbeMemNumerify(
4610: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66  Mem *pMem){.  if
4620: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
4630: 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
4640: 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 3d 3d 30  al|MEM_Null))==0
4650: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4660: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28  (pMem->flags & (
4670: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72  MEM_Blob|MEM_Str
4680: 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ))!=0 );.    ass
4690: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
46a0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
46b0: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
46c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 69  >mutex) );.    i
46d0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f  f( 0==sqlite3Ato
46e0: 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d  i64(pMem->z, &pM
46f0: 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e  em->u.i, pMem->n
4700: 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 20 29 7b 0a  , pMem->enc) ){.
4710: 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65        MemSetType
4720: 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 49  Flag(pMem, MEM_I
4730: 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt);.    }else{.
4740: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 72 20        pMem->u.r 
4750: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
4760: 6c 56 61 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20  lValue(pMem);.  
4770: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
4780: 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 52 65 61  ag(pMem, MEM_Rea
4790: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
47a0: 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69  3VdbeIntegerAffi
47b0: 6e 69 74 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20  nity(pMem);.    
47c0: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
47d0: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28  (pMem->flags & (
47e0: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
47f0: 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 21 3d 30 20 29  |MEM_Null))!=0 )
4800: 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  ;.  pMem->flags 
4810: 26 3d 20 7e 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  &= ~(MEM_Str|MEM
4820: 5f 42 6c 6f 62 29 3b 0a 20 20 72 65 74 75 72 6e  _Blob);.  return
4830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4840: 2a 0a 2a 2a 20 43 61 73 74 20 74 68 65 20 64 61  *.** Cast the da
4850: 74 61 74 79 70 65 20 6f 66 20 74 68 65 20 76 61  tatype of the va
4860: 6c 75 65 20 69 6e 20 70 4d 65 6d 20 61 63 63 6f  lue in pMem acco
4870: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 61 66 66  rding to the aff
4880: 69 6e 69 74 79 0a 2a 2a 20 22 61 66 66 22 2e 20  inity.** "aff". 
4890: 20 43 61 73 74 69 6e 67 20 69 73 20 64 69 66 66   Casting is diff
48a0: 65 72 65 6e 74 20 66 72 6f 6d 20 61 70 70 6c 79  erent from apply
48b0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 6e 20  ing affinity in 
48c0: 74 68 61 74 20 61 20 63 61 73 74 0a 2a 2a 20 69  that a cast.** i
48d0: 73 20 66 6f 72 63 65 64 2e 20 20 49 6e 20 6f 74  s forced.  In ot
48e0: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76  her words, the v
48f0: 61 6c 75 65 20 69 73 20 63 6f 6e 76 65 72 74 65  alue is converte
4900: 64 20 69 6e 74 6f 20 74 68 65 20 64 65 73 69 72  d into the desir
4910: 65 64 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 65  ed.** affinity e
4920: 76 65 6e 20 69 66 20 74 68 61 74 20 72 65 73 75  ven if that resu
4930: 6c 74 73 20 69 6e 20 6c 6f 73 73 20 6f 66 20 64  lts in loss of d
4940: 61 74 61 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ata.  This routi
4950: 6e 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 28 66  ne is.** used (f
4960: 6f 72 20 65 78 61 6d 70 6c 65 29 20 74 6f 20 69  or example) to i
4970: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 53 51 4c  mplement the SQL
4980: 20 22 63 61 73 74 28 29 22 20 6f 70 65 72 61 74   "cast()" operat
4990: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
49a0: 74 65 33 56 64 62 65 4d 65 6d 43 61 73 74 28 4d  te3VdbeMemCast(M
49b0: 65 6d 20 2a 70 4d 65 6d 2c 20 75 38 20 61 66 66  em *pMem, u8 aff
49c0: 2c 20 75 38 20 65 6e 63 6f 64 69 6e 67 29 7b 0a  , u8 encoding){.
49d0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
49e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 72  s & MEM_Null ) r
49f0: 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28  eturn;.  switch(
4a00: 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65   aff ){.    case
4a10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
4a20: 3a 20 7b 20 20 20 2f 2a 20 52 65 61 6c 6c 79 20  : {   /* Really 
4a30: 61 20 63 61 73 74 20 74 6f 20 42 4c 4f 42 20 2a  a cast to BLOB *
4a40: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 4d 65  /.      if( (pMe
4a50: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
4a60: 6c 6f 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lob)==0 ){.     
4a70: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
4a80: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 4d 65  pplyAffinity(pMe
4a90: 6d 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  m, SQLITE_AFF_TE
4aa0: 58 54 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  XT, encoding);. 
4ab0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4ac0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4ad0: 5f 53 74 72 20 7c 7c 20 70 4d 65 6d 2d 3e 64 62  _Str || pMem->db
4ae0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4af0: 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74  ;.        MemSet
4b00: 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d  TypeFlag(pMem, M
4b10: 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20  EM_Blob);.      
4b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4b30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Mem->flags &= ~(
4b40: 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 26 7e 4d 45  MEM_TypeMask&~ME
4b50: 4d 5f 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 7d  M_Blob);.      }
4b60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4b70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4b80: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
4b90: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4ba0: 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79 28  VdbeMemNumerify(
4bb0: 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  pMem);.      bre
4bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4bd0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  se SQLITE_AFF_IN
4be0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  TEGER: {.      s
4bf0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
4c00: 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20  egerify(pMem);. 
4c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4c20: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4c30: 45 5f 41 46 46 5f 52 45 41 4c 3a 20 7b 0a 20 20  E_AFF_REAL: {.  
4c40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
4c50: 65 6d 52 65 61 6c 69 66 79 28 70 4d 65 6d 29 3b  emRealify(pMem);
4c60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4c70: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4c80: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4c90: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
4ca0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 20 20 61  _TEXT );.      a
4cb0: 73 73 65 72 74 28 20 4d 45 4d 5f 53 74 72 3d 3d  ssert( MEM_Str==
4cc0: 28 4d 45 4d 5f 42 6c 6f 62 3e 3e 33 29 20 29 3b  (MEM_Blob>>3) );
4cd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
4ce0: 67 73 20 7c 3d 20 28 70 4d 65 6d 2d 3e 66 6c 61  gs |= (pMem->fla
4cf0: 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33 3b  gs&MEM_Blob)>>3;
4d00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
4d10: 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
4d20: 28 70 4d 65 6d 2c 20 53 51 4c 49 54 45 5f 41 46  (pMem, SQLITE_AF
4d30: 46 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e 67  F_TEXT, encoding
4d40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4d50: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
4d60: 45 4d 5f 53 74 72 20 7c 7c 20 70 4d 65 6d 2d 3e  EM_Str || pMem->
4d70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4d80: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
4d90: 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 49  flags &= ~(MEM_I
4da0: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
4db0: 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b 0a  Blob|MEM_Zero);.
4dc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4dd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4de0: 49 6e 69 74 69 61 6c 69 7a 65 20 62 75 6c 6b 20  Initialize bulk 
4df0: 6d 65 6d 6f 72 79 20 74 6f 20 62 65 20 61 20 63  memory to be a c
4e00: 6f 6e 73 69 73 74 65 6e 74 20 4d 65 6d 20 6f 62  onsistent Mem ob
4e10: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
4e20: 6d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  minimum amount o
4e30: 66 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  f initialization
4e40: 20 66 65 61 73 69 62 6c 65 20 69 73 20 70 65 72   feasible is per
4e50: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  formed..*/.void 
4e60: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
4e70: 69 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 73 71  it(Mem *pMem, sq
4e80: 6c 69 74 65 33 20 2a 64 62 2c 20 75 31 36 20 66  lite3 *db, u16 f
4e90: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
4ea0: 20 28 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54   (flags & ~MEM_T
4eb0: 79 70 65 4d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20  ypeMask)==0 );. 
4ec0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 66   pMem->flags = f
4ed0: 6c 61 67 73 3b 0a 20 20 70 4d 65 6d 2d 3e 64 62  lags;.  pMem->db
4ee0: 20 3d 20 64 62 3b 0a 20 20 70 4d 65 6d 2d 3e 73   = db;.  pMem->s
4ef0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 7d 0a 0a  zMalloc = 0;.}..
4f00: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
4f10: 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  y previous value
4f20: 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61 6c   and set the val
4f30: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d  ue stored in *pM
4f40: 65 6d 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  em to NULL..**.*
4f50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
4f60: 61 6c 6c 73 20 74 68 65 20 4d 65 6d 2e 78 44 65  alls the Mem.xDe
4f70: 6c 20 64 65 73 74 72 75 63 74 6f 72 20 74 6f 20  l destructor to 
4f80: 64 69 73 70 6f 73 65 20 6f 66 20 76 61 6c 75 65  dispose of value
4f90: 73 20 74 68 61 74 0a 2a 2a 20 72 65 71 75 69 72  s that.** requir
4fa0: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
4fb0: 2e 20 20 42 75 74 20 69 74 20 70 72 65 73 65 72  .  But it preser
4fc0: 76 65 73 20 74 68 65 20 4d 65 6d 2e 7a 4d 61 6c  ves the Mem.zMal
4fd0: 6c 6f 63 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  loc memory alloc
4fe0: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20 66 72 65  ation..** To fre
4ff0: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2c  e all resources,
5000: 20 75 73 65 20 73 71 6c 69 74 65 33 56 64 62 65   use sqlite3Vdbe
5010: 4d 65 6d 52 65 6c 65 61 73 65 28 29 2c 20 77 68  MemRelease(), wh
5020: 69 63 68 20 62 6f 74 68 20 63 61 6c 6c 73 20 74  ich both calls t
5030: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  his.** routine t
5040: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  o invoke the des
5050: 74 72 75 63 74 6f 72 20 61 6e 64 20 64 65 61 6c  tructor and deal
5060: 6c 6f 63 61 74 65 73 20 4d 65 6d 2e 7a 4d 61 6c  locates Mem.zMal
5070: 6c 6f 63 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  loc..**.** Use t
5080: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 72  his routine to r
5090: 65 73 65 74 20 74 68 65 20 4d 65 6d 20 70 72 69  eset the Mem pri
50a0: 6f 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  or to insert a n
50b0: 65 77 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ew value..**.** 
50c0: 55 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 4d  Use sqlite3VdbeM
50d0: 65 6d 52 65 6c 65 61 73 65 28 29 20 74 6f 20 63  emRelease() to c
50e0: 6f 6d 70 6c 65 74 65 20 65 72 61 73 65 20 74 68  omplete erase th
50f0: 65 20 4d 65 6d 20 70 72 69 6f 72 20 74 6f 20 61  e Mem prior to a
5100: 62 61 6e 64 6f 6e 69 6e 67 20 69 74 2e 0a 2a 2f  bandoning it..*/
5110: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5120: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 4d 65 6d 20  eMemSetNull(Mem 
5130: 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28 20 56 64  *pMem){.  if( Vd
5140: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4d 65  beMemDynamic(pMe
5150: 6d 29 20 29 7b 0a 20 20 20 20 76 64 62 65 4d 65  m) ){.    vdbeMe
5160: 6d 43 6c 65 61 72 45 78 74 65 72 6e 41 6e 64 53  mClearExternAndS
5170: 65 74 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a 20 20  etNull(pMem);.  
5180: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d  }else{.    pMem-
5190: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
51a0: 6c 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  l;.  }.}.void sq
51b0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 4e 75 6c  lite3ValueSetNul
51c0: 6c 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  l(sqlite3_value 
51d0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  *p){.  sqlite3Vd
51e0: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 28 4d 65  beMemSetNull((Me
51f0: 6d 2a 29 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  m*)p); .}../*.**
5200: 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76   Delete any prev
5210: 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73  ious value and s
5220: 65 74 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  et the value to 
5230: 62 65 20 61 20 42 4c 4f 42 20 6f 66 20 6c 65 6e  be a BLOB of len
5240: 67 74 68 0a 2a 2a 20 6e 20 63 6f 6e 74 61 69 6e  gth.** n contain
5250: 69 6e 67 20 61 6c 6c 20 7a 65 72 6f 73 2e 0a 2a  ing all zeros..*
5260: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5270: 62 65 4d 65 6d 53 65 74 5a 65 72 6f 42 6c 6f 62  beMemSetZeroBlob
5280: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
5290: 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  n){.  sqlite3Vdb
52a0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
52b0: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  );.  pMem->flags
52c0: 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   = MEM_Blob|MEM_
52d0: 5a 65 72 6f 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 20  Zero;.  pMem->n 
52e0: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  = 0;.  if( n<0 )
52f0: 20 6e 20 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e   n = 0;.  pMem->
5300: 75 2e 6e 5a 65 72 6f 20 3d 20 6e 3b 0a 20 20 70  u.nZero = n;.  p
5310: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
5320: 45 5f 55 54 46 38 3b 0a 20 20 70 4d 65 6d 2d 3e  E_UTF8;.  pMem->
5330: 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z = 0;.}../*.** 
5340: 54 68 65 20 70 4d 65 6d 20 69 73 20 6b 6e 6f 77  The pMem is know
5350: 6e 20 74 6f 20 63 6f 6e 74 61 69 6e 20 63 6f 6e  n to contain con
5360: 74 65 6e 74 20 74 68 61 74 20 6e 65 65 64 73 20  tent that needs 
5370: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
5380: 70 72 69 6f 72 0a 2a 2a 20 74 6f 20 61 20 76 61  prior.** to a va
5390: 6c 75 65 20 63 68 61 6e 67 65 2e 20 20 53 6f 20  lue change.  So 
53a0: 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
53b0: 75 63 74 6f 72 2c 20 74 68 65 6e 20 73 65 74 20  uctor, then set 
53c0: 74 68 65 20 76 61 6c 75 65 20 74 6f 0a 2a 2a 20  the value to.** 
53d0: 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
53e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
53f0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
5400: 20 76 64 62 65 52 65 6c 65 61 73 65 41 6e 64 53   vdbeReleaseAndS
5410: 65 74 49 6e 74 36 34 28 4d 65 6d 20 2a 70 4d 65  etInt64(Mem *pMe
5420: 6d 2c 20 69 36 34 20 76 61 6c 29 7b 0a 20 20 73  m, i64 val){.  s
5430: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
5440: 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a 20 20 70 4d  Null(pMem);.  pM
5450: 65 6d 2d 3e 75 2e 69 20 3d 20 76 61 6c 3b 0a 20  em->u.i = val;. 
5460: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5470: 45 4d 5f 49 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EM_Int;.}../*.**
5480: 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76   Delete any prev
5490: 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73  ious value and s
54a0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  et the value sto
54b0: 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20  red in *pMem to 
54c0: 76 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73 74  val,.** manifest
54d0: 20 74 79 70 65 20 49 4e 54 45 47 45 52 2e 0a 2a   type INTEGER..*
54e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
54f0: 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 4d 65  beMemSetInt64(Me
5500: 6d 20 2a 70 4d 65 6d 2c 20 69 36 34 20 76 61 6c  m *pMem, i64 val
5510: 29 7b 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d  ){.  if( VdbeMem
5520: 44 79 6e 61 6d 69 63 28 70 4d 65 6d 29 20 29 7b  Dynamic(pMem) ){
5530: 0a 20 20 20 20 76 64 62 65 52 65 6c 65 61 73 65  .    vdbeRelease
5540: 41 6e 64 53 65 74 49 6e 74 36 34 28 70 4d 65 6d  AndSetInt64(pMem
5550: 2c 20 76 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  , val);.  }else{
5560: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
5570: 20 76 61 6c 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   val;.    pMem->
5580: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
5590: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
55a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
55b0: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
55c0: 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76   Delete any prev
55d0: 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73  ious value and s
55e0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  et the value sto
55f0: 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20  red in *pMem to 
5600: 76 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73 74  val,.** manifest
5610: 20 74 79 70 65 20 52 45 41 4c 2e 0a 2a 2f 0a 76   type REAL..*/.v
5620: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
5630: 65 6d 53 65 74 44 6f 75 62 6c 65 28 4d 65 6d 20  emSetDouble(Mem 
5640: 2a 70 4d 65 6d 2c 20 64 6f 75 62 6c 65 20 76 61  *pMem, double va
5650: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
5660: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
5670: 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  );.  if( !sqlite
5680: 33 49 73 4e 61 4e 28 76 61 6c 29 20 29 7b 0a 20  3IsNaN(val) ){. 
5690: 20 20 20 70 4d 65 6d 2d 3e 75 2e 72 20 3d 20 76     pMem->u.r = v
56a0: 61 6c 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  al;.    pMem->fl
56b0: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
56c0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
56d0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70  .** Delete any p
56e0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e  revious value an
56f0: 64 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  d set the value 
5700: 6f 66 20 70 4d 65 6d 20 74 6f 20 62 65 20 61 6e  of pMem to be an
5710: 0a 2a 2a 20 65 6d 70 74 79 20 62 6f 6f 6c 65 61  .** empty boolea
5720: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  n index..*/.void
5730: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
5740: 65 74 52 6f 77 53 65 74 28 4d 65 6d 20 2a 70 4d  etRowSet(Mem *pM
5750: 65 6d 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  em){.  sqlite3 *
5760: 64 62 20 3d 20 70 4d 65 6d 2d 3e 64 62 3b 0a 20  db = pMem->db;. 
5770: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
5780: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65  ;.  assert( (pMe
5790: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
57a0: 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20 73  owSet)==0 );.  s
57b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
57c0: 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d  ease(pMem);.  pM
57d0: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71  em->zMalloc = sq
57e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
57f0: 28 64 62 2c 20 36 34 29 3b 0a 20 20 69 66 28 20  (db, 64);.  if( 
5800: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5810: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   ){.    pMem->fl
5820: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
5830: 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
5840: 6f 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  oc = 0;.  }else{
5850: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
5860: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20  m->zMalloc );.  
5870: 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63    pMem->szMalloc
5880: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5890: 6f 63 53 69 7a 65 28 64 62 2c 20 70 4d 65 6d 2d  ocSize(db, pMem-
58a0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 70  >zMalloc);.    p
58b0: 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74 20 3d  Mem->u.pRowSet =
58c0: 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 49 6e   sqlite3RowSetIn
58d0: 69 74 28 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61  it(db, pMem->zMa
58e0: 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61  lloc, pMem->szMa
58f0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 61 73 73 65 72  lloc);.    asser
5900: 74 28 20 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53  t( pMem->u.pRowS
5910: 65 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 4d 65  et!=0 );.    pMe
5920: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52  m->flags = MEM_R
5930: 6f 77 53 65 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  owSet;.  }.}../*
5940: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5950: 69 66 20 74 68 65 20 4d 65 6d 20 6f 62 6a 65 63  if the Mem objec
5960: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 54 45 58  t contains a TEX
5970: 54 20 6f 72 20 42 4c 4f 42 20 74 68 61 74 20 69  T or BLOB that i
5980: 73 0a 2a 2a 20 74 6f 6f 20 6c 61 72 67 65 20 2d  s.** too large -
5990: 20 77 68 6f 73 65 20 73 69 7a 65 20 65 78 63 65   whose size exce
59a0: 65 64 73 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  eds SQLITE_MAX_L
59b0: 45 4e 47 54 48 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ENGTH..*/.int sq
59c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42  lite3VdbeMemTooB
59d0: 69 67 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61 73  ig(Mem *p){.  as
59e0: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
59f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ;.  if( p->flags
5a00: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
5a10: 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 69 6e 74  Blob) ){.    int
5a20: 20 6e 20 3d 20 70 2d 3e 6e 3b 0a 20 20 20 20 69   n = p->n;.    i
5a30: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  f( p->flags & ME
5a40: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
5a50: 6e 20 2b 3d 20 70 2d 3e 75 2e 6e 5a 65 72 6f 3b  n += p->u.nZero;
5a60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5a70: 6e 20 6e 3e 70 2d 3e 64 62 2d 3e 61 4c 69 6d 69  n n>p->db->aLimi
5a80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
5a90: 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 72 65  ENGTH];.  }.  re
5aa0: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 23 69 66 64  turn 0; .}..#ifd
5ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5ac0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5ad0: 6e 65 20 70 72 65 70 61 72 65 73 20 61 20 6d 65  ne prepares a me
5ae0: 6d 6f 72 79 20 63 65 6c 6c 20 66 6f 72 20 6d 6f  mory cell for mo
5af0: 64 69 66 69 63 61 74 69 6f 6e 20 62 79 20 62 72  dification by br
5b00: 65 61 6b 69 6e 67 0a 2a 2a 20 69 74 73 20 6c 69  eaking.** its li
5b10: 6e 6b 20 74 6f 20 61 20 73 68 61 6c 6c 6f 77 20  nk to a shallow 
5b20: 63 6f 70 79 20 61 6e 64 20 62 79 20 6d 61 72 6b  copy and by mark
5b30: 69 6e 67 20 61 6e 79 20 63 75 72 72 65 6e 74 20  ing any current 
5b40: 73 68 61 6c 6c 6f 77 0a 2a 2a 20 63 6f 70 69 65  shallow.** copie
5b50: 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
5b60: 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  s invalid..**.**
5b70: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
5b80: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
5b90: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 20 2d 20 74  bugging only - t
5ba0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 73 68 61 6c  o make sure shal
5bb0: 6c 6f 77 0a 2a 2a 20 63 6f 70 69 65 73 20 61 72  low.** copies ar
5bc0: 65 20 6e 6f 74 20 6d 69 73 75 73 65 64 2e 0a 2a  e not misused..*
5bd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5be0: 62 65 4d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e  beMemAboutToChan
5bf0: 67 65 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ge(Vdbe *pVdbe, 
5c00: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e  Mem *pMem){.  in
5c10: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a  t i;.  Mem *pX;.
5c20: 20 20 66 6f 72 28 69 3d 31 2c 20 70 58 3d 26 70    for(i=1, pX=&p
5c30: 56 64 62 65 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 69  Vdbe->aMem[1]; i
5c40: 3c 3d 70 56 64 62 65 2d 3e 6e 4d 65 6d 3b 20 69  <=pVdbe->nMem; i
5c50: 2b 2b 2c 20 70 58 2b 2b 29 7b 0a 20 20 20 20 69  ++, pX++){.    i
5c60: 66 28 20 70 58 2d 3e 70 53 63 6f 70 79 46 72 6f  f( pX->pScopyFro
5c70: 6d 3d 3d 70 4d 65 6d 20 29 7b 0a 20 20 20 20 20  m==pMem ){.     
5c80: 20 70 58 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45   pX->flags |= ME
5c90: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
5ca0: 20 20 20 70 58 2d 3e 70 53 63 6f 70 79 46 72 6f     pX->pScopyFro
5cb0: 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 0;.    }.  }
5cc0: 0a 20 20 70 4d 65 6d 2d 3e 70 53 63 6f 70 79 46  .  pMem->pScopyF
5cd0: 72 6f 6d 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  rom = 0;.}.#endi
5ce0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
5cf0: 47 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  G */.../*.** Mak
5d00: 65 20 61 6e 20 73 68 61 6c 6c 6f 77 20 63 6f 70  e an shallow cop
5d10: 79 20 6f 66 20 70 46 72 6f 6d 20 69 6e 74 6f 20  y of pFrom into 
5d20: 70 54 6f 2e 20 20 50 72 69 6f 72 20 63 6f 6e 74  pTo.  Prior cont
5d30: 65 6e 74 73 20 6f 66 0a 2a 2a 20 70 54 6f 20 61  ents of.** pTo a
5d40: 72 65 20 66 72 65 65 64 2e 20 20 54 68 65 20 70  re freed.  The p
5d50: 46 72 6f 6d 2d 3e 7a 20 66 69 65 6c 64 20 69 73  From->z field is
5d60: 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e   not duplicated.
5d70: 20 20 49 66 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 7a    If.** pFrom->z
5d80: 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 70   is used, then p
5d90: 54 6f 2d 3e 7a 20 70 6f 69 6e 74 73 20 74 6f 20  To->z points to 
5da0: 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
5db0: 73 20 70 46 72 6f 6d 2d 3e 7a 0a 2a 2a 20 61 6e  s pFrom->z.** an
5dc0: 64 20 66 6c 61 67 73 20 67 65 74 73 20 73 72 63  d flags gets src
5dd0: 54 79 70 65 20 28 65 69 74 68 65 72 20 4d 45 4d  Type (either MEM
5de0: 5f 45 70 68 65 6d 20 6f 72 20 4d 45 4d 5f 53 74  _Ephem or MEM_St
5df0: 61 74 69 63 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  atic)..*/.static
5e00: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5e10: 20 76 6f 69 64 20 76 64 62 65 43 6c 72 43 6f 70   void vdbeClrCop
5e20: 79 28 4d 65 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73  y(Mem *pTo, cons
5e30: 74 20 4d 65 6d 20 2a 70 46 72 6f 6d 2c 20 69 6e  t Mem *pFrom, in
5e40: 74 20 65 54 79 70 65 29 7b 0a 20 20 76 64 62 65  t eType){.  vdbe
5e50: 4d 65 6d 43 6c 65 61 72 45 78 74 65 72 6e 41 6e  MemClearExternAn
5e60: 64 53 65 74 4e 75 6c 6c 28 70 54 6f 29 3b 0a 20  dSetNull(pTo);. 
5e70: 20 61 73 73 65 72 74 28 20 21 56 64 62 65 4d 65   assert( !VdbeMe
5e80: 6d 44 79 6e 61 6d 69 63 28 70 54 6f 29 20 29 3b  mDynamic(pTo) );
5e90: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
5ea0: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 54 6f  mShallowCopy(pTo
5eb0: 2c 20 70 46 72 6f 6d 2c 20 65 54 79 70 65 29 3b  , pFrom, eType);
5ec0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5ed0: 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
5ee0: 79 28 4d 65 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73  y(Mem *pTo, cons
5ef0: 74 20 4d 65 6d 20 2a 70 46 72 6f 6d 2c 20 69 6e  t Mem *pFrom, in
5f00: 74 20 73 72 63 54 79 70 65 29 7b 0a 20 20 61 73  t srcType){.  as
5f10: 73 65 72 74 28 20 28 70 46 72 6f 6d 2d 3e 66 6c  sert( (pFrom->fl
5f20: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
5f30: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5f40: 28 20 70 54 6f 2d 3e 64 62 3d 3d 70 46 72 6f 6d  ( pTo->db==pFrom
5f50: 2d 3e 64 62 20 29 3b 0a 20 20 69 66 28 20 56 64  ->db );.  if( Vd
5f60: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 54 6f  beMemDynamic(pTo
5f70: 29 20 29 7b 20 76 64 62 65 43 6c 72 43 6f 70 79  ) ){ vdbeClrCopy
5f80: 28 70 54 6f 2c 70 46 72 6f 6d 2c 73 72 63 54 79  (pTo,pFrom,srcTy
5f90: 70 65 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  pe); return; }. 
5fa0: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
5fb0: 6f 6d 2c 20 4d 45 4d 43 45 4c 4c 53 49 5a 45 29  om, MEMCELLSIZE)
5fc0: 3b 0a 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e  ;.  if( (pFrom->
5fd0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61 74 69 63  flags&MEM_Static
5fe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 6f 2d  )==0 ){.    pTo-
5ff0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
6000: 44 79 6e 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  Dyn|MEM_Static|M
6010: 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 61  EM_Ephem);.    a
6020: 73 73 65 72 74 28 20 73 72 63 54 79 70 65 3d 3d  ssert( srcType==
6030: 4d 45 4d 5f 45 70 68 65 6d 20 7c 7c 20 73 72 63  MEM_Ephem || src
6040: 54 79 70 65 3d 3d 4d 45 4d 5f 53 74 61 74 69 63  Type==MEM_Static
6050: 20 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 66 6c 61   );.    pTo->fla
6060: 67 73 20 7c 3d 20 73 72 63 54 79 70 65 3b 0a 20  gs |= srcType;. 
6070: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
6080: 20 61 20 66 75 6c 6c 20 63 6f 70 79 20 6f 66 20   a full copy of 
6090: 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e 20  pFrom into pTo. 
60a0: 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74 73 20   Prior contents 
60b0: 6f 66 20 70 54 6f 20 61 72 65 0a 2a 2a 20 66 72  of pTo are.** fr
60c0: 65 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  eed before the c
60d0: 6f 70 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a  opy is made..*/.
60e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
60f0: 65 6d 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c  emCopy(Mem *pTo,
6100: 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f   const Mem *pFro
6110: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
6120: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
6130: 54 68 65 20 70 46 72 6f 6d 3d 3d 30 20 63 61 73  The pFrom==0 cas
6140: 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e in the followi
6150: 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 77  ng assert() is w
6160: 68 65 6e 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  hen an sqlite3_v
6170: 61 6c 75 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 73  alue.  ** from s
6180: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70  qlite3_value_dup
6190: 28 29 20 69 73 20 75 73 65 64 20 61 73 20 74 68  () is used as th
61a0: 65 20 61 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20  e argument.  ** 
61b0: 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  to sqlite3_resul
61c0: 74 5f 76 61 6c 75 65 28 29 2e 20 2a 2f 0a 20 20  t_value(). */.  
61d0: 61 73 73 65 72 74 28 20 70 54 6f 2d 3e 64 62 3d  assert( pTo->db=
61e0: 3d 70 46 72 6f 6d 2d 3e 64 62 20 7c 7c 20 70 46  =pFrom->db || pF
61f0: 72 6f 6d 2d 3e 64 62 3d 3d 30 20 29 3b 0a 20 20  rom->db==0 );.  
6200: 61 73 73 65 72 74 28 20 28 70 46 72 6f 6d 2d 3e  assert( (pFrom->
6210: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
6220: 65 74 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  et)==0 );.  if( 
6230: 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70  VdbeMemDynamic(p
6240: 54 6f 29 20 29 20 76 64 62 65 4d 65 6d 43 6c 65  To) ) vdbeMemCle
6250: 61 72 45 78 74 65 72 6e 41 6e 64 53 65 74 4e 75  arExternAndSetNu
6260: 6c 6c 28 70 54 6f 29 3b 0a 20 20 6d 65 6d 63 70  ll(pTo);.  memcp
6270: 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 4d 45  y(pTo, pFrom, ME
6280: 4d 43 45 4c 4c 53 49 5a 45 29 3b 0a 20 20 70 54  MCELLSIZE);.  pT
6290: 6f 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d  o->flags &= ~MEM
62a0: 5f 44 79 6e 3b 0a 20 20 69 66 28 20 70 54 6f 2d  _Dyn;.  if( pTo-
62b0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c  >flags&(MEM_Str|
62c0: 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20  MEM_Blob) ){.   
62d0: 20 69 66 28 20 30 3d 3d 28 70 46 72 6f 6d 2d 3e   if( 0==(pFrom->
62e0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61 74 69 63  flags&MEM_Static
62f0: 29 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 2d 3e  ) ){.      pTo->
6300: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 45 70 68  flags |= MEM_Eph
6310: 65 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  em;.      rc = s
6320: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b  qlite3VdbeMemMak
6330: 65 57 72 69 74 65 61 62 6c 65 28 70 54 6f 29 3b  eWriteable(pTo);
6340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
6350: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6360: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 63  * Transfer the c
6370: 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d  ontents of pFrom
6380: 20 74 6f 20 70 54 6f 2e 20 41 6e 79 20 65 78 69   to pTo. Any exi
6390: 73 74 69 6e 67 20 76 61 6c 75 65 20 69 6e 20 70  sting value in p
63a0: 54 6f 20 69 73 0a 2a 2a 20 66 72 65 65 64 2e 20  To is.** freed. 
63b0: 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
63c0: 73 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  s ephemeral data
63d0: 2c 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  , a copy is made
63e0: 2e 0a 2a 2a 0a 2a 2a 20 70 46 72 6f 6d 20 63 6f  ..**.** pFrom co
63f0: 6e 74 61 69 6e 73 20 61 6e 20 53 51 4c 20 4e 55  ntains an SQL NU
6400: 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  LL when this rou
6410: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tine returns..*/
6420: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6430: 65 4d 65 6d 4d 6f 76 65 28 4d 65 6d 20 2a 70 54  eMemMove(Mem *pT
6440: 6f 2c 20 4d 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  o, Mem *pFrom){.
6450: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
6460: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
6470: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 72  3_mutex_held(pFr
6480: 6f 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  om->db->mutex) )
6490: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 2d  ;.  assert( pTo-
64a0: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
64b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 54 6f  3_mutex_held(pTo
64c0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
64d0: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
64e0: 3e 64 62 3d 3d 30 20 7c 7c 20 70 54 6f 2d 3e 64  >db==0 || pTo->d
64f0: 62 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 64  b==0 || pFrom->d
6500: 62 3d 3d 70 54 6f 2d 3e 64 62 20 29 3b 0a 0a 20  b==pTo->db );.. 
6510: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
6520: 65 6c 65 61 73 65 28 70 54 6f 29 3b 0a 20 20 6d  elease(pTo);.  m
6530: 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d  emcpy(pTo, pFrom
6540: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  , sizeof(Mem));.
6550: 20 20 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 20 3d    pFrom->flags =
6560: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 70 46 72   MEM_Null;.  pFr
6570: 6f 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  om->szMalloc = 0
6580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
6590: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
65a0: 20 4d 65 6d 20 74 6f 20 62 65 20 61 20 73 74 72   Mem to be a str
65b0: 69 6e 67 20 6f 72 20 61 20 42 4c 4f 42 2e 0a 2a  ing or a BLOB..*
65c0: 2a 0a 2a 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20  *.** The memory 
65d0: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
65e0: 65 67 79 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  egy depends on t
65f0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
6600: 78 44 65 6c 0a 2a 2a 20 70 61 72 61 6d 65 74 65  xDel.** paramete
6610: 72 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  r. If the value 
6620: 70 61 73 73 65 64 20 69 73 20 53 51 4c 49 54 45  passed is SQLITE
6630: 5f 54 52 41 4e 53 49 45 4e 54 2c 20 74 68 65 6e  _TRANSIENT, then
6640: 20 74 68 65 20 0a 2a 2a 20 73 74 72 69 6e 67 20   the .** string 
6650: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 61  is copied into a
6660: 20 28 70 6f 73 73 69 62 6c 79 20 65 78 69 73 74   (possibly exist
6670: 69 6e 67 29 20 62 75 66 66 65 72 20 6d 61 6e 61  ing) buffer mana
6680: 67 65 64 20 62 79 20 74 68 65 20 0a 2a 2a 20 4d  ged by the .** M
6690: 65 6d 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74  em structure. Ot
66a0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 65 78 69  herwise, any exi
66b0: 73 74 69 6e 67 20 62 75 66 66 65 72 20 69 73 20  sting buffer is 
66c0: 66 72 65 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  freed and the.**
66d0: 20 70 6f 69 6e 74 65 72 20 63 6f 70 69 65 64 2e   pointer copied.
66e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  .**.** If the st
66f0: 72 69 6e 67 20 69 73 20 74 6f 6f 20 6c 61 72 67  ring is too larg
6700: 65 20 28 69 66 20 69 74 20 65 78 63 65 65 64 73  e (if it exceeds
6710: 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
6720: 54 5f 4c 45 4e 47 54 48 0a 2a 2a 20 73 69 7a 65  T_LENGTH.** size
6730: 20 6c 69 6d 69 74 29 20 74 68 65 6e 20 6e 6f 20   limit) then no 
6740: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6750: 6e 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68  n occurs.  If th
6760: 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65 0a  e string can be.
6770: 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68 6f 75  ** stored withou
6780: 74 20 61 6c 6c 6f 63 61 74 69 6e 67 20 6d 65 6d  t allocating mem
6790: 6f 72 79 2c 20 74 68 65 6e 20 69 74 20 69 73 2e  ory, then it is.
67a0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
67b0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  location.** is r
67c0: 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
67d0: 20 74 68 65 20 73 74 72 69 6e 67 2c 20 74 68 65   the string, the
67e0: 6e 20 76 61 6c 75 65 20 6f 66 20 70 4d 65 6d 20  n value of pMem 
67f0: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 49  is unchanged.  I
6800: 6e 0a 2a 2a 20 65 69 74 68 65 72 20 63 61 73 65  n.** either case
6810: 2c 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  , SQLITE_TOOBIG 
6820: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
6830: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
6840: 65 6d 53 65 74 53 74 72 28 0a 20 20 4d 65 6d 20  emSetStr(.  Mem 
6850: 2a 70 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20  *pMem,          
6860: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
6870: 6f 20 73 65 74 20 74 6f 20 73 74 72 69 6e 67 20  o set to string 
6880: 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  value */.  const
6890: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 2f   char *z,      /
68a0: 2a 20 53 74 72 69 6e 67 20 70 6f 69 6e 74 65 72  * String pointer
68b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
68c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
68d0: 65 73 20 69 6e 20 73 74 72 69 6e 67 2c 20 6f 72  es in string, or
68e0: 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 75   negative */.  u
68f0: 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20  8 enc,          
6900: 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 6f     /* Encoding o
6910: 66 20 7a 2e 20 20 30 20 66 6f 72 20 42 4c 4f 42  f z.  0 for BLOB
6920: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  s */.  void (*xD
6930: 65 6c 29 28 76 6f 69 64 2a 29 20 2f 2a 20 44 65  el)(void*) /* De
6940: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
6950: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  n */.){.  int nB
6960: 79 74 65 20 3d 20 6e 3b 20 20 20 20 20 20 2f 2a  yte = n;      /*
6970: 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 70   New value for p
6980: 4d 65 6d 2d 3e 6e 20 2a 2f 0a 20 20 69 6e 74 20  Mem->n */.  int 
6990: 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  iLimit;         
69a0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
69b0: 65 64 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  ed string or blo
69c0: 62 20 73 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20  b size */.  u16 
69d0: 66 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  flags = 0;      
69e0: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
69f0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 2a 2f 0a   pMem->flags */.
6a00: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
6a10: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
6a20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65  3_mutex_held(pMe
6a30: 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  m->db->mutex) );
6a40: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
6a50: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
6a60: 77 53 65 74 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  wSet)==0 );..  /
6a70: 2a 20 49 66 20 7a 20 69 73 20 61 20 4e 55 4c 4c  * If z is a NULL
6a80: 20 70 6f 69 6e 74 65 72 2c 20 73 65 74 20 70 4d   pointer, set pM
6a90: 65 6d 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 6e  em to contain an
6aa0: 20 53 51 4c 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20   SQL NULL. */.  
6ab0: 69 66 28 20 21 7a 20 29 7b 0a 20 20 20 20 73 71  if( !z ){.    sq
6ac0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
6ad0: 75 6c 6c 28 70 4d 65 6d 29 3b 0a 20 20 20 20 72  ull(pMem);.    r
6ae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6af0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 65 6d  .  }..  if( pMem
6b00: 2d 3e 64 62 20 29 7b 0a 20 20 20 20 69 4c 69 6d  ->db ){.    iLim
6b10: 69 74 20 3d 20 70 4d 65 6d 2d 3e 64 62 2d 3e 61  it = pMem->db->a
6b20: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
6b30: 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 65  IT_LENGTH];.  }e
6b40: 6c 73 65 7b 0a 20 20 20 20 69 4c 69 6d 69 74 20  lse{.    iLimit 
6b50: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  = SQLITE_MAX_LEN
6b60: 47 54 48 3b 0a 20 20 7d 0a 20 20 66 6c 61 67 73  GTH;.  }.  flags
6b70: 20 3d 20 28 65 6e 63 3d 3d 30 3f 4d 45 4d 5f 42   = (enc==0?MEM_B
6b80: 6c 6f 62 3a 4d 45 4d 5f 53 74 72 29 3b 0a 20 20  lob:MEM_Str);.  
6b90: 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20  if( nByte<0 ){. 
6ba0: 20 20 20 61 73 73 65 72 74 28 20 65 6e 63 21 3d     assert( enc!=
6bb0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65 6e 63  0 );.    if( enc
6bc0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  ==SQLITE_UTF8 ){
6bd0: 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73  .      nByte = s
6be0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6bf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79  );.      if( nBy
6c00: 74 65 3e 69 4c 69 6d 69 74 20 29 20 6e 42 79 74  te>iLimit ) nByt
6c10: 65 20 3d 20 69 4c 69 6d 69 74 2b 31 3b 0a 20 20  e = iLimit+1;.  
6c20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
6c30: 6f 72 28 6e 42 79 74 65 3d 30 3b 20 6e 42 79 74  or(nByte=0; nByt
6c40: 65 3c 3d 69 4c 69 6d 69 74 20 26 26 20 28 7a 5b  e<=iLimit && (z[
6c50: 6e 42 79 74 65 5d 20 7c 20 7a 5b 6e 42 79 74 65  nByte] | z[nByte
6c60: 2b 31 5d 29 3b 20 6e 42 79 74 65 2b 3d 32 29 7b  +1]); nByte+=2){
6c70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6c 61 67  }.    }.    flag
6c80: 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20  s |= MEM_Term;. 
6c90: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
6ca0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 65 74  lowing block set
6cb0: 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 73  s the new values
6cc0: 20 6f 66 20 4d 65 6d 2e 7a 20 61 6e 64 20 4d 65   of Mem.z and Me
6cd0: 6d 2e 78 44 65 6c 2e 20 49 74 0a 20 20 2a 2a 20  m.xDel. It.  ** 
6ce0: 61 6c 73 6f 20 73 65 74 73 20 61 20 66 6c 61 67  also sets a flag
6cf0: 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
6d00: 6c 65 20 22 66 6c 61 67 73 22 20 74 6f 20 69 6e  le "flags" to in
6d10: 64 69 63 61 74 65 20 74 68 65 20 6d 65 6d 6f 72  dicate the memor
6d20: 79 0a 20 20 2a 2a 20 6d 61 6e 61 67 65 6d 65 6e  y.  ** managemen
6d30: 74 20 28 6f 6e 65 20 6f 66 20 4d 45 4d 5f 44 79  t (one of MEM_Dy
6d40: 6e 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69 63 29  n or MEM_Static)
6d50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 78 44 65  ..  */.  if( xDe
6d60: 6c 3d 3d 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l==SQLITE_TRANSI
6d70: 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ENT ){.    int n
6d80: 41 6c 6c 6f 63 20 3d 20 6e 42 79 74 65 3b 0a 20  Alloc = nByte;. 
6d90: 20 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d     if( flags&MEM
6da0: 5f 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 6e  _Term ){.      n
6db0: 41 6c 6c 6f 63 20 2b 3d 20 28 65 6e 63 3d 3d 53  Alloc += (enc==S
6dc0: 51 4c 49 54 45 5f 55 54 46 38 3f 31 3a 32 29 3b  QLITE_UTF8?1:2);
6dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
6de0: 42 79 74 65 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  Byte>iLimit ){. 
6df0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6e00: 54 45 5f 54 4f 4f 42 49 47 3b 0a 20 20 20 20 7d  TE_TOOBIG;.    }
6e10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
6e20: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20  Alloc==0 );.    
6e30: 74 65 73 74 63 61 73 65 28 20 6e 41 6c 6c 6f 63  testcase( nAlloc
6e40: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 74 65 73 74  ==31 );.    test
6e50: 63 61 73 65 28 20 6e 41 6c 6c 6f 63 3d 3d 33 32  case( nAlloc==32
6e60: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
6e70: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
6e80: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 4d  ndResize(pMem, M
6e90: 41 58 28 6e 41 6c 6c 6f 63 2c 33 32 29 29 20 29  AX(nAlloc,32)) )
6ea0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6eb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6ec0: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4d   }.    memcpy(pM
6ed0: 65 6d 2d 3e 7a 2c 20 7a 2c 20 6e 41 6c 6c 6f 63  em->z, z, nAlloc
6ee0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 78  );.  }else if( x
6ef0: 44 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del==SQLITE_DYNA
6f00: 4d 49 43 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MIC ){.    sqlit
6f10: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
6f20: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d  (pMem);.    pMem
6f30: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 70 4d 65 6d  ->zMalloc = pMem
6f40: 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 7a 3b  ->z = (char *)z;
6f50: 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
6f60: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
6f70: 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e  allocSize(pMem->
6f80: 64 62 2c 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  db, pMem->zMallo
6f90: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  c);.  }else{.   
6fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
6fb0: 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
6fc0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
6fd0: 72 20 2a 29 7a 3b 0a 20 20 20 20 70 4d 65 6d 2d  r *)z;.    pMem-
6fe0: 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
6ff0: 20 20 66 6c 61 67 73 20 7c 3d 20 28 28 78 44 65    flags |= ((xDe
7000: 6c 3d 3d 53 51 4c 49 54 45 5f 53 54 41 54 49 43  l==SQLITE_STATIC
7010: 29 3f 4d 45 4d 5f 53 74 61 74 69 63 3a 4d 45 4d  )?MEM_Static:MEM
7020: 5f 44 79 6e 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d  _Dyn);.  }..  pM
7030: 65 6d 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  em->n = nByte;. 
7040: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 66   pMem->flags = f
7050: 6c 61 67 73 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e  lags;.  pMem->en
7060: 63 20 3d 20 28 65 6e 63 3d 3d 30 20 3f 20 53 51  c = (enc==0 ? SQ
7070: 4c 49 54 45 5f 55 54 46 38 20 3a 20 65 6e 63 29  LITE_UTF8 : enc)
7080: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7090: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
70a0: 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 53 51  f( pMem->enc!=SQ
70b0: 4c 49 54 45 5f 55 54 46 38 20 26 26 20 73 71 6c  LITE_UTF8 && sql
70c0: 69 74 65 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c  ite3VdbeMemHandl
70d0: 65 42 6f 6d 28 70 4d 65 6d 29 20 29 7b 0a 20 20  eBom(pMem) ){.  
70e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
70f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
7100: 66 0a 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 69  f..  if( nByte>i
7110: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
7120: 75 72 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  urn SQLITE_TOOBI
7130: 47 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  G;.  }..  return
7140: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7150: 2a 0a 2a 2a 20 4d 6f 76 65 20 64 61 74 61 20 6f  *.** Move data o
7160: 75 74 20 6f 66 20 61 20 62 74 72 65 65 20 6b 65  ut of a btree ke
7170: 79 20 6f 72 20 64 61 74 61 20 66 69 65 6c 64 20  y or data field 
7180: 61 6e 64 20 69 6e 74 6f 20 61 20 4d 65 6d 20 73  and into a Mem s
7190: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
71a0: 20 64 61 74 61 20 6f 72 20 6b 65 79 20 69 73 20   data or key is 
71b0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 65  taken from the e
71c0: 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
71d0: 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
71e0: 74 69 6e 67 0a 2a 2a 20 74 6f 2e 20 20 6f 66 66  ting.** to.  off
71f0: 73 65 74 20 61 6e 64 20 61 6d 74 20 64 65 74 65  set and amt dete
7200: 72 6d 69 6e 65 20 77 68 61 74 20 70 6f 72 74 69  rmine what porti
7210: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6f  on of the data o
7220: 72 20 6b 65 79 20 74 6f 20 72 65 74 72 69 65 76  r key to retriev
7230: 65 2e 0a 2a 2a 20 6b 65 79 20 69 73 20 74 72 75  e..** key is tru
7240: 65 20 74 6f 20 67 65 74 20 74 68 65 20 6b 65 79  e to get the key
7250: 20 6f 72 20 66 61 6c 73 65 20 74 6f 20 67 65 74   or false to get
7260: 20 64 61 74 61 2e 20 20 54 68 65 20 72 65 73 75   data.  The resu
7270: 6c 74 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  lt is written.**
7280: 20 69 6e 74 6f 20 74 68 65 20 70 4d 65 6d 20 65   into the pMem e
7290: 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  lement..**.** Th
72a0: 65 20 70 4d 65 6d 20 6f 62 6a 65 63 74 20 6d 75  e pMem object mu
72b0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69  st have been ini
72c0: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 69 73 20  tialized.  This 
72d0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
72e0: 0a 2a 2a 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  .** pMem->zMallo
72f0: 63 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 6f  c to hold the co
7300: 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 62  ntent from the b
7310: 74 72 65 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  tree, if possibl
7320: 65 2e 20 20 4e 65 77 0a 2a 2a 20 70 4d 65 6d 2d  e.  New.** pMem-
7330: 3e 7a 4d 61 6c 6c 6f 63 20 73 70 61 63 65 20 77  >zMalloc space w
7340: 69 6c 6c 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ill be allocated
7350: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
7360: 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  The calling rout
7370: 69 6e 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ine.** is respon
7380: 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
7390: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
73a0: 4d 65 6d 20 6f 62 6a 65 63 74 20 69 73 20 65 76  Mem object is ev
73b0: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 64 65 73 74  entually.** dest
73c0: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  royed..**.** If 
73d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
73e0: 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
73f0: 6e 20 28 6d 61 6c 6c 6f 63 20 72 65 74 75 72 6e  n (malloc return
7400: 73 20 4e 55 4c 4c 20 6f 72 20 75 6e 61 62 6c 65  s NULL or unable
7410: 0a 2a 2a 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  .** to read from
7420: 20 74 68 65 20 64 69 73 6b 29 20 74 68 65 6e 20   the disk) then 
7430: 74 68 65 20 70 4d 65 6d 20 69 73 20 6c 65 66 74  the pMem is left
7440: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
7450: 65 6e 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ent state..*/.st
7460: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
7470: 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 4d 65 6d  LINE int vdbeMem
7480: 46 72 6f 6d 42 74 72 65 65 52 65 73 69 7a 65 28  FromBtreeResize(
7490: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
74a0: 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70  r,   /* Cursor p
74b0: 6f 69 6e 74 69 6e 67 20 61 74 20 72 65 63 6f 72  ointing at recor
74c0: 64 20 74 6f 20 72 65 74 72 69 65 76 65 2e 20 2a  d to retrieve. *
74d0: 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
74e0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
74f0: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
7500: 66 20 64 61 74 61 20 74 6f 20 72 65 74 75 72 6e  f data to return
7510: 20 62 79 74 65 73 20 66 72 6f 6d 2e 20 2a 2f 0a   bytes from. */.
7520: 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
7530: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7540: 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e   bytes to return
7550: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6b 65 79 2c 20  . */.  int key, 
7560: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
7570: 72 75 65 2c 20 72 65 74 72 69 65 76 65 20 66 72  rue, retrieve fr
7580: 6f 6d 20 74 68 65 20 62 74 72 65 65 20 6b 65 79  om the btree key
7590: 2c 20 6e 6f 74 20 64 61 74 61 2e 20 2a 2f 0a 20  , not data. */. 
75a0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
75b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
75c0: 6e 20 64 61 74 61 20 69 6e 20 74 68 69 73 20 4d  n data in this M
75d0: 65 6d 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  em structure. */
75e0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
75f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
7600: 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 53 51  M_Null;.  if( SQ
7610: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
7620: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
7630: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
7640: 2c 20 61 6d 74 2b 32 29 29 20 29 7b 0a 20 20 20  , amt+2)) ){.   
7650: 20 69 66 28 20 6b 65 79 20 29 7b 0a 20 20 20 20   if( key ){.    
7660: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
7670: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 6f 66 66  reeKey(pCur, off
7680: 73 65 74 2c 20 61 6d 74 2c 20 70 4d 65 6d 2d 3e  set, amt, pMem->
7690: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
76a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
76b0: 33 42 74 72 65 65 44 61 74 61 28 70 43 75 72 2c  3BtreeData(pCur,
76c0: 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 4d   offset, amt, pM
76d0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  em->z);.    }.  
76e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
76f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  _OK ){.      pMe
7700: 6d 2d 3e 7a 5b 61 6d 74 5d 20 3d 20 30 3b 0a 20  m->z[amt] = 0;. 
7710: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 61 6d 74       pMem->z[amt
7720: 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  +1] = 0;.      p
7730: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
7740: 5f 42 6c 6f 62 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  _Blob|MEM_Term;.
7750: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
7760: 28 69 6e 74 29 61 6d 74 3b 0a 20 20 20 20 7d 65  (int)amt;.    }e
7770: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
7780: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
7790: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
77a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
77b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
77c0: 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 0a 20 20  MemFromBtree(.  
77d0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
77e0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
77f0: 74 69 6e 67 20 61 74 20 72 65 63 6f 72 64 20 74  ting at record t
7800: 6f 20 72 65 74 72 69 65 76 65 2e 20 2a 2f 0a 20  o retrieve. */. 
7810: 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
7820: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
7830: 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64  m the start of d
7840: 61 74 61 20 74 6f 20 72 65 74 75 72 6e 20 62 79  ata to return by
7850: 74 65 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 75  tes from. */.  u
7860: 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
7870: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
7880: 74 65 73 20 74 6f 20 72 65 74 75 72 6e 2e 20 2a  tes to return. *
7890: 2f 0a 20 20 69 6e 74 20 6b 65 79 2c 20 20 20 20  /.  int key,    
78a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
78b0: 2c 20 72 65 74 72 69 65 76 65 20 66 72 6f 6d 20  , retrieve from 
78c0: 74 68 65 20 62 74 72 65 65 20 6b 65 79 2c 20 6e  the btree key, n
78d0: 6f 74 20 64 61 74 61 2e 20 2a 2f 0a 20 20 4d 65  ot data. */.  Me
78e0: 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
78f0: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 64  /* OUT: Return d
7900: 61 74 61 20 69 6e 20 74 68 69 73 20 4d 65 6d 20  ata in this Mem 
7910: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 29 7b  structure. */.){
7920: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 20  .  char *zData; 
7930: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
7940: 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 6c 61  rom the btree la
7950: 79 65 72 20 2a 2f 0a 20 20 75 33 32 20 61 76 61  yer */.  u32 ava
7960: 69 6c 61 62 6c 65 20 3d 20 30 3b 20 20 2f 2a 20  ilable = 0;  /* 
7970: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7980: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
7990: 20 6c 6f 63 61 6c 20 62 74 72 65 65 20 70 61 67   local btree pag
79a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
79b0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 52 65  SQLITE_OK; /* Re
79c0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
79d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
79e0: 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
79f0: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
7a00: 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44 79 6e  ert( !VdbeMemDyn
7a10: 61 6d 69 63 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  amic(pMem) );.. 
7a20: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 65 20 63 61   /* Note: the ca
7a30: 6c 6c 73 20 74 6f 20 42 74 72 65 65 4b 65 79 46  lls to BtreeKeyF
7a40: 65 74 63 68 28 29 20 61 6e 64 20 44 61 74 61 46  etch() and DataF
7a50: 65 74 63 68 28 29 20 62 65 6c 6f 77 20 61 73 73  etch() below ass
7a60: 65 72 74 28 29 20 0a 20 20 2a 2a 20 74 68 61 74  ert() .  ** that
7a70: 20 62 6f 74 68 20 74 68 65 20 42 74 53 68 61 72   both the BtShar
7a80: 65 64 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  ed and database 
7a90: 68 61 6e 64 6c 65 20 6d 75 74 65 78 65 73 20 61  handle mutexes a
7aa0: 72 65 20 68 65 6c 64 2e 20 2a 2f 0a 20 20 61 73  re held. */.  as
7ab0: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
7ac0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
7ad0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  ==0 );.  if( key
7ae0: 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 20 3d 20   ){.    zData = 
7af0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 42  (char *)sqlite3B
7b00: 74 72 65 65 4b 65 79 46 65 74 63 68 28 70 43 75  treeKeyFetch(pCu
7b10: 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 29 3b 0a  r, &available);.
7b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
7b30: 74 61 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ta = (char *)sql
7b40: 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
7b50: 63 68 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61  ch(pCur, &availa
7b60: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ble);.  }.  asse
7b70: 72 74 28 20 7a 44 61 74 61 21 3d 30 20 29 3b 0a  rt( zData!=0 );.
7b80: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d  .  if( offset+am
7b90: 74 3c 3d 61 76 61 69 6c 61 62 6c 65 20 29 7b 0a  t<=available ){.
7ba0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 26 7a      pMem->z = &z
7bb0: 44 61 74 61 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  Data[offset];.  
7bc0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
7bd0: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
7be0: 65 6d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  em;.    pMem->n 
7bf0: 3d 20 28 69 6e 74 29 61 6d 74 3b 0a 20 20 7d 65  = (int)amt;.  }e
7c00: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 76 64  lse{.    rc = vd
7c10: 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 52 65  beMemFromBtreeRe
7c20: 73 69 7a 65 28 70 43 75 72 2c 20 6f 66 66 73 65  size(pCur, offse
7c30: 74 2c 20 61 6d 74 2c 20 6b 65 79 2c 20 70 4d 65  t, amt, key, pMe
7c40: 6d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  m);.  }..  retur
7c50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
7c60: 68 65 20 70 56 61 6c 20 61 72 67 75 6d 65 6e 74  he pVal argument
7c70: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
7c80: 61 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68  a value other th
7c90: 61 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 43 6f 6e 76  an NULL..** Conv
7ca0: 65 72 74 20 69 74 20 69 6e 74 6f 20 61 20 73 74  ert it into a st
7cb0: 72 69 6e 67 20 77 69 74 68 20 65 6e 63 6f 64 69  ring with encodi
7cc0: 6e 67 20 65 6e 63 20 61 6e 64 20 72 65 74 75 72  ng enc and retur
7cd0: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
7ce0: 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  o a zero-termina
7cf0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
7d00: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  hat string..*/.s
7d10: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
7d20: 4e 4c 49 4e 45 20 63 6f 6e 73 74 20 76 6f 69 64  NLINE const void
7d30: 20 2a 76 61 6c 75 65 54 6f 54 65 78 74 28 73 71   *valueToText(sq
7d40: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 20 70 56 61  lite3_value* pVa
7d50: 6c 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 61 73  l, u8 enc){.  as
7d60: 73 65 72 74 28 20 70 56 61 6c 21 3d 30 20 29 3b  sert( pVal!=0 );
7d70: 0a 20 20 61 73 73 65 72 74 28 20 70 56 61 6c 2d  .  assert( pVal-
7d80: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
7d90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 56 61  3_mutex_held(pVa
7da0: 6c 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  l->db->mutex) );
7db0: 0a 20 20 61 73 73 65 72 74 28 20 28 65 6e 63 26  .  assert( (enc&
7dc0: 33 29 3d 3d 28 65 6e 63 26 7e 53 51 4c 49 54 45  3)==(enc&~SQLITE
7dd0: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20  _UTF16_ALIGNED) 
7de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 56  );.  assert( (pV
7df0: 61 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  al->flags & MEM_
7e00: 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20  RowSet)==0 );.  
7e10: 61 73 73 65 72 74 28 20 28 70 56 61 6c 2d 3e 66  assert( (pVal->f
7e20: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 4e 75 6c 6c  lags & (MEM_Null
7e30: 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ))==0 );.  if( p
7e40: 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Val->flags & (ME
7e50: 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20  M_Blob|MEM_Str) 
7e60: 29 7b 0a 20 20 20 20 70 56 61 6c 2d 3e 66 6c 61  ){.    pVal->fla
7e70: 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  gs |= MEM_Str;. 
7e80: 20 20 20 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61     if( pVal->fla
7e90: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
7ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7eb0: 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28  beMemExpandBlob(
7ec0: 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pVal);.    }.   
7ed0: 20 69 66 28 20 70 56 61 6c 2d 3e 65 6e 63 20 21   if( pVal->enc !
7ee0: 3d 20 28 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  = (enc & ~SQLITE
7ef0: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20  _UTF16_ALIGNED) 
7f00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7f10: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
7f20: 6e 67 28 70 56 61 6c 2c 20 65 6e 63 20 26 20 7e  ng(pVal, enc & ~
7f30: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
7f40: 47 4e 45 44 29 3b 0a 20 20 20 20 7d 0a 20 20 20  GNED);.    }.   
7f50: 20 69 66 28 20 28 65 6e 63 20 26 20 53 51 4c 49   if( (enc & SQLI
7f60: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
7f70: 29 21 3d 30 20 26 26 20 31 3d 3d 28 31 26 53 51  )!=0 && 1==(1&SQ
7f80: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
7f90: 70 56 61 6c 2d 3e 7a 29 29 20 29 7b 0a 20 20 20  pVal->z)) ){.   
7fa0: 20 20 20 61 73 73 65 72 74 28 20 28 70 56 61 6c     assert( (pVal
7fb0: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 45  ->flags & (MEM_E
7fc0: 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29  phem|MEM_Static)
7fd0: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )!=0 );.      if
7fe0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
7ff0: 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 70 56  MakeWriteable(pV
8000: 61 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  al)!=SQLITE_OK )
8010: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8020: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8030: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
8040: 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65  eMemNulTerminate
8050: 28 70 56 61 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20  (pVal); /* IMP: 
8060: 52 2d 33 31 32 37 35 2d 34 34 30 36 30 20 2a 2f  R-31275-44060 */
8070: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8080: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
8090: 6e 67 69 66 79 28 70 56 61 6c 2c 20 65 6e 63 2c  ngify(pVal, enc,
80a0: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
80b0: 20 30 3d 3d 28 31 26 53 51 4c 49 54 45 5f 50 54   0==(1&SQLITE_PT
80c0: 52 5f 54 4f 5f 49 4e 54 28 70 56 61 6c 2d 3e 7a  R_TO_INT(pVal->z
80d0: 29 29 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  )) );.  }.  asse
80e0: 72 74 28 70 56 61 6c 2d 3e 65 6e 63 3d 3d 28 65  rt(pVal->enc==(e
80f0: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
8100: 31 36 5f 41 4c 49 47 4e 45 44 29 20 7c 7c 20 70  16_ALIGNED) || p
8110: 56 61 6c 2d 3e 64 62 3d 3d 30 0a 20 20 20 20 20  Val->db==0.     
8120: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 56 61 6c           || pVal
8130: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8140: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 56 61 6c  ed );.  if( pVal
8150: 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20 26 20 7e 53  ->enc==(enc & ~S
8160: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
8170: 4e 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74 75  NED) ){.    retu
8180: 72 6e 20 70 56 61 6c 2d 3e 7a 3b 0a 20 20 7d 65  rn pVal->z;.  }e
8190: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
81a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 69  0;.  }.}../* Thi
81b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
81c0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 74  ly available int
81d0: 65 72 6e 61 6c 6c 79 2c 20 69 74 20 69 73 20 6e  ernally, it is n
81e0: 6f 74 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  ot part of the.*
81f0: 2a 20 65 78 74 65 72 6e 61 6c 20 41 50 49 2e 20  * external API. 
8200: 49 74 20 77 6f 72 6b 73 20 69 6e 20 61 20 73 69  It works in a si
8210: 6d 69 6c 61 72 20 77 61 79 20 74 6f 20 73 71 6c  milar way to sql
8220: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8230: 29 2c 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 65  ),.** except the
8240: 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
8250: 73 20 69 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  s in the encodin
8260: 67 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  g specified by t
8270: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 70 61 72  he second.** par
8280: 61 6d 65 74 65 72 2c 20 77 68 69 63 68 20 6d 75  ameter, which mu
8290: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
82a0: 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c  ITE_UTF16BE, SQL
82b0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 0a 2a  ITE_UTF16LE or.*
82c0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 38 2e 0a 2a  * SQLITE_UTF8..*
82d0: 2a 0a 2a 2a 20 28 32 30 30 36 2d 30 32 2d 31 36  *.** (2006-02-16
82e0: 3a 29 20 20 54 68 65 20 65 6e 63 20 76 61 6c 75  :)  The enc valu
82f0: 65 20 63 61 6e 20 62 65 20 6f 72 2d 65 64 20 77  e can be or-ed w
8300: 69 74 68 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ith SQLITE_UTF16
8310: 5f 41 4c 49 47 4e 45 44 2e 0a 2a 2a 20 49 66 20  _ALIGNED..** If 
8320: 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
8330: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
8340: 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
8350: 64 20 6f 6e 20 61 6e 20 65 76 65 6e 20 62 79 74  d on an even byt
8360: 65 0a 2a 2a 20 62 6f 75 6e 64 61 72 79 2e 0a 2a  e.** boundary..*
8370: 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
8380: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 73  lite3ValueText(s
8390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 20 70 56  qlite3_value* pV
83a0: 61 6c 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 69  al, u8 enc){.  i
83b0: 66 28 20 21 70 56 61 6c 20 29 20 72 65 74 75 72  f( !pVal ) retur
83c0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
83d0: 56 61 6c 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Val->db==0 || sq
83e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83f0: 28 70 56 61 6c 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pVal->db->mutex
8400: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
8410: 65 6e 63 26 33 29 3d 3d 28 65 6e 63 26 7e 53 51  enc&3)==(enc&~SQ
8420: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
8430: 45 44 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ED) );.  assert(
8440: 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 20   (pVal->flags & 
8450: 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
8460: 3b 0a 20 20 69 66 28 20 28 70 56 61 6c 2d 3e 66  ;.  if( (pVal->f
8470: 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
8480: 4d 5f 54 65 72 6d 29 29 3d 3d 28 4d 45 4d 5f 53  M_Term))==(MEM_S
8490: 74 72 7c 4d 45 4d 5f 54 65 72 6d 29 20 26 26 20  tr|MEM_Term) && 
84a0: 70 56 61 6c 2d 3e 65 6e 63 3d 3d 65 6e 63 20 29  pVal->enc==enc )
84b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 56 61  {.    return pVa
84c0: 6c 2d 3e 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20  l->z;.  }.  if( 
84d0: 70 56 61 6c 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pVal->flags&MEM_
84e0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
84f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
8500: 72 6e 20 76 61 6c 75 65 54 6f 54 65 78 74 28 70  rn valueToText(p
8510: 56 61 6c 2c 20 65 6e 63 29 3b 0a 7d 0a 0a 2f 2a  Val, enc);.}../*
8520: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
8530: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
8540: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65  bject..*/.sqlite
8550: 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
8560: 56 61 6c 75 65 4e 65 77 28 73 71 6c 69 74 65 33  ValueNew(sqlite3
8570: 20 2a 64 62 29 7b 0a 20 20 4d 65 6d 20 2a 70 20   *db){.  Mem *p 
8580: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8590: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
85a0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
85b0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  {.    p->flags =
85c0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
85d0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 20  ->db = db;.  }. 
85e0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
85f0: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
8600: 63 74 20 70 61 73 73 65 64 20 62 79 20 73 71 6c  ct passed by sql
8610: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
8620: 74 56 61 6c 75 65 28 29 20 74 68 72 6f 75 67 68  tValue() through
8630: 20 74 6f 20 0a 2a 2a 20 76 61 6c 75 65 4e 65 77   to .** valueNew
8640: 28 29 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  (). See comments
8650: 20 61 62 6f 76 65 20 76 61 6c 75 65 4e 65 77 28   above valueNew(
8660: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
8670: 2f 0a 73 74 72 75 63 74 20 56 61 6c 75 65 4e 65  /.struct ValueNe
8680: 77 53 74 61 74 34 43 74 78 20 7b 0a 20 20 50 61  wStat4Ctx {.  Pa
8690: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 49  rse *pParse;.  I
86a0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 55 6e  ndex *pIdx;.  Un
86b0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 2a 70  packedRecord **p
86c0: 70 52 65 63 3b 0a 20 20 69 6e 74 20 69 56 61 6c  pRec;.  int iVal
86d0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.};../*.** Allo
86e0: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
86f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
8700: 65 77 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ew sqlite3_value
8710: 20 6f 62 6a 65 63 74 2e 20 49 66 0a 2a 2a 20 74   object. If.** t
8720: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8730: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
8740: 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ion is NULL, the
8750: 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
8760: 61 74 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ated.** by calli
8770: 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e  ng sqlite3ValueN
8780: 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ew()..**.** Othe
8790: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 73 65  rwise, if the se
87a0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
87b0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
87c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
87d0: 20 0a 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65   .** being calle
87e0: 64 20 69 6e 64 69 72 65 63 74 6c 79 20 62 79 20  d indirectly by 
87f0: 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
8800: 65 53 65 74 56 61 6c 75 65 28 29 2e 20 49 66 20  eSetValue(). If 
8810: 69 74 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 61 6c  it has not.** al
8820: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
8830: 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 74  ated, allocate t
8840: 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  he UnpackedRecor
8850: 64 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  d structure that
8860: 20 0a 2a 2a 20 74 68 61 74 20 66 75 6e 63 74 69   .** that functi
8870: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  on will return t
8880: 6f 20 69 74 73 20 63 61 6c 6c 65 72 20 68 65 72  o its caller her
8890: 65 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 61  e. Then return a
88a0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61   pointer to.** a
88b0: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
88c0: 77 69 74 68 69 6e 20 74 68 65 20 55 6e 70 61 63  within the Unpac
88d0: 6b 65 64 52 65 63 6f 72 64 2e 61 5b 5d 20 61 72  kedRecord.a[] ar
88e0: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ray..*/.static s
88f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 76 61  qlite3_value *va
8900: 6c 75 65 4e 65 77 28 73 71 6c 69 74 65 33 20 2a  lueNew(sqlite3 *
8910: 64 62 2c 20 73 74 72 75 63 74 20 56 61 6c 75 65  db, struct Value
8920: 4e 65 77 53 74 61 74 34 43 74 78 20 2a 70 29 7b  NewStat4Ctx *p){
8930: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8940: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8950: 54 41 54 34 0a 20 20 69 66 28 20 70 20 29 7b 0a  TAT4.  if( p ){.
8960: 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f      UnpackedReco
8970: 72 64 20 2a 70 52 65 63 20 3d 20 70 2d 3e 70 70  rd *pRec = p->pp
8980: 52 65 63 5b 30 5d 3b 0a 0a 20 20 20 20 69 66 28  Rec[0];..    if(
8990: 20 70 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pRec==0 ){.    
89a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
89b0: 70 2d 3e 70 49 64 78 3b 20 20 20 20 20 20 2f 2a  p->pIdx;      /*
89c0: 20 49 6e 64 65 78 20 62 65 69 6e 67 20 70 72 6f   Index being pro
89d0: 62 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  bed */.      int
89e0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
89f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
8a00: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
8a10: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 20 20  locate */.      
8a20: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8a40: 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
8a50: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  */.      int nCo
8a60: 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
8a70: 6e 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  n;   /* Number o
8a80: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
8a90: 69 6e 63 6c 75 64 69 6e 67 20 72 6f 77 69 64 20  including rowid 
8aa0: 2a 2f 0a 20 20 0a 20 20 20 20 20 20 6e 42 79 74  */.  .      nByt
8ab0: 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d 29 20  e = sizeof(Mem) 
8ac0: 2a 20 6e 43 6f 6c 20 2b 20 52 4f 55 4e 44 38 28  * nCol + ROUND8(
8ad0: 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
8ae0: 65 63 6f 72 64 29 29 3b 0a 20 20 20 20 20 20 70  ecord));.      p
8af0: 52 65 63 20 3d 20 28 55 6e 70 61 63 6b 65 64 52  Rec = (UnpackedR
8b00: 65 63 6f 72 64 2a 29 73 71 6c 69 74 65 33 44 62  ecord*)sqlite3Db
8b10: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
8b20: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
8b30: 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20 20 20   pRec ){.       
8b40: 20 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 20   pRec->pKeyInfo 
8b50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
8b60: 4f 66 49 6e 64 65 78 28 70 2d 3e 70 50 61 72 73  OfIndex(p->pPars
8b70: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  e, pIdx);.      
8b80: 20 20 69 66 28 20 70 52 65 63 2d 3e 70 4b 65 79    if( pRec->pKey
8b90: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
8ba0: 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d 3e    assert( pRec->
8bb0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8bc0: 2b 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 2d  +pRec->pKeyInfo-
8bd0: 3e 6e 58 46 69 65 6c 64 3d 3d 6e 43 6f 6c 20 29  >nXField==nCol )
8be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8bf0: 72 74 28 20 70 52 65 63 2d 3e 70 4b 65 79 49 6e  rt( pRec->pKeyIn
8c00: 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29  fo->enc==ENC(db)
8c10: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52   );.          pR
8c20: 65 63 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 20  ec->aMem = (Mem 
8c30: 2a 29 28 28 75 38 2a 29 70 52 65 63 20 2b 20 52  *)((u8*)pRec + R
8c40: 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
8c50: 61 63 6b 65 64 52 65 63 6f 72 64 29 29 29 3b 0a  ackedRecord)));.
8c60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
8c70: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
8c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 65  .            pRe
8c90: 63 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  c->aMem[i].flags
8ca0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
8cb0: 20 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 61           pRec->a
8cc0: 4d 65 6d 5b 69 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[i].db = db;.
8cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8ce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8d00: 65 65 28 64 62 2c 20 70 52 65 63 29 3b 0a 20 20  ee(db, pRec);.  
8d10: 20 20 20 20 20 20 20 20 70 52 65 63 20 3d 20 30          pRec = 0
8d20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8d30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
8d40: 65 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ec==0 ) return 0
8d50: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 70 52 65 63  ;.      p->ppRec
8d60: 5b 30 5d 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  [0] = pRec;.    
8d70: 7d 0a 20 20 0a 20 20 20 20 70 52 65 63 2d 3e 6e  }.  .    pRec->n
8d80: 46 69 65 6c 64 20 3d 20 70 2d 3e 69 56 61 6c 2b  Field = p->iVal+
8d90: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  1;.    return &p
8da0: 52 65 63 2d 3e 61 4d 65 6d 5b 70 2d 3e 69 56 61  Rec->aMem[p->iVa
8db0: 6c 5d 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  l];.  }.#else.  
8dc0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8dd0: 28 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64  (p);.#endif /* d
8de0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8df0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
8e00: 41 54 34 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e  AT4) */.  return
8e10: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
8e20: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (db);.}../*.** T
8e30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 62  he expression ob
8e40: 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62  ject indicated b
8e50: 79 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  y the second arg
8e60: 75 6d 65 6e 74 20 69 73 20 67 75 61 72 61 6e 74  ument is guarant
8e70: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 61 20 73  eed.** to be a s
8e80: 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74 69  calar SQL functi
8e90: 6f 6e 2e 20 49 66 0a 2a 2a 0a 2a 2a 20 20 20 2a  on. If.**.**   *
8ea0: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72   all function ar
8eb0: 67 75 6d 65 6e 74 73 20 61 72 65 20 53 51 4c 20  guments are SQL 
8ec0: 6c 69 74 65 72 61 6c 73 2c 0a 2a 2a 20 20 20 2a  literals,.**   *
8ed0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49   one of the SQLI
8ee0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
8ef0: 20 6f 72 20 5f 53 4c 4f 43 48 4e 47 20 66 75 6e   or _SLOCHNG fun
8f00: 63 74 69 6f 6e 20 66 6c 61 67 73 20 69 73 20 73  ction flags is s
8f10: 65 74 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  et, and.**   * t
8f20: 68 65 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e  he SQLITE_FUNC_N
8f30: 45 45 44 43 4f 4c 4c 20 66 75 6e 63 74 69 6f 6e  EEDCOLL function
8f40: 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
8f50: 2c 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ,.**.** then thi
8f60: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
8f70: 74 73 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ts to invoke the
8f80: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 41   SQL function. A
8f90: 73 73 75 6d 69 6e 67 20 6e 6f 0a 2a 2a 20 65 72  ssuming no.** er
8fa0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 75 74 70  ror occurs, outp
8fb0: 75 74 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  ut parameter (*p
8fc0: 70 56 61 6c 29 20 69 73 20 73 65 74 20 74 6f 20  pVal) is set to 
8fd0: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 75 65  point to a value
8fe0: 20 0a 2a 2a 20 6f 62 6a 65 63 74 20 63 6f 6e 74   .** object cont
8ff0: 61 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  aining the resul
9000: 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
9010: 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ng SQLITE_OK..**
9020: 0a 2a 2a 20 41 66 66 69 6e 69 74 79 20 61 66 66  .** Affinity aff
9030: 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 74   is applied to t
9040: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
9050: 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65   function before
9060: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 49   returning..** I
9070: 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
9080: 61 20 74 65 78 74 20 76 61 6c 75 65 2c 20 74 68  a text value, th
9090: 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  e sqlite3_value 
90a0: 6f 62 6a 65 63 74 20 75 73 65 73 20 65 6e 63 6f  object uses enco
90b0: 64 69 6e 67 20 0a 2a 2a 20 65 6e 63 2e 0a 2a 2a  ding .** enc..**
90c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
90d0: 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20  tions above are 
90e0: 6e 6f 74 20 6d 65 74 2c 20 74 68 69 73 20 66 75  not met, this fu
90f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
9100: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 61 6e 64 20  QLITE_OK.** and 
9110: 73 65 74 73 20 28 2a 70 70 56 61 6c 29 20 74 6f  sets (*ppVal) to
9120: 20 4e 55 4c 4c 2e 20 4f 72 2c 20 69 66 20 61 6e   NULL. Or, if an
9130: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 28   error occurs, (
9140: 2a 70 70 56 61 6c 29 20 69 73 20 73 65 74 20 74  *ppVal) is set t
9150: 6f 0a 2a 2a 20 4e 55 4c 4c 20 61 6e 64 20 61 6e  o.** NULL and an
9160: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
9170: 64 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  de returned..*/.
9180: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9190: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
91a0: 41 54 34 0a 73 74 61 74 69 63 20 69 6e 74 20 76  AT4.static int v
91b0: 61 6c 75 65 46 72 6f 6d 46 75 6e 63 74 69 6f 6e  alueFromFunction
91c0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
91f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9200: 2f 0a 20 20 45 78 70 72 20 2a 70 2c 20 20 20 20  /.  Expr *p,    
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9230: 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74  ssion to evaluat
9240: 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20  e */.  u8 enc,  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 69         /* Encodi
9270: 6e 67 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 75  ng to use */.  u
9280: 38 20 61 66 66 2c 20 20 20 20 20 20 20 20 20 20  8 aff,          
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92a0: 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73  * Affinity to us
92b0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
92c0: 61 6c 75 65 20 2a 2a 70 70 56 61 6c 2c 20 20 20  alue **ppVal,   
92d0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
92e0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 68 65  the new value he
92f0: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 56  re */.  struct V
9300: 61 6c 75 65 4e 65 77 53 74 61 74 34 43 74 78 20  alueNewStat4Ctx 
9310: 2a 70 43 74 78 20 20 20 2f 2a 20 53 65 63 6f 6e  *pCtx   /* Secon
9320: 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 76  d argument for v
9330: 61 6c 75 65 4e 65 77 28 29 20 2a 2f 0a 29 7b 0a  alueNew() */.){.
9340: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
9350: 74 20 63 74 78 3b 20 20 20 20 20 20 20 20 20 20  t ctx;          
9360: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
9370: 65 63 74 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  ect for function
9380: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
9390: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
93a0: 2a 61 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20  *apVal = 0;     
93b0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
93c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  uments */.  int 
93d0: 6e 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nVal = 0;       
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
93f0: 69 7a 65 20 6f 66 20 61 70 56 61 6c 5b 5d 20 61  ize of apVal[] a
9400: 72 72 61 79 20 2a 2f 0a 20 20 46 75 6e 63 44 65  rray */.  FuncDe
9410: 66 20 2a 70 46 75 6e 63 20 3d 20 30 3b 20 20 20  f *pFunc = 0;   
9420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
9430: 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
9440: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
9450: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20  lue *pVal = 0;  
9460: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 76 61 6c        /* New val
9470: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ue */.  int rc =
9480: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9490: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
94a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
94b0: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
94d0: 69 7a 65 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ize of function 
94e0: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
94f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9500: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
9510: 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
9520: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  rguments */.  in
9530: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9550: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
9560: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
9570: 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20 61 73   pCtx!=0 );.  as
9580: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 20  sert( (p->flags 
9590: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d  & EP_TokenOnly)=
95a0: 3d 30 20 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  =0 );.  pList = 
95b0: 70 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  p->x.pList;.  if
95c0: 28 20 70 4c 69 73 74 20 29 20 6e 56 61 6c 20 3d  ( pList ) nVal =
95d0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
95e0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
95f0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
9600: 6f 6b 65 6e 29 3b 0a 20 20 70 46 75 6e 63 20 3d  oken);.  pFunc =
9610: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
9620: 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  tion(db, p->u.zT
9630: 6f 6b 65 6e 2c 20 6e 4e 61 6d 65 2c 20 6e 56 61  oken, nName, nVa
9640: 6c 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 61 73  l, enc, 0);.  as
9650: 73 65 72 74 28 20 70 46 75 6e 63 20 29 3b 0a 20  sert( pFunc );. 
9660: 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e   if( (pFunc->fun
9670: 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
9680: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53  _FUNC_CONSTANT|S
9690: 51 4c 49 54 45 5f 46 55 4e 43 5f 53 4c 4f 43 48  QLITE_FUNC_SLOCH
96a0: 4e 47 29 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 28  NG))==0 .   || (
96b0: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
96c0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
96d0: 45 45 44 43 4f 4c 4c 29 0a 20 20 29 7b 0a 20 20  EEDCOLL).  ){.  
96e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
96f0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OK;.  }..  if( p
9700: 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 70 56 61  List ){.    apVa
9710: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 61 6c  l = (sqlite3_val
9720: 75 65 2a 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  ue**)sqlite3DbMa
9730: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
9740: 65 6f 66 28 61 70 56 61 6c 5b 30 5d 29 20 2a 20  eof(apVal[0]) * 
9750: 6e 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 61  nVal);.    if( a
9760: 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pVal==0 ){.     
9770: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9780: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76  EM;.      goto v
9790: 61 6c 75 65 5f 66 72 6f 6d 5f 66 75 6e 63 74 69  alue_from_functi
97a0: 6f 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  on_out;.    }.  
97b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 61    for(i=0; i<nVa
97c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  l; i++){.      r
97d0: 63 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  c = sqlite3Value
97e0: 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 4c 69  FromExpr(db, pLi
97f0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
9800: 65 6e 63 2c 20 61 66 66 2c 20 26 61 70 56 61 6c  enc, aff, &apVal
9810: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
9820: 61 70 56 61 6c 5b 69 5d 3d 3d 30 20 7c 7c 20 72  apVal[i]==0 || r
9830: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9840: 6f 74 6f 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66  oto value_from_f
9850: 75 6e 63 74 69 6f 6e 5f 6f 75 74 3b 0a 20 20 20  unction_out;.   
9860: 20 7d 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d   }.  }..  pVal =
9870: 20 76 61 6c 75 65 4e 65 77 28 64 62 2c 20 70 43   valueNew(db, pC
9880: 74 78 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 3d  tx);.  if( pVal=
9890: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
98a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
98b0: 20 67 6f 74 6f 20 76 61 6c 75 65 5f 66 72 6f 6d   goto value_from
98c0: 5f 66 75 6e 63 74 69 6f 6e 5f 6f 75 74 3b 0a 20  _function_out;. 
98d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43   }..  assert( pC
98e0: 74 78 2d 3e 70 50 61 72 73 65 2d 3e 72 63 3d 3d  tx->pParse->rc==
98f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 6d  SQLITE_OK );.  m
9900: 65 6d 73 65 74 28 26 63 74 78 2c 20 30 2c 20 73  emset(&ctx, 0, s
9910: 69 7a 65 6f 66 28 63 74 78 29 29 3b 0a 20 20 63  izeof(ctx));.  c
9920: 74 78 2e 70 4f 75 74 20 3d 20 70 56 61 6c 3b 0a  tx.pOut = pVal;.
9930: 20 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 46    ctx.pFunc = pF
9940: 75 6e 63 3b 0a 20 20 70 46 75 6e 63 2d 3e 78 46  unc;.  pFunc->xF
9950: 75 6e 63 28 26 63 74 78 2c 20 6e 56 61 6c 2c 20  unc(&ctx, nVal, 
9960: 61 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 63 74  apVal);.  if( ct
9970: 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20  x.isError ){.   
9980: 20 72 63 20 3d 20 63 74 78 2e 69 73 45 72 72 6f   rc = ctx.isErro
9990: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  r;.    sqlite3Er
99a0: 72 6f 72 4d 73 67 28 70 43 74 78 2d 3e 70 50 61  rorMsg(pCtx->pPa
99b0: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
99c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
99d0: 61 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  al));.  }else{. 
99e0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
99f0: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 56 61  pplyAffinity(pVa
9a00: 6c 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  l, aff, SQLITE_U
9a10: 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
9a20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9a30: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
9a40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
9a50: 6f 64 69 6e 67 28 70 56 61 6c 2c 20 65 6e 63 29  oding(pVal, enc)
9a60: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9a70: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
9a80: 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28  e3VdbeMemTooBig(
9a90: 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  pVal) ){.      r
9aa0: 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  c = SQLITE_TOOBI
9ab0: 47 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 70  G;.      pCtx->p
9ac0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
9ad0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 74 78 2d     }.  }.  pCtx-
9ae0: 3e 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63  >pParse->rc = rc
9af0: 3b 0a 0a 20 76 61 6c 75 65 5f 66 72 6f 6d 5f 66  ;.. value_from_f
9b00: 75 6e 63 74 69 6f 6e 5f 6f 75 74 3a 0a 20 20 69  unction_out:.  i
9b10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9b20: 20 29 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20 30   ){.    pVal = 0
9b30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61  ;.  }.  if( apVa
9b40: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
9b50: 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nVal; i++){.
9b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
9b70: 75 65 46 72 65 65 28 61 70 56 61 6c 5b 69 5d 29  ueFree(apVal[i])
9b80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9b90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 70  te3DbFree(db, ap
9ba0: 56 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  Val);.  }..  *pp
9bb0: 56 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72 65  Val = pVal;.  re
9bc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
9bd0: 0a 23 20 64 65 66 69 6e 65 20 76 61 6c 75 65 46  .# define valueF
9be0: 72 6f 6d 46 75 6e 63 74 69 6f 6e 28 61 2c 62 2c  romFunction(a,b,
9bf0: 63 2c 64 2c 65 2c 66 29 20 53 51 4c 49 54 45 5f  c,d,e,f) SQLITE_
9c00: 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  OK.#endif /* def
9c10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9c20: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
9c30: 34 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74  4) */../*.** Ext
9c40: 72 61 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f  ract a value fro
9c50: 6d 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 65  m the supplied e
9c60: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
9c70: 20 6d 61 6e 6e 65 72 20 64 65 73 63 72 69 62 65   manner describe
9c80: 64 0a 2a 2a 20 61 62 6f 76 65 20 73 71 6c 69 74  d.** above sqlit
9c90: 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
9ca0: 29 2e 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ). Allocate the 
9cb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
9cc0: 6a 65 63 74 0a 2a 2a 20 75 73 69 6e 67 20 76 61  ject.** using va
9cd0: 6c 75 65 4e 65 77 28 29 2e 0a 2a 2a 0a 2a 2a 20  lueNew()..**.** 
9ce0: 49 66 20 70 43 74 78 20 69 73 20 4e 55 4c 4c 20  If pCtx is NULL 
9cf0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  and an error occ
9d00: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 71  urs after the sq
9d10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
9d20: 63 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61  ct.** has been a
9d30: 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
9d40: 66 72 65 65 64 20 62 65 66 6f 72 65 20 72 65 74  freed before ret
9d50: 75 72 6e 69 6e 67 2e 20 4f 72 2c 20 69 66 20 70  urning. Or, if p
9d60: 43 74 78 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Ctx is not.** NU
9d70: 4c 4c 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  LL, it is assume
9d80: 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
9d90: 72 20 77 69 6c 6c 20 66 72 65 65 20 61 6e 79 20  r will free any 
9da0: 61 6c 6c 6f 63 61 74 65 64 20 6f 62 6a 65 63 74  allocated object
9db0: 0a 2a 2a 20 69 6e 20 61 6c 6c 20 63 61 73 65 73  .** in all cases
9dc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9dd0: 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a 20  valueFromExpr(. 
9de0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
9e10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
9e20: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
9e50: 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 2a  on to evaluate *
9e60: 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20  /.  u8 enc,     
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20      /* Encoding 
9e90: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 75 38 20 61  to use */.  u8 a
9ea0: 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20  ffinity,        
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9ec0: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a  ffinity to use *
9ed0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
9ee0: 65 20 2a 2a 70 70 56 61 6c 2c 20 20 20 20 20 20  e **ppVal,      
9ef0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
9f00: 20 6e 65 77 20 76 61 6c 75 65 20 68 65 72 65 20   new value here 
9f10: 2a 2f 0a 20 20 73 74 72 75 63 74 20 56 61 6c 75  */.  struct Valu
9f20: 65 4e 65 77 53 74 61 74 34 43 74 78 20 2a 70 43  eNewStat4Ctx *pC
9f30: 74 78 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61  tx   /* Second a
9f40: 72 67 75 6d 65 6e 74 20 66 6f 72 20 76 61 6c 75  rgument for valu
9f50: 65 4e 65 77 28 29 20 2a 2f 0a 29 7b 0a 20 20 69  eNew() */.){.  i
9f60: 6e 74 20 6f 70 3b 0a 20 20 63 68 61 72 20 2a 7a  nt op;.  char *z
9f70: 56 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Val = 0;.  sqlit
9f80: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
9f90: 20 30 3b 0a 20 20 69 6e 74 20 6e 65 67 49 6e 74   0;.  int negInt
9fa0: 20 3d 20 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 1;.  const ch
9fb0: 61 72 20 2a 7a 4e 65 67 20 3d 20 22 22 3b 0a 20  ar *zNeg = "";. 
9fc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9fd0: 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 45 78  _OK;..  if( !pEx
9fe0: 70 72 20 29 7b 0a 20 20 20 20 2a 70 70 56 61 6c  pr ){.    *ppVal
9ff0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
a000: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a010: 20 20 77 68 69 6c 65 28 20 28 6f 70 20 3d 20 70    while( (op = p
a020: 45 78 70 72 2d 3e 6f 70 29 3d 3d 54 4b 5f 55 50  Expr->op)==TK_UP
a030: 4c 55 53 20 29 20 70 45 78 70 72 20 3d 20 70 45  LUS ) pExpr = pE
a040: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 66  xpr->pLeft;.  if
a050: 28 20 4e 45 56 45 52 28 6f 70 3d 3d 54 4b 5f 52  ( NEVER(op==TK_R
a060: 45 47 49 53 54 45 52 29 20 29 20 6f 70 20 3d 20  EGISTER) ) op = 
a070: 70 45 78 70 72 2d 3e 6f 70 32 3b 0a 0a 20 20 2f  pExpr->op2;..  /
a080: 2a 20 43 6f 6d 70 72 65 73 73 65 64 20 65 78 70  * Compressed exp
a090: 72 65 73 73 69 6f 6e 73 20 6f 6e 6c 79 20 61 70  ressions only ap
a0a0: 70 65 61 72 20 77 68 65 6e 20 70 61 72 73 69 6e  pear when parsin
a0b0: 67 20 74 68 65 20 44 45 46 41 55 4c 54 20 63 6c  g the DEFAULT cl
a0c0: 61 75 73 65 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  ause.  ** on a t
a0d0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69  able column defi
a0e0: 6e 69 74 69 6f 6e 2c 20 61 6e 64 20 68 65 6e 63  nition, and henc
a0f0: 65 20 6f 6e 6c 79 20 77 68 65 6e 20 70 43 74 78  e only when pCtx
a100: 3d 3d 30 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ==0.  This.  ** 
a110: 63 68 65 63 6b 20 65 6e 73 75 72 65 73 20 74 68  check ensures th
a120: 61 74 20 61 6e 20 45 50 5f 54 6f 6b 65 6e 4f 6e  at an EP_TokenOn
a130: 6c 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  ly expression is
a140: 20 6e 65 76 65 72 20 70 61 73 73 65 64 20 64 6f   never passed do
a150: 77 6e 0a 20 20 2a 2a 20 69 6e 74 6f 20 76 61 6c  wn.  ** into val
a160: 75 65 46 72 6f 6d 46 75 6e 63 74 69 6f 6e 28 29  ueFromFunction()
a170: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
a180: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
a190: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 20  P_TokenOnly)==0 
a1a0: 7c 7c 20 70 43 74 78 3d 3d 30 20 29 3b 0a 0a 20  || pCtx==0 );.. 
a1b0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
a1c0: 20 29 7b 0a 20 20 20 20 75 38 20 61 66 66 20 3d   ){.    u8 aff =
a1d0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
a1e0: 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54  Type(pExpr->u.zT
a1f0: 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 72 63 20  oken,0);.    rc 
a200: 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
a210: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
a220: 2c 20 65 6e 63 2c 20 61 66 66 2c 20 70 70 56 61  , enc, aff, ppVa
a230: 6c 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 74 65  l, pCtx);.    te
a240: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
a250: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28  TE_OK );.    if(
a260: 20 2a 70 70 56 61 6c 20 29 7b 0a 20 20 20 20 20   *ppVal ){.     
a270: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
a280: 61 73 74 28 2a 70 70 56 61 6c 2c 20 61 66 66 2c  ast(*ppVal, aff,
a290: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
a2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
a2b0: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 2a  eApplyAffinity(*
a2c0: 70 70 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c  ppVal, affinity,
a2d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
a2e0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
a2f0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 48 61  rc;.  }..  /* Ha
a300: 6e 64 6c 65 20 6e 65 67 61 74 69 76 65 20 69 6e  ndle negative in
a310: 74 65 67 65 72 73 20 69 6e 20 61 20 73 69 6e 67  tegers in a sing
a320: 6c 65 20 73 74 65 70 2e 20 20 54 68 69 73 20 69  le step.  This i
a330: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 0a  s needed in the.
a340: 20 20 2a 2a 20 63 61 73 65 20 77 68 65 6e 20 74    ** case when t
a350: 68 65 20 76 61 6c 75 65 20 69 73 20 2d 39 32 32  he value is -922
a360: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
a370: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
a380: 3d 54 4b 5f 55 4d 49 4e 55 53 0a 20 20 20 26 26  =TK_UMINUS.   &&
a390: 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
a3a0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c  op==TK_INTEGER |
a3b0: 7c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  | pExpr->pLeft->
a3c0: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 29 20 29 7b  op==TK_FLOAT) ){
a3d0: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70 45 78  .    pExpr = pEx
a3e0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 6f  pr->pLeft;.    o
a3f0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
a400: 20 20 20 6e 65 67 49 6e 74 20 3d 20 2d 31 3b 0a     negInt = -1;.
a410: 20 20 20 20 7a 4e 65 67 20 3d 20 22 2d 22 3b 0a      zNeg = "-";.
a420: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 54    }..  if( op==T
a430: 4b 5f 53 54 52 49 4e 47 20 7c 7c 20 6f 70 3d 3d  K_STRING || op==
a440: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 6f 70 3d 3d  TK_FLOAT || op==
a450: 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
a460: 20 20 70 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65    pVal = valueNe
a470: 77 28 64 62 2c 20 70 43 74 78 29 3b 0a 20 20 20  w(db, pCtx);.   
a480: 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 29 20 67   if( pVal==0 ) g
a490: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
a4a0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
a4b0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
a4c0: 74 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  tValue) ){.     
a4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
a4e0: 65 74 49 6e 74 36 34 28 70 56 61 6c 2c 20 28 69  etInt64(pVal, (i
a4f0: 36 34 29 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  64)pExpr->u.iVal
a500: 75 65 2a 6e 65 67 49 6e 74 29 3b 0a 20 20 20 20  ue*negInt);.    
a510: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 56 61  }else{.      zVa
a520: 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
a530: 74 66 28 64 62 2c 20 22 25 73 25 73 22 2c 20 7a  tf(db, "%s%s", z
a540: 4e 65 67 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Neg, pExpr->u.zT
a550: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  oken);.      if(
a560: 20 7a 56 61 6c 3d 3d 30 20 29 20 67 6f 74 6f 20   zVal==0 ) goto 
a570: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 73 71  no_mem;.      sq
a580: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
a590: 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 56 61 6c 2c  (pVal, -1, zVal,
a5a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
a5b0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
a5c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f 70     }.    if( (op
a5d0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20  ==TK_INTEGER || 
a5e0: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 26  op==TK_FLOAT ) &
a5f0: 26 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  & affinity==SQLI
a600: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 7b 0a 20  TE_AFF_BLOB ){. 
a610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
a620: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
a630: 56 61 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  Val, SQLITE_AFF_
a640: 4e 55 4d 45 52 49 43 2c 20 53 51 4c 49 54 45 5f  NUMERIC, SQLITE_
a650: 55 54 46 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65  UTF8);.    }else
a660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a670: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
a680: 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69 74 79  y(pVal, affinity
a690: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
a6a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 56      }.    if( pV
a6b0: 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  al->flags & (MEM
a6c0: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
a6d0: 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26 3d 20   pVal->flags &= 
a6e0: 7e 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 69 66  ~MEM_Str;.    if
a6f0: 28 20 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54  ( enc!=SQLITE_UT
a700: 46 38 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  F8 ){.      rc =
a710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a720: 67 65 45 6e 63 6f 64 69 6e 67 28 70 56 61 6c 2c  geEncoding(pVal,
a730: 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   enc);.    }.  }
a740: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
a750: 55 4d 49 4e 55 53 20 29 20 7b 0a 20 20 20 20 2f  UMINUS ) {.    /
a760: 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 68 61  * This branch ha
a770: 70 70 65 6e 73 20 66 6f 72 20 6d 75 6c 74 69 70  ppens for multip
a780: 6c 65 20 6e 65 67 61 74 69 76 65 20 73 69 67 6e  le negative sign
a790: 73 2e 20 20 45 78 3a 20 2d 28 2d 35 29 20 2a 2f  s.  Ex: -(-5) */
a7a0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
a7b0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 61 6c 75 65  OK==sqlite3Value
a7c0: 46 72 6f 6d 45 78 70 72 28 64 62 2c 70 45 78 70  FromExpr(db,pExp
a7d0: 72 2d 3e 70 4c 65 66 74 2c 65 6e 63 2c 61 66 66  r->pLeft,enc,aff
a7e0: 69 6e 69 74 79 2c 26 70 56 61 6c 29 20 0a 20 20  inity,&pVal) .  
a7f0: 20 20 20 26 26 20 70 56 61 6c 21 3d 30 0a 20 20     && pVal!=0.  
a800: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
a810: 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66  e3VdbeMemNumerif
a820: 79 28 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  y(pVal);.      i
a830: 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26  f( pVal->flags &
a840: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
a850: 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e 72 20 3d       pVal->u.r =
a860: 20 2d 70 56 61 6c 2d 3e 75 2e 72 3b 0a 20 20 20   -pVal->u.r;.   
a870: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 56 61     }else if( pVa
a880: 6c 2d 3e 75 2e 69 3d 3d 53 4d 41 4c 4c 45 53 54  l->u.i==SMALLEST
a890: 5f 49 4e 54 36 34 20 29 7b 0a 20 20 20 20 20 20  _INT64 ){.      
a8a0: 20 20 70 56 61 6c 2d 3e 75 2e 72 20 3d 20 2d 28    pVal->u.r = -(
a8b0: 64 6f 75 62 6c 65 29 53 4d 41 4c 4c 45 53 54 5f  double)SMALLEST_
a8c0: 49 4e 54 36 34 3b 0a 20 20 20 20 20 20 20 20 4d  INT64;.        M
a8d0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 56  emSetTypeFlag(pV
a8e0: 61 6c 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20  al, MEM_Real);. 
a8f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a900: 20 20 20 20 70 56 61 6c 2d 3e 75 2e 69 20 3d 20      pVal->u.i = 
a910: 2d 70 56 61 6c 2d 3e 75 2e 69 3b 0a 20 20 20 20  -pVal->u.i;.    
a920: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a930: 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
a940: 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69  ity(pVal, affini
a950: 74 79 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a  ty, enc);.    }.
a960: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
a970: 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  TK_NULL ){.    p
a980: 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28 64  Val = valueNew(d
a990: 62 2c 20 70 43 74 78 29 3b 0a 20 20 20 20 69 66  b, pCtx);.    if
a9a0: 28 20 70 56 61 6c 3d 3d 30 20 29 20 67 6f 74 6f  ( pVal==0 ) goto
a9b0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 23 69 66   no_mem;.  }.#if
a9c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a9d0: 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
a9e0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
a9f0: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 69 6e 74 20  BLOB ){.    int 
aa00: 6e 56 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  nVal;.    assert
aa10: 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
aa20: 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
aa30: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
aa40: 3d 27 58 27 20 29 3b 0a 20 20 20 20 61 73 73 65  ='X' );.    asse
aa50: 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
aa60: 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
aa70: 20 20 20 20 70 56 61 6c 20 3d 20 76 61 6c 75 65      pVal = value
aa80: 4e 65 77 28 64 62 2c 20 70 43 74 78 29 3b 0a 20  New(db, pCtx);. 
aa90: 20 20 20 69 66 28 20 21 70 56 61 6c 20 29 20 67     if( !pVal ) g
aaa0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
aab0: 7a 56 61 6c 20 3d 20 26 70 45 78 70 72 2d 3e 75  zVal = &pExpr->u
aac0: 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
aad0: 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
aae0: 72 6c 65 6e 33 30 28 7a 56 61 6c 29 2d 31 3b 0a  rlen30(zVal)-1;.
aaf0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 56 61 6c      assert( zVal
ab00: 5b 6e 56 61 6c 5d 3d 3d 27 5c 27 27 20 29 3b 0a  [nVal]=='\'' );.
ab10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
ab20: 65 6d 53 65 74 53 74 72 28 70 56 61 6c 2c 20 73  emSetStr(pVal, s
ab30: 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
ab40: 64 62 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c 29 2c  db, zVal, nVal),
ab50: 20 6e 56 61 6c 2f 32 2c 0a 20 20 20 20 20 20 20   nVal/2,.       
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 30 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41    0, SQLITE_DYNA
ab80: 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  MIC);.  }.#endif
ab90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
aba0: 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
abb0: 53 54 41 54 34 0a 20 20 65 6c 73 65 20 69 66 28  STAT4.  else if(
abc0: 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e   op==TK_FUNCTION
abd0: 20 26 26 20 70 43 74 78 21 3d 30 20 29 7b 0a 20   && pCtx!=0 ){. 
abe0: 20 20 20 72 63 20 3d 20 76 61 6c 75 65 46 72 6f     rc = valueFro
abf0: 6d 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45  mFunction(db, pE
ac00: 78 70 72 2c 20 65 6e 63 2c 20 61 66 66 69 6e 69  xpr, enc, affini
ac10: 74 79 2c 20 26 70 56 61 6c 2c 20 70 43 74 78 29  ty, &pVal, pCtx)
ac20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
ac30: 2a 70 70 56 61 6c 20 3d 20 70 56 61 6c 3b 0a 20  *ppVal = pVal;. 
ac40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 6e 6f 5f   return rc;..no_
ac50: 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f  mem:.  db->mallo
ac60: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73  cFailed = 1;.  s
ac70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ac80: 20 7a 56 61 6c 29 3b 0a 20 20 61 73 73 65 72 74   zVal);.  assert
ac90: 28 20 2a 70 70 56 61 6c 3d 3d 30 20 29 3b 0a 23  ( *ppVal==0 );.#
aca0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
acb0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
acc0: 54 34 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30  T4.  if( pCtx==0
acd0: 20 29 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46   ) sqlite3ValueF
ace0: 72 65 65 28 70 56 61 6c 29 3b 0a 23 65 6c 73 65  ree(pVal);.#else
acf0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 74 78 3d  .  assert( pCtx=
ad00: 3d 30 20 29 3b 20 73 71 6c 69 74 65 33 56 61 6c  =0 ); sqlite3Val
ad10: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 23 65  ueFree(pVal);.#e
ad20: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
ad30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 7d 0a 0a 2f  LITE_NOMEM;.}../
ad40: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
ad50: 77 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  w sqlite3_value 
ad60: 6f 62 6a 65 63 74 2c 20 63 6f 6e 74 61 69 6e 69  object, containi
ad70: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ng the value of 
ad80: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  pExpr..**.** Thi
ad90: 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  s only works for
ada0: 20 76 65 72 79 20 73 69 6d 70 6c 65 20 65 78 70   very simple exp
adb0: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63 6f  ressions that co
adc0: 6e 73 69 73 74 20 6f 66 20 6f 6e 65 20 63 6f 6e  nsist of one con
add0: 73 74 61 6e 74 0a 2a 2a 20 74 6f 6b 65 6e 20 28  stant.** token (
ade0: 69 2e 65 2e 20 22 35 22 2c 20 22 35 2e 31 22 2c  i.e. "5", "5.1",
adf0: 20 22 27 61 20 73 74 72 69 6e 67 27 22 29 2e 20   "'a string'"). 
ae00: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
ae10: 6e 20 63 61 6e 0a 2a 2a 20 62 65 20 63 6f 6e 76  n can.** be conv
ae20: 65 72 74 65 64 20 64 69 72 65 63 74 6c 79 20 69  erted directly i
ae30: 6e 74 6f 20 61 20 76 61 6c 75 65 2c 20 74 68 65  nto a value, the
ae40: 6e 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  n the value is a
ae50: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20  llocated and.** 
ae60: 61 20 70 6f 69 6e 74 65 72 20 77 72 69 74 74 65  a pointer writte
ae70: 6e 20 74 6f 20 2a 70 70 56 61 6c 2e 20 54 68 65  n to *ppVal. The
ae80: 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
ae90: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
aea0: 6f 63 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 76  ocating.** the v
aeb0: 61 6c 75 65 20 62 79 20 70 61 73 73 69 6e 67 20  alue by passing 
aec0: 69 74 20 74 6f 20 73 71 6c 69 74 65 33 56 61 6c  it to sqlite3Val
aed0: 75 65 46 72 65 65 28 29 20 6c 61 74 65 72 20 6f  ueFree() later o
aee0: 6e 2e 20 49 66 20 74 68 65 20 65 78 70 72 65 73  n. If the expres
aef0: 73 69 6f 6e 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  sion.** cannot b
af00: 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  e converted to a
af10: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70 70   value, then *pp
af20: 56 61 6c 20 69 73 20 73 65 74 20 74 6f 20 4e 55  Val is set to NU
af30: 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  LL..*/.int sqlit
af40: 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
af50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af70: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
af80: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
af90: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
afa0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
afb0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c  pression to eval
afc0: 75 61 74 65 20 2a 2f 0a 20 20 75 38 20 65 6e 63  uate */.  u8 enc
afd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
afe0: 20 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20      /* Encoding 
aff0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 75 38 20 61  to use */.  u8 a
b000: 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20  ffinity,        
b010: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
b020: 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71  y to use */.  sq
b030: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70  lite3_value **pp
b040: 56 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  Val     /* Write
b050: 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 68   the new value h
b060: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ere */.){.  retu
b070: 72 6e 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  rn valueFromExpr
b080: 28 64 62 2c 20 70 45 78 70 72 2c 20 65 6e 63 2c  (db, pExpr, enc,
b090: 20 61 66 66 69 6e 69 74 79 2c 20 70 70 56 61 6c   affinity, ppVal
b0a0: 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  , 0);.}..#ifdef 
b0b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
b0c0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
b0d0: 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
b0e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c  ation of the sql
b0f0: 69 74 65 5f 72 65 63 6f 72 64 28 29 20 66 75 6e  ite_record() fun
b100: 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ction. This func
b110: 74 69 6f 6e 20 61 63 63 65 70 74 73 0a 2a 2a 20  tion accepts.** 
b120: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
b130: 74 20 6f 66 20 61 6e 79 20 74 79 70 65 2e 20 54  t of any type. T
b140: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
b150: 69 73 20 61 20 66 6f 72 6d 61 74 74 65 64 20 64  is a formatted d
b160: 61 74 61 62 61 73 65 20 0a 2a 2a 20 72 65 63 6f  atabase .** reco
b170: 72 64 20 28 61 20 62 6c 6f 62 29 20 63 6f 6e 74  rd (a blob) cont
b180: 61 69 6e 69 6e 67 20 74 68 65 20 61 72 67 75 6d  aining the argum
b190: 65 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ent value..**.**
b1a0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
b1b0: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
b1c0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ue stored in the
b1d0: 20 27 73 61 6d 70 6c 65 27 20 63 6f 6c 75 6d 6e   'sample' column
b1e0: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   of the.** sqlit
b1f0: 65 5f 73 74 61 74 33 20 74 61 62 6c 65 20 74 6f  e_stat3 table to
b200: 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
b210: 61 74 20 53 51 4c 69 74 65 20 75 73 65 73 20 69  at SQLite uses i
b220: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74  nternally..*/.st
b230: 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 72 64  atic void record
b240: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
b250: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b260: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
b270: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
b280: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
b290: 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20  int file_format 
b2a0: 3d 20 31 3b 0a 20 20 75 33 32 20 69 53 65 72 69  = 1;.  u32 iSeri
b2b0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
b2c0: 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
b2d0: 20 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   type */.  int n
b2e0: 53 65 72 69 61 6c 3b 20 20 20 20 20 20 20 20 20  Serial;         
b2f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
b300: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
b310: 20 69 53 65 72 69 61 6c 20 61 73 20 76 61 72 69   iSerial as vari
b320: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 56 61 6c  nt */.  u32 nVal
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
b350: 20 6f 66 20 73 70 61 63 65 20 72 65 71 75 69 72   of space requir
b360: 65 64 20 66 6f 72 20 61 72 67 76 5b 30 5d 20 2a  ed for argv[0] *
b370: 2f 0a 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20  /.  int nRet;.  
b380: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 75  sqlite3 *db;.  u
b390: 38 20 2a 61 52 65 74 3b 0a 0a 20 20 55 4e 55 53  8 *aRet;..  UNUS
b3a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 61 72  ED_PARAMETER( ar
b3b0: 67 63 20 29 3b 0a 20 20 69 53 65 72 69 61 6c 20  gc );.  iSerial 
b3c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
b3d0: 69 61 6c 54 79 70 65 28 61 72 67 76 5b 30 5d 2c  ialType(argv[0],
b3e0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6e   file_format, &n
b3f0: 56 61 6c 29 3b 0a 20 20 6e 53 65 72 69 61 6c 20  Val);.  nSerial 
b400: 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
b410: 65 6e 28 69 53 65 72 69 61 6c 29 3b 0a 20 20 64  en(iSerial);.  d
b420: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
b430: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
b440: 6e 74 65 78 74 29 3b 0a 0a 20 20 6e 52 65 74 20  ntext);..  nRet 
b450: 3d 20 31 20 2b 20 6e 53 65 72 69 61 6c 20 2b 20  = 1 + nSerial + 
b460: 6e 56 61 6c 3b 0a 20 20 61 52 65 74 20 3d 20 73  nVal;.  aRet = s
b470: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b480: 77 28 64 62 2c 20 6e 52 65 74 29 3b 0a 20 20 69  w(db, nRet);.  i
b490: 66 28 20 61 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( aRet==0 ){.  
b4a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b4b0: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
b4c0: 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  text);.  }else{.
b4d0: 20 20 20 20 61 52 65 74 5b 30 5d 20 3d 20 6e 53      aRet[0] = nS
b4e0: 65 72 69 61 6c 2b 31 3b 0a 20 20 20 20 70 75 74  erial+1;.    put
b4f0: 56 61 72 69 6e 74 33 32 28 26 61 52 65 74 5b 31  Varint32(&aRet[1
b500: 5d 2c 20 69 53 65 72 69 61 6c 29 3b 0a 20 20 20  ], iSerial);.   
b510: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
b520: 61 6c 50 75 74 28 26 61 52 65 74 5b 31 2b 6e 53  alPut(&aRet[1+nS
b530: 65 72 69 61 6c 5d 2c 20 61 72 67 76 5b 30 5d 2c  erial], argv[0],
b540: 20 69 53 65 72 69 61 6c 29 3b 0a 20 20 20 20 73   iSerial);.    s
b550: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
b560: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 61 52 65 74  ob(context, aRet
b570: 2c 20 6e 52 65 74 2c 20 53 51 4c 49 54 45 5f 54  , nRet, SQLITE_T
b580: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
b590: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b5a0: 20 61 52 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aRet);.  }.}../
b5b0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 62 75  *.** Register bu
b5c0: 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
b5d0: 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 72 65   used to help re
b5e0: 61 64 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2e  ad ANALYZE data.
b5f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b600: 41 6e 61 6c 79 7a 65 46 75 6e 63 74 69 6f 6e 73  AnalyzeFunctions
b610: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
b620: 20 53 51 4c 49 54 45 5f 57 53 44 20 46 75 6e 63   SQLITE_WSD Func
b630: 44 65 66 20 61 41 6e 61 6c 79 7a 65 54 61 62 6c  Def aAnalyzeTabl
b640: 65 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20  eFuncs[] = {.   
b650: 20 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65   FUNCTION(sqlite
b660: 5f 72 65 63 6f 72 64 2c 20 20 20 31 2c 20 30 2c  _record,   1, 0,
b670: 20 30 2c 20 72 65 63 6f 72 64 46 75 6e 63 29 2c   0, recordFunc),
b680: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
b690: 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48   FuncDefHash *pH
b6a0: 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75  ash = &GLOBAL(Fu
b6b0: 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74  ncDefHash, sqlit
b6c0: 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  e3GlobalFunction
b6d0: 73 29 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a 61  s);.  FuncDef *a
b6e0: 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a  Func = (FuncDef*
b6f0: 29 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66  )&GLOBAL(FuncDef
b700: 2c 20 61 41 6e 61 6c 79 7a 65 54 61 62 6c 65 46  , aAnalyzeTableF
b710: 75 6e 63 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  uncs);.  for(i=0
b720: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 41  ; i<ArraySize(aA
b730: 6e 61 6c 79 7a 65 54 61 62 6c 65 46 75 6e 63 73  nalyzeTableFuncs
b740: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
b750: 69 74 65 33 46 75 6e 63 44 65 66 49 6e 73 65 72  ite3FuncDefInser
b760: 74 28 70 48 61 73 68 2c 20 26 61 46 75 6e 63 5b  t(pHash, &aFunc[
b770: 69 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  i]);.  }.}../*.*
b780: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74  * Attempt to ext
b790: 72 61 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f  ract a value fro
b7a0: 6d 20 70 45 78 70 72 20 61 6e 64 20 75 73 65 20  m pExpr and use 
b7b0: 69 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  it to construct 
b7c0: 2a 70 70 56 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  *ppVal..**.** If
b7d0: 20 70 41 6c 6c 6f 63 20 69 73 20 6e 6f 74 20 4e   pAlloc is not N
b7e0: 55 4c 4c 2c 20 74 68 65 6e 20 61 6e 20 55 6e 70  ULL, then an Unp
b7f0: 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62 6a 65  ackedRecord obje
b800: 63 74 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ct is created fo
b810: 72 0a 2a 2a 20 70 41 6c 6c 6f 63 20 69 66 20 6f  r.** pAlloc if o
b820: 6e 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ne does not exis
b830: 74 20 61 6e 64 20 74 68 65 20 6e 65 77 20 76 61  t and the new va
b840: 6c 75 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  lue is added to 
b850: 74 68 65 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52  the.** UnpackedR
b860: 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ecord object..**
b870: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 69 73 20 65  .** A value is e
b880: 78 74 72 61 63 74 65 64 20 69 6e 20 74 68 65 20  xtracted in the 
b890: 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 3a  following cases:
b8a0: 0a 2a 2a 0a 2a 2a 20 20 2a 20 28 70 45 78 70 72  .**.**  * (pExpr
b8b0: 3d 3d 30 29 2e 20 49 6e 20 74 68 69 73 20 63 61  ==0). In this ca
b8c0: 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  se the value is 
b8d0: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 61 6e  assumed to be an
b8e0: 20 53 51 4c 20 4e 55 4c 4c 2c 0a 2a 2a 0a 2a 2a   SQL NULL,.**.**
b8f0: 20 20 2a 20 54 68 65 20 65 78 70 72 65 73 73 69    * The expressi
b900: 6f 6e 20 69 73 20 61 20 62 6f 75 6e 64 20 76 61  on is a bound va
b910: 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 69 73  riable, and this
b920: 20 69 73 20 61 20 72 65 70 72 65 70 61 72 65 2c   is a reprepare,
b930: 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 2a 20 54 68 65   or.**.**  * The
b940: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
b950: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 2e 0a   literal value..
b960: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
b970: 2c 20 2a 70 70 56 61 6c 20 69 73 20 6d 61 64 65  , *ppVal is made
b980: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
b990: 20 65 78 74 72 61 63 74 65 64 20 76 61 6c 75 65   extracted value
b9a0: 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  .  The caller.**
b9b0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
b9c0: 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
b9d0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 65  t the value is e
b9e0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e  ventually freed.
b9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ba00: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
ba10: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
ba20: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
ba30: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
ba40: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
ba50: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
ba60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ba70: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
ba80: 65 78 74 72 61 63 74 20 61 20 76 61 6c 75 65 20  extract a value 
ba90: 66 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66  from */.  u8 aff
baa0: 69 6e 69 74 79 2c 20 20 20 20 20 20 20 20 20 20  inity,          
bab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
bac0: 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a  inity to use */.
bad0: 20 20 73 74 72 75 63 74 20 56 61 6c 75 65 4e 65    struct ValueNe
bae0: 77 53 74 61 74 34 43 74 78 20 2a 70 41 6c 6c 6f  wStat4Ctx *pAllo
baf0: 63 2c 2f 2a 20 48 6f 77 20 74 6f 20 61 6c 6c 6f  c,/* How to allo
bb00: 63 61 74 65 20 73 70 61 63 65 2e 20 20 4f 72 20  cate space.  Or 
bb10: 4e 55 4c 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  NULL */.  sqlite
bb20: 33 5f 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 20  3_value **ppVal 
bb30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
bb40: 3a 20 4e 65 77 20 76 61 6c 75 65 20 6f 62 6a 65  : New value obje
bb50: 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ct (or NULL) */.
bb60: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bb70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
bb80: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
bb90: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
bba0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bbb0: 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20  .  /* Skip over 
bbc0: 61 6e 79 20 54 4b 5f 43 4f 4c 4c 41 54 45 20 6e  any TK_COLLATE n
bbd0: 6f 64 65 73 20 2a 2f 0a 20 20 70 45 78 70 72 20  odes */.  pExpr 
bbe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
bbf0: 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
bc00: 0a 0a 20 20 69 66 28 20 21 70 45 78 70 72 20 29  ..  if( !pExpr )
bc10: 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61 6c  {.    pVal = val
bc20: 75 65 4e 65 77 28 64 62 2c 20 70 41 6c 6c 6f 63  ueNew(db, pAlloc
bc30: 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 20  );.    if( pVal 
bc40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bc50: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 28  VdbeMemSetNull((
bc60: 4d 65 6d 2a 29 70 56 61 6c 29 3b 0a 20 20 20 20  Mem*)pVal);.    
bc70: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45  }.  }else if( pE
bc80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  xpr->op==TK_VARI
bc90: 41 42 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c 20  ABLE.        || 
bca0: 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
bcb0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
bcc0: 70 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56  pExpr->op2==TK_V
bcd0: 41 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20  ARIABLE).  ){.  
bce0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69    Vdbe *v;.    i
bcf0: 6e 74 20 69 42 69 6e 64 56 61 72 20 3d 20 70 45  nt iBindVar = pE
bd00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
bd10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
bd20: 56 61 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e  Varmask(pParse->
bd30: 70 56 64 62 65 2c 20 69 42 69 6e 64 56 61 72 29  pVdbe, iBindVar)
bd40: 3b 0a 20 20 20 20 69 66 28 20 28 76 20 3d 20 70  ;.    if( (v = p
bd50: 50 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72  Parse->pReprepar
bd60: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
bd70: 56 61 6c 20 3d 20 76 61 6c 75 65 4e 65 77 28 64  Val = valueNew(d
bd80: 62 2c 20 70 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  b, pAlloc);.    
bd90: 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20    if( pVal ){.  
bda0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
bdb0: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
bdc0: 65 6d 2a 29 70 56 61 6c 2c 20 26 76 2d 3e 61 56  em*)pVal, &v->aV
bdd0: 61 72 5b 69 42 69 6e 64 56 61 72 2d 31 5d 29 3b  ar[iBindVar-1]);
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
bdf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
be00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
be10: 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
be20: 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69 74 79  y(pVal, affinity
be30: 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20  , ENC(db));.    
be40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 56      }.        pV
be50: 61 6c 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d  al->db = pParse-
be60: 3e 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >db;.      }.   
be70: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
be80: 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
be90: 70 72 28 64 62 2c 20 70 45 78 70 72 2c 20 45 4e  pr(db, pExpr, EN
bea0: 43 28 64 62 29 2c 20 61 66 66 69 6e 69 74 79 2c  C(db), affinity,
beb0: 20 26 70 56 61 6c 2c 20 70 41 6c 6c 6f 63 29 3b   &pVal, pAlloc);
bec0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
bed0: 70 56 61 6c 3d 3d 30 20 7c 7c 20 70 56 61 6c 2d  pVal==0 || pVal-
bee0: 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 2a 70 70  >db==db );.  *pp
bef0: 56 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72 65  Val = pVal;.  re
bf00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bf10: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bf20: 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
bf30: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
bf40: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
bf50: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 69  .** structures i
bf60: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 6f  ntended to be co
bf70: 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 20 73  mpared against s
bf80: 61 6d 70 6c 65 20 69 6e 64 65 78 20 6b 65 79 73  ample index keys
bf90: 20 73 74 6f 72 65 64 20 0a 2a 2a 20 69 6e 20 74   stored .** in t
bfa0: 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  he sqlite_stat4 
bfb0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  table..**.** A s
bfc0: 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 74 68  ingle call to th
bfd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
bfe0: 6d 70 74 73 20 74 6f 20 70 6f 70 75 6c 61 74 65  mpts to populate
bff0: 73 20 66 69 65 6c 64 20 69 56 61 6c 20 28 6c 65  s field iVal (le
c000: 66 74 6d 6f 73 74 20 0a 2a 2a 20 69 73 20 30 20  ftmost .** is 0 
c010: 65 74 63 2e 29 20 6f 66 20 74 68 65 20 75 6e 70  etc.) of the unp
c020: 61 63 6b 65 64 20 72 65 63 6f 72 64 20 77 69 74  acked record wit
c030: 68 20 61 20 76 61 6c 75 65 20 65 78 74 72 61 63  h a value extrac
c040: 74 65 64 20 66 72 6f 6d 20 65 78 70 72 65 73 73  ted from express
c050: 69 6f 6e 0a 2a 2a 20 70 45 78 70 72 2e 20 45 78  ion.** pExpr. Ex
c060: 74 72 61 63 74 69 6f 6e 20 6f 66 20 76 61 6c 75  traction of valu
c070: 65 73 20 69 73 20 70 6f 73 73 69 62 6c 65 20 69  es is possible i
c080: 66 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 28 70 45 78  f:.**.**  * (pEx
c090: 70 72 3d 3d 30 29 2e 20 49 6e 20 74 68 69 73 20  pr==0). In this 
c0a0: 63 61 73 65 20 74 68 65 20 76 61 6c 75 65 20 69  case the value i
c0b0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
c0c0: 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 0a 2a 2a 0a  an SQL NULL,.**.
c0d0: 2a 2a 20 20 2a 20 54 68 65 20 65 78 70 72 65 73  **  * The expres
c0e0: 73 69 6f 6e 20 69 73 20 61 20 62 6f 75 6e 64 20  sion is a bound 
c0f0: 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68  variable, and th
c100: 69 73 20 69 73 20 61 20 72 65 70 72 65 70 61 72  is is a reprepar
c110: 65 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 2a 20 54  e, or.**.**  * T
c120: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  he sqlite3ValueF
c130: 72 6f 6d 45 78 70 72 28 29 20 66 75 6e 63 74 69  romExpr() functi
c140: 6f 6e 20 69 73 20 61 62 6c 65 20 74 6f 20 65 78  on is able to ex
c150: 74 72 61 63 74 20 61 20 76 61 6c 75 65 20 0a 2a  tract a value .*
c160: 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65 78  *    from the ex
c170: 70 72 65 73 73 69 6f 6e 20 28 69 2e 65 2e 20 74  pression (i.e. t
c180: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
c190: 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65   a literal value
c1a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 76 61  )..**.** If a va
c1b0: 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74 72 61  lue can be extra
c1c0: 63 74 65 64 2c 20 74 68 65 20 61 66 66 69 6e 69  cted, the affini
c1d0: 74 79 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ty passed as the
c1e0: 20 35 74 68 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   5th argument.**
c1f0: 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 69   is applied to i
c200: 74 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63  t before it is c
c210: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 55  opied into the U
c220: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2e 20 4f  npackedRecord. O
c230: 75 74 70 75 74 0a 2a 2a 20 70 61 72 61 6d 65 74  utput.** paramet
c240: 65 72 20 2a 70 62 4f 6b 20 69 73 20 73 65 74 20  er *pbOk is set 
c250: 74 6f 20 74 72 75 65 20 69 66 20 61 20 76 61 6c  to true if a val
c260: 75 65 20 69 73 20 65 78 74 72 61 63 74 65 64 2c  ue is extracted,
c270: 20 6f 72 20 66 61 6c 73 65 20 0a 2a 2a 20 6f 74   or false .** ot
c280: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  herwise..**.** W
c290: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c2a0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70  n is called, *pp
c2b0: 52 65 63 20 6d 75 73 74 20 65 69 74 68 65 72 20  Rec must either 
c2c0: 70 6f 69 6e 74 20 74 6f 20 61 6e 20 6f 62 6a 65  point to an obje
c2d0: 63 74 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ct.** allocated 
c2e0: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
c2f0: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
c300: 69 6f 6e 2c 20 6f 72 20 6d 75 73 74 20 62 65 20  ion, or must be 
c310: 4e 55 4c 4c 2e 20 49 66 20 69 74 0a 2a 2a 20 69  NULL. If it.** i
c320: 73 20 4e 55 4c 4c 20 61 6e 64 20 61 20 76 61 6c  s NULL and a val
c330: 75 65 20 63 61 6e 20 62 65 20 73 75 63 63 65 73  ue can be succes
c340: 73 66 75 6c 6c 79 20 65 78 74 72 61 63 74 65 64  sfully extracted
c350: 2c 20 61 20 6e 65 77 20 55 6e 70 61 63 6b 65 64  , a new Unpacked
c360: 52 65 63 6f 72 64 0a 2a 2a 20 69 73 20 61 6c 6c  Record.** is all
c370: 6f 63 61 74 65 64 20 28 61 6e 64 20 2a 70 70 52  ocated (and *ppR
c380: 65 63 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ec set to point 
c390: 74 6f 20 69 74 29 20 62 65 66 6f 72 65 20 72 65  to it) before re
c3a0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 55  turning..**.** U
c3b0: 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20 69  nless an error i
c3c0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 53  s encountered, S
c3d0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c3e0: 72 6e 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  rned. It is not 
c3f0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 69 66 20 61  an.** error if a
c400: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
c410: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c420: 70 45 78 70 72 2e 20 49 66 20 61 6e 20 65 72 72  pExpr. If an err
c430: 6f 72 20 64 6f 65 73 0a 2a 2a 20 6f 63 63 75 72  or does.** occur
c440: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
c450: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c460: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
c470: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
c480: 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20 2a 70  alue(.  Parse *p
c490: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c4a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
c4b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
c4c0: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c4e0: 20 49 6e 64 65 78 20 62 65 69 6e 67 20 70 72 6f   Index being pro
c4f0: 62 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  bed */.  Unpacke
c500: 64 52 65 63 6f 72 64 20 2a 2a 70 70 52 65 63 2c  dRecord **ppRec,
c510: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
c520: 55 54 3a 20 50 72 6f 62 65 20 72 65 63 6f 72 64  UT: Probe record
c530: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
c540: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
c550: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c560: 72 65 73 73 69 6f 6e 20 74 6f 20 65 78 74 72 61  ression to extra
c570: 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 20  ct a value from 
c580: 2a 2f 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79  */.  u8 affinity
c590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c5a0: 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
c5b0: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   to use */.  int
c5c0: 20 69 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   iVal,          
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5e0: 41 72 72 61 79 20 65 6c 65 6d 65 6e 74 20 74 6f  Array element to
c5f0: 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 20 20 69   populate */.  i
c600: 6e 74 20 2a 70 62 4f 6b 20 20 20 20 20 20 20 20  nt *pbOk        
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c620: 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 76  * OUT: True if v
c630: 61 6c 75 65 20 77 61 73 20 65 78 74 72 61 63 74  alue was extract
c640: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
c650: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c;.  sqlite3_val
c660: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
c670: 73 74 72 75 63 74 20 56 61 6c 75 65 4e 65 77 53  struct ValueNewS
c680: 74 61 74 34 43 74 78 20 61 6c 6c 6f 63 3b 0a 0a  tat4Ctx alloc;..
c690: 20 20 61 6c 6c 6f 63 2e 70 50 61 72 73 65 20 3d    alloc.pParse =
c6a0: 20 70 50 61 72 73 65 3b 0a 20 20 61 6c 6c 6f 63   pParse;.  alloc
c6b0: 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20  .pIdx = pIdx;.  
c6c0: 61 6c 6c 6f 63 2e 70 70 52 65 63 20 3d 20 70 70  alloc.ppRec = pp
c6d0: 52 65 63 3b 0a 20 20 61 6c 6c 6f 63 2e 69 56 61  Rec;.  alloc.iVa
c6e0: 6c 20 3d 20 69 56 61 6c 3b 0a 0a 20 20 72 63 20  l = iVal;..  rc 
c6f0: 3d 20 73 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  = stat4ValueFrom
c700: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
c710: 70 72 2c 20 61 66 66 69 6e 69 74 79 2c 20 26 61  pr, affinity, &a
c720: 6c 6c 6f 63 2c 20 26 70 56 61 6c 29 3b 0a 20 20  lloc, &pVal);.  
c730: 61 73 73 65 72 74 28 20 70 56 61 6c 3d 3d 30 20  assert( pVal==0 
c740: 7c 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d 70 50 61  || pVal->db==pPa
c750: 72 73 65 2d 3e 64 62 20 29 3b 0a 20 20 2a 70 62  rse->db );.  *pb
c760: 4f 6b 20 3d 20 28 70 56 61 6c 21 3d 30 29 3b 0a  Ok = (pVal!=0);.
c770: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c780: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
c790: 20 65 78 74 72 61 63 74 20 61 20 76 61 6c 75 65   extract a value
c7a0: 20 66 72 6f 6d 20 65 78 70 72 65 73 73 69 6f 6e   from expression
c7b0: 20 70 45 78 70 72 20 75 73 69 6e 67 20 74 68 65   pExpr using the
c7c0: 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 73 20 64   methods.** as d
c7d0: 65 73 63 72 69 62 65 64 20 66 6f 72 20 73 71 6c  escribed for sql
c7e0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
c7f0: 74 56 61 6c 75 65 28 29 20 61 62 6f 76 65 2e 20  tValue() above. 
c800: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
c810: 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 56 61 6c  sful, set *ppVal
c820: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6e   to point to a n
c830: 65 77 20 76 61 6c 75 65 20 6f 62 6a 65 63 74 20  ew value object 
c840: 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  and return .** S
c850: 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 6e 6f 20  QLITE_OK. If no 
c860: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
c870: 72 61 63 74 65 64 2c 20 62 75 74 20 6e 6f 20 6f  racted, but no o
c880: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
c890: 73 0a 2a 2a 20 28 65 2e 67 2e 20 4f 4f 4d 29 2c  s.** (e.g. OOM),
c8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c8b0: 4b 20 61 6e 64 20 73 65 74 20 2a 70 70 56 61 6c  K and set *ppVal
c8c0: 20 74 6f 20 4e 55 4c 4c 2e 20 4f 72 2c 20 69 66   to NULL. Or, if
c8d0: 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 64 6f 65   an error.** doe
c8e0: 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
c8f0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
c900: 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20  code. The final 
c910: 76 61 6c 75 65 20 6f 66 20 2a 70 70 56 61 6c 0a  value of *ppVal.
c920: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
c930: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
c940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 61 74  .int sqlite3Stat
c950: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 0a  4ValueFromExpr(.
c960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
c990: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
c9a0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
c9b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
c9c0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 65 78 74  xpression to ext
c9d0: 72 61 63 74 20 61 20 76 61 6c 75 65 20 66 72 6f  ract a value fro
c9e0: 6d 20 2a 2f 0a 20 20 75 38 20 61 66 66 69 6e 69  m */.  u8 affini
c9f0: 74 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ty,             
ca00: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
ca10: 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73  ty to use */.  s
ca20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
ca30: 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
ca40: 2a 20 4f 55 54 3a 20 4e 65 77 20 76 61 6c 75 65  * OUT: New value
ca50: 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c   object (or NULL
ca60: 29 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  ) */.){.  return
ca70: 20 73 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45   stat4ValueFromE
ca80: 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  xpr(pParse, pExp
ca90: 72 2c 20 61 66 66 69 6e 69 74 79 2c 20 30 2c 20  r, affinity, 0, 
caa0: 70 70 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ppVal);.}../*.**
cab0: 20 45 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   Extract the iCo
cac0: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  l-th column from
cad0: 20 74 68 65 20 6e 52 65 63 2d 62 79 74 65 20 72   the nRec-byte r
cae0: 65 63 6f 72 64 20 69 6e 20 70 52 65 63 2e 20 20  ecord in pRec.  
caf0: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c  Write.** the col
cb00: 75 6d 6e 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  umn value into *
cb10: 70 70 56 61 6c 2e 20 20 49 66 20 2a 70 70 56 61  ppVal.  If *ppVa
cb20: 6c 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 4e  l is initially N
cb30: 55 4c 4c 20 74 68 65 6e 20 61 20 6e 65 77 0a 2a  ULL then a new.*
cb40: 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  * sqlite3_value 
cb50: 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
cb60: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  ted..**.** If *p
cb70: 70 56 61 6c 20 69 73 20 69 6e 69 74 69 61 6c 6c  pVal is initiall
cb80: 79 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20  y NULL then the 
cb90: 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
cba0: 73 69 62 6c 65 20 66 6f 72 20 0a 2a 2a 20 65 6e  sible for .** en
cbb0: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 65 20  suring that the 
cbc0: 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e  value written in
cbd0: 74 6f 20 2a 70 70 56 61 6c 20 69 73 20 65 76 65  to *ppVal is eve
cbe0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  ntually freed..*
cbf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 61  /.int sqlite3Sta
cc00: 74 34 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  t4Column(.  sqli
cc10: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
cc30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
cc40: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
cc50: 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  pRec,           
cc60: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
cc70: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
cc80: 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ing record */.  
cc90: 69 6e 74 20 6e 52 65 63 2c 20 20 20 20 20 20 20  int nRec,       
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccb0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
ccc0: 72 20 70 52 65 63 20 69 6e 20 62 79 74 65 73 20  r pRec in bytes 
ccd0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
cd00: 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20 73  o extract */.  s
cd10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 70  qlite3_value **p
cd20: 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
cd30: 2a 20 4f 55 54 3a 20 45 78 74 72 61 63 74 65 64  * OUT: Extracted
cd40: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
cd50: 33 32 20 74 3b 20 20 20 20 20 20 20 20 20 20 20  32 t;           
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd70: 2a 20 61 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  * a column type 
cd80: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  code */.  int nH
cd90: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
cda0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
cdb0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
cdc0: 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  in the record */
cdd0: 0a 20 20 69 6e 74 20 69 48 64 72 3b 20 20 20 20  .  int iHdr;    
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 72 65 61     /* Next unrea
ce00: 64 20 68 65 61 64 65 72 20 62 79 74 65 20 2a 2f  d header byte */
ce10: 0a 20 20 69 6e 74 20 69 46 69 65 6c 64 3b 20 20  .  int iField;  
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce30: 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 72 65 61     /* Next unrea
ce40: 64 20 64 61 74 61 20 62 79 74 65 20 2a 2f 0a 20  d data byte */. 
ce50: 20 69 6e 74 20 73 7a 46 69 65 6c 64 3b 20 20 20   int szField;   
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
ce80: 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 69 65  current data fie
ce90: 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ld */.  int i;  
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
cec0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  n index */.  u8 
ced0: 2a 61 20 3d 20 28 75 38 2a 29 70 52 65 63 3b 20  *a = (u8*)pRec; 
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cef0: 54 79 70 65 63 61 73 74 20 62 79 74 65 20 61 72  Typecast byte ar
cf00: 72 61 79 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ray */.  Mem *pM
cf10: 65 6d 20 3d 20 2a 70 70 56 61 6c 3b 20 20 20 20  em = *ppVal;    
cf20: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
cf30: 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68  e result into th
cf40: 69 73 20 4d 65 6d 20 6f 62 6a 65 63 74 20 2a 2f  is Mem object */
cf50: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  ..  assert( iCol
cf60: 3e 30 20 29 3b 0a 20 20 69 48 64 72 20 3d 20 67  >0 );.  iHdr = g
cf70: 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 6e 48  etVarint32(a, nH
cf80: 64 72 29 3b 0a 20 20 69 66 28 20 6e 48 64 72 3e  dr);.  if( nHdr>
cf90: 6e 52 65 63 20 7c 7c 20 69 48 64 72 3e 3d 6e 48  nRec || iHdr>=nH
cfa0: 64 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  dr ) return SQLI
cfb0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cfc0: 0a 20 20 69 46 69 65 6c 64 20 3d 20 6e 48 64 72  .  iField = nHdr
cfd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
cfe0: 69 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iCol; i++){.    
cff0: 69 48 64 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  iHdr += getVarin
d000: 74 33 32 28 26 61 5b 69 48 64 72 5d 2c 20 74 29  t32(&a[iHdr], t)
d010: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
d020: 69 48 64 72 3d 3d 6e 48 64 72 20 29 3b 0a 20 20  iHdr==nHdr );.  
d030: 20 20 74 65 73 74 63 61 73 65 28 20 69 48 64 72    testcase( iHdr
d040: 3d 3d 6e 48 64 72 2b 31 20 29 3b 0a 20 20 20 20  ==nHdr+1 );.    
d050: 69 66 28 20 69 48 64 72 3e 6e 48 64 72 20 29 20  if( iHdr>nHdr ) 
d060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d070: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d080: 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74 65  szField = sqlite
d090: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
d0a0: 65 6e 28 74 29 3b 0a 20 20 20 20 69 46 69 65 6c  en(t);.    iFiel
d0b0: 64 20 2b 3d 20 73 7a 46 69 65 6c 64 3b 0a 20 20  d += szField;.  
d0c0: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 46  }.  testcase( iF
d0d0: 69 65 6c 64 3d 3d 6e 52 65 63 20 29 3b 0a 20 20  ield==nRec );.  
d0e0: 74 65 73 74 63 61 73 65 28 20 69 46 69 65 6c 64  testcase( iField
d0f0: 3d 3d 6e 52 65 63 2b 31 20 29 3b 0a 20 20 69 66  ==nRec+1 );.  if
d100: 28 20 69 46 69 65 6c 64 3e 6e 52 65 63 20 29 20  ( iField>nRec ) 
d110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d120: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66  RRUPT_BKPT;.  if
d130: 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
d140: 20 70 4d 65 6d 20 3d 20 2a 70 70 56 61 6c 20 3d   pMem = *ppVal =
d150: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
d160: 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  (db);.    if( pM
d170: 65 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  em==0 ) return S
d180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
d190: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
d1a0: 72 69 61 6c 47 65 74 28 26 61 5b 69 46 69 65 6c  rialGet(&a[iFiel
d1b0: 64 2d 73 7a 46 69 65 6c 64 5d 2c 20 74 2c 20 70  d-szField], t, p
d1c0: 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e  Mem);.  pMem->en
d1d0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 72  c = ENC(db);.  r
d1e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
d200: 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65   it is NULL, the
d210: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
d220: 65 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  e an UnpackedRec
d230: 6f 72 64 20 6f 62 6a 65 63 74 20 72 65 74 75 72  ord object retur
d240: 6e 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 61 72  ned.** by an ear
d250: 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
d260: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d270: 74 56 61 6c 75 65 28 29 2e 20 54 68 69 73 20 63  tValue(). This c
d280: 61 6c 6c 20 64 65 6c 65 74 65 73 0a 2a 2a 20 74  all deletes.** t
d290: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  he object..*/.vo
d2a0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 74 34 50  id sqlite3Stat4P
d2b0: 72 6f 62 65 46 72 65 65 28 55 6e 70 61 63 6b 65  robeFree(Unpacke
d2c0: 64 52 65 63 6f 72 64 20 2a 70 52 65 63 29 7b 0a  dRecord *pRec){.
d2d0: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
d2e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
d2f0: 20 6e 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 70 4b   nCol = pRec->pK
d300: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
d310: 52 65 63 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  Rec->pKeyInfo->n
d320: 58 46 69 65 6c 64 3b 0a 20 20 20 20 4d 65 6d 20  XField;.    Mem 
d330: 2a 61 4d 65 6d 20 3d 20 70 52 65 63 2d 3e 61 4d  *aMem = pRec->aM
d340: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  em;.    sqlite3 
d350: 2a 64 62 20 3d 20 61 4d 65 6d 5b 30 5d 2e 64 62  *db = aMem[0].db
d360: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d370: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
d380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
d390: 6d 52 65 6c 65 61 73 65 28 26 61 4d 65 6d 5b 69  mRelease(&aMem[i
d3a0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
d3b0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
d3c0: 66 28 70 52 65 63 2d 3e 70 4b 65 79 49 6e 66 6f  f(pRec->pKeyInfo
d3d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
d3e0: 46 72 65 65 28 64 62 2c 20 70 52 65 63 29 3b 0a  Free(db, pRec);.
d3f0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
d400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d410: 42 4c 45 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a  BLE_STAT4 */../*
d420: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
d430: 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 61  tring value of a
d440: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
d450: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
d460: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
d470: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  r(.  sqlite3_val
d480: 75 65 20 2a 76 2c 20 20 20 20 20 2f 2a 20 56 61  ue *v,     /* Va
d490: 6c 75 65 20 74 6f 20 62 65 20 73 65 74 20 2a 2f  lue to be set */
d4a0: 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
d4c0: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 20 2a  th of string z *
d4d0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
d4e0: 7a 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78  z,        /* Tex
d4f0: 74 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 72  t of the new str
d500: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c  ing */.  u8 enc,
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d520: 2a 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73  * Encoding to us
d530: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
d540: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 2f 2a 20  el)(void*)   /* 
d550: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
d560: 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  he string */.){.
d570: 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
d580: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 28  3VdbeMemSetStr((
d590: 4d 65 6d 20 2a 29 76 2c 20 7a 2c 20 6e 2c 20 65  Mem *)v, z, n, e
d5a0: 6e 63 2c 20 78 44 65 6c 29 3b 0a 7d 0a 0a 2f 2a  nc, xDel);.}../*
d5b0: 0a 2a 2a 20 46 72 65 65 20 61 6e 20 73 71 6c 69  .** Free an sqli
d5c0: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
d5d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d5e0: 56 61 6c 75 65 46 72 65 65 28 73 71 6c 69 74 65  ValueFree(sqlite
d5f0: 33 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 69  3_value *v){.  i
d600: 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
d610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d620: 52 65 6c 65 61 73 65 28 28 4d 65 6d 20 2a 29 76  Release((Mem *)v
d630: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d640: 65 65 28 28 28 4d 65 6d 2a 29 76 29 2d 3e 64 62  ee(((Mem*)v)->db
d650: 2c 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , v);.}../*.** T
d660: 68 65 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42  he sqlite3ValueB
d670: 79 74 65 73 28 29 20 72 6f 75 74 69 6e 65 20 72  ytes() routine r
d680: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
d690: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
d6a0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 61 6c  e.** sqlite3_val
d6b0: 75 65 20 6f 62 6a 65 63 74 20 61 73 73 75 6d 69  ue object assumi
d6c0: 6e 67 20 74 68 61 74 20 69 74 20 75 73 65 73 20  ng that it uses 
d6d0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 22 65 6e  the encoding "en
d6e0: 63 22 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  c"..** The value
d6f0: 42 79 74 65 73 28 29 20 72 6f 75 74 69 6e 65 20  Bytes() routine 
d700: 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63  is a helper func
d710: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
d720: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
d730: 69 6e 74 20 76 61 6c 75 65 42 79 74 65 73 28 73  int valueBytes(s
d740: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
d750: 61 6c 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 72  al, u8 enc){.  r
d760: 65 74 75 72 6e 20 76 61 6c 75 65 54 6f 54 65 78  eturn valueToTex
d770: 74 28 70 56 61 6c 2c 20 65 6e 63 29 21 3d 30 20  t(pVal, enc)!=0 
d780: 3f 20 70 56 61 6c 2d 3e 6e 20 3a 20 30 3b 0a 7d  ? pVal->n : 0;.}
d790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75  .int sqlite3Valu
d7a0: 65 42 79 74 65 73 28 73 71 6c 69 74 65 33 5f 76  eBytes(sqlite3_v
d7b0: 61 6c 75 65 20 2a 70 56 61 6c 2c 20 75 38 20 65  alue *pVal, u8 e
d7c0: 6e 63 29 7b 0a 20 20 4d 65 6d 20 2a 70 20 3d 20  nc){.  Mem *p = 
d7d0: 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20 20 61 73  (Mem*)pVal;.  as
d7e0: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 20  sert( (p->flags 
d7f0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 7c  & MEM_Null)==0 |
d800: 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d  | (p->flags & (M
d810: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
d820: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  )==0 );.  if( (p
d830: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
d840: 72 29 21 3d 30 20 26 26 20 70 56 61 6c 2d 3e 65  r)!=0 && pVal->e
d850: 6e 63 3d 3d 65 6e 63 20 29 7b 0a 20 20 20 20 72  nc==enc ){.    r
d860: 65 74 75 72 6e 20 70 2d 3e 6e 3b 0a 20 20 7d 0a  eturn p->n;.  }.
d870: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
d880: 26 20 4d 45 4d 5f 42 6c 6f 62 29 21 3d 30 20 29  & MEM_Blob)!=0 )
d890: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61  {.    if( p->fla
d8a0: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
d8b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
d8c0: 3e 6e 20 2b 20 70 2d 3e 75 2e 6e 5a 65 72 6f 3b  >n + p->u.nZero;
d8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d8e0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 3b 0a 20    return p->n;. 
d8f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d900: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
d910: 6c 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ll ) return 0;. 
d920: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 42 79 74   return valueByt
d930: 65 73 28 70 56 61 6c 2c 20 65 6e 63 29 3b 0a 7d  es(pVal, enc);.}
d940: 0a                                               .