/ Hex Artifact Content
Login

Artifact 981a113405bd9b80aeb71fe246a2f01708e8a8f7:


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 6f 73 2e 68 22 0a 23 69 6e 63 6c 75  de "os.h".#inclu
0290: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e  de <ctype.h>.#in
02a0: 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68  clude "vdbeInt.h
02b0: 22 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d  "../*.** If pMem
02c0: 20 69 73 20 61 6e 20 6f 62 6a 65 63 74 20 77 69   is an object wi
02d0: 74 68 20 61 20 76 61 6c 69 64 20 73 74 72 69 6e  th a valid strin
02e0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
02f0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
0300: 2a 20 65 6e 73 75 72 65 73 20 74 68 65 20 69 6e  * ensures the in
0310: 74 65 72 6e 61 6c 20 65 6e 63 6f 64 69 6e 67 20  ternal encoding 
0320: 66 6f 72 20 74 68 65 20 73 74 72 69 6e 67 20 72  for the string r
0330: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
0340: 0a 2a 2a 20 27 64 65 73 69 72 65 64 45 6e 63 27  .** 'desiredEnc'
0350: 2c 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  , one of SQLITE_
0360: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 55 54 46  UTF8, SQLITE_UTF
0370: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
0380: 54 46 31 36 42 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  TF16BE..**.** If
0390: 20 70 4d 65 6d 20 69 73 20 6e 6f 74 20 61 20 73   pMem is not a s
03a0: 74 72 69 6e 67 20 6f 62 6a 65 63 74 2c 20 6f 72  tring object, or
03b0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
03c0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 72   the string.** r
03d0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
03e0: 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
03f0: 75 73 69 6e 67 20 74 68 65 20 72 65 71 75 65 73  using the reques
0400: 74 65 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ted encoding, th
0410: 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  en this.** routi
0420: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
0430: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
0440: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
0450: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20  e conversion is 
0460: 73 75 63 63 65 73 73 66 75 6c 20 28 6f 72 20 6e  successful (or n
0470: 6f 74 20 72 65 71 75 69 72 65 64 29 2e 0a 2a 2a  ot required)..**
0480: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
0490: 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 66  y be returned if
04a0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
04b0: 73 20 64 75 72 69 6e 67 20 63 6f 6e 76 65 72 73  s during convers
04c0: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 66  ion.** between f
04d0: 6f 72 6d 61 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ormats..*/.int s
04e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
04f0: 45 6e 63 6f 64 69 6e 67 28 4d 65 6d 20 2a 70 4d  Encoding(Mem *pM
0500: 65 6d 2c 20 69 6e 74 20 64 65 73 69 72 65 64 45  em, int desiredE
0510: 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nc){.  int rc;. 
0520: 20 69 66 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61   if( !(pMem->fla
0530: 67 73 26 4d 45 4d 5f 53 74 72 29 20 7c 7c 20 70  gs&MEM_Str) || p
0540: 4d 65 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65  Mem->enc==desire
0550: 64 45 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75  dEnc ){.    retu
0560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
0570: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
0580: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 72 65 74  OMIT_UTF16.  ret
0590: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
05a0: 3b 0a 23 65 6c 73 65 0a 0a 0a 20 20 2f 2a 20 4d  ;.#else...  /* M
05b0: 65 6d 54 72 61 6e 73 6c 61 74 65 28 29 20 6d 61  emTranslate() ma
05c0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
05d0: 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  OK or SQLITE_NOM
05e0: 45 4d 2e 20 49 66 20 4e 4f 4d 45 4d 20 69 73 20  EM. If NOMEM is 
05f0: 72 65 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74  returned,.  ** t
0600: 68 65 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  hen the encoding
0610: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6d 61   of the value ma
0620: 79 20 6e 6f 74 20 68 61 76 65 20 63 68 61 6e 67  y not have chang
0630: 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
0640: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72  sqlite3VdbeMemTr
0650: 61 6e 73 6c 61 74 65 28 70 4d 65 6d 2c 20 64 65  anslate(pMem, de
0660: 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 61 73 73  siredEnc);.  ass
0670: 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
0680: 4b 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  K    || rc==SQLI
0690: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 61 73 73  TE_NOMEM);.  ass
06a0: 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
06b0: 4b 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 65 6e  K    || pMem->en
06c0: 63 21 3d 64 65 73 69 72 65 64 45 6e 63 29 3b 0a  c!=desiredEnc);.
06d0: 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
06e0: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 4d 65  ITE_NOMEM || pMe
06f0: 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64 45  m->enc==desiredE
0700: 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
0710: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
0720: 2a 20 4d 61 6b 65 20 74 68 65 20 67 69 76 65 6e  * Make the given
0730: 20 4d 65 6d 20 6f 62 6a 65 63 74 20 4d 45 4d 5f   Mem object MEM_
0740: 44 79 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  Dyn..**.** Retur
0750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
0760: 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45  uccess or SQLITE
0770: 5f 4e 4f 4d 45 4d 20 69 66 20 6d 61 6c 6c 6f 63  _NOMEM if malloc
0780: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
0790: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 44 79 6e  qlite3VdbeMemDyn
07a0: 61 6d 69 63 69 66 79 28 4d 65 6d 20 2a 70 4d 65  amicify(Mem *pMe
07b0: 6d 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 4d  m){.  int n = pM
07c0: 65 6d 2d 3e 6e 3b 0a 20 20 75 38 20 2a 7a 3b 0a  em->n;.  u8 *z;.
07d0: 20 20 69 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61    if( (pMem->fla
07e0: 67 73 20 26 20 28 4d 45 4d 5f 45 70 68 65 6d 7c  gs & (MEM_Ephem|
07f0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
0800: 68 6f 72 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20  hort))==0 ){.   
0810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0820: 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
0830: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
0840: 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20  MEM_Dyn)==0 );. 
0850: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
0860: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
0870: 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 7a  MEM_Blob) );.  z
0880: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
0890: 61 77 28 20 6e 2b 32 20 29 3b 0a 20 20 69 66 28  aw( n+2 );.  if(
08a0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74   z==0 ){.    ret
08b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
08c0: 3b 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d 3e 66 6c  ;.  }.  pMem->fl
08d0: 61 67 73 20 7c 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  ags |= MEM_Dyn|M
08e0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4d 65 6d 2d  EM_Term;.  pMem-
08f0: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >xDel = 0;.  mem
0900: 63 70 79 28 7a 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  cpy(z, pMem->z, 
0910: 6e 20 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  n );.  z[n] = 0;
0920: 0a 20 20 7a 5b 6e 2b 31 5d 20 3d 20 30 3b 0a 20  .  z[n+1] = 0;. 
0930: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
0940: 2a 29 7a 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61  *)z;.  pMem->fla
0950: 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 45 70 68 65  gs &= ~(MEM_Ephe
0960: 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  m|MEM_Static|MEM
0970: 5f 53 68 6f 72 74 29 3b 0a 20 20 72 65 74 75 72  _Short);.  retur
0980: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
0990: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 67  /*.** Make the g
09a0: 69 76 65 6e 20 4d 65 6d 20 6f 62 6a 65 63 74 20  iven Mem object 
09b0: 65 69 74 68 65 72 20 4d 45 4d 5f 53 68 6f 72 74  either MEM_Short
09c0: 20 6f 72 20 4d 45 4d 5f 44 79 6e 20 73 6f 20 74   or MEM_Dyn so t
09d0: 68 61 74 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  hat bytes.** of 
09e0: 74 68 65 20 4d 65 6d 2e 7a 5b 5d 20 61 72 72 61  the Mem.z[] arra
09f0: 79 20 63 61 6e 20 62 65 20 6d 6f 64 69 66 69 65  y can be modifie
0a00: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
0a10: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
0a20: 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
0a30: 4f 4d 45 4d 20 69 66 20 6d 61 6c 6c 6f 63 20 66  OMEM if malloc f
0a40: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
0a50: 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57  ite3VdbeMemMakeW
0a60: 72 69 74 65 61 62 6c 65 28 4d 65 6d 20 2a 70 4d  riteable(Mem *pM
0a70: 65 6d 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  em){.  int n;.  
0a80: 75 38 20 2a 7a 3b 0a 20 20 69 66 28 20 28 70 4d  u8 *z;.  if( (pM
0a90: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  em->flags & (MEM
0aa0: 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69  _Ephem|MEM_Stati
0ab0: 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))==0 ){.    re
0ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0ad0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70    }.  assert( (p
0ae0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
0af0: 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 61 73  _Dyn)==0 );.  as
0b00: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  sert( pMem->flag
0b10: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
0b20: 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 69 66 28 20  _Blob) );.  if( 
0b30: 28 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 29 2b 32 3c  (n = pMem->n)+2<
0b40: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53 68  sizeof(pMem->zSh
0b50: 6f 72 74 29 20 29 7b 0a 20 20 20 20 7a 20 3d 20  ort) ){.    z = 
0b60: 28 75 38 2a 29 70 4d 65 6d 2d 3e 7a 53 68 6f 72  (u8*)pMem->zShor
0b70: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  t;.    pMem->fla
0b80: 67 73 20 7c 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c  gs |= MEM_Short|
0b90: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 65 6c 73  MEM_Term;.  }els
0ba0: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
0bb0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 2b 32 20  eMallocRaw( n+2 
0bc0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
0bd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0be0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0bf0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
0c00: 61 67 73 20 7c 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  ags |= MEM_Dyn|M
0c10: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65  EM_Term;.    pMe
0c20: 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d  m->xDel = 0;.  }
0c30: 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4d 65  .  memcpy(z, pMe
0c40: 6d 2d 3e 7a 2c 20 6e 20 29 3b 0a 20 20 7a 5b 6e  m->z, n );.  z[n
0c50: 5d 20 3d 20 30 3b 0a 20 20 7a 5b 6e 2b 31 5d 20  ] = 0;.  z[n+1] 
0c60: 3d 20 30 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d  = 0;.  pMem->z =
0c70: 20 28 63 68 61 72 2a 29 7a 3b 0a 20 20 70 4d 65   (char*)z;.  pMe
0c80: 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45  m->flags &= ~(ME
0c90: 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74  M_Ephem|MEM_Stat
0ca0: 69 63 29 3b 0a 20 20 61 73 73 65 72 74 28 30 3d  ic);.  assert(0=
0cb0: 3d 28 31 26 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a  =(1&(int)pMem->z
0cc0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
0cd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
0ce0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67   Make sure the g
0cf0: 69 76 65 6e 20 4d 65 6d 20 69 73 20 5c 75 30 30  iven Mem is \u00
0d00: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  00 terminated..*
0d10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0d20: 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65  eMemNulTerminate
0d30: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
0d40: 66 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  f( (pMem->flags 
0d50: 26 20 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 7c  & MEM_Term)!=0 |
0d60: 7c 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  | (pMem->flags &
0d70: 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
0d80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0d90: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 4e 6f 74 68 69  E_OK;   /* Nothi
0da0: 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 0a  ng to do */.  }.
0db0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
0dc0: 73 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  s & (MEM_Static|
0dd0: 4d 45 4d 5f 45 70 68 65 6d 29 20 29 7b 0a 20 20  MEM_Ephem) ){.  
0de0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0df0: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65  VdbeMemMakeWrite
0e00: 61 62 6c 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 65  able(pMem);.  }e
0e10: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
0e20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
0e30: 70 4d 65 6d 2d 3e 6e 2b 32 29 3b 0a 20 20 20 20  pMem->n+2);.    
0e40: 69 66 28 20 21 7a 20 29 20 72 65 74 75 72 6e 20  if( !z ) return 
0e50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0e60: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4d 65 6d    memcpy(z, pMem
0e70: 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  ->z, pMem->n);. 
0e80: 20 20 20 7a 5b 70 4d 65 6d 2d 3e 6e 5d 20 3d 20     z[pMem->n] = 
0e90: 30 3b 0a 20 20 20 20 7a 5b 70 4d 65 6d 2d 3e 6e  0;.    z[pMem->n
0ea0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  +1] = 0;.    if(
0eb0: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 7b 0a 20   pMem->xDel ){. 
0ec0: 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 28       pMem->xDel(
0ed0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  pMem->z);.    }e
0ee0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
0ef0: 65 46 72 65 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  eFree(pMem->z);.
0f00: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
0f10: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 70 4d  xDel = 0;.    pM
0f20: 65 6d 2d 3e 7a 20 3d 20 7a 3b 0a 20 20 20 20 70  em->z = z;.    p
0f30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Mem->flags |= ME
0f40: 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 72 65  M_Term;.  }.  re
0f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 4d 45 4d  }../*.** Add MEM
0f70: 5f 53 74 72 20 74 6f 20 74 68 65 20 73 65 74 20  _Str to the set 
0f80: 6f 66 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  of representatio
0f90: 6e 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ns for the given
0fa0: 20 4d 65 6d 2e 20 20 4e 75 6d 62 65 72 73 0a 2a   Mem.  Numbers.*
0fb0: 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  * are converted 
0fc0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 6e  using sqlite3_sn
0fd0: 70 72 69 6e 74 66 28 29 2e 20 20 43 6f 6e 76 65  printf().  Conve
0fe0: 72 74 69 6e 67 20 61 20 42 4c 4f 42 20 74 6f 20  rting a BLOB to 
0ff0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 61  a string.** is a
1000: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 45 78   no-op..**.** Ex
1010: 69 73 74 69 6e 67 20 72 65 70 72 65 73 65 6e 74  isting represent
1020: 61 74 69 6f 6e 73 20 4d 45 4d 5f 49 6e 74 20 61  ations MEM_Int a
1030: 6e 64 20 4d 45 4d 5f 52 65 61 6c 20 61 72 65 20  nd MEM_Real are 
1040: 2a 6e 6f 74 2a 20 69 6e 76 61 6c 69 64 61 74 65  *not* invalidate
1050: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 4d 45 4d 5f 4e  d..**.** A MEM_N
1060: 75 6c 6c 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e  ull value will n
1070: 65 76 65 72 20 62 65 20 70 61 73 73 65 64 20 74  ever be passed t
1080: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
1090: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10a0: 73 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 63 6f  s.** used for co
10b0: 6e 76 65 72 74 69 6e 67 20 76 61 6c 75 65 73 20  nverting values 
10c0: 74 6f 20 74 65 78 74 20 66 6f 72 20 72 65 74 75  to text for retu
10d0: 72 6e 69 6e 67 20 74 6f 20 74 68 65 20 75 73 65  rning to the use
10e0: 72 20 28 69 2e 65 2e 20 76 69 61 0a 2a 2a 20 73  r (i.e. via.** s
10f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
1100: 74 28 29 29 2c 20 6f 72 20 66 6f 72 20 65 6e 73  t()), or for ens
1110: 75 72 69 6e 67 20 74 68 61 74 20 76 61 6c 75 65  uring that value
1120: 73 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 20  s to be used as 
1130: 62 74 72 65 65 0a 2a 2a 20 6b 65 79 73 20 61 72  btree.** keys ar
1140: 65 20 73 74 72 69 6e 67 73 2e 20 49 6e 20 74 68  e strings. In th
1150: 65 20 66 6f 72 6d 65 72 20 63 61 73 65 20 61 20  e former case a 
1160: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20  NULL pointer is 
1170: 72 65 74 75 72 6e 65 64 20 74 68 65 0a 2a 2a 20  returned the.** 
1180: 75 73 65 72 20 61 6e 64 20 74 68 65 20 6c 61 74  user and the lat
1190: 65 72 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  er is an interna
11a0: 6c 20 70 72 6f 67 72 61 6d 6d 69 6e 67 20 65 72  l programming er
11b0: 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
11c0: 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
11d0: 69 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ify(Mem *pMem, i
11e0: 6e 74 20 65 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nt enc){.  int r
11f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1200: 20 69 6e 74 20 66 67 20 3d 20 70 4d 65 6d 2d 3e   int fg = pMem->
1210: 66 6c 61 67 73 3b 0a 20 20 63 68 61 72 20 2a 7a  flags;.  char *z
1220: 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 3b   = pMem->zShort;
1230: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 28 66 67  ..  assert( !(fg
1240: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
1250: 6f 62 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ob)) );.  assert
1260: 28 20 66 67 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  ( fg&(MEM_Int|ME
1270: 4d 5f 52 65 61 6c 29 20 29 3b 0a 0a 20 20 2f 2a  M_Real) );..  /*
1280: 20 46 6f 72 20 61 20 52 65 61 6c 20 6f 72 20 49   For a Real or I
1290: 6e 74 65 67 65 72 2c 20 75 73 65 20 73 71 6c 69  nteger, use sqli
12a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 74  te3_snprintf() t
12b0: 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 55 54  o produce the UT
12c0: 46 2d 38 0a 20 20 2a 2a 20 73 74 72 69 6e 67 20  F-8.  ** string 
12d0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
12e0: 66 20 74 68 65 20 76 61 6c 75 65 2e 20 54 68 65  f the value. The
12f0: 6e 2c 20 69 66 20 74 68 65 20 72 65 71 75 69 72  n, if the requir
1300: 65 64 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a  ed encoding.  **
1310: 20 69 73 20 55 54 46 2d 31 36 6c 65 20 6f 72 20   is UTF-16le or 
1320: 55 54 46 2d 31 36 62 65 20 64 6f 20 61 20 74 72  UTF-16be do a tr
1330: 61 6e 73 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2a 20  anslation..  ** 
1340: 0a 20 20 2a 2a 20 46 49 58 20 4d 45 3a 20 49 74  .  ** FIX ME: It
1350: 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65 72   would be better
1360: 20 69 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72   if sqlite3_snpr
1370: 69 6e 74 66 28 29 20 63 6f 75 6c 64 20 64 6f 20  intf() could do 
1380: 55 54 46 2d 31 36 2e 0a 20 20 2a 2f 0a 20 20 69  UTF-16..  */.  i
1390: 66 28 20 66 67 20 26 20 4d 45 4d 5f 49 6e 74 20  f( fg & MEM_Int 
13a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
13b0: 6e 70 72 69 6e 74 66 28 4e 42 46 53 2c 20 7a 2c  nprintf(NBFS, z,
13c0: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
13d0: 2e 69 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .i);.  }else{.  
13e0: 20 20 61 73 73 65 72 74 28 20 66 67 20 26 20 4d    assert( fg & M
13f0: 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 73  EM_Real );.    s
1400: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1410: 4e 42 46 53 2c 20 7a 2c 20 22 25 21 2e 31 35 67  NBFS, z, "%!.15g
1420: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 7d  ", pMem->r);.  }
1430: 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72  .  pMem->n = str
1440: 6c 65 6e 28 7a 29 3b 0a 20 20 70 4d 65 6d 2d 3e  len(z);.  pMem->
1450: 7a 20 3d 20 7a 3b 0a 20 20 70 4d 65 6d 2d 3e 65  z = z;.  pMem->e
1460: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
1470: 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  ;.  pMem->flags 
1480: 7c 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d  |= MEM_Str | MEM
1490: 5f 53 68 6f 72 74 20 7c 20 4d 45 4d 5f 54 65 72  _Short | MEM_Ter
14a0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
14b0: 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
14c0: 4d 65 6d 2c 20 65 6e 63 29 3b 0a 20 20 72 65 74  Mem, enc);.  ret
14d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14e0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 4d 65   Memory cell pMe
14f0: 6d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  m contains the c
1500: 6f 6e 74 65 78 74 20 6f 66 20 61 6e 20 61 67 67  ontext of an agg
1510: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
1520: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1530: 20 63 61 6c 6c 73 20 74 68 65 20 66 69 6e 61 6c   calls the final
1540: 69 7a 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  ize method for t
1550: 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  hat function.  T
1560: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20  he.** result of 
1570: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69 73  the aggregate is
1580: 20 73 74 6f 72 65 64 20 62 61 63 6b 20 69 6e 74   stored back int
1590: 6f 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65  o pMem..**.** Re
15a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
15b0: 52 20 69 66 20 74 68 65 20 66 69 6e 61 6c 69 7a  R if the finaliz
15c0: 65 72 20 72 65 70 6f 72 74 73 20 61 6e 20 65 72  er reports an er
15d0: 72 6f 72 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 0a  ror.  SQLITE_OK.
15e0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
15f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1600: 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 4d 65 6d 20  MemFinalize(Mem 
1610: 2a 70 4d 65 6d 2c 20 46 75 6e 63 44 65 66 20 2a  *pMem, FuncDef *
1620: 70 46 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  pFunc){.  int rc
1630: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1640: 69 66 28 20 70 46 75 6e 63 20 26 26 20 70 46 75  if( pFunc && pFu
1650: 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 29 7b  nc->xFinalize ){
1660: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
1670: 74 65 78 74 20 63 74 78 3b 0a 20 20 20 20 61 73  text ctx;.    as
1680: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
1690: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  gs & MEM_Null)!=
16a0: 30 20 7c 7c 20 70 46 75 6e 63 3d 3d 70 4d 65 6d  0 || pFunc==pMem
16b0: 2d 3e 75 2e 70 44 65 66 20 29 3b 0a 20 20 20 20  ->u.pDef );.    
16c0: 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45  ctx.s.flags = ME
16d0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 63 74 78 2e  M_Null;.    ctx.
16e0: 73 2e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f  s.z = pMem->zSho
16f0: 72 74 3b 0a 20 20 20 20 63 74 78 2e 70 4d 65 6d  rt;.    ctx.pMem
1700: 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 63 74 78   = pMem;.    ctx
1710: 2e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a  .pFunc = pFunc;.
1720: 20 20 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20      ctx.isError 
1730: 3d 20 30 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e  = 0;.    pFunc->
1740: 78 46 69 6e 61 6c 69 7a 65 28 26 63 74 78 29 3b  xFinalize(&ctx);
1750: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a  .    if( pMem->z
1760: 20 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65   && pMem->z!=pMe
1770: 6d 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20  m->zShort ){.   
1780: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
1790: 4d 65 6d 2d 3e 7a 20 29 3b 0a 20 20 20 20 7d 0a  Mem->z );.    }.
17a0: 20 20 20 20 2a 70 4d 65 6d 20 3d 20 63 74 78 2e      *pMem = ctx.
17b0: 73 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  s;.    if( pMem-
17c0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 68 6f  >flags & MEM_Sho
17d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  rt ){.      pMem
17e0: 2d 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 53 68 6f  ->z = pMem->zSho
17f0: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rt;.    }.    if
1800: 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b  ( ctx.isError ){
1810: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1820: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
1830: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1850: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 68 65 6c  e any memory hel
1860: 64 20 62 79 20 74 68 65 20 4d 65 6d 2e 20 54 68  d by the Mem. Th
1870: 69 73 20 6d 61 79 20 6c 65 61 76 65 20 74 68 65  is may leave the
1880: 20 4d 65 6d 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e   Mem in an.** in
1890: 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
18a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 77 69  , for example wi
18b0: 74 68 20 28 4d 65 6d 2e 7a 3d 3d 30 29 20 61 6e  th (Mem.z==0) an
18c0: 64 0a 2a 2a 20 28 4d 65 6d 2e 74 79 70 65 3d 3d  d.** (Mem.type==
18d0: 53 51 4c 49 54 45 5f 54 45 58 54 29 2e 0a 2a 2f  SQLITE_TEXT)..*/
18e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18f0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 4d 65 6d 20  eMemRelease(Mem 
1900: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c  *p){.  if( p->fl
1910: 61 67 73 20 26 20 28 4d 45 4d 5f 44 79 6e 7c 4d  ags & (MEM_Dyn|M
1920: 45 4d 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 69  EM_Agg) ){.    i
1930: 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20  f( p->xDel ){.  
1940: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
1950: 20 26 20 4d 45 4d 5f 41 67 67 20 29 7b 0a 20 20   & MEM_Agg ){.  
1960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1970: 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 2c 20  eMemFinalize(p, 
1980: 70 2d 3e 75 2e 70 44 65 66 29 3b 0a 20 20 20 20  p->u.pDef);.    
1990: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
19a0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 29  flags & MEM_Agg)
19b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
19c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
19d0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
19e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
19f0: 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a 29 70 2d  >xDel((void *)p-
1a00: 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >z);.      }.   
1a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1a20: 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a  liteFree(p->z);.
1a30: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
1a40: 20 30 3b 0a 20 20 20 20 70 2d 3e 78 44 65 6c 20   0;.    p->xDel 
1a50: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1a60: 2a 20 52 65 74 75 72 6e 20 73 6f 6d 65 20 6b 69  * Return some ki
1a70: 6e 64 20 6f 66 20 69 6e 74 65 67 65 72 20 76 61  nd of integer va
1a80: 6c 75 65 20 77 68 69 63 68 20 69 73 20 74 68 65  lue which is the
1a90: 20 62 65 73 74 20 77 65 20 63 61 6e 20 64 6f 0a   best we can do.
1aa0: 2a 2a 20 61 74 20 72 65 70 72 65 73 65 6e 74 69  ** at representi
1ab0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  ng the value tha
1ac0: 74 20 2a 70 4d 65 6d 20 64 65 73 63 72 69 62 65  t *pMem describe
1ad0: 73 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  s as an integer.
1ae0: 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 61  .** If pMem is a
1af0: 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  n integer, then 
1b00: 74 68 65 20 76 61 6c 75 65 20 69 73 20 65 78 61  the value is exa
1b10: 63 74 2e 20 20 49 66 20 70 4d 65 6d 20 69 73 0a  ct.  If pMem is.
1b20: 2a 2a 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  ** a floating-po
1b30: 69 6e 74 20 74 68 65 6e 20 74 68 65 20 76 61 6c  int then the val
1b40: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
1b50: 68 65 20 69 6e 74 65 67 65 72 20 70 61 72 74 2e  he integer part.
1b60: 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 61  .** If pMem is a
1b70: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c   string or blob,
1b80: 20 74 68 65 6e 20 77 65 20 6d 61 6b 65 20 61 6e   then we make an
1b90: 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76   attempt to conv
1ba0: 65 72 74 0a 2a 2a 20 69 74 20 69 6e 74 6f 20 61  ert.** it into a
1bb0: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
1bc0: 75 72 6e 20 74 68 61 74 2e 20 20 49 66 20 70 4d  urn that.  If pM
1bd0: 65 6d 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75  em is NULL, retu
1be0: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rn 0..**.** If p
1bf0: 4d 65 6d 20 69 73 20 61 20 73 74 72 69 6e 67 2c  Mem is a string,
1c00: 20 69 74 73 20 65 6e 63 6f 64 69 6e 67 20 6d 69   its encoding mi
1c10: 67 68 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ght be changed..
1c20: 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 56 64  */.i64 sqlite3Vd
1c30: 62 65 49 6e 74 56 61 6c 75 65 28 4d 65 6d 20 2a  beIntValue(Mem *
1c40: 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pMem){.  int fla
1c50: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
1c60: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
1c70: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 72  MEM_Int ){.    r
1c80: 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 75 2e 69 3b  eturn pMem->u.i;
1c90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
1ca0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
1cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34  .    return (i64
1cc0: 29 70 4d 65 6d 2d 3e 72 3b 0a 20 20 7d 65 6c 73  )pMem->r;.  }els
1cd0: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 4d  e if( flags & (M
1ce0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1cf0: 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   ){.    i64 valu
1d00: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
1d10: 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f  e3VdbeChangeEnco
1d20: 64 69 6e 67 28 70 4d 65 6d 2c 20 53 51 4c 49 54  ding(pMem, SQLIT
1d30: 45 5f 55 54 46 38 29 0a 20 20 20 20 20 20 20 7c  E_UTF8).       |
1d40: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  | sqlite3VdbeMem
1d50: 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 70 4d 65  NulTerminate(pMe
1d60: 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
1d70: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1d80: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 20  assert( pMem->z 
1d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 61 74  );.    sqlite3at
1da0: 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 76  oi64(pMem->z, &v
1db0: 61 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72  alue);.    retur
1dc0: 6e 20 76 61 6c 75 65 3b 0a 20 20 7d 65 6c 73 65  n value;.  }else
1dd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1de0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1df0: 75 72 6e 20 74 68 65 20 62 65 73 74 20 72 65 70  urn the best rep
1e00: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
1e10: 4d 65 6d 20 74 68 61 74 20 77 65 20 63 61 6e 20  Mem that we can 
1e20: 67 65 74 20 69 6e 74 6f 20 61 0a 2a 2a 20 64 6f  get into a.** do
1e30: 75 62 6c 65 2e 20 20 49 66 20 70 4d 65 6d 20 69  uble.  If pMem i
1e40: 73 20 61 6c 72 65 61 64 79 20 61 20 64 6f 75 62  s already a doub
1e50: 6c 65 20 6f 72 20 61 6e 20 69 6e 74 65 67 65 72  le or an integer
1e60: 2c 20 72 65 74 75 72 6e 20 69 74 73 0a 2a 2a 20  , return its.** 
1e70: 76 61 6c 75 65 2e 20 20 49 66 20 69 74 20 69 73  value.  If it is
1e80: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f   a string or blo
1e90: 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72  b, try to conver
1ea0: 74 20 69 74 20 74 6f 20 61 20 64 6f 75 62 6c 65  t it to a double
1eb0: 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 61 20  ..** If it is a 
1ec0: 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 30  NULL, return 0.0
1ed0: 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20 73 71 6c 69  ..*/.double sqli
1ee0: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
1ef0: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
1f00: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
1f10: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1f20: 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 72 3b   return pMem->r;
1f30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65  .  }else if( pMe
1f40: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
1f50: 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
1f60: 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75   (double)pMem->u
1f70: 2e 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  .i;.  }else if( 
1f80: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
1f90: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
1fa0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76   ){.    double v
1fb0: 61 6c 20 3d 20 30 2e 30 3b 0a 20 20 20 20 69 66  al = 0.0;.    if
1fc0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ( sqlite3VdbeCha
1fd0: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d  ngeEncoding(pMem
1fe0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 20  , SQLITE_UTF8). 
1ff0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2000: 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e  VdbeMemNulTermin
2010: 61 74 65 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20  ate(pMem) ){.   
2020: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
2030: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2040: 20 70 4d 65 6d 2d 3e 7a 20 29 3b 0a 20 20 20 20   pMem->z );.    
2050: 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65 6d  sqlite3AtoF(pMem
2060: 2d 3e 7a 2c 20 26 76 61 6c 29 3b 0a 20 20 20 20  ->z, &val);.    
2070: 72 65 74 75 72 6e 20 76 61 6c 3b 0a 20 20 7d 65  return val;.  }e
2080: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2090: 30 2e 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0.0;.  }.}../*.*
20a0: 2a 20 54 68 65 20 4d 45 4d 20 73 74 72 75 63 74  * The MEM struct
20b0: 75 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ure is already a
20c0: 20 4d 45 4d 5f 52 65 61 6c 2e 20 20 54 72 79 20   MEM_Real.  Try 
20d0: 74 6f 20 61 6c 73 6f 20 6d 61 6b 65 20 69 74 20  to also make it 
20e0: 61 0a 2a 2a 20 4d 45 4d 5f 49 6e 74 20 69 66 20  a.** MEM_Int if 
20f0: 77 65 20 63 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  we can..*/.void 
2100: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67  sqlite3VdbeInteg
2110: 65 72 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a  erAffinity(Mem *
2120: 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28  pMem){.  assert(
2130: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
2140: 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 70 4d 65  EM_Real );.  pMe
2150: 6d 2d 3e 75 2e 69 20 3d 20 70 4d 65 6d 2d 3e 72  m->u.i = pMem->r
2160: 3b 0a 20 20 69 66 28 20 28 28 64 6f 75 62 6c 65  ;.  if( ((double
2170: 29 70 4d 65 6d 2d 3e 75 2e 69 29 3d 3d 70 4d 65  )pMem->u.i)==pMe
2180: 6d 2d 3e 72 20 29 7b 0a 20 20 20 20 70 4d 65 6d  m->r ){.    pMem
2190: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 49  ->flags |= MEM_I
21a0: 6e 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt;.  }.}../*.**
21b0: 20 43 6f 6e 76 65 72 74 20 70 4d 65 6d 20 74 6f   Convert pMem to
21c0: 20 74 79 70 65 20 69 6e 74 65 67 65 72 2e 20 20   type integer.  
21d0: 49 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  Invalidate any p
21e0: 72 69 6f 72 20 72 65 70 72 65 73 65 6e 74 61 74  rior representat
21f0: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
2200: 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
2210: 65 72 69 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29  erify(Mem *pMem)
2220: 7b 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20  {.  pMem->u.i = 
2230: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
2240: 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c  lue(pMem);.  sql
2250: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
2260: 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d  se(pMem);.  pMem
2270: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
2280: 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
2290: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22a0: 43 6f 6e 76 65 72 74 20 70 4d 65 6d 20 73 6f 20  Convert pMem so 
22b0: 74 68 61 74 20 69 74 20 69 73 20 6f 66 20 74 79  that it is of ty
22c0: 70 65 20 4d 45 4d 5f 52 65 61 6c 2e 0a 2a 2a 20  pe MEM_Real..** 
22d0: 49 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  Invalidate any p
22e0: 72 69 6f 72 20 72 65 70 72 65 73 65 6e 74 61 74  rior representat
22f0: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
2300: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69  ite3VdbeMemReali
2310: 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  fy(Mem *pMem){. 
2320: 20 70 4d 65 6d 2d 3e 72 20 3d 20 73 71 6c 69 74   pMem->r = sqlit
2330: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
2340: 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  pMem);.  sqlite3
2350: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
2360: 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c  Mem);.  pMem->fl
2370: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
2380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OK;.}../*.** Con
23a0: 76 65 72 74 20 70 4d 65 6d 20 73 6f 20 74 68 61  vert pMem so tha
23b0: 74 20 69 74 20 68 61 73 20 74 79 70 65 73 20 4d  t it has types M
23c0: 45 4d 5f 52 65 61 6c 20 6f 72 20 4d 45 4d 5f 49  EM_Real or MEM_I
23d0: 6e 74 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 49  nt or both..** I
23e0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72  nvalidate any pr
23f0: 69 6f 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ior representati
2400: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
2410: 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69  te3VdbeMemNumeri
2420: 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  fy(Mem *pMem){. 
2430: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
2440: 65 61 6c 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20  ealify(pMem);.  
2450: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67  sqlite3VdbeInteg
2460: 65 72 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 29  erAffinity(pMem)
2470: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2480: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
2490: 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76 69 6f  elete any previo
24a0: 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73 65 74  us value and set
24b0: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
24c0: 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20 4e 55  d in *pMem to NU
24d0: 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  LL..*/.void sqli
24e0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
24f0: 6c 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20  l(Mem *pMem){.  
2500: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
2510: 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70  lease(pMem);.  p
2520: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
2530: 5f 4e 75 6c 6c 3b 0a 20 20 70 4d 65 6d 2d 3e 74  _Null;.  pMem->t
2540: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
2550: 4c 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30  L;.  pMem->n = 0
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2570: 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 20 76  e any previous v
2580: 61 6c 75 65 20 61 6e 64 20 73 65 74 20 74 68 65  alue and set the
2590: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
25a0: 20 2a 70 4d 65 6d 20 74 6f 20 76 61 6c 2c 0a 2a   *pMem to val,.*
25b0: 2a 20 6d 61 6e 69 66 65 73 74 20 74 79 70 65 20  * manifest type 
25c0: 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a 76 6f 69 64  INTEGER..*/.void
25d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
25e0: 65 74 49 6e 74 36 34 28 4d 65 6d 20 2a 70 4d 65  etInt64(Mem *pMe
25f0: 6d 2c 20 69 36 34 20 76 61 6c 29 7b 0a 20 20 73  m, i64 val){.  s
2600: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
2610: 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d  ease(pMem);.  pM
2620: 65 6d 2d 3e 75 2e 69 20 3d 20 76 61 6c 3b 0a 20  em->u.i = val;. 
2630: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
2640: 45 4d 5f 49 6e 74 3b 0a 20 20 70 4d 65 6d 2d 3e  EM_Int;.  pMem->
2650: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
2660: 54 45 47 45 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TEGER;.}../*.** 
2670: 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76 69  Delete any previ
2680: 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73 65  ous value and se
2690: 74 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  t the value stor
26a0: 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20 76  ed in *pMem to v
26b0: 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73 74 20  al,.** manifest 
26c0: 74 79 70 65 20 52 45 41 4c 2e 0a 2a 2f 0a 76 6f  type REAL..*/.vo
26d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  id sqlite3VdbeMe
26e0: 6d 53 65 74 44 6f 75 62 6c 65 28 4d 65 6d 20 2a  mSetDouble(Mem *
26f0: 70 4d 65 6d 2c 20 64 6f 75 62 6c 65 20 76 61 6c  pMem, double val
2700: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2710: 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
2720: 3b 0a 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 76 61  ;.  pMem->r = va
2730: 6c 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  l;.  pMem->flags
2740: 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 70   = MEM_Real;.  p
2750: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
2760: 54 45 5f 46 4c 4f 41 54 3b 0a 7d 0a 0a 2f 2a 0a  TE_FLOAT;.}../*.
2770: 2a 2a 20 4d 61 6b 65 20 61 6e 20 73 68 61 6c 6c  ** Make an shall
2780: 6f 77 20 63 6f 70 79 20 6f 66 20 70 46 72 6f 6d  ow copy of pFrom
2790: 20 69 6e 74 6f 20 70 54 6f 2e 20 20 50 72 69 6f   into pTo.  Prio
27a0: 72 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a  r contents of.**
27b0: 20 70 54 6f 20 61 72 65 20 6f 76 65 72 77 72 69   pTo are overwri
27c0: 74 74 65 6e 2e 20 20 54 68 65 20 70 46 72 6f 6d  tten.  The pFrom
27d0: 2d 3e 7a 20 66 69 65 6c 64 20 69 73 20 6e 6f 74  ->z field is not
27e0: 20 64 75 70 6c 69 63 61 74 65 64 2e 20 20 49 66   duplicated.  If
27f0: 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 7a 20 69 73 20  .** pFrom->z is 
2800: 75 73 65 64 2c 20 74 68 65 6e 20 70 54 6f 2d 3e  used, then pTo->
2810: 7a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  z points to the 
2820: 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 70 46  same thing as pF
2830: 72 6f 6d 2d 3e 7a 0a 2a 2a 20 61 6e 64 20 66 6c  rom->z.** and fl
2840: 61 67 73 20 67 65 74 73 20 73 72 63 54 79 70 65  ags gets srcType
2850: 20 28 65 69 74 68 65 72 20 4d 45 4d 5f 45 70 68   (either MEM_Eph
2860: 65 6d 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69 63  em or MEM_Static
2870: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
2880: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
2890: 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c 20 63  Copy(Mem *pTo, c
28a0: 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f 6d 2c  onst Mem *pFrom,
28b0: 20 69 6e 74 20 73 72 63 54 79 70 65 29 7b 0a 20   int srcType){. 
28c0: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
28d0: 6f 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 46 72 6f  om, sizeof(*pFro
28e0: 6d 29 2d 73 69 7a 65 6f 66 28 70 46 72 6f 6d 2d  m)-sizeof(pFrom-
28f0: 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 70 54 6f  >zShort));.  pTo
2900: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69 66  ->xDel = 0;.  if
2910: 28 20 70 54 6f 2d 3e 66 6c 61 67 73 20 26 20 28  ( pTo->flags & (
2920: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
2930: 29 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 66 6c  ) ){.    pTo->fl
2940: 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 44 79 6e  ags &= ~(MEM_Dyn
2950: 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  |MEM_Static|MEM_
2960: 53 68 6f 72 74 7c 4d 45 4d 5f 45 70 68 65 6d 29  Short|MEM_Ephem)
2970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 72  ;.    assert( sr
2980: 63 54 79 70 65 3d 3d 4d 45 4d 5f 45 70 68 65 6d  cType==MEM_Ephem
2990: 20 7c 7c 20 73 72 63 54 79 70 65 3d 3d 4d 45 4d   || srcType==MEM
29a0: 5f 53 74 61 74 69 63 20 29 3b 0a 20 20 20 20 70  _Static );.    p
29b0: 54 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 73 72 63  To->flags |= src
29c0: 54 79 70 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Type;.  }.}../*.
29d0: 2a 2a 20 4d 61 6b 65 20 61 20 66 75 6c 6c 20 63  ** Make a full c
29e0: 6f 70 79 20 6f 66 20 70 46 72 6f 6d 20 69 6e 74  opy of pFrom int
29f0: 6f 20 70 54 6f 2e 20 20 50 72 69 6f 72 20 63 6f  o pTo.  Prior co
2a00: 6e 74 65 6e 74 73 20 6f 66 20 70 54 6f 20 61 72  ntents of pTo ar
2a10: 65 0a 2a 2a 20 66 72 65 65 64 20 62 65 66 6f 72  e.** freed befor
2a20: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 6d 61  e the copy is ma
2a30: 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
2a40: 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 4d 65  e3VdbeMemCopy(Me
2a50: 6d 20 2a 70 54 6f 2c 20 63 6f 6e 73 74 20 4d 65  m *pTo, const Me
2a60: 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74  m *pFrom){.  int
2a70: 20 72 63 3b 0a 20 20 69 66 28 20 70 54 6f 2d 3e   rc;.  if( pTo->
2a80: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
2a90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2aa0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 54 6f  beMemRelease(pTo
2ab0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2ac0: 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
2ad0: 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 4d  py(pTo, pFrom, M
2ae0: 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 69 66 28  EM_Ephem);.  if(
2af0: 20 70 54 6f 2d 3e 66 6c 61 67 73 20 26 20 4d 45   pTo->flags & ME
2b00: 4d 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 72  M_Ephem ){.    r
2b10: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
2b20: 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28  emMakeWriteable(
2b30: 70 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pTo);.  }else{. 
2b40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b50: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2b60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  rc;.}../*.** Tra
2b70: 6e 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e  nsfer the conten
2b80: 74 73 20 6f 66 20 70 46 72 6f 6d 20 74 6f 20 70  ts of pFrom to p
2b90: 54 6f 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67  To. Any existing
2ba0: 20 76 61 6c 75 65 20 69 6e 20 70 54 6f 20 69 73   value in pTo is
2bb0: 0a 2a 2a 20 66 72 65 65 64 2e 20 49 66 20 70 46  .** freed. If pF
2bc0: 72 6f 6d 20 63 6f 6e 74 61 69 6e 73 20 65 70 68  rom contains eph
2bd0: 65 6d 65 72 61 6c 20 64 61 74 61 2c 20 61 20 63  emeral data, a c
2be0: 6f 70 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2a 0a  opy is made..**.
2bf0: 2a 2a 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  ** pFrom contain
2c00: 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 77 68  s an SQL NULL wh
2c10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2c20: 72 65 74 75 72 6e 73 2e 20 20 53 51 4c 49 54 45  returns.  SQLITE
2c30: 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6d 69 67 68 74 20  _NOMEM.** might 
2c40: 62 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 70  be returned if p
2c50: 46 72 6f 6d 20 68 65 6c 64 20 65 70 68 65 6d 65  From held epheme
2c60: 72 61 6c 20 64 61 74 61 20 61 6e 64 20 77 65 20  ral data and we 
2c70: 77 65 72 65 20 75 6e 61 62 6c 65 0a 2a 2a 20 74  were unable.** t
2c80: 6f 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67  o allocate enoug
2c90: 68 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  h space to make 
2ca0: 61 20 63 6f 70 79 2e 0a 2a 2f 0a 69 6e 74 20 73  a copy..*/.int s
2cb0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
2cc0: 65 28 4d 65 6d 20 2a 70 54 6f 2c 20 4d 65 6d 20  e(Mem *pTo, Mem 
2cd0: 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
2ce0: 63 3b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 66 6c  c;.  if( pTo->fl
2cf0: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b  ags & MEM_Dyn ){
2d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2d10: 4d 65 6d 52 65 6c 65 61 73 65 28 70 54 6f 29 3b  MemRelease(pTo);
2d20: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54  .  }.  memcpy(pT
2d30: 6f 2c 20 70 46 72 6f 6d 2c 20 73 69 7a 65 6f 66  o, pFrom, sizeof
2d40: 28 4d 65 6d 29 29 3b 0a 20 20 69 66 28 20 70 46  (Mem));.  if( pF
2d50: 72 6f 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  rom->flags & MEM
2d60: 5f 53 68 6f 72 74 20 29 7b 0a 20 20 20 20 70 54  _Short ){.    pT
2d70: 6f 2d 3e 7a 20 3d 20 70 54 6f 2d 3e 7a 53 68 6f  o->z = pTo->zSho
2d80: 72 74 3b 0a 20 20 7d 0a 20 20 70 46 72 6f 6d 2d  rt;.  }.  pFrom-
2d90: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
2da0: 6c 3b 0a 20 20 70 46 72 6f 6d 2d 3e 78 44 65 6c  l;.  pFrom->xDel
2db0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 6f 2d   = 0;.  if( pTo-
2dc0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45 70 68  >flags & MEM_Eph
2dd0: 65 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  em ){.    rc = s
2de0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b  qlite3VdbeMemMak
2df0: 65 57 72 69 74 65 61 62 6c 65 28 70 54 6f 29 3b  eWriteable(pTo);
2e00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2e10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2e40: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 4d 65  he value of a Me
2e50: 6d 20 74 6f 20 62 65 20 61 20 73 74 72 69 6e 67  m to be a string
2e60: 20 6f 72 20 61 20 42 4c 4f 42 2e 0a 2a 2f 0a 69   or a BLOB..*/.i
2e70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
2e80: 6d 53 65 74 53 74 72 28 0a 20 20 4d 65 6d 20 2a  mSetStr(.  Mem *
2e90: 70 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20 2f  pMem,          /
2ea0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
2eb0: 20 73 65 74 20 74 6f 20 73 74 72 69 6e 67 20 76   set to string v
2ec0: 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  alue */.  const 
2ed0: 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 2f 2a  char *z,      /*
2ee0: 20 53 74 72 69 6e 67 20 70 6f 69 6e 74 65 72 20   String pointer 
2ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
2f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2f10: 73 20 69 6e 20 73 74 72 69 6e 67 2c 20 6f 72 20  s in string, or 
2f20: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 75 38  negative */.  u8
2f30: 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20   enc,           
2f40: 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 6f 66    /* Encoding of
2f50: 20 7a 2e 20 20 30 20 66 6f 72 20 42 4c 4f 42 73   z.  0 for BLOBs
2f60: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
2f70: 6c 29 28 76 6f 69 64 2a 29 20 2f 2a 20 44 65 73  l)(void*) /* Des
2f80: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
2f90: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2fa0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
2fb0: 4d 65 6d 29 3b 0a 20 20 69 66 28 20 21 7a 20 29  Mem);.  if( !z )
2fc0: 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  {.    pMem->flag
2fd0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
2fe0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
2ff0: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
3000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3010: 3b 0a 20 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 7a  ;.  }..  pMem->z
3020: 20 3d 20 28 63 68 61 72 20 2a 29 7a 3b 0a 20 20   = (char *)z;.  
3030: 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c 49 54 45  if( xDel==SQLITE
3040: 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20 70  _STATIC ){.    p
3050: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
3060: 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65 6c 73 65  _Static;.  }else
3070: 20 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c 49 54   if( xDel==SQLIT
3080: 45 5f 54 52 41 4e 53 49 45 4e 54 20 29 7b 0a 20  E_TRANSIENT ){. 
3090: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
30a0: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 7d 65   MEM_Ephem;.  }e
30b0: 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  lse{.    pMem->f
30c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 3b 0a  lags = MEM_Dyn;.
30d0: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
30e0: 20 78 44 65 6c 3b 0a 20 20 7d 0a 0a 20 20 70 4d   xDel;.  }..  pM
30f0: 65 6d 2d 3e 65 6e 63 20 3d 20 65 6e 63 3b 0a 20  em->enc = enc;. 
3100: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 65 6e   pMem->type = en
3110: 63 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 42 4c  c==0 ? SQLITE_BL
3120: 4f 42 20 3a 20 53 51 4c 49 54 45 5f 54 45 58 54  OB : SQLITE_TEXT
3130: 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6e 3b  ;.  pMem->n = n;
3140: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63 3d  ..  assert( enc=
3150: 3d 30 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54  =0 || enc==SQLIT
3160: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 3d 3d 53  E_UTF8 || enc==S
3170: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 0a 20  QLITE_UTF16LE . 
3180: 20 20 20 20 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c       || enc==SQL
3190: 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20  ITE_UTF16BE );. 
31a0: 20 73 77 69 74 63 68 28 20 65 6e 63 20 29 7b 0a   switch( enc ){.
31b0: 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
31c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d    pMem->flags |=
31d0: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
31e0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
31f0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
3200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
3210: 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20   SQLITE_UTF8:.  
3220: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
3230: 7c 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20  |= MEM_Str;.    
3240: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
3250: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
3260: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20  trlen(z);.      
3270: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d    pMem->flags |=
3280: 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20   MEM_Term;.     
3290: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
32a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32b0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 63  OMIT_UTF16.    c
32c0: 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
32d0: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LE:.    case SQL
32e0: 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20  ITE_UTF16BE:.   
32f0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c     pMem->flags |
3300: 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
3310: 20 69 66 28 20 70 4d 65 6d 2d 3e 6e 3c 30 20 29   if( pMem->n<0 )
3320: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
3330: 6e 20 3d 20 73 71 6c 69 74 65 33 75 74 66 31 36  n = sqlite3utf16
3340: 42 79 74 65 4c 65 6e 28 70 4d 65 6d 2d 3e 7a 2c  ByteLen(pMem->z,
3350: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  -1);.        pMe
3360: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  m->flags |= MEM_
3370: 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
3380: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
3390: 64 62 65 4d 65 6d 48 61 6e 64 6c 65 42 6f 6d 28  dbeMemHandleBom(
33a0: 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  pMem) ){.       
33b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
33c0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 23 65  OMEM;.      }.#e
33d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
33e0: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 7d  MIT_UTF16 */.  }
33f0: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  .  if( pMem->fla
3400: 67 73 26 4d 45 4d 5f 45 70 68 65 6d 20 29 7b 0a  gs&MEM_Ephem ){.
3410: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
3420: 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69  e3VdbeMemMakeWri
3430: 74 65 61 62 6c 65 28 70 4d 65 6d 29 3b 0a 20 20  teable(pMem);.  
3440: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
3450: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
3460: 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
3470: 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
3480: 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
3490: 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
34a0: 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
34b0: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
34c0: 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
34d0: 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
34e0: 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
34f0: 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
3500: 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
3510: 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
3520: 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
3530: 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
3540: 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
3550: 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
3560: 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
3570: 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
3580: 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
3590: 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
35a0: 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
35b0: 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
35c0: 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
35d0: 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
35e0: 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
35f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
3600: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
3610: 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
3620: 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
3630: 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
3640: 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
3650: 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 31 2c 20  t rc;.  int f1, 
3660: 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
3670: 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  ed_flags;..  /* 
3680: 49 6e 74 65 72 63 68 61 6e 67 65 20 70 4d 65 6d  Interchange pMem
3690: 31 20 61 6e 64 20 70 4d 65 6d 32 20 69 66 20 74  1 and pMem2 if t
36a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
36b0: 75 65 6e 63 65 20 73 70 65 63 69 66 69 65 73 0a  uence specifies.
36c0: 20 20 2a 2a 20 44 45 53 43 20 6f 72 64 65 72 2e    ** DESC order.
36d0: 0a 20 20 2a 2f 0a 20 20 66 31 20 3d 20 70 4d 65  .  */.  f1 = pMe
36e0: 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20  m1->flags;.  f2 
36f0: 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a  = pMem2->flags;.
3700: 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73    combined_flags
3710: 20 3d 20 66 31 7c 66 32 3b 0a 20 0a 20 20 2f 2a   = f1|f2;. .  /*
3720: 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
3730: 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
3740: 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
3750: 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
3760: 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
3770: 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
3780: 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
3790: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
37a0: 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
37b0: 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
37c0: 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
37d0: 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
37e0: 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64   is a number and
37f0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
3800: 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73  t, the number is
3810: 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
3820: 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c  oth are numbers,
3830: 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c   compare as real
3840: 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65  s if one is a re
3850: 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65  al, or as intege
3860: 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20  rs.  ** if both 
3870: 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67  values are integ
3880: 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
3890: 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
38a0: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
38b0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 21 28 66  ) ){.    if( !(f
38c0: 31 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  1&(MEM_Int|MEM_R
38d0: 65 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72  eal)) ){.      r
38e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
38f0: 20 20 20 69 66 28 20 21 28 66 32 26 28 4d 45 4d     if( !(f2&(MEM
3900: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 20  _Int|MEM_Real)) 
3910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3920: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
3930: 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
3940: 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
3950: 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b    double r1, r2;
3960: 0a 20 20 20 20 20 20 69 66 28 20 28 66 31 26 4d  .      if( (f1&M
3970: 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Real)==0 ){. 
3980: 20 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d         r1 = pMem
3990: 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 65  1->u.i;.      }e
39a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
39b0: 3d 20 70 4d 65 6d 31 2d 3e 72 3b 0a 20 20 20 20  = pMem1->r;.    
39c0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 66    }.      if( (f
39d0: 32 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29  2&MEM_Real)==0 )
39e0: 7b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 70  {.        r2 = p
39f0: 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  Mem2->u.i;.     
3a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3a10: 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20  r2 = pMem2->r;. 
3a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3a30: 20 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20   r1<r2 ) return 
3a40: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31  -1;.      if( r1
3a50: 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  >r2 ) return 1;.
3a60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3a70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3a80: 20 61 73 73 65 72 74 28 20 66 31 26 4d 45 4d 5f   assert( f1&MEM_
3a90: 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Int );.      ass
3aa0: 65 72 74 28 20 66 32 26 4d 45 4d 5f 49 6e 74 20  ert( f2&MEM_Int 
3ab0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  );.      if( pMe
3ac0: 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
3ad0: 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
3ae0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
3af0: 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
3b00: 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  u.i ) return 1;.
3b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3b20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3b30: 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
3b40: 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
3b50: 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
3b60: 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
3b70: 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
3b80: 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
3b90: 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
3ba0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
3bb0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
3bc0: 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
3bd0: 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
3be0: 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
3bf0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
3c00: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
3c10: 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
3c20: 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
3c30: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
3c40: 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
3c50: 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
3c60: 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73  2->enc );.    as
3c70: 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
3c80: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
3c90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
3ca0: 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
3cb0: 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
3cc0: 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
3cd0: 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
3ce0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
3cf0: 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
3d00: 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
3d10: 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
3d20: 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
3d30: 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
3d40: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
3d50: 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
3d60: 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
3d70: 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
3d80: 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
3d90: 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
3da0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
3db0: 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
3dc0: 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
3dd0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  oll ){.      if(
3de0: 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f   pMem1->enc==pCo
3df0: 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20  ll->enc ){.     
3e00: 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
3e10: 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
3e20: 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
3e30: 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
3e40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  .        ** comp
3e50: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
3e60: 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
3e70: 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
3e80: 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
3e90: 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
3ea0: 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
3eb0: 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  Mem2->z);.      
3ec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
3ed0: 38 20 6f 72 69 67 45 6e 63 20 3d 20 70 4d 65 6d  8 origEnc = pMem
3ee0: 31 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  1->enc;.        
3ef0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
3f00: 2a 76 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *v2;.        int
3f10: 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 20 20 20   n1, n2;.       
3f20: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
3f30: 73 74 72 69 6e 67 73 20 69 6e 74 6f 20 74 68 65  strings into the
3f40: 20 65 6e 63 6f 64 69 6e 67 20 74 68 61 74 20 74   encoding that t
3f50: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
3f60: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
3f70: 6e 20 65 78 70 65 63 74 73 20 2a 2f 0a 20 20 20  n expects */.   
3f80: 20 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65       v1 = sqlite
3f90: 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
3fa0: 74 65 33 5f 76 61 6c 75 65 2a 29 70 4d 65 6d 31  te3_value*)pMem1
3fb0: 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
3fc0: 20 20 20 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d         n1 = v1==
3fd0: 30 20 3f 20 30 20 3a 20 70 4d 65 6d 31 2d 3e 6e  0 ? 0 : pMem1->n
3fe0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3ff0: 28 20 6e 31 3d 3d 73 71 6c 69 74 65 33 56 61 6c  ( n1==sqlite3Val
4000: 75 65 42 79 74 65 73 28 28 73 71 6c 69 74 65 33  ueBytes((sqlite3
4010: 5f 76 61 6c 75 65 2a 29 70 4d 65 6d 31 2c 20 70  _value*)pMem1, p
4020: 43 6f 6c 6c 2d 3e 65 6e 63 29 20 29 3b 0a 20 20  Coll->enc) );.  
4030: 20 20 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74        v2 = sqlit
4040: 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
4050: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 4d 65 6d  ite3_value*)pMem
4060: 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  2, pColl->enc);.
4070: 20 20 20 20 20 20 20 20 6e 32 20 3d 20 76 32 3d          n2 = v2=
4080: 3d 30 20 3f 20 30 20 3a 20 70 4d 65 6d 32 2d 3e  =0 ? 0 : pMem2->
4090: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
40a0: 74 28 20 6e 32 3d 3d 73 71 6c 69 74 65 33 56 61  t( n2==sqlite3Va
40b0: 6c 75 65 42 79 74 65 73 28 28 73 71 6c 69 74 65  lueBytes((sqlite
40c0: 33 5f 76 61 6c 75 65 2a 29 70 4d 65 6d 32 2c 20  3_value*)pMem2, 
40d0: 70 43 6f 6c 6c 2d 3e 65 6e 63 29 20 29 3b 0a 20  pColl->enc) );. 
40e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 74 68 65         /* Do the
40f0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20   comparison */. 
4100: 20 20 20 20 20 20 20 72 63 20 3d 20 70 43 6f 6c         rc = pCol
4110: 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
4120: 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32  User, n1, v1, n2
4130: 2c 20 76 32 29 3b 0a 20 20 20 20 20 20 20 20 2f  , v2);.        /
4140: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 73 74  * Convert the st
4150: 72 69 6e 67 73 20 62 61 63 6b 20 69 6e 74 6f 20  rings back into 
4160: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  the database enc
4170: 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  oding */.       
4180: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
4190: 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
41a0: 2a 29 70 4d 65 6d 31 2c 20 6f 72 69 67 45 6e 63  *)pMem1, origEnc
41b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
41c0: 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
41d0: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 4d 65 6d  ite3_value*)pMem
41e0: 32 2c 20 6f 72 69 67 45 6e 63 29 3b 0a 20 20 20  2, origEnc);.   
41f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
4200: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4210: 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
4220: 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
4230: 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
4240: 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
4250: 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
4260: 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
4270: 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
4280: 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
4290: 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
42a0: 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
42b0: 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
42c0: 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  p().  */.  rc = 
42d0: 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c  memcmp(pMem1->z,
42e0: 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d   pMem2->z, (pMem
42f0: 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70  1->n>pMem2->n)?p
4300: 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e  Mem2->n:pMem1->n
4310: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
4320: 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d 31  {.    rc = pMem1
4330: 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a  ->n - pMem2->n;.
4340: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 64  .}../*.** Move d
4360: 61 74 61 20 6f 75 74 20 6f 66 20 61 20 62 74 72  ata out of a btr
4370: 65 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 66  ee key or data f
4380: 69 65 6c 64 20 61 6e 64 20 69 6e 74 6f 20 61 20  ield and into a 
4390: 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Mem structure..*
43a0: 2a 20 54 68 65 20 64 61 74 61 20 6f 72 20 6b 65  * The data or ke
43b0: 79 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  y is taken from 
43c0: 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70  the entry that p
43d0: 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
43e0: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 2e   pointing.** to.
43f0: 20 20 6f 66 66 73 65 74 20 61 6e 64 20 61 6d 74    offset and amt
4400: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   determine what 
4410: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  portion of the d
4420: 61 74 61 20 6f 72 20 6b 65 79 20 74 6f 20 72 65  ata or key to re
4430: 74 72 69 65 76 65 2e 0a 2a 2a 20 6b 65 79 20 69  trieve..** key i
4440: 73 20 74 72 75 65 20 74 6f 20 67 65 74 20 74 68  s true to get th
4450: 65 20 6b 65 79 20 6f 72 20 66 61 6c 73 65 20 74  e key or false t
4460: 6f 20 67 65 74 20 64 61 74 61 2e 20 20 54 68 65  o get data.  The
4470: 20 72 65 73 75 6c 74 20 69 73 20 77 72 69 74 74   result is writt
4480: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 70  en.** into the p
4490: 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2a 0a  Mem element..**.
44a0: 2a 2a 20 54 68 65 20 70 4d 65 6d 20 73 74 72 75  ** The pMem stru
44b0: 63 74 75 72 65 20 69 73 20 61 73 73 75 6d 65 64  cture is assumed
44c0: 20 74 6f 20 62 65 20 75 6e 69 6e 69 74 69 61 6c   to be uninitial
44d0: 69 7a 65 64 2e 20 20 41 6e 79 20 70 72 69 6f 72  ized.  Any prior
44e0: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 69 73 20 6f   content.** is o
44f0: 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 6f  verwritten witho
4500: 75 74 20 62 65 69 6e 67 20 66 72 65 65 64 2e 0a  ut being freed..
4510: 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
4520: 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
4530: 61 6e 79 20 72 65 61 73 6f 6e 20 28 6d 61 6c 6c  any reason (mall
4540: 6f 63 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  oc returns NULL 
4550: 6f 72 20 75 6e 61 62 6c 65 0a 2a 2a 20 74 6f 20  or unable.** to 
4560: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
4570: 73 6b 29 20 74 68 65 6e 20 74 68 65 20 70 4d 65  sk) then the pMe
4580: 6d 20 69 73 20 6c 65 66 74 20 69 6e 20 61 6e 20  m is left in an 
4590: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
45a0: 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
45b0: 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
45c0: 65 65 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ee(.  BtCursor *
45d0: 70 43 75 72 2c 20 20 20 2f 2a 20 43 75 72 73 6f  pCur,   /* Curso
45e0: 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 72 65  r pointing at re
45f0: 63 6f 72 64 20 74 6f 20 72 65 74 72 69 65 76 65  cord to retrieve
4600: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  . */.  int offse
4610: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t,       /* Offs
4620: 65 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  et from the star
4630: 74 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 74  t of data to ret
4640: 75 72 6e 20 62 79 74 65 73 20 66 72 6f 6d 2e 20  urn bytes from. 
4650: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
4660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4670: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 74   of bytes to ret
4680: 75 72 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6b 65  urn. */.  int ke
4690: 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  y,          /* I
46a0: 66 20 74 72 75 65 2c 20 72 65 74 72 69 65 76 65  f true, retrieve
46b0: 20 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20   from the btree 
46c0: 6b 65 79 2c 20 6e 6f 74 20 64 61 74 61 2e 20 2a  key, not data. *
46d0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
46e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
46f0: 74 75 72 6e 20 64 61 74 61 20 69 6e 20 74 68 69  turn data in thi
4700: 73 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65 2e  s Mem structure.
4710: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
4720: 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 44  Data;       /* D
4730: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 62 74 72  ata from the btr
4740: 65 65 20 6c 61 79 65 72 20 2a 2f 0a 20 20 69 6e  ee layer */.  in
4750: 74 20 61 76 61 69 6c 61 62 6c 65 20 3d 20 30 3b  t available = 0;
4760: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
4770: 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  tes available on
4780: 20 74 68 65 20 6c 6f 63 61 6c 20 62 74 72 65 65   the local btree
4790: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20   page */..  if( 
47a0: 6b 65 79 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  key ){.    zData
47b0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
47c0: 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
47d0: 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
47e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
47f0: 7a 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29  zData = (char *)
4800: 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
4810: 46 65 74 63 68 28 70 43 75 72 2c 20 26 61 76 61  Fetch(pCur, &ava
4820: 69 6c 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 61  ilable);.  }.  a
4830: 73 73 65 72 74 28 20 7a 44 61 74 61 21 3d 30 20  ssert( zData!=0 
4840: 29 3b 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20  );..  pMem->n = 
4850: 61 6d 74 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  amt;.  if( offse
4860: 74 2b 61 6d 74 3c 3d 61 76 61 69 6c 61 62 6c 65  t+amt<=available
4870: 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   ){.    pMem->z 
4880: 3d 20 26 7a 44 61 74 61 5b 6f 66 66 73 65 74 5d  = &zData[offset]
4890: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
48a0: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  s = MEM_Blob|MEM
48b0: 5f 45 70 68 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  _Ephem;.  }else{
48c0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
48d0: 20 69 66 28 20 61 6d 74 3e 4e 42 46 53 2d 32 20   if( amt>NBFS-2 
48e0: 29 7b 0a 20 20 20 20 20 20 7a 44 61 74 61 20 3d  ){.      zData =
48f0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
4900: 61 6c 6c 6f 63 52 61 77 28 61 6d 74 2b 32 29 3b  allocRaw(amt+2);
4910: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 44 61 74  .      if( !zDat
4920: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  a ){.        ret
4930: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
4940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4950: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
4960: 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 44 79 6e 7c 4d  M_Blob|MEM_Dyn|M
4970: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
4980: 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
4990: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
49a0: 7a 44 61 74 61 20 3d 20 26 28 70 4d 65 6d 2d 3e  zData = &(pMem->
49b0: 7a 53 68 6f 72 74 5b 30 5d 29 3b 0a 20 20 20 20  zShort[0]);.    
49c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
49d0: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 68 6f  MEM_Blob|MEM_Sho
49e0: 72 74 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  rt|MEM_Term;.   
49f0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d   }.    pMem->z =
4a00: 20 7a 44 61 74 61 3b 0a 20 20 20 20 70 4d 65 6d   zData;.    pMem
4a10: 2d 3e 65 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  ->enc = 0;.    p
4a20: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
4a30: 54 45 5f 42 4c 4f 42 3b 0a 0a 20 20 20 20 69 66  TE_BLOB;..    if
4a40: 28 20 6b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ( key ){.      r
4a50: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
4a60: 4b 65 79 28 70 43 75 72 2c 20 6f 66 66 73 65 74  Key(pCur, offset
4a70: 2c 20 61 6d 74 2c 20 7a 44 61 74 61 29 3b 0a 20  , amt, zData);. 
4a80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4a90: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
4aa0: 65 44 61 74 61 28 70 43 75 72 2c 20 6f 66 66 73  eData(pCur, offs
4ab0: 65 74 2c 20 61 6d 74 2c 20 7a 44 61 74 61 29 3b  et, amt, zData);
4ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 61  .    }.    zData
4ad0: 5b 61 6d 74 5d 20 3d 20 30 3b 0a 20 20 20 20 7a  [amt] = 0;.    z
4ae0: 44 61 74 61 5b 61 6d 74 2b 31 5d 20 3d 20 30 3b  Data[amt+1] = 0;
4af0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
4b00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4b10: 69 66 28 20 61 6d 74 3e 4e 42 46 53 2d 32 20 29  if( amt>NBFS-2 )
4b20: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4b30: 28 20 7a 44 61 74 61 21 3d 70 4d 65 6d 2d 3e 7a  ( zData!=pMem->z
4b40: 53 68 6f 72 74 20 29 3b 0a 20 20 20 20 20 20 20  Short );.       
4b50: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
4b60: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
4b70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4b80: 46 72 65 65 28 7a 44 61 74 61 29 3b 0a 20 20 20  Free(zData);.   
4b90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
4ba0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 44 61 74      assert( zDat
4bb0: 61 3d 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 20  a==pMem->zShort 
4bc0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
4bd0: 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  t( pMem->flags &
4be0: 20 4d 45 4d 5f 53 68 6f 72 74 20 29 3b 0a 20 20   MEM_Short );.  
4bf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
4c00: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
4c10: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
4c20: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
4c30: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 65   NDEBUG./*.** Pe
4c40: 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 63 68  rform various ch
4c50: 65 63 6b 73 20 6f 6e 20 74 68 65 20 6d 65 6d 6f  ecks on the memo
4c60: 72 79 20 63 65 6c 6c 20 70 4d 65 6d 2e 20 41 6e  ry cell pMem. An
4c70: 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c 0a 2a   assert() will.*
4c80: 2a 20 66 61 69 6c 20 69 66 20 70 4d 65 6d 20 69  * fail if pMem i
4c90: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63  s internally inc
4ca0: 6f 6e 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  onsistent..*/.vo
4cb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  id sqlite3VdbeMe
4cc0: 6d 53 61 6e 69 74 79 28 4d 65 6d 20 2a 70 4d 65  mSanity(Mem *pMe
4cd0: 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  m){.  int flags 
4ce0: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
4cf0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d   assert( flags!=
4d00: 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 64 65  0 );  /* Must de
4d10: 66 69 6e 65 20 73 6f 6d 65 20 74 79 70 65 20 2a  fine some type *
4d20: 2f 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  /.  if( pMem->fl
4d30: 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d  ags & (MEM_Str|M
4d40: 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20  EM_Blob) ){.    
4d50: 69 6e 74 20 78 20 3d 20 70 4d 65 6d 2d 3e 66 6c  int x = pMem->fl
4d60: 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 61 74 69  ags & (MEM_Stati
4d70: 63 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70  c|MEM_Dyn|MEM_Ep
4d80: 68 65 6d 7c 4d 45 4d 5f 53 68 6f 72 74 29 3b 0a  hem|MEM_Short);.
4d90: 20 20 20 20 61 73 73 65 72 74 28 20 78 21 3d 30      assert( x!=0
4da0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   );            /
4db0: 2a 20 53 74 72 69 6e 67 73 20 6d 75 73 74 20 64  * Strings must d
4dc0: 65 66 69 6e 65 20 61 20 73 74 72 69 6e 67 20 73  efine a string s
4dd0: 75 62 74 79 70 65 20 2a 2f 0a 20 20 20 20 61 73  ubtype */.    as
4de0: 73 65 72 74 28 20 28 78 20 26 20 28 78 2d 31 29  sert( (x & (x-1)
4df0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79  )==0 );  /* Only
4e00: 20 6f 6e 65 20 73 74 72 69 6e 67 20 73 75 62 74   one string subt
4e10: 79 70 65 20 63 61 6e 20 62 65 20 64 65 66 69 6e  ype can be defin
4e20: 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
4e30: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 20  ( pMem->z!=0 ); 
4e40: 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 73 20       /* Strings 
4e50: 6d 75 73 74 20 68 61 76 65 20 61 20 76 61 6c 75  must have a valu
4e60: 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 4d 65 6d 2e  e */.    /* Mem.
4e70: 7a 20 70 6f 69 6e 74 73 20 74 6f 20 4d 65 6d 2e  z points to Mem.
4e80: 7a 53 68 6f 72 74 20 69 66 66 20 74 68 65 20 73  zShort iff the s
4e90: 75 62 74 79 70 65 20 69 73 20 4d 45 4d 5f 53 68  ubtype is MEM_Sh
4ea0: 6f 72 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ort */.    asser
4eb0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4ec0: 26 20 4d 45 4d 5f 53 68 6f 72 74 29 3d 3d 30 20  & MEM_Short)==0 
4ed0: 7c 7c 20 70 4d 65 6d 2d 3e 7a 3d 3d 70 4d 65 6d  || pMem->z==pMem
4ee0: 2d 3e 7a 53 68 6f 72 74 20 29 3b 0a 20 20 20 20  ->zShort );.    
4ef0: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
4f00: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 68 6f 72 74  lags & MEM_Short
4f10: 29 21 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 7a 21  )!=0 || pMem->z!
4f20: 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 20 29 3b  =pMem->zShort );
4f30: 0a 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72  .    /* No destr
4f40: 75 63 74 6f 72 20 75 6e 6c 65 73 73 20 74 68 65  uctor unless the
4f50: 72 65 20 69 73 20 4d 45 4d 5f 44 79 6e 20 2a 2f  re is MEM_Dyn */
4f60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
4f70: 6d 2d 3e 78 44 65 6c 3d 3d 30 20 7c 7c 20 28 70  m->xDel==0 || (p
4f80: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4f90: 5f 44 79 6e 29 21 3d 30 20 29 3b 0a 0a 20 20 20  _Dyn)!=0 );..   
4fa0: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
4fb0: 4d 5f 53 74 72 29 20 29 7b 0a 20 20 20 20 20 20  M_Str) ){.      
4fc0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 65 6e  assert( pMem->en
4fd0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
4fe0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
4ff0: 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49   pMem->enc==SQLI
5000: 54 45 5f 55 54 46 31 36 42 45 20 7c 7c 0a 20 20  TE_UTF16BE ||.  
5010: 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
5020: 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
5030: 46 31 36 4c 45 20 0a 20 20 20 20 20 20 29 3b 0a  F16LE .      );.
5040: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
5050: 73 74 72 69 6e 67 20 69 73 20 55 54 46 2d 38 20  string is UTF-8 
5060: 65 6e 63 6f 64 65 64 20 61 6e 64 20 6e 75 6c 20  encoded and nul 
5070: 74 65 72 6d 69 6e 61 74 65 64 2c 20 74 68 65 6e  terminated, then
5080: 20 70 4d 65 6d 2d 3e 6e 0a 20 20 20 20 20 20 2a   pMem->n.      *
5090: 2a 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 65  * must be the le
50a0: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69  ngth of the stri
50b0: 6e 67 2e 20 20 28 4c 61 74 65 72 3a 29 20 20 49  ng.  (Later:)  I
50c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
50d0: 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ile.      ** has
50e0: 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64 2c   been corrupted,
50f0: 20 27 5c 30 30 30 27 20 63 68 61 72 61 63 74 65   '\000' characte
5100: 72 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  rs might have be
5110: 65 6e 20 69 6e 73 65 72 74 65 64 0a 20 20 20 20  en inserted.    
5120: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6d 69    ** into the mi
5130: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 74 72 69  ddle of the stri
5140: 6e 67 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ng.  In that cas
5150: 65 2c 20 74 68 65 20 73 74 72 6c 65 6e 28 29 20  e, the strlen() 
5160: 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 62  might.      ** b
5170: 65 20 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2f  e less..      */
5180: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
5190: 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
51a0: 38 20 26 26 20 28 66 6c 61 67 73 20 26 20 4d 45  8 && (flags & ME
51b0: 4d 5f 54 65 72 6d 29 20 29 7b 20 0a 20 20 20 20  M_Term) ){ .    
51c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
51d0: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3c 3d 70 4d 65  en(pMem->z)<=pMe
51e0: 6d 2d 3e 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  m->n );.        
51f0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 5b  assert( pMem->z[
5200: 70 4d 65 6d 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20  pMem->n]==0 );. 
5210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5220: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 61 6e  else{.    /* Can
5230: 6e 6f 74 20 64 65 66 69 6e 65 20 61 20 73 74 72  not define a str
5240: 69 6e 67 20 73 75 62 74 79 70 65 20 66 6f 72 20  ing subtype for 
5250: 6e 6f 6e 2d 73 74 72 69 6e 67 20 6f 62 6a 65 63  non-string objec
5260: 74 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ts */.    assert
5270: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
5280: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
5290: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 7c 4d  _Dyn|MEM_Ephem|M
52a0: 45 4d 5f 53 68 6f 72 74 29 29 3d 3d 30 20 29 3b  EM_Short))==0 );
52b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
52c0: 6d 2d 3e 78 44 65 6c 3d 3d 30 20 29 3b 0a 20 20  m->xDel==0 );.  
52d0: 7d 0a 20 20 2f 2a 20 4d 45 4d 5f 4e 75 6c 6c 20  }.  /* MEM_Null 
52e0: 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
52f0: 65 72 20 74 79 70 65 73 20 2a 2f 0a 20 20 61 73  er types */.  as
5300: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
5310: 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
5320: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
5330: 5f 42 6c 6f 62 29 29 3d 3d 30 0a 20 20 20 20 20  _Blob))==0.     
5340: 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 2d 3e 66       || (pMem->f
5350: 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  lags&MEM_Null)==
5360: 30 20 29 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65  0 );.  /* If the
5370: 20 4d 45 4d 20 69 73 20 62 6f 74 68 20 72 65 61   MEM is both rea
5380: 6c 20 61 6e 64 20 69 6e 74 65 67 65 72 2c 20 74  l and integer, t
5390: 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 65 71  he values are eq
53a0: 75 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ual */.  assert(
53b0: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
53c0: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
53d0: 6c 29 29 21 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45  l))!=(MEM_Int|ME
53e0: 4d 5f 52 65 61 6c 29 20 0a 20 20 20 20 20 20 20  M_Real) .       
53f0: 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 72 3d 3d 70     || pMem->r==p
5400: 4d 65 6d 2d 3e 75 2e 69 20 29 3b 0a 7d 0a 23 65  Mem->u.i );.}.#e
5410: 6e 64 69 66 0a 0a 2f 2a 20 54 68 69 73 20 66 75  ndif../* This fu
5420: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 61  nction is only a
5430: 76 61 69 6c 61 62 6c 65 20 69 6e 74 65 72 6e 61  vailable interna
5440: 6c 6c 79 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  lly, it is not p
5450: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  art of the.** ex
5460: 74 65 72 6e 61 6c 20 41 50 49 2e 20 49 74 20 77  ternal API. It w
5470: 6f 72 6b 73 20 69 6e 20 61 20 73 69 6d 69 6c 61  orks in a simila
5480: 72 20 77 61 79 20 74 6f 20 73 71 6c 69 74 65 33  r way to sqlite3
5490: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 2c 0a 2a  _value_text(),.*
54a0: 2a 20 65 78 63 65 70 74 20 74 68 65 20 64 61 74  * except the dat
54b0: 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 69 6e  a returned is in
54c0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 73 70   the encoding sp
54d0: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ecified by the s
54e0: 65 63 6f 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  econd.** paramet
54f0: 65 72 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  er, which must b
5500: 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
5510: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
5520: 55 54 46 31 36 4c 45 20 6f 72 0a 2a 2a 20 53 51  UTF16LE or.** SQ
5530: 4c 49 54 45 5f 55 54 46 38 2e 0a 2a 2a 0a 2a 2a  LITE_UTF8..**.**
5540: 20 28 32 30 30 36 2d 30 32 2d 31 36 3a 29 20 20   (2006-02-16:)  
5550: 54 68 65 20 65 6e 63 20 76 61 6c 75 65 20 63 61  The enc value ca
5560: 6e 20 62 65 20 6f 72 2d 65 64 20 77 69 74 68 20  n be or-ed with 
5570: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
5580: 47 4e 45 44 2e 0a 2a 2a 20 49 66 20 74 68 61 74  GNED..** If that
5590: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
55a0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d 75  en the result mu
55b0: 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
55c0: 20 61 6e 20 65 76 65 6e 20 62 79 74 65 0a 2a 2a   an even byte.**
55d0: 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 63 6f   boundary..*/.co
55e0: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
55f0: 33 56 61 6c 75 65 54 65 78 74 28 73 71 6c 69 74  3ValueText(sqlit
5600: 65 33 5f 76 61 6c 75 65 2a 20 70 56 61 6c 2c 20  e3_value* pVal, 
5610: 75 38 20 65 6e 63 29 7b 0a 20 20 69 66 28 20 21  u8 enc){.  if( !
5620: 70 56 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  pVal ) return 0;
5630: 0a 20 20 61 73 73 65 72 74 28 20 28 65 6e 63 26  .  assert( (enc&
5640: 33 29 3d 3d 28 65 6e 63 26 7e 53 51 4c 49 54 45  3)==(enc&~SQLITE
5650: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20  _UTF16_ALIGNED) 
5660: 29 3b 0a 0a 20 20 69 66 28 20 70 56 61 6c 2d 3e  );..  if( pVal->
5670: 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
5680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5690: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 4d    }.  assert( (M
56a0: 45 4d 5f 42 6c 6f 62 3e 3e 33 29 20 3d 3d 20 4d  EM_Blob>>3) == M
56b0: 45 4d 5f 53 74 72 20 29 3b 0a 20 20 70 56 61 6c  EM_Str );.  pVal
56c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 56 61 6c  ->flags |= (pVal
56d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
56e0: 6f 62 29 3e 3e 33 3b 0a 20 20 69 66 28 20 70 56  ob)>>3;.  if( pV
56f0: 61 6c 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74  al->flags&MEM_St
5700: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
5710: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
5720: 6e 67 28 70 56 61 6c 2c 20 65 6e 63 20 26 20 7e  ng(pVal, enc & ~
5730: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
5740: 47 4e 45 44 29 3b 0a 20 20 20 20 69 66 28 20 28  GNED);.    if( (
5750: 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
5760: 31 36 5f 41 4c 49 47 4e 45 44 29 21 3d 30 20 26  16_ALIGNED)!=0 &
5770: 26 20 31 3d 3d 28 31 26 28 69 6e 74 29 70 56 61  & 1==(1&(int)pVa
5780: 6c 2d 3e 7a 29 20 29 7b 0a 20 20 20 20 20 20 61  l->z) ){.      a
5790: 73 73 65 72 74 28 20 28 70 56 61 6c 2d 3e 66 6c  ssert( (pVal->fl
57a0: 61 67 73 20 26 20 28 4d 45 4d 5f 45 70 68 65 6d  ags & (MEM_Ephem
57b0: 7c 4d 45 4d 5f 53 74 61 74 69 63 29 29 21 3d 30  |MEM_Static))!=0
57c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
57d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65  lite3VdbeMemMake
57e0: 57 72 69 74 65 61 62 6c 65 28 70 56 61 6c 29 21  Writeable(pVal)!
57f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
5810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5830: 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 70 56 61  NulTerminate(pVa
5840: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
5850: 20 61 73 73 65 72 74 28 20 28 70 56 61 6c 2d 3e   assert( (pVal->
5860: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 29 3d  flags&MEM_Blob)=
5870: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
5880: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
5890: 79 28 70 56 61 6c 2c 20 65 6e 63 29 3b 0a 20 20  y(pVal, enc);.  
58a0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 31 26    assert( 0==(1&
58b0: 28 69 6e 74 29 70 56 61 6c 2d 3e 7a 29 20 29 3b  (int)pVal->z) );
58c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 56  .  }.  assert(pV
58d0: 61 6c 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20 26 20  al->enc==(enc & 
58e0: 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
58f0: 49 47 4e 45 44 29 20 7c 7c 20 73 71 6c 69 74 65  IGNED) || sqlite
5900: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
5910: 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 2d 3e 65  );.  if( pVal->e
5920: 6e 63 3d 3d 28 65 6e 63 20 26 20 7e 53 51 4c 49  nc==(enc & ~SQLI
5930: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
5940: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5950: 70 56 61 6c 2d 3e 7a 3b 0a 20 20 7d 65 6c 73 65  pVal->z;.  }else
5960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5970: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
5980: 61 74 65 20 61 20 6e 65 77 20 73 71 6c 69 74 65  ate a new sqlite
5990: 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 2e 0a  3_value object..
59a0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
59b0: 2a 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  * sqlite3ValueNe
59c0: 77 28 76 6f 69 64 29 7b 0a 20 20 4d 65 6d 20 2a  w(void){.  Mem *
59d0: 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  p = sqliteMalloc
59e0: 28 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20  (sizeof(*p));.  
59f0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e  if( p ){.    p->
5a00: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
5a10: 3b 0a 20 20 20 20 70 2d 3e 74 79 70 65 20 3d 20  ;.    p->type = 
5a20: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 7d  SQLITE_NULL;.  }
5a30: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
5a40: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
5a50: 65 77 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ew sqlite3_value
5a60: 20 6f 62 6a 65 63 74 2c 20 63 6f 6e 74 61 69 6e   object, contain
5a70: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ing the value of
5a80: 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   pExpr..**.** Th
5a90: 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  is only works fo
5aa0: 72 20 76 65 72 79 20 73 69 6d 70 6c 65 20 65 78  r very simple ex
5ab0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63  pressions that c
5ac0: 6f 6e 73 69 73 74 20 6f 66 20 6f 6e 65 20 63 6f  onsist of one co
5ad0: 6e 73 74 61 6e 74 0a 2a 2a 20 74 6f 6b 65 6e 20  nstant.** token 
5ae0: 28 69 2e 65 2e 20 22 35 22 2c 20 22 35 2e 31 22  (i.e. "5", "5.1"
5af0: 2c 20 22 4e 55 4c 4c 22 2c 20 22 27 61 20 73 74  , "NULL", "'a st
5b00: 72 69 6e 67 27 22 29 2e 20 49 66 20 74 68 65 20  ring'"). If the 
5b10: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 0a 2a  expression can.*
5b20: 2a 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 64  * be converted d
5b30: 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 61 20 76  irectly into a v
5b40: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76  alue, then the v
5b50: 61 6c 75 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  alue is allocate
5b60: 64 20 61 6e 64 0a 2a 2a 20 61 20 70 6f 69 6e 74  d and.** a point
5b70: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  er written to *p
5b80: 70 56 61 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  pVal. The caller
5b90: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5ba0: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67  for deallocating
5bb0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 62 79  .** the value by
5bc0: 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20 73   passing it to s
5bd0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
5be0: 29 20 6c 61 74 65 72 20 6f 6e 2e 20 49 66 20 74  ) later on. If t
5bf0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
5c00: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65   cannot be conve
5c10: 72 74 65 64 20 74 6f 20 61 20 76 61 6c 75 65 2c  rted to a value,
5c20: 20 74 68 65 6e 20 2a 70 70 56 61 6c 20 69 73 20   then *ppVal is 
5c30: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a  set to NULL..*/.
5c40: 69 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75 65  int sqlite3Value
5c50: 46 72 6f 6d 45 78 70 72 28 0a 20 20 45 78 70 72  FromExpr(.  Expr
5c60: 20 2a 70 45 78 70 72 2c 20 0a 20 20 75 38 20 65   *pExpr, .  u8 e
5c70: 6e 63 2c 20 0a 20 20 75 38 20 61 66 66 69 6e 69  nc, .  u8 affini
5c80: 74 79 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ty,.  sqlite3_va
5c90: 6c 75 65 20 2a 2a 70 70 56 61 6c 0a 29 7b 0a 20  lue **ppVal.){. 
5ca0: 20 69 6e 74 20 6f 70 3b 0a 20 20 63 68 61 72 20   int op;.  char 
5cb0: 2a 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  *zVal = 0;.  sql
5cc0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
5cd0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21 70 45   = 0;..  if( !pE
5ce0: 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70 56 61  xpr ){.    *ppVa
5cf0: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
5d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5d10: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
5d20: 70 3b 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  p;..  if( op==TK
5d30: 5f 53 54 52 49 4e 47 20 7c 7c 20 6f 70 3d 3d 54  _STRING || op==T
5d40: 4b 5f 46 4c 4f 41 54 20 7c 7c 20 6f 70 3d 3d 54  K_FLOAT || op==T
5d50: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
5d60: 20 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65 53 74   zVal = sqliteSt
5d70: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 45 78  rNDup((char*)pEx
5d80: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
5d90: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
5da0: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
5db0: 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 20 20  ValueNew();.    
5dc0: 69 66 28 20 21 7a 56 61 6c 20 7c 7c 20 21 70 56  if( !zVal || !pV
5dd0: 61 6c 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  al ) goto no_mem
5de0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
5df0: 75 6f 74 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20  uote(zVal);.    
5e00: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
5e10: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 56 61  tr(pVal, -1, zVa
5e20: 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  l, SQLITE_UTF8, 
5e30: 73 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a 20  sqlite3FreeX);. 
5e40: 20 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 49     if( (op==TK_I
5e50: 4e 54 45 47 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  NTEGER || op==TK
5e60: 5f 46 4c 4f 41 54 20 29 20 26 26 20 61 66 66 69  _FLOAT ) && affi
5e70: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
5e80: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 73  _NONE ){.      s
5e90: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
5ea0: 41 66 66 69 6e 69 74 79 28 70 56 61 6c 2c 20 53  Affinity(pVal, S
5eb0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
5ec0: 43 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d 65 6c  C, enc);.    }el
5ed0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
5ee0: 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
5ef0: 69 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69  ity(pVal, affini
5f00: 74 79 2c 20 65 6e 63 29 3b 0a 20 20 20 20 7d 0a  ty, enc);.    }.
5f10: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
5f20: 54 4b 5f 55 4d 49 4e 55 53 20 29 20 7b 0a 20 20  TK_UMINUS ) {.  
5f30: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
5f40: 3d 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f  =sqlite3ValueFro
5f50: 6d 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  mExpr(pExpr->pLe
5f60: 66 74 2c 20 65 6e 63 2c 20 61 66 66 69 6e 69 74  ft, enc, affinit
5f70: 79 2c 20 26 70 56 61 6c 29 20 29 7b 0a 20 20 20  y, &pVal) ){.   
5f80: 20 20 20 70 56 61 6c 2d 3e 75 2e 69 20 3d 20 2d     pVal->u.i = -
5f90: 31 20 2a 20 70 56 61 6c 2d 3e 75 2e 69 3b 0a 20  1 * pVal->u.i;. 
5fa0: 20 20 20 20 20 70 56 61 6c 2d 3e 72 20 3d 20 2d       pVal->r = -
5fb0: 31 2e 30 20 2a 20 70 56 61 6c 2d 3e 72 3b 0a 20  1.0 * pVal->r;. 
5fc0: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66     }.  }.#ifndef
5fd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
5fe0: 42 5f 4c 49 54 45 52 41 4c 0a 20 20 65 6c 73 65  B_LITERAL.  else
5ff0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 42 4c 4f 42   if( op==TK_BLOB
6000: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c   ){.    int nVal
6010: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
6020: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
6030: 20 20 20 20 7a 56 61 6c 20 3d 20 73 71 6c 69 74      zVal = sqlit
6040: 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  eStrNDup((char*)
6050: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31  pExpr->token.z+1
6060: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
6070: 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 56  -1);.    if( !zV
6080: 61 6c 20 7c 7c 20 21 70 56 61 6c 20 29 20 67 6f  al || !pVal ) go
6090: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73  to no_mem;.    s
60a0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 56  qlite3Dequote(zV
60b0: 61 6c 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20  al);.    nVal = 
60c0: 73 74 72 6c 65 6e 28 7a 56 61 6c 29 2f 32 3b 0a  strlen(zVal)/2;.
60d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
60e0: 65 6d 53 65 74 53 74 72 28 70 56 61 6c 2c 20 73  emSetStr(pVal, s
60f0: 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
6100: 7a 56 61 6c 29 2c 20 6e 56 61 6c 2c 20 30 2c 20  zVal), nVal, 0, 
6110: 73 71 6c 69 74 65 33 46 72 65 65 58 29 3b 0a 20  sqlite3FreeX);. 
6120: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 56     sqliteFree(zV
6130: 61 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  al);.  }.#endif.
6140: 0a 20 20 2a 70 70 56 61 6c 20 3d 20 70 56 61 6c  .  *ppVal = pVal
6150: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6160: 45 5f 4f 4b 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 0a 20  E_OK;..no_mem:. 
6170: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 56 61 6c   sqliteFree(zVal
6180: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
6190: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 2a  eFree(pVal);.  *
61a0: 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  ppVal = 0;.  ret
61b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
61c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
61d0: 65 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c  e the string val
61e0: 75 65 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33  ue of an sqlite3
61f0: 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a 2a 2f  _value object.*/
6200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c  .void sqlite3Val
6210: 75 65 53 65 74 53 74 72 28 0a 20 20 73 71 6c 69  ueSetStr(.  sqli
6220: 74 65 33 5f 76 61 6c 75 65 20 2a 76 2c 20 0a 20  te3_value *v, . 
6230: 20 69 6e 74 20 6e 2c 20 0a 20 20 63 6f 6e 73 74   int n, .  const
6240: 20 76 6f 69 64 20 2a 7a 2c 20 0a 20 20 75 38 20   void *z, .  u8 
6250: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44  enc,.  void (*xD
6260: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
6270: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
6280: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 28 4d 65  dbeMemSetStr((Me
6290: 6d 20 2a 29 76 2c 20 7a 2c 20 6e 2c 20 65 6e 63  m *)v, z, n, enc
62a0: 2c 20 78 44 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , xDel);.}../*.*
62b0: 2a 20 46 72 65 65 20 61 6e 20 73 71 6c 69 74 65  * Free an sqlite
62c0: 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a 2a  3_value object.*
62d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61  /.void sqlite3Va
62e0: 6c 75 65 46 72 65 65 28 73 71 6c 69 74 65 33 5f  lueFree(sqlite3_
62f0: 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 69 66 28  value *v){.  if(
6300: 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
6310: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
6320: 74 72 28 76 2c 20 30 2c 20 30 2c 20 53 51 4c 49  tr(v, 0, 0, SQLI
6330: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
6340: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
6350: 65 46 72 65 65 28 76 29 3b 0a 7d 0a 0a 2f 2a 0a  eFree(v);.}../*.
6360: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
6370: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
6380: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 61 6c   the sqlite3_val
6390: 75 65 20 6f 62 6a 65 63 74 20 61 73 73 75 6d 69  ue object assumi
63a0: 6e 67 0a 2a 2a 20 74 68 61 74 20 69 74 20 75 73  ng.** that it us
63b0: 65 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  es the encoding 
63c0: 22 65 6e 63 22 0a 2a 2f 0a 69 6e 74 20 73 71 6c  "enc".*/.int sql
63d0: 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28 73  ite3ValueBytes(s
63e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
63f0: 61 6c 2c 20 75 38 20 65 6e 63 29 7b 0a 20 20 4d  al, u8 enc){.  M
6400: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 56  em *p = (Mem*)pV
6410: 61 6c 3b 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c  al;.  if( (p->fl
6420: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 21  ags & MEM_Blob)!
6430: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 61 6c  =0 || sqlite3Val
6440: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 65 6e 63  ueText(pVal, enc
6450: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
6460: 70 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  p->n;.  }.  retu
6470: 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.