/ Hex Artifact Content
Login

Artifact a39a822e6ae61c4cab4a512df4a315888b206911:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62 65 6d  **.** $Id: vdbem
0270: 65 6d 2e 63 2c 76 20 31 2e 31 31 35 20 32 30 30  em.c,v 1.115 200
0280: 38 2f 30 35 2f 31 36 20 30 34 3a 35 31 3a 35 35  8/05/16 04:51:55
0290: 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45 78 70   danielk1977 Exp
02a0: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
02b0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
02c0: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
02d0: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  t.h"../*.** Call
02f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45   sqlite3VdbeMemE
0300: 78 70 61 6e 64 42 6c 6f 62 28 29 20 6f 6e 20 74  xpandBlob() on t
0310: 68 65 20 73 75 70 70 6c 69 65 64 20 76 61 6c 75  he supplied valu
0320: 65 20 28 74 79 70 65 20 4d 65 6d 2a 29 0a 2a 2a  e (type Mem*).**
0330: 20 50 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a   P if required..
0340: 2a 2f 0a 23 64 65 66 69 6e 65 20 65 78 70 61 6e  */.#define expan
0350: 64 42 6c 6f 62 28 50 29 20 28 28 28 50 29 2d 3e  dBlob(P) (((P)->
0360: 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 29 3f  flags&MEM_Zero)?
0370: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78  sqlite3VdbeMemEx
0380: 70 61 6e 64 42 6c 6f 62 28 50 29 3a 30 29 0a 0a  pandBlob(P):0)..
0390: 2f 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73  /*.** If pMem is
03a0: 20 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68 20   an object with 
03b0: 61 20 76 61 6c 69 64 20 73 74 72 69 6e 67 20 72  a valid string r
03c0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2c 20 74  epresentation, t
03d0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  his routine.** e
03e0: 6e 73 75 72 65 73 20 74 68 65 20 69 6e 74 65 72  nsures the inter
03f0: 6e 61 6c 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  nal encoding for
0400: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
0410: 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a  esentation is.**
0420: 20 27 64 65 73 69 72 65 64 45 6e 63 27 2c 20 6f   'desiredEnc', o
0430: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
0440: 38 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  8, SQLITE_UTF16L
0450: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
0460: 36 42 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4d  6BE..**.** If pM
0470: 65 6d 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69  em is not a stri
0480: 6e 67 20 6f 62 6a 65 63 74 2c 20 6f 72 20 74 68  ng object, or th
0490: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
04a0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 72 65 70 72  e string.** repr
04b0: 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c  esentation is al
04c0: 72 65 61 64 79 20 73 74 6f 72 65 64 20 75 73 69  ready stored usi
04d0: 6e 67 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ng the requested
04e0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
04f0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
0500: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
0510: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
0520: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
0530: 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 73 75 63  onversion is suc
0540: 63 65 73 73 66 75 6c 20 28 6f 72 20 6e 6f 74 20  cessful (or not 
0550: 72 65 71 75 69 72 65 64 29 2e 0a 2a 2a 20 53 51  required)..** SQ
0560: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 62  LITE_NOMEM may b
0570: 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  e returned if a 
0580: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 64  malloc() fails d
0590: 75 72 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e  uring conversion
05a0: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 66 6f 72 6d  .** between form
05b0: 61 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ats..*/.int sqli
05c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
05d0: 6f 64 69 6e 67 28 4d 65 6d 20 2a 70 4d 65 6d 2c  oding(Mem *pMem,
05e0: 20 69 6e 74 20 64 65 73 69 72 65 64 45 6e 63 29   int desiredEnc)
05f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
0600: 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  ( !(pMem->flags&
0610: 4d 45 4d 5f 53 74 72 29 20 7c 7c 20 70 4d 65 6d  MEM_Str) || pMem
0620: 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64 45 6e  ->enc==desiredEn
0630: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
0640: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
0650: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
0660: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
0670: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
0680: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 23  >db->mutex) );.#
0690: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
06a0: 54 5f 55 54 46 31 36 0a 20 20 72 65 74 75 72 6e  T_UTF16.  return
06b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23   SQLITE_ERROR;.#
06c0: 65 6c 73 65 0a 0a 20 20 2f 2a 20 4d 65 6d 54 72  else..  /* MemTr
06d0: 61 6e 73 6c 61 74 65 28 29 20 6d 61 79 20 72 65  anslate() may re
06e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
06f0: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  r SQLITE_NOMEM. 
0700: 49 66 20 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  If NOMEM is retu
0710: 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  rned,.  ** then 
0720: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
0730: 74 68 65 20 76 61 6c 75 65 20 6d 61 79 20 6e 6f  the value may no
0740: 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  t have changed..
0750: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
0760: 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e 73 6c  te3VdbeMemTransl
0770: 61 74 65 28 70 4d 65 6d 2c 20 64 65 73 69 72 65  ate(pMem, desire
0780: 64 45 6e 63 29 3b 0a 20 20 61 73 73 65 72 74 28  dEnc);.  assert(
0790: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20  rc==SQLITE_OK   
07a0: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
07b0: 4f 4d 45 4d 29 3b 0a 20 20 61 73 73 65 72 74 28  OMEM);.  assert(
07c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20  rc==SQLITE_OK   
07d0: 20 7c 7c 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 64   || pMem->enc!=d
07e0: 65 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 61 73  esiredEnc);.  as
07f0: 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
0800: 4e 4f 4d 45 4d 20 7c 7c 20 70 4d 65 6d 2d 3e 65  NOMEM || pMem->e
0810: 6e 63 3d 3d 64 65 73 69 72 65 64 45 6e 63 29 3b  nc==desiredEnc);
0820: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
0830: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
0840: 6b 65 20 73 75 72 65 20 70 4d 65 6d 2d 3e 7a 20  ke sure pMem->z 
0850: 70 6f 69 6e 74 73 20 74 6f 20 61 20 77 72 69 74  points to a writ
0860: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  able allocation 
0870: 6f 66 20 61 74 20 6c 65 61 73 74 20 0a 2a 2a 20  of at least .** 
0880: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  n bytes..**.** I
0890: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
08a0: 6c 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  l currently cont
08b0: 61 69 6e 73 20 73 74 72 69 6e 67 20 6f 72 20 62  ains string or b
08c0: 6c 6f 62 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  lob data.** and 
08d0: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
08e0: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
08f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 72  s function is tr
0900: 75 65 2c 20 74 68 65 20 0a 2a 2a 20 63 75 72 72  ue, the .** curr
0910: 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ent content of t
0920: 68 65 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  he cell is prese
0930: 72 76 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rved. Otherwise,
0940: 20 69 74 20 6d 61 79 0a 2a 2a 20 62 65 20 64 69   it may.** be di
0950: 73 63 61 72 64 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  scarded.  .**.**
0960: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
0970: 65 74 73 20 74 68 65 20 4d 45 4d 5f 44 79 6e 20  ets the MEM_Dyn 
0980: 66 6c 61 67 20 61 6e 64 20 63 6c 65 61 72 73 20  flag and clears 
0990: 61 6e 79 20 78 44 65 6c 20 63 61 6c 6c 62 61 63  any xDel callbac
09a0: 6b 2e 0a 2a 2a 20 49 74 20 61 6c 73 6f 20 63 6c  k..** It also cl
09b0: 65 61 72 73 20 4d 45 4d 5f 45 70 68 65 6d 20 61  ears MEM_Ephem a
09c0: 6e 64 20 4d 45 4d 5f 53 74 61 74 69 63 2e 20 49  nd MEM_Static. I
09d0: 66 20 74 68 65 20 70 72 65 73 65 72 76 65 20 66  f the preserve f
09e0: 6c 61 67 20 69 73 20 0a 2a 2a 20 6e 6f 74 20 73  lag is .** not s
09f0: 65 74 2c 20 4d 65 6d 2e 6e 20 69 73 20 7a 65 72  et, Mem.n is zer
0a00: 6f 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oed..*/.int sqli
0a10: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 4d  te3VdbeMemGrow(M
0a20: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 6e 2c  em *pMem, int n,
0a30: 20 69 6e 74 20 70 72 65 73 65 72 76 65 29 7b 0a   int preserve){.
0a40: 20 20 61 73 73 65 72 74 28 20 31 20 3e 3d 0a 20    assert( 1 >=. 
0a50: 20 20 20 28 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c     ((pMem->zMall
0a60: 6f 63 20 26 26 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  oc && pMem->zMal
0a70: 6c 6f 63 3d 3d 70 4d 65 6d 2d 3e 7a 29 20 3f 20  loc==pMem->z) ? 
0a80: 31 20 3a 20 30 29 20 2b 0a 20 20 20 20 28 28 28  1 : 0) +.    (((
0a90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pMem->flags&MEM_
0aa0: 44 79 6e 29 26 26 70 4d 65 6d 2d 3e 78 44 65 6c  Dyn)&&pMem->xDel
0ab0: 29 20 3f 20 31 20 3a 20 30 29 20 2b 20 0a 20 20  ) ? 1 : 0) + .  
0ac0: 20 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26    ((pMem->flags&
0ad0: 4d 45 4d 5f 45 70 68 65 6d 29 20 3f 20 31 20 3a  MEM_Ephem) ? 1 :
0ae0: 20 30 29 20 2b 20 0a 20 20 20 20 28 28 70 4d 65   0) + .    ((pMe
0af0: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 61  m->flags&MEM_Sta
0b00: 74 69 63 29 20 3f 20 31 20 3a 20 30 29 0a 20 20  tic) ? 1 : 0).  
0b10: 29 3b 0a 0a 20 20 69 66 28 20 21 70 4d 65 6d 2d  );..  if( !pMem-
0b20: 3e 7a 4d 61 6c 6c 6f 63 20 7c 7c 20 73 71 6c 69  >zMalloc || sqli
0b30: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d  te3MallocSize(pM
0b40: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 3c 6e 20 29  em->zMalloc)<n )
0b50: 7b 0a 20 20 20 20 6e 20 3d 20 28 6e 3e 33 32 3f  {.    n = (n>32?
0b60: 6e 3a 33 32 29 3b 0a 20 20 20 20 69 66 28 20 70  n:32);.    if( p
0b70: 72 65 73 65 72 76 65 20 26 26 20 70 4d 65 6d 2d  reserve && pMem-
0b80: 3e 7a 3d 3d 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  >z==pMem->zMallo
0b90: 63 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  c ){.      pMem-
0ba0: 3e 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  >z = pMem->zMall
0bb0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  oc = sqlite3DbRe
0bc0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 4d 65 6d  allocOrFree(pMem
0bd0: 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6e  ->db, pMem->z, n
0be0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d  );.      if( !pM
0bf0: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 20  em->z ){.       
0c00: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
0c10: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 7d  EM_Null;.      }
0c20: 0a 20 20 20 20 20 20 70 72 65 73 65 72 76 65 20  .      preserve 
0c30: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
0c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
0c50: 65 65 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  ee(pMem->zMalloc
0c60: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  );.      pMem->z
0c70: 4d 61 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  Malloc = sqlite3
0c80: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4d 65 6d  DbMallocRaw(pMem
0c90: 2d 3e 64 62 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  ->db, n);.    }.
0ca0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 72 65 73 65    }..  if( prese
0cb0: 72 76 65 20 26 26 20 70 4d 65 6d 2d 3e 7a 20 26  rve && pMem->z &
0cc0: 26 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  & pMem->zMalloc 
0cd0: 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d  && pMem->z!=pMem
0ce0: 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  ->zMalloc ){.   
0cf0: 20 6d 65 6d 63 70 79 28 70 4d 65 6d 2d 3e 7a 4d   memcpy(pMem->zM
0d00: 61 6c 6c 6f 63 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  alloc, pMem->z, 
0d10: 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20  pMem->n);.  }.  
0d20: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  if( pMem->flags&
0d30: 4d 45 4d 5f 44 79 6e 20 26 26 20 70 4d 65 6d 2d  MEM_Dyn && pMem-
0d40: 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 70 4d 65  >xDel ){.    pMe
0d50: 6d 2d 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a 29  m->xDel((void *)
0d60: 28 70 4d 65 6d 2d 3e 7a 29 29 3b 0a 20 20 7d 0a  (pMem->z));.  }.
0d70: 0a 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d 65  .  pMem->z = pMe
0d80: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 70 4d  m->zMalloc;.  pM
0d90: 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d  em->flags &= ~(M
0da0: 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61  EM_Ephem|MEM_Sta
0db0: 74 69 63 29 3b 0a 20 20 70 4d 65 6d 2d 3e 78 44  tic);.  pMem->xD
0dc0: 65 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  el = 0;.  return
0dd0: 20 28 70 4d 65 6d 2d 3e 7a 20 3f 20 53 51 4c 49   (pMem->z ? SQLI
0de0: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e  TE_OK : SQLITE_N
0df0: 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OMEM);.}../*.** 
0e00: 4d 61 6b 65 20 74 68 65 20 67 69 76 65 6e 20 4d  Make the given M
0e10: 65 6d 20 6f 62 6a 65 63 74 20 4d 45 4d 5f 44 79  em object MEM_Dy
0e20: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  n..**.** Return 
0e30: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
0e40: 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
0e50: 4f 4d 45 4d 20 69 66 20 6d 61 6c 6c 6f 63 20 66  OMEM if malloc f
0e60: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
0e70: 69 74 65 33 56 64 62 65 4d 65 6d 44 79 6e 61 6d  ite3VdbeMemDynam
0e80: 69 63 69 66 79 28 4d 65 6d 20 2a 70 4d 65 6d 29  icify(Mem *pMem)
0e90: 7b 0a 20 20 69 6e 74 20 66 3b 0a 20 20 61 73 73  {.  int f;.  ass
0ea0: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
0eb0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
0ec0: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
0ed0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 65 78 70  >mutex) );.  exp
0ee0: 61 6e 64 42 6c 6f 62 28 70 4d 65 6d 29 3b 0a 20  andBlob(pMem);. 
0ef0: 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   f = pMem->flags
0f00: 3b 0a 20 20 69 66 28 20 28 66 26 28 4d 45 4d 5f  ;.  if( (f&(MEM_
0f10: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 20 26  Str|MEM_Blob)) &
0f20: 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d  & pMem->z!=pMem-
0f30: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
0f40: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
0f50: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 70 4d 65  emGrow(pMem, pMe
0f60: 6d 2d 3e 6e 20 2b 20 32 2c 20 31 29 20 29 7b 0a  m->n + 2, 1) ){.
0f70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
0f80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
0f90: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65  .    pMem->z[pMe
0fa0: 6d 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 70  m->n] = 0;.    p
0fb0: 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b 31  Mem->z[pMem->n+1
0fc0: 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  ] = 0;.    pMem-
0fd0: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65  >flags |= MEM_Te
0fe0: 72 6d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rm;.  }..  retur
0ff0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1000: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76  /*.** If the giv
1010: 65 6e 20 4d 65 6d 2a 20 68 61 73 20 61 20 7a 65  en Mem* has a ze
1020: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
1030: 74 75 72 6e 20 69 74 20 69 6e 74 6f 20 61 6e 20  turn it into an 
1040: 6f 72 64 69 6e 61 72 79 0a 2a 2a 20 62 6c 6f 62  ordinary.** blob
1050: 20 73 74 6f 72 65 64 20 69 6e 20 64 79 6e 61 6d   stored in dynam
1060: 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1070: 20 73 70 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64   space..*/.#ifnd
1080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1090: 4e 43 52 42 4c 4f 42 0a 69 6e 74 20 73 71 6c 69  NCRBLOB.int sqli
10a0: 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64  te3VdbeMemExpand
10b0: 42 6c 6f 62 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b  Blob(Mem *pMem){
10c0: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  .  if( pMem->fla
10d0: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
10e0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
10f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1100: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
1110: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1120: 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73  pMem->db==0 || s
1130: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1140: 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65  d(pMem->db->mute
1150: 78 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  x) );..    /* Se
1160: 74 20 6e 42 79 74 65 20 74 6f 20 74 68 65 20 6e  t nByte to the n
1170: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1180: 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
1190: 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 62 6c   the expanded bl
11a0: 6f 62 2e 20 2a 2f 0a 20 20 20 20 6e 42 79 74 65  ob. */.    nByte
11b0: 20 3d 20 70 4d 65 6d 2d 3e 6e 20 2b 20 70 4d 65   = pMem->n + pMe
11c0: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 66 28 20  m->u.i;.    if( 
11d0: 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20  nByte<=0 ){.    
11e0: 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20 20    nByte = 1;.   
11f0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
1200: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
1210: 65 6d 2c 20 6e 42 79 74 65 2c 20 31 29 20 29 7b  em, nByte, 1) ){
1220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1230: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1240: 7d 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  }..    memset(&p
1250: 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d 2c  Mem->z[pMem->n],
1260: 20 30 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a   0, pMem->u.i);.
1270: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 2b 3d 20 70      pMem->n += p
1280: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 4d  Mem->u.i;.    pM
1290: 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d  em->flags &= ~(M
12a0: 45 4d 5f 5a 65 72 6f 7c 4d 45 4d 5f 54 65 72 6d  EM_Zero|MEM_Term
12b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
12d0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  dif.../*.** Make
12e0: 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d 20 6f   the given Mem o
12f0: 62 6a 65 63 74 20 65 69 74 68 65 72 20 4d 45 4d  bject either MEM
1300: 5f 53 68 6f 72 74 20 6f 72 20 4d 45 4d 5f 44 79  _Short or MEM_Dy
1310: 6e 20 73 6f 20 74 68 61 74 20 62 79 74 65 73 0a  n so that bytes.
1320: 2a 2a 20 6f 66 20 74 68 65 20 4d 65 6d 2e 7a 5b  ** of the Mem.z[
1330: 5d 20 61 72 72 61 79 20 63 61 6e 20 62 65 20 6d  ] array can be m
1340: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  odified..**.** R
1350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1360: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53 51  on success or SQ
1370: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 6d 61  LITE_NOMEM if ma
1380: 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  lloc fails..*/.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
13a0: 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28 4d  mMakeWriteable(M
13b0: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 72 65 74  em *pMem){.  ret
13c0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4d  urn sqlite3VdbeM
13d0: 65 6d 44 79 6e 61 6d 69 63 69 66 79 28 70 4d 65  emDynamicify(pMe
13e0: 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  m);.}../*.** Mak
13f0: 65 20 73 75 72 65 20 74 68 65 20 67 69 76 65 6e  e sure the given
1400: 20 4d 65 6d 20 69 73 20 5c 75 30 30 30 30 20 74   Mem is \u0000 t
1410: 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 69 6e  erminated..*/.in
1420: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
1430: 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 4d 65 6d  NulTerminate(Mem
1440: 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72   *pMem){.  asser
1450: 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c  t( pMem->db==0 |
1460: 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
1470: 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  held(pMem->db->m
1480: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28  utex) );.  if( (
1490: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
14a0: 4d 5f 54 65 72 6d 29 21 3d 30 20 7c 7c 20 28 70  M_Term)!=0 || (p
14b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
14c0: 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
14d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e0: 3b 20 20 20 2f 2a 20 4e 6f 74 68 69 6e 67 20 74  ;   /* Nothing t
14f0: 6f 20 64 6f 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  o do */.  }.  if
1500: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
1510: 47 72 6f 77 28 70 4d 65 6d 2c 20 70 4d 65 6d 2d  Grow(pMem, pMem-
1520: 3e 6e 2b 32 2c 20 31 29 20 29 7b 0a 20 20 20 20  >n+2, 1) ){.    
1530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1540: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4d 65 6d 2d  MEM;.  }.  pMem-
1550: 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d 20 3d 20 30 3b  >z[pMem->n] = 0;
1560: 0a 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d  .  pMem->z[pMem-
1570: 3e 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 4d 65  >n+1] = 0;.  pMe
1580: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  m->flags |= MEM_
1590: 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 53  Term;.  return S
15a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15b0: 2a 2a 20 41 64 64 20 4d 45 4d 5f 53 74 72 20 74  ** Add MEM_Str t
15c0: 6f 20 74 68 65 20 73 65 74 20 6f 66 20 72 65 70  o the set of rep
15d0: 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  resentations for
15e0: 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d 2e 20   the given Mem. 
15f0: 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 72 65 20   Numbers.** are 
1600: 63 6f 6e 76 65 72 74 65 64 20 75 73 69 6e 67 20  converted using 
1610: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1620: 28 29 2e 20 20 43 6f 6e 76 65 72 74 69 6e 67 20  ().  Converting 
1630: 61 20 42 4c 4f 42 20 74 6f 20 61 20 73 74 72 69  a BLOB to a stri
1640: 6e 67 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  ng.** is a no-op
1650: 2e 0a 2a 2a 0a 2a 2a 20 45 78 69 73 74 69 6e 67  ..**.** Existing
1660: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73   representations
1670: 20 4d 45 4d 5f 49 6e 74 20 61 6e 64 20 4d 45 4d   MEM_Int and MEM
1680: 5f 52 65 61 6c 20 61 72 65 20 2a 6e 6f 74 2a 20  _Real are *not* 
1690: 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
16a0: 2a 2a 20 41 20 4d 45 4d 5f 4e 75 6c 6c 20 76 61  ** A MEM_Null va
16b0: 6c 75 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  lue will never b
16c0: 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
16d0: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69 73 20   function. This 
16e0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75  function is.** u
16f0: 73 65 64 20 66 6f 72 20 63 6f 6e 76 65 72 74 69  sed for converti
1700: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 74 65 78  ng values to tex
1710: 74 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20  t for returning 
1720: 74 6f 20 74 68 65 20 75 73 65 72 20 28 69 2e 65  to the user (i.e
1730: 2e 20 76 69 61 0a 2a 2a 20 73 71 6c 69 74 65 33  . via.** sqlite3
1740: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 29 2c 20  _value_text()), 
1750: 6f 72 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  or for ensuring 
1760: 74 68 61 74 20 76 61 6c 75 65 73 20 74 6f 20 62  that values to b
1770: 65 20 75 73 65 64 20 61 73 20 62 74 72 65 65 0a  e used as btree.
1780: 2a 2a 20 6b 65 79 73 20 61 72 65 20 73 74 72 69  ** keys are stri
1790: 6e 67 73 2e 20 49 6e 20 74 68 65 20 66 6f 72 6d  ngs. In the form
17a0: 65 72 20 63 61 73 65 20 61 20 4e 55 4c 4c 20 70  er case a NULL p
17b0: 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e  ointer is return
17c0: 65 64 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 61  ed the.** user a
17d0: 6e 64 20 74 68 65 20 6c 61 74 65 72 20 69 73 20  nd the later is 
17e0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 72 6f 67  an internal prog
17f0: 72 61 6d 6d 69 6e 67 20 65 72 72 6f 72 2e 0a 2a  ramming error..*
1800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1810: 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 4d 65  eMemStringify(Me
1820: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 65 6e 63  m *pMem, int enc
1830: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1840: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 66  LITE_OK;.  int f
1850: 67 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  g = pMem->flags;
1860: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 79  .  const int nBy
1870: 74 65 20 3d 20 33 32 3b 0a 0a 20 20 61 73 73 65  te = 32;..  asse
1880: 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20  rt( pMem->db==0 
1890: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
18a0: 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e  _held(pMem->db->
18b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18c0: 72 74 28 20 21 28 66 67 26 4d 45 4d 5f 5a 65 72  rt( !(fg&MEM_Zer
18d0: 6f 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  o) );.  assert( 
18e0: 21 28 66 67 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  !(fg&(MEM_Str|ME
18f0: 4d 5f 42 6c 6f 62 29 29 20 29 3b 0a 20 20 61 73  M_Blob)) );.  as
1900: 73 65 72 74 28 20 66 67 26 28 4d 45 4d 5f 49 6e  sert( fg&(MEM_In
1910: 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 3b 0a 0a  t|MEM_Real) );..
1920: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
1930: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
1940: 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
1950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1960: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
1970: 6f 72 20 61 20 52 65 61 6c 20 6f 72 20 49 6e 74  or a Real or Int
1980: 65 67 65 72 2c 20 75 73 65 20 73 71 6c 69 74 65  eger, use sqlite
1990: 33 5f 6d 70 72 69 6e 74 66 28 29 20 74 6f 20 70  3_mprintf() to p
19a0: 72 6f 64 75 63 65 20 74 68 65 20 55 54 46 2d 38  roduce the UTF-8
19b0: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 20 72 65 70  .  ** string rep
19c0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
19d0: 68 65 20 76 61 6c 75 65 2e 20 54 68 65 6e 2c 20  he value. Then, 
19e0: 69 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  if the required 
19f0: 65 6e 63 6f 64 69 6e 67 0a 20 20 2a 2a 20 69 73  encoding.  ** is
1a00: 20 55 54 46 2d 31 36 6c 65 20 6f 72 20 55 54 46   UTF-16le or UTF
1a10: 2d 31 36 62 65 20 64 6f 20 61 20 74 72 61 6e 73  -16be do a trans
1a20: 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2a 20 0a 20 20  lation..  ** .  
1a30: 2a 2a 20 46 49 58 20 4d 45 3a 20 49 74 20 77 6f  ** FIX ME: It wo
1a40: 75 6c 64 20 62 65 20 62 65 74 74 65 72 20 69 66  uld be better if
1a50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1a60: 66 28 29 20 63 6f 75 6c 64 20 64 6f 20 55 54 46  f() could do UTF
1a70: 2d 31 36 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -16..  */.  if( 
1a80: 66 67 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  fg & MEM_Int ){.
1a90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1aa0: 69 6e 74 66 28 6e 42 79 74 65 2c 20 70 4d 65 6d  intf(nByte, pMem
1ab0: 2d 3e 7a 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  ->z, "%lld", pMe
1ac0: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65  m->u.i);.  }else
1ad0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 67  {.    assert( fg
1ae0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
1af0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1b00: 6e 74 66 28 6e 42 79 74 65 2c 20 70 4d 65 6d 2d  ntf(nByte, pMem-
1b10: 3e 7a 2c 20 22 25 21 2e 31 35 67 22 2c 20 70 4d  >z, "%!.15g", pM
1b20: 65 6d 2d 3e 72 29 3b 0a 20 20 7d 0a 20 20 70 4d  em->r);.  }.  pM
1b30: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
1b40: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 70 4d 65 6d 2d  Mem->z);.  pMem-
1b50: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
1b60: 46 38 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  F8;.  pMem->flag
1b70: 73 20 7c 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s |= MEM_Str|MEM
1b80: 5f 54 65 72 6d 3b 0a 20 20 73 71 6c 69 74 65 33  _Term;.  sqlite3
1b90: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
1ba0: 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 29 3b 0a 20  ng(pMem, enc);. 
1bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1bc0: 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  *.** Memory cell
1bd0: 20 70 4d 65 6d 20 63 6f 6e 74 61 69 6e 73 20 74   pMem contains t
1be0: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 61 6e  he context of an
1bf0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c00: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1c10: 74 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 66  tine calls the f
1c20: 69 6e 61 6c 69 7a 65 20 6d 65 74 68 6f 64 20 66  inalize method f
1c30: 6f 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  or that function
1c40: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  .  The.** result
1c50: 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
1c60: 65 20 69 73 20 73 74 6f 72 65 64 20 62 61 63 6b  e is stored back
1c70: 20 69 6e 74 6f 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a   into pMem..**.*
1c80: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1c90: 45 52 52 4f 52 20 69 66 20 74 68 65 20 66 69 6e  ERROR if the fin
1ca0: 61 6c 69 7a 65 72 20 72 65 70 6f 72 74 73 20 61  alizer reports a
1cb0: 6e 20 65 72 72 6f 72 2e 20 20 53 51 4c 49 54 45  n error.  SQLITE
1cc0: 5f 4f 4b 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  _OK.** otherwise
1cd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ce0: 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28  VdbeMemFinalize(
1cf0: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 46 75 6e 63 44  Mem *pMem, FuncD
1d00: 65 66 20 2a 70 46 75 6e 63 29 7b 0a 20 20 69 6e  ef *pFunc){.  in
1d10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d20: 3b 0a 20 20 69 66 28 20 70 46 75 6e 63 20 26 26  ;.  if( pFunc &&
1d30: 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a   pFunc->xFinaliz
1d40: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1d50: 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20  _context ctx;.  
1d60: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
1d70: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
1d80: 6c 29 21 3d 30 20 7c 7c 20 70 46 75 6e 63 3d 3d  l)!=0 || pFunc==
1d90: 70 4d 65 6d 2d 3e 75 2e 70 44 65 66 20 29 3b 0a  pMem->u.pDef );.
1da0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1db0: 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ->db==0 || sqlit
1dc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d  e3_mutex_held(pM
1dd0: 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  em->db->mutex) )
1de0: 3b 0a 20 20 20 20 63 74 78 2e 73 2e 66 6c 61 67  ;.    ctx.s.flag
1df0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
1e00: 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 70 4d 65    ctx.s.db = pMe
1e10: 6d 2d 3e 64 62 3b 0a 20 20 20 20 63 74 78 2e 73  m->db;.    ctx.s
1e20: 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  .zMalloc = 0;.  
1e30: 20 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d 65    ctx.pMem = pMe
1e40: 6d 3b 0a 20 20 20 20 63 74 78 2e 70 46 75 6e 63  m;.    ctx.pFunc
1e50: 20 3d 20 70 46 75 6e 63 3b 0a 20 20 20 20 63 74   = pFunc;.    ct
1e60: 78 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20  x.isError = 0;. 
1e70: 20 20 20 70 46 75 6e 63 2d 3e 78 46 69 6e 61 6c     pFunc->xFinal
1e80: 69 7a 65 28 26 63 74 78 29 3b 0a 20 20 20 20 61  ize(&ctx);.    a
1e90: 73 73 65 72 74 28 20 30 3d 3d 28 70 4d 65 6d 2d  ssert( 0==(pMem-
1ea0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20  >flags&MEM_Dyn) 
1eb0: 26 26 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29  && !pMem->xDel )
1ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1ed0: 65 65 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  ee(pMem->zMalloc
1ee0: 29 3b 0a 20 20 20 20 2a 70 4d 65 6d 20 3d 20 63  );.    *pMem = c
1ef0: 74 78 2e 73 3b 0a 20 20 20 20 72 63 20 3d 20 28  tx.s;.    rc = (
1f00: 63 74 78 2e 69 73 45 72 72 6f 72 3f 53 51 4c 49  ctx.isError?SQLI
1f10: 54 45 5f 45 52 52 4f 52 3a 53 51 4c 49 54 45 5f  TE_ERROR:SQLITE_
1f20: 4f 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  OK);.  }.  retur
1f30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1f40: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
1f50: 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 74 72  l contains a str
1f60: 69 6e 67 20 76 61 6c 75 65 20 74 68 61 74 20 6d  ing value that m
1f70: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 0a  ust be freed by.
1f80: 2a 2a 20 69 6e 76 6f 6b 69 6e 67 20 61 6e 20 65  ** invoking an e
1f90: 78 74 65 72 6e 61 6c 20 63 61 6c 6c 62 61 63 6b  xternal callback
1fa0: 2c 20 66 72 65 65 20 69 74 20 6e 6f 77 2e 20 43  , free it now. C
1fb0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1fc0: 74 69 6f 6e 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  tion.** does not
1fd0: 20 66 72 65 65 20 61 6e 79 20 4d 65 6d 2e 7a 4d   free any Mem.zM
1fe0: 61 6c 6c 6f 63 20 62 75 66 66 65 72 2e 0a 2a 2f  alloc buffer..*/
1ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2000: 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65 72  eMemReleaseExter
2010: 6e 61 6c 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 61  nal(Mem *p){.  a
2020: 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
2030: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
2040: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
2050: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ex) );.  if( p->
2060: 66 6c 61 67 73 26 4d 45 4d 5f 41 67 67 20 29 7b  flags&MEM_Agg ){
2070: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2080: 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 2c 20 70  MemFinalize(p, p
2090: 2d 3e 75 2e 70 44 65 66 29 3b 0a 20 20 20 20 61  ->u.pDef);.    a
20a0: 73 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73  ssert( (p->flags
20b0: 20 26 20 4d 45 4d 5f 41 67 67 29 3d 3d 30 20 29   & MEM_Agg)==0 )
20c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
20d0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
20e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66    }else if( p->f
20f0: 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 26 26 20  lags&MEM_Dyn && 
2100: 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 70  p->xDel ){.    p
2110: 2d 3e 78 44 65 6c 28 28 76 6f 69 64 20 2a 29 70  ->xDel((void *)p
2120: 2d 3e 7a 29 3b 0a 20 20 20 20 70 2d 3e 78 44 65  ->z);.    p->xDe
2130: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
2140: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20  .** Release any 
2150: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
2160: 68 65 20 4d 65 6d 2e 20 54 68 69 73 20 6d 61 79  he Mem. This may
2170: 20 6c 65 61 76 65 20 74 68 65 20 4d 65 6d 20 69   leave the Mem i
2180: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73  n an.** inconsis
2190: 74 65 6e 74 20 73 74 61 74 65 2c 20 66 6f 72 20  tent state, for 
21a0: 65 78 61 6d 70 6c 65 20 77 69 74 68 20 28 4d 65  example with (Me
21b0: 6d 2e 7a 3d 3d 30 29 20 61 6e 64 0a 2a 2a 20 28  m.z==0) and.** (
21c0: 4d 65 6d 2e 74 79 70 65 3d 3d 53 51 4c 49 54 45  Mem.type==SQLITE
21d0: 5f 54 45 58 54 29 2e 0a 2a 2f 0a 76 6f 69 64 20  _TEXT)..*/.void 
21e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
21f0: 6c 65 61 73 65 28 4d 65 6d 20 2a 70 29 7b 0a 20  lease(Mem *p){. 
2200: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
2210: 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70  eleaseExternal(p
2220: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2230: 65 28 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  e(p->zMalloc);. 
2240: 20 70 2d 3e 7a 20 3d 20 30 3b 0a 20 20 70 2d 3e   p->z = 0;.  p->
2250: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 70  zMalloc = 0;.  p
2260: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->xDel = 0;.}../
2270: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 36  *.** Convert a 6
2280: 34 2d 62 69 74 20 49 45 45 45 20 64 6f 75 62 6c  4-bit IEEE doubl
2290: 65 20 69 6e 74 6f 20 61 20 36 34 2d 62 69 74 20  e into a 64-bit 
22a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
22b0: 2a 2a 20 49 66 20 74 68 65 20 64 6f 75 62 6c 65  ** If the double
22c0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
22d0: 65 74 75 72 6e 20 30 78 38 30 30 30 30 30 30 30  eturn 0x80000000
22e0: 30 30 30 30 30 30 30 30 2e 0a 2a 2a 0a 2a 2a 20  00000000..**.** 
22f0: 4d 6f 73 74 20 73 79 73 74 65 6d 73 20 61 70 70  Most systems app
2300: 65 61 72 20 74 6f 20 64 6f 20 74 68 69 73 20 73  ear to do this s
2310: 69 6d 70 6c 79 20 62 79 20 61 73 73 69 67 6e 69  imply by assigni
2320: 6e 67 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  ng.** variables 
2330: 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
2340: 65 78 74 72 61 20 72 61 6e 67 65 20 74 65 73 74  extra range test
2350: 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 65 72 65  s.  But.** there
2360: 20 61 72 65 20 72 65 70 6f 72 74 73 20 74 68 61   are reports tha
2370: 74 20 77 69 6e 64 6f 77 73 20 74 68 72 6f 77 73  t windows throws
2380: 20 61 6e 20 65 78 70 65 63 74 69 6f 6e 0a 2a 2a   an expection.**
2390: 20 69 66 20 74 68 65 20 66 6c 6f 61 74 69 6e 67   if the floating
23a0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 69 73 20   point value is 
23b0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 28 53  out of range. (S
23c0: 65 65 20 74 69 63 6b 65 74 20 23 32 38 38 30 2e  ee ticket #2880.
23d0: 29 0a 2a 2a 20 42 65 63 61 75 73 65 20 77 65 20  ).** Because we 
23e0: 64 6f 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  do not completel
23f0: 79 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  y understand the
2400: 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 77 69 6c   problem, we wil
2410: 6c 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 63 6f  l.** take the co
2420: 6e 73 65 72 76 61 74 69 76 65 20 61 70 70 72 6f  nservative appro
2430: 61 63 68 20 61 6e 64 20 61 6c 77 61 79 73 20 64  ach and always d
2440: 6f 20 72 61 6e 67 65 20 74 65 73 74 73 0a 2a 2a  o range tests.**
2450: 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
2460: 6e 67 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  ng the conversio
2470: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  n..*/.static i64
2480: 20 64 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 64   doubleToInt64(d
2490: 6f 75 62 6c 65 20 72 29 7b 0a 20 20 2f 2a 0a 20  ouble r){.  /*. 
24a0: 20 2a 2a 20 4d 61 6e 79 20 63 6f 6d 70 69 6c 65   ** Many compile
24b0: 72 73 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  rs we encounter 
24c0: 64 6f 20 6e 6f 74 20 64 65 66 69 6e 65 20 63 6f  do not define co
24d0: 6e 73 74 61 6e 74 73 20 66 6f 72 20 74 68 65 0a  nstants for the.
24e0: 20 20 2a 2a 20 6d 69 6e 69 6d 75 6d 20 61 6e 64    ** minimum and
24f0: 20 6d 61 78 69 6d 75 6d 20 36 34 2d 62 69 74 20   maximum 64-bit 
2500: 69 6e 74 65 67 65 72 73 2c 20 6f 72 20 74 68 65  integers, or the
2510: 79 20 64 65 66 69 6e 65 20 74 68 65 6d 0a 20 20  y define them.  
2520: 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 6c  ** inconsistentl
2530: 79 2e 20 20 41 6e 64 20 6d 61 6e 79 20 64 6f 20  y.  And many do 
2540: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
2550: 68 65 20 22 4c 4c 22 20 6e 6f 74 61 74 69 6f 6e  he "LL" notation
2560: 2e 0a 20 20 2a 2a 20 53 6f 20 77 65 20 64 65 66  ..  ** So we def
2570: 69 6e 65 20 6f 75 72 20 6f 77 6e 20 73 74 61 74  ine our own stat
2580: 69 63 20 63 6f 6e 73 74 61 6e 74 73 20 68 65 72  ic constants her
2590: 65 20 75 73 69 6e 67 20 6e 6f 74 68 69 6e 67 0a  e using nothing.
25a0: 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e    ** larger than
25b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
25c0: 72 20 63 6f 6e 73 74 61 6e 74 2e 0a 20 20 2a 2f  r constant..  */
25d0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
25e0: 69 36 34 20 6d 61 78 49 6e 74 20 3d 20 4c 41 52  i64 maxInt = LAR
25f0: 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 73 74  GEST_INT64;.  st
2600: 61 74 69 63 20 63 6f 6e 73 74 20 69 36 34 20 6d  atic const i64 m
2610: 69 6e 49 6e 74 20 3d 20 53 4d 41 4c 4c 45 53 54  inInt = SMALLEST
2620: 5f 49 4e 54 36 34 3b 0a 0a 20 20 69 66 28 20 72  _INT64;..  if( r
2630: 3c 28 64 6f 75 62 6c 65 29 6d 69 6e 49 6e 74 20  <(double)minInt 
2640: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 69  ){.    return mi
2650: 6e 49 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nInt;.  }else if
2660: 28 20 72 3e 28 64 6f 75 62 6c 65 29 6d 61 78 49  ( r>(double)maxI
2670: 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nt ){.    return
2680: 20 6d 69 6e 49 6e 74 3b 0a 20 20 7d 65 6c 73 65   minInt;.  }else
2690: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 69 36  {.    return (i6
26a0: 34 29 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  4)r;.  }.}../*.*
26b0: 2a 20 52 65 74 75 72 6e 20 73 6f 6d 65 20 6b 69  * Return some ki
26c0: 6e 64 20 6f 66 20 69 6e 74 65 67 65 72 20 76 61  nd of integer va
26d0: 6c 75 65 20 77 68 69 63 68 20 69 73 20 74 68 65  lue which is the
26e0: 20 62 65 73 74 20 77 65 20 63 61 6e 20 64 6f 0a   best we can do.
26f0: 2a 2a 20 61 74 20 72 65 70 72 65 73 65 6e 74 69  ** at representi
2700: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  ng the value tha
2710: 74 20 2a 70 4d 65 6d 20 64 65 73 63 72 69 62 65  t *pMem describe
2720: 73 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  s as an integer.
2730: 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 61  .** If pMem is a
2740: 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  n integer, then 
2750: 74 68 65 20 76 61 6c 75 65 20 69 73 20 65 78 61  the value is exa
2760: 63 74 2e 20 20 49 66 20 70 4d 65 6d 20 69 73 0a  ct.  If pMem is.
2770: 2a 2a 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f  ** a floating-po
2780: 69 6e 74 20 74 68 65 6e 20 74 68 65 20 76 61 6c  int then the val
2790: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
27a0: 68 65 20 69 6e 74 65 67 65 72 20 70 61 72 74 2e  he integer part.
27b0: 0a 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 61  .** If pMem is a
27c0: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c   string or blob,
27d0: 20 74 68 65 6e 20 77 65 20 6d 61 6b 65 20 61 6e   then we make an
27e0: 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76   attempt to conv
27f0: 65 72 74 0a 2a 2a 20 69 74 20 69 6e 74 6f 20 61  ert.** it into a
2800: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
2810: 75 72 6e 20 74 68 61 74 2e 20 20 49 66 20 70 4d  urn that.  If pM
2820: 65 6d 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75  em is NULL, retu
2830: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rn 0..**.** If p
2840: 4d 65 6d 20 69 73 20 61 20 73 74 72 69 6e 67 2c  Mem is a string,
2850: 20 69 74 73 20 65 6e 63 6f 64 69 6e 67 20 6d 69   its encoding mi
2860: 67 68 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ght be changed..
2870: 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 56 64  */.i64 sqlite3Vd
2880: 62 65 49 6e 74 56 61 6c 75 65 28 4d 65 6d 20 2a  beIntValue(Mem *
2890: 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pMem){.  int fla
28a0: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  gs;.  assert( pM
28b0: 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  em->db==0 || sql
28c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
28d0: 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  pMem->db->mutex)
28e0: 20 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 4d   );.  flags = pM
28f0: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  em->flags;.  if(
2900: 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74   flags & MEM_Int
2910: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2920: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73  Mem->u.i;.  }els
2930: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45  e if( flags & ME
2940: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
2950: 74 75 72 6e 20 64 6f 75 62 6c 65 54 6f 49 6e 74  turn doubleToInt
2960: 36 34 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 7d  64(pMem->r);.  }
2970: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2980: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
2990: 6f 62 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76  ob) ){.    i64 v
29a0: 61 6c 75 65 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  alue;.    pMem->
29b0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 72  flags |= MEM_Str
29c0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29d0: 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
29e0: 69 6e 67 28 70 4d 65 6d 2c 20 53 51 4c 49 54 45  ing(pMem, SQLITE
29f0: 5f 55 54 46 38 29 0a 20 20 20 20 20 20 20 7c 7c  _UTF8).       ||
2a00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e   sqlite3VdbeMemN
2a10: 75 6c 54 65 72 6d 69 6e 61 74 65 28 70 4d 65 6d  ulTerminate(pMem
2a20: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
2a30: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  n 0;.    }.    a
2a40: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 20 29  ssert( pMem->z )
2a50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f  ;.    sqlite3Ato
2a60: 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 76 61  i64(pMem->z, &va
2a70: 6c 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  lue);.    return
2a80: 20 76 61 6c 75 65 3b 0a 20 20 7d 65 6c 73 65 7b   value;.  }else{
2a90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2aa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
2ab0: 72 6e 20 74 68 65 20 62 65 73 74 20 72 65 70 72  rn the best repr
2ac0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 4d  esentation of pM
2ad0: 65 6d 20 74 68 61 74 20 77 65 20 63 61 6e 20 67  em that we can g
2ae0: 65 74 20 69 6e 74 6f 20 61 0a 2a 2a 20 64 6f 75  et into a.** dou
2af0: 62 6c 65 2e 20 20 49 66 20 70 4d 65 6d 20 69 73  ble.  If pMem is
2b00: 20 61 6c 72 65 61 64 79 20 61 20 64 6f 75 62 6c   already a doubl
2b10: 65 20 6f 72 20 61 6e 20 69 6e 74 65 67 65 72 2c  e or an integer,
2b20: 20 72 65 74 75 72 6e 20 69 74 73 0a 2a 2a 20 76   return its.** v
2b30: 61 6c 75 65 2e 20 20 49 66 20 69 74 20 69 73 20  alue.  If it is 
2b40: 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
2b50: 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74  , try to convert
2b60: 20 69 74 20 74 6f 20 61 20 64 6f 75 62 6c 65 2e   it to a double.
2b70: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 61 20 4e  .** If it is a N
2b80: 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 30 2e  ULL, return 0.0.
2b90: 0a 2a 2f 0a 64 6f 75 62 6c 65 20 73 71 6c 69 74  .*/.double sqlit
2ba0: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
2bb0: 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73  Mem *pMem){.  as
2bc0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d  sert( pMem->db==
2bd0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
2be0: 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62  ex_held(pMem->db
2bf0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2c00: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
2c10: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
2c20: 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 72 3b 0a  return pMem->r;.
2c30: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
2c40: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
2c50: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
2c60: 28 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e  (double)pMem->u.
2c70: 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  i;.  }else if( p
2c80: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  Mem->flags & (ME
2c90: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
2ca0: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
2cb0: 6c 20 3d 20 30 2e 30 3b 0a 20 20 20 20 70 4d 65  l = 0.0;.    pMe
2cc0: 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  m->flags |= MEM_
2cd0: 53 74 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Str;.    if( sql
2ce0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
2cf0: 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 53 51 4c  coding(pMem, SQL
2d00: 49 54 45 5f 55 54 46 38 29 0a 20 20 20 20 20 20  ITE_UTF8).      
2d10: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 4d   || sqlite3VdbeM
2d20: 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 70  emNulTerminate(p
2d30: 4d 65 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Mem) ){.      re
2d40: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a  turn 0.0;.    }.
2d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
2d60: 2d 3e 7a 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->z );.    sqlit
2d70: 65 33 41 74 6f 46 28 70 4d 65 6d 2d 3e 7a 2c 20  e3AtoF(pMem->z, 
2d80: 26 76 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  &val);.    retur
2d90: 6e 20 76 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n val;.  }else{.
2da0: 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a      return 0.0;.
2db0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
2dc0: 20 4d 45 4d 20 73 74 72 75 63 74 75 72 65 20 69   MEM structure i
2dd0: 73 20 61 6c 72 65 61 64 79 20 61 20 4d 45 4d 5f  s already a MEM_
2de0: 52 65 61 6c 2e 20 20 54 72 79 20 74 6f 20 61 6c  Real.  Try to al
2df0: 73 6f 20 6d 61 6b 65 20 69 74 20 61 0a 2a 2a 20  so make it a.** 
2e00: 4d 45 4d 5f 49 6e 74 20 69 66 20 77 65 20 63 61  MEM_Int if we ca
2e10: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2e20: 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66  e3VdbeIntegerAff
2e30: 69 6e 69 74 79 28 4d 65 6d 20 2a 70 4d 65 6d 29  inity(Mem *pMem)
2e40: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  {.  assert( pMem
2e50: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
2e60: 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2e70: 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73  pMem->db==0 || s
2e80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e90: 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65  d(pMem->db->mute
2ea0: 78 29 20 29 3b 0a 0a 20 20 70 4d 65 6d 2d 3e 75  x) );..  pMem->u
2eb0: 2e 69 20 3d 20 64 6f 75 62 6c 65 54 6f 49 6e 74  .i = doubleToInt
2ec0: 36 34 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 69  64(pMem->r);.  i
2ed0: 66 28 20 70 4d 65 6d 2d 3e 72 3d 3d 28 64 6f 75  f( pMem->r==(dou
2ee0: 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69 20 29 7b  ble)pMem->u.i ){
2ef0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
2f00: 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d   |= MEM_Int;.  }
2f10: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2f20: 73 65 74 54 79 70 65 46 6c 61 67 28 4d 65 6d 20  setTypeFlag(Mem 
2f30: 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 29 7b 0a 20  *pMem, int f){. 
2f40: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
2f50: 70 4d 65 6d 2c 20 66 29 3b 0a 7d 0a 0a 2f 2a 0a  pMem, f);.}../*.
2f60: 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d 65 6d 20  ** Convert pMem 
2f70: 74 6f 20 74 79 70 65 20 69 6e 74 65 67 65 72 2e  to type integer.
2f80: 20 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6e 79    Invalidate any
2f90: 20 70 72 69 6f 72 20 72 65 70 72 65 73 65 6e 74   prior represent
2fa0: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ations..*/.int s
2fb0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
2fc0: 65 67 65 72 69 66 79 28 4d 65 6d 20 2a 70 4d 65  egerify(Mem *pMe
2fd0: 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  m){.  assert( pM
2fe0: 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  em->db==0 || sql
2ff0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3000: 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  pMem->db->mutex)
3010: 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20   );.  pMem->u.i 
3020: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
3030: 56 61 6c 75 65 28 70 4d 65 6d 29 3b 0a 20 20 73  Value(pMem);.  s
3040: 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c  etTypeFlag(pMem,
3050: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 72 65 74   MEM_Int);.  ret
3060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3070: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
3080: 70 4d 65 6d 20 73 6f 20 74 68 61 74 20 69 74 20  pMem so that it 
3090: 69 73 20 6f 66 20 74 79 70 65 20 4d 45 4d 5f 52  is of type MEM_R
30a0: 65 61 6c 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  eal..** Invalida
30b0: 74 65 20 61 6e 79 20 70 72 69 6f 72 20 72 65 70  te any prior rep
30c0: 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  resentations..*/
30d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
30e0: 4d 65 6d 52 65 61 6c 69 66 79 28 4d 65 6d 20 2a  MemRealify(Mem *
30f0: 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28  pMem){.  assert(
3100: 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20   pMem->db==0 || 
3110: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3120: 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74  ld(pMem->db->mut
3130: 65 78 29 20 29 3b 0a 20 20 70 4d 65 6d 2d 3e 72  ex) );.  pMem->r
3140: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
3150: 61 6c 56 61 6c 75 65 28 70 4d 65 6d 29 3b 0a 20  alValue(pMem);. 
3160: 20 73 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65   setTypeFlag(pMe
3170: 6d 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20  m, MEM_Real);.  
3180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
31a0: 72 74 20 70 4d 65 6d 20 73 6f 20 74 68 61 74 20  rt pMem so that 
31b0: 69 74 20 68 61 73 20 74 79 70 65 73 20 4d 45 4d  it has types MEM
31c0: 5f 52 65 61 6c 20 6f 72 20 4d 45 4d 5f 49 6e 74  _Real or MEM_Int
31d0: 20 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 49 6e 76   or both..** Inv
31e0: 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 69 6f  alidate any prio
31f0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
3200: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
3210: 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72 69 66 79  3VdbeMemNumerify
3220: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 64  (Mem *pMem){.  d
3230: 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20  ouble r1, r2;.  
3240: 69 36 34 20 69 3b 0a 20 20 61 73 73 65 72 74 28  i64 i;.  assert(
3250: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
3260: 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
3270: 6c 7c 4d 45 4d 5f 4e 75 6c 6c 29 29 3d 3d 30 20  l|MEM_Null))==0 
3280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  );.  assert( (pM
3290: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  em->flags & (MEM
32a0: 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 21  _Blob|MEM_Str))!
32b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
32c0: 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73  pMem->db==0 || s
32d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32e0: 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65  d(pMem->db->mute
32f0: 78 29 20 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c  x) );.  r1 = sql
3300: 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
3310: 65 28 70 4d 65 6d 29 3b 0a 20 20 69 20 3d 20 64  e(pMem);.  i = d
3320: 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 72 31 29  oubleToInt64(r1)
3330: 3b 0a 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65  ;.  r2 = (double
3340: 29 69 3b 0a 20 20 69 66 28 20 72 31 3d 3d 72 32  )i;.  if( r1==r2
3350: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
3360: 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
3370: 28 70 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pMem);.  }else{
3380: 0a 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 72  .    pMem->r = r
3390: 31 3b 0a 20 20 20 20 73 65 74 54 79 70 65 46 6c  1;.    setTypeFl
33a0: 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 52 65 61  ag(pMem, MEM_Rea
33b0: 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
33c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79 20  *.** Delete any 
33e0: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 61  previous value a
33f0: 6e 64 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  nd set the value
3400: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d   stored in *pMem
3410: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69   to NULL..*/.voi
3420: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  d sqlite3VdbeMem
3430: 53 65 74 4e 75 6c 6c 28 4d 65 6d 20 2a 70 4d 65  SetNull(Mem *pMe
3440: 6d 29 7b 0a 20 20 73 65 74 54 79 70 65 46 6c 61  m){.  setTypeFla
3450: 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 4e 75 6c 6c  g(pMem, MEM_Null
3460: 29 3b 0a 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  );.  pMem->type 
3470: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 7d  = SQLITE_NULL;.}
3480: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
3490: 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ny previous valu
34a0: 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61  e and set the va
34b0: 6c 75 65 20 74 6f 20 62 65 20 61 20 42 4c 4f 42  lue to be a BLOB
34c0: 20 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 6e 20   of length.** n 
34d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 7a  containing all z
34e0: 65 72 6f 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eros..*/.void sq
34f0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 5a  lite3VdbeMemSetZ
3500: 65 72 6f 42 6c 6f 62 28 4d 65 6d 20 2a 70 4d 65  eroBlob(Mem *pMe
3510: 6d 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 73 71 6c  m, int n){.  sql
3520: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
3530: 73 65 28 70 4d 65 6d 29 3b 0a 20 20 73 65 74 54  se(pMem);.  setT
3540: 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45  ypeFlag(pMem, ME
3550: 4d 5f 42 6c 6f 62 29 3b 0a 20 20 70 4d 65 6d 2d  M_Blob);.  pMem-
3560: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
3570: 62 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 70 4d  b|MEM_Zero;.  pM
3580: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
3590: 45 5f 42 4c 4f 42 3b 0a 20 20 70 4d 65 6d 2d 3e  E_BLOB;.  pMem->
35a0: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30  n = 0;.  if( n<0
35b0: 20 29 20 6e 20 3d 20 30 3b 0a 20 20 70 4d 65 6d   ) n = 0;.  pMem
35c0: 2d 3e 75 2e 69 20 3d 20 6e 3b 0a 20 20 70 4d 65  ->u.i = n;.  pMe
35d0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
35e0: 55 54 46 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  UTF8;.}../*.** D
35f0: 65 6c 65 74 65 20 61 6e 79 20 70 72 65 76 69 6f  elete any previo
3600: 75 73 20 76 61 6c 75 65 20 61 6e 64 20 73 65 74  us value and set
3610: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
3620: 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f 20 76 61  d in *pMem to va
3630: 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65 73 74 20 74  l,.** manifest t
3640: 79 70 65 20 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a  ype INTEGER..*/.
3650: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3660: 4d 65 6d 53 65 74 49 6e 74 36 34 28 4d 65 6d 20  MemSetInt64(Mem 
3670: 2a 70 4d 65 6d 2c 20 69 36 34 20 76 61 6c 29 7b  *pMem, i64 val){
3680: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
3690: 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
36a0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 61    pMem->u.i = va
36b0: 6c 3b 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  l;.  pMem->flags
36c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 4d   = MEM_Int;.  pM
36d0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
36e0: 45 5f 49 4e 54 45 47 45 52 3b 0a 7d 0a 0a 2f 2a  E_INTEGER;.}../*
36f0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70  .** Delete any p
3700: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e  revious value an
3710: 64 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  d set the value 
3720: 73 74 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20  stored in *pMem 
3730: 74 6f 20 76 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66  to val,.** manif
3740: 65 73 74 20 74 79 70 65 20 52 45 41 4c 2e 0a 2a  est type REAL..*
3750: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3760: 62 65 4d 65 6d 53 65 74 44 6f 75 62 6c 65 28 4d  beMemSetDouble(M
3770: 65 6d 20 2a 70 4d 65 6d 2c 20 64 6f 75 62 6c 65  em *pMem, double
3780: 20 76 61 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c   val){.  if( sql
3790: 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 29 20 29  ite3IsNaN(val) )
37a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
37b0: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d  eMemSetNull(pMem
37c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
37d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
37e0: 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
37f0: 20 70 4d 65 6d 2d 3e 72 20 3d 20 76 61 6c 3b 0a   pMem->r = val;.
3800: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
3810: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
3820: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
3830: 49 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a 7d  ITE_FLOAT;.  }.}
3840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3850: 72 75 65 20 69 66 20 74 68 65 20 4d 65 6d 20 6f  rue if the Mem o
3860: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
3870: 20 54 45 58 54 20 6f 72 20 42 4c 4f 42 20 74 68   TEXT or BLOB th
3880: 61 74 20 69 73 0a 2a 2a 20 74 6f 6f 20 6c 61 72  at is.** too lar
3890: 67 65 20 2d 20 77 68 6f 73 65 20 73 69 7a 65 20  ge - whose size 
38a0: 65 78 63 65 65 64 73 20 53 51 4c 49 54 45 5f 4d  exceeds SQLITE_M
38b0: 41 58 5f 4c 45 4e 47 54 48 2e 0a 2a 2f 0a 69 6e  AX_LENGTH..*/.in
38c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
38d0: 54 6f 6f 42 69 67 28 4d 65 6d 20 2a 70 29 7b 0a  TooBig(Mem *p){.
38e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
38f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66  =0 );.  if( p->f
3900: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
3910: 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20  MEM_Blob) ){.   
3920: 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 3b 0a 20   int n = p->n;. 
3930: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
3940: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
3950: 20 20 20 20 6e 20 2b 3d 20 70 2d 3e 75 2e 69 3b      n += p->u.i;
3960: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
3970: 6e 20 6e 3e 70 2d 3e 64 62 2d 3e 61 4c 69 6d 69  n n>p->db->aLimi
3980: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
3990: 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a 20 20 72 65  ENGTH];.  }.  re
39a0: 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn 0; .}../*.*
39b0: 2a 20 53 69 7a 65 20 6f 66 20 73 74 72 75 63 74  * Size of struct
39c0: 20 4d 65 6d 20 6e 6f 74 20 69 6e 63 6c 75 64 69   Mem not includi
39d0: 6e 67 20 74 68 65 20 4d 65 6d 2e 7a 4d 61 6c 6c  ng the Mem.zMall
39e0: 6f 63 20 6d 65 6d 62 65 72 2e 0a 2a 2f 0a 23 64  oc member..*/.#d
39f0: 65 66 69 6e 65 20 4d 45 4d 43 45 4c 4c 53 49 5a  efine MEMCELLSIZ
3a00: 45 20 28 73 69 7a 65 5f 74 29 28 26 28 28 28 4d  E (size_t)(&(((M
3a10: 65 6d 20 2a 29 30 29 2d 3e 7a 4d 61 6c 6c 6f 63  em *)0)->zMalloc
3a20: 29 29 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  ))../*.** Make a
3a30: 6e 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  n shallow copy o
3a40: 66 20 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f  f pFrom into pTo
3a50: 2e 20 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74  .  Prior content
3a60: 73 20 6f 66 0a 2a 2a 20 70 54 6f 20 61 72 65 20  s of.** pTo are 
3a70: 66 72 65 65 64 2e 20 20 54 68 65 20 70 46 72 6f  freed.  The pFro
3a80: 6d 2d 3e 7a 20 66 69 65 6c 64 20 69 73 20 6e 6f  m->z field is no
3a90: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 20 20 49  t duplicated.  I
3aa0: 66 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 7a 20 69 73  f.** pFrom->z is
3ab0: 20 75 73 65 64 2c 20 74 68 65 6e 20 70 54 6f 2d   used, then pTo-
3ac0: 3e 7a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  >z points to the
3ad0: 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 70   same thing as p
3ae0: 46 72 6f 6d 2d 3e 7a 0a 2a 2a 20 61 6e 64 20 66  From->z.** and f
3af0: 6c 61 67 73 20 67 65 74 73 20 73 72 63 54 79 70  lags gets srcTyp
3b00: 65 20 28 65 69 74 68 65 72 20 4d 45 4d 5f 45 70  e (either MEM_Ep
3b10: 68 65 6d 20 6f 72 20 4d 45 4d 5f 53 74 61 74 69  hem or MEM_Stati
3b20: 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
3b30: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
3b40: 77 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f 2c 20  wCopy(Mem *pTo, 
3b50: 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72 6f 6d  const Mem *pFrom
3b60: 2c 20 69 6e 74 20 73 72 63 54 79 70 65 29 7b 0a  , int srcType){.
3b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3b80: 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28  ReleaseExternal(
3b90: 70 54 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  pTo);.  memcpy(p
3ba0: 54 6f 2c 20 70 46 72 6f 6d 2c 20 4d 45 4d 43 45  To, pFrom, MEMCE
3bb0: 4c 4c 53 49 5a 45 29 3b 0a 20 20 70 54 6f 2d 3e  LLSIZE);.  pTo->
3bc0: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  xDel = 0;.  if( 
3bd0: 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 26 4d 45  (pFrom->flags&ME
3be0: 4d 5f 44 79 6e 29 21 3d 30 20 7c 7c 20 70 46 72  M_Dyn)!=0 || pFr
3bf0: 6f 6d 2d 3e 7a 3d 3d 70 46 72 6f 6d 2d 3e 7a 4d  om->z==pFrom->zM
3c00: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 54 6f  alloc ){.    pTo
3c10: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
3c20: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Dyn|MEM_Static|
3c30: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
3c40: 61 73 73 65 72 74 28 20 73 72 63 54 79 70 65 3d  assert( srcType=
3c50: 3d 4d 45 4d 5f 45 70 68 65 6d 20 7c 7c 20 73 72  =MEM_Ephem || sr
3c60: 63 54 79 70 65 3d 3d 4d 45 4d 5f 53 74 61 74 69  cType==MEM_Stati
3c70: 63 20 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 66 6c  c );.    pTo->fl
3c80: 61 67 73 20 7c 3d 20 73 72 63 54 79 70 65 3b 0a  ags |= srcType;.
3c90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
3ca0: 65 20 61 20 66 75 6c 6c 20 63 6f 70 79 20 6f 66  e a full copy of
3cb0: 20 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e   pFrom into pTo.
3cc0: 20 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74 73    Prior contents
3cd0: 20 6f 66 20 70 54 6f 20 61 72 65 0a 2a 2a 20 66   of pTo are.** f
3ce0: 72 65 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  reed before the 
3cf0: 63 6f 70 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2f  copy is made..*/
3d00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3d10: 4d 65 6d 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f  MemCopy(Mem *pTo
3d20: 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72  , const Mem *pFr
3d30: 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  om){.  int rc = 
3d40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
3d50: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
3d60: 61 73 65 45 78 74 65 72 6e 61 6c 28 70 54 6f 29  aseExternal(pTo)
3d70: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20  ;.  memcpy(pTo, 
3d80: 70 46 72 6f 6d 2c 20 4d 45 4d 43 45 4c 4c 53 49  pFrom, MEMCELLSI
3d90: 5a 45 29 3b 0a 20 20 70 54 6f 2d 3e 66 6c 61 67  ZE);.  pTo->flag
3da0: 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b 0a 0a  s &= ~MEM_Dyn;..
3db0: 20 20 69 66 28 20 70 54 6f 2d 3e 66 6c 61 67 73    if( pTo->flags
3dc0: 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
3dd0: 6f 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 30  ob) ){.    if( 0
3de0: 3d 3d 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 26  ==(pFrom->flags&
3df0: 4d 45 4d 5f 53 74 61 74 69 63 29 20 29 7b 0a 20  MEM_Static) ){. 
3e00: 20 20 20 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20       pTo->flags 
3e10: 7c 3d 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20  |= MEM_Ephem;.  
3e20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3e30: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65  VdbeMemMakeWrite
3e40: 61 62 6c 65 28 70 54 6f 29 3b 0a 20 20 20 20 7d  able(pTo);.    }
3e50: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
3e60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  c;.}../*.** Tran
3e70: 73 66 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74  sfer the content
3e80: 73 20 6f 66 20 70 46 72 6f 6d 20 74 6f 20 70 54  s of pFrom to pT
3e90: 6f 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20  o. Any existing 
3ea0: 76 61 6c 75 65 20 69 6e 20 70 54 6f 20 69 73 0a  value in pTo is.
3eb0: 2a 2a 20 66 72 65 65 64 2e 20 49 66 20 70 46 72  ** freed. If pFr
3ec0: 6f 6d 20 63 6f 6e 74 61 69 6e 73 20 65 70 68 65  om contains ephe
3ed0: 6d 65 72 61 6c 20 64 61 74 61 2c 20 61 20 63 6f  meral data, a co
3ee0: 70 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2a 0a 2a  py is made..**.*
3ef0: 2a 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 73  * pFrom contains
3f00: 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 77 68 65   an SQL NULL whe
3f10: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
3f20: 65 74 75 72 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  eturns..*/.void 
3f30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
3f40: 76 65 28 4d 65 6d 20 2a 70 54 6f 2c 20 4d 65 6d  ve(Mem *pTo, Mem
3f50: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 61 73 73 65   *pFrom){.  asse
3f60: 72 74 28 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30  rt( pFrom->db==0
3f70: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
3f80: 78 5f 68 65 6c 64 28 70 46 72 6f 6d 2d 3e 64 62  x_held(pFrom->db
3f90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
3fa0: 73 65 72 74 28 20 70 54 6f 2d 3e 64 62 3d 3d 30  sert( pTo->db==0
3fb0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
3fc0: 78 5f 68 65 6c 64 28 70 54 6f 2d 3e 64 62 2d 3e  x_held(pTo->db->
3fd0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
3fe0: 72 74 28 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30  rt( pFrom->db==0
3ff0: 20 7c 7c 20 70 54 6f 2d 3e 64 62 3d 3d 30 20 7c   || pTo->db==0 |
4000: 7c 20 70 46 72 6f 6d 2d 3e 64 62 3d 3d 70 54 6f  | pFrom->db==pTo
4010: 2d 3e 64 62 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ->db );..  sqlit
4020: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
4030: 28 70 54 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28  (pTo);.  memcpy(
4040: 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 73 69 7a 65  pTo, pFrom, size
4050: 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 70 46 72 6f  of(Mem));.  pFro
4060: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
4070: 75 6c 6c 3b 0a 20 20 70 46 72 6f 6d 2d 3e 78 44  ull;.  pFrom->xD
4080: 65 6c 20 3d 20 30 3b 0a 20 20 70 46 72 6f 6d 2d  el = 0;.  pFrom-
4090: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 7d 0a  >zMalloc = 0;.}.
40a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
40b0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 4d 65 6d  e value of a Mem
40c0: 20 74 6f 20 62 65 20 61 20 73 74 72 69 6e 67 20   to be a string 
40d0: 6f 72 20 61 20 42 4c 4f 42 2e 0a 2a 2a 0a 2a 2a  or a BLOB..**.**
40e0: 20 54 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61   The memory mana
40f0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
4100: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
4110: 61 6c 75 65 20 6f 66 20 74 68 65 20 78 44 65 6c  alue of the xDel
4120: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 49  .** parameter. I
4130: 66 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  f the value pass
4140: 65 64 20 69 73 20 53 51 4c 49 54 45 5f 54 52 41  ed is SQLITE_TRA
4150: 4e 53 49 45 4e 54 2c 20 74 68 65 6e 20 74 68 65  NSIENT, then the
4160: 20 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 63   .** string is c
4170: 6f 70 69 65 64 20 69 6e 74 6f 20 61 20 28 70 6f  opied into a (po
4180: 73 73 69 62 6c 79 20 65 78 69 73 74 69 6e 67 29  ssibly existing)
4190: 20 62 75 66 66 65 72 20 6d 61 6e 61 67 65 64 20   buffer managed 
41a0: 62 79 20 74 68 65 20 0a 2a 2a 20 4d 65 6d 20 73  by the .** Mem s
41b0: 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77  tructure. Otherw
41c0: 69 73 65 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  ise, any existin
41d0: 67 20 62 75 66 66 65 72 20 69 73 20 66 72 65 65  g buffer is free
41e0: 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 70 6f 69  d and the.** poi
41f0: 6e 74 65 72 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a  nter copied..*/.
4200: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
4210: 65 6d 53 65 74 53 74 72 28 0a 20 20 4d 65 6d 20  emSetStr(.  Mem 
4220: 2a 70 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 20  *pMem,          
4230: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
4240: 6f 20 73 65 74 20 74 6f 20 73 74 72 69 6e 67 20  o set to string 
4250: 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  value */.  const
4260: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 2f   char *z,      /
4270: 2a 20 53 74 72 69 6e 67 20 70 6f 69 6e 74 65 72  * String pointer
4280: 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
42a0: 65 73 20 69 6e 20 73 74 72 69 6e 67 2c 20 6f 72  es in string, or
42b0: 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 75   negative */.  u
42c0: 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20  8 enc,          
42d0: 20 20 20 2f 2a 20 45 6e 63 6f 64 69 6e 67 20 6f     /* Encoding o
42e0: 66 20 7a 2e 20 20 30 20 66 6f 72 20 42 4c 4f 42  f z.  0 for BLOB
42f0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  s */.  void (*xD
4300: 65 6c 29 28 76 6f 69 64 2a 29 20 2f 2a 20 44 65  el)(void*) /* De
4310: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
4320: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  n */.){.  int nB
4330: 79 74 65 20 3d 20 6e 3b 20 20 20 20 20 20 2f 2a  yte = n;      /*
4340: 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 70   New value for p
4350: 4d 65 6d 2d 3e 6e 20 2a 2f 0a 20 20 69 6e 74 20  Mem->n */.  int 
4360: 66 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  flags = 0;      
4370: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
4380: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 2a 2f 0a   pMem->flags */.
4390: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
43a0: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
43b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65  3_mutex_held(pMe
43c0: 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  m->db->mutex) );
43d0: 0a 0a 20 20 2f 2a 20 49 66 20 7a 20 69 73 20 61  ..  /* If z is a
43e0: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 73   NULL pointer, s
43f0: 65 74 20 70 4d 65 6d 20 74 6f 20 63 6f 6e 74 61  et pMem to conta
4400: 69 6e 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2e 20  in an SQL NULL. 
4410: 2a 2f 0a 20 20 69 66 28 20 21 7a 20 29 7b 0a 20  */.  if( !z ){. 
4420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
4430: 6d 53 65 74 4e 75 6c 6c 28 70 4d 65 6d 29 3b 0a  mSetNull(pMem);.
4440: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4450: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 66 6c 61  E_OK;.  }..  fla
4460: 67 73 20 3d 20 28 65 6e 63 3d 3d 30 3f 4d 45 4d  gs = (enc==0?MEM
4470: 5f 42 6c 6f 62 3a 4d 45 4d 5f 53 74 72 29 3b 0a  _Blob:MEM_Str);.
4480: 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
4490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 63  .    assert( enc
44a0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65  !=0 );.    if( e
44b0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
44c0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 42 79  ){.      for(nBy
44d0: 74 65 3d 30 3b 20 7a 5b 6e 42 79 74 65 5d 3b 20  te=0; z[nByte]; 
44e0: 6e 42 79 74 65 2b 2b 29 7b 7d 0a 20 20 20 20 7d  nByte++){}.    }
44f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
4500: 6e 42 79 74 65 3d 30 3b 20 7a 5b 6e 42 79 74 65  nByte=0; z[nByte
4510: 5d 20 7c 20 7a 5b 6e 42 79 74 65 2b 31 5d 3b 20  ] | z[nByte+1]; 
4520: 6e 42 79 74 65 2b 3d 32 29 7b 7d 0a 20 20 20 20  nByte+=2){}.    
4530: 7d 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 4d  }.    flags |= M
4540: 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20  EM_Term;.  }..  
4550: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
4560: 20 62 6c 6f 63 6b 20 73 65 74 73 20 74 68 65 20   block sets the 
4570: 6e 65 77 20 76 61 6c 75 65 73 20 6f 66 20 4d 65  new values of Me
4580: 6d 2e 7a 20 61 6e 64 20 4d 65 6d 2e 78 44 65 6c  m.z and Mem.xDel
4590: 2e 20 49 74 0a 20 20 2a 2a 20 61 6c 73 6f 20 73  . It.  ** also s
45a0: 65 74 73 20 61 20 66 6c 61 67 20 69 6e 20 6c 6f  ets a flag in lo
45b0: 63 61 6c 20 76 61 72 69 61 62 6c 65 20 22 66 6c  cal variable "fl
45c0: 61 67 73 22 20 74 6f 20 69 6e 64 69 63 61 74 65  ags" to indicate
45d0: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   the memory.  **
45e0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 28 6f 6e 65   management (one
45f0: 20 6f 66 20 4d 45 4d 5f 44 79 6e 20 6f 72 20 4d   of MEM_Dyn or M
4600: 45 4d 5f 53 74 61 74 69 63 29 2e 0a 20 20 2a 2f  EM_Static)..  */
4610: 0a 20 20 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c  .  if( xDel==SQL
4620: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 29 7b  ITE_TRANSIENT ){
4630: 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
4640: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28  = nByte;.    if(
4650: 20 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 20   flags&MEM_Term 
4660: 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  ){.      nAlloc 
4670: 2b 3d 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  += (enc==SQLITE_
4680: 55 54 46 38 3f 31 3a 32 29 3b 0a 20 20 20 20 7d  UTF8?1:2);.    }
4690: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
46a0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
46b0: 2c 20 6e 41 6c 6c 6f 63 2c 20 30 29 20 29 7b 0a  , nAlloc, 0) ){.
46c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
46d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
46e0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d  .    memcpy(pMem
46f0: 2d 3e 7a 2c 20 7a 2c 20 6e 41 6c 6c 6f 63 29 3b  ->z, z, nAlloc);
4700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4710: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
4720: 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 70  ase(pMem);.    p
4730: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
4740: 29 7a 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 78 44  )z;.    pMem->xD
4750: 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 20 20 66  el = xDel;.    f
4760: 6c 61 67 73 20 7c 3d 20 28 28 78 44 65 6c 3d 3d  lags |= ((xDel==
4770: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3f 4d  SQLITE_STATIC)?M
4780: 45 4d 5f 53 74 61 74 69 63 3a 4d 45 4d 5f 44 79  EM_Static:MEM_Dy
4790: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 65 6d 2d  n);.  }..  pMem-
47a0: 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 70 4d  >n = nByte;.  pM
47b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  em->flags = flag
47c0: 73 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  s;.  pMem->enc =
47d0: 20 28 65 6e 63 3d 3d 30 20 3f 20 53 51 4c 49 54   (enc==0 ? SQLIT
47e0: 45 5f 55 54 46 38 20 3a 20 65 6e 63 29 3b 0a 20  E_UTF8 : enc);. 
47f0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 28 65   pMem->type = (e
4800: 6e 63 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 42  nc==0 ? SQLITE_B
4810: 4c 4f 42 20 3a 20 53 51 4c 49 54 45 5f 54 45 58  LOB : SQLITE_TEX
4820: 54 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  T);..#ifndef SQL
4830: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
4840: 20 69 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d   if( pMem->enc!=
4850: 53 51 4c 49 54 45 5f 55 54 46 38 20 26 26 20 73  SQLITE_UTF8 && s
4860: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 48 61 6e  qlite3VdbeMemHan
4870: 64 6c 65 42 6f 6d 28 70 4d 65 6d 29 20 29 7b 0a  dleBom(pMem) ){.
4880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4890: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  E_NOMEM;.  }.#en
48a0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
48b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
48c0: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
48d0: 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
48e0: 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
48f0: 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
4900: 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
4910: 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
4920: 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
4930: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
4940: 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
4950: 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
4960: 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
4970: 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
4980: 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
4990: 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
49a0: 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
49b0: 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
49c0: 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
49d0: 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
49e0: 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
49f0: 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
4a00: 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
4a10: 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
4a20: 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
4a30: 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
4a40: 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
4a50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
4a60: 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
4a70: 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
4a80: 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
4a90: 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
4aa0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
4ab0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
4ac0: 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
4ad0: 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
4ae0: 2f 2a 20 49 6e 74 65 72 63 68 61 6e 67 65 20 70  /* Interchange p
4af0: 4d 65 6d 31 20 61 6e 64 20 70 4d 65 6d 32 20 69  Mem1 and pMem2 i
4b00: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  f the collating 
4b10: 73 65 71 75 65 6e 63 65 20 73 70 65 63 69 66 69  sequence specifi
4b20: 65 73 0a 20 20 2a 2a 20 44 45 53 43 20 6f 72 64  es.  ** DESC ord
4b30: 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 31 20 3d 20  er..  */.  f1 = 
4b40: 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem1->flags;.  
4b50: 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67  f2 = pMem2->flag
4b60: 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c  s;.  combined_fl
4b70: 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 0a 20  ags = f1|f2;. . 
4b80: 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
4b90: 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
4ba0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
4bb0: 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
4bc0: 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
4bd0: 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
4be0: 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
4bf0: 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
4c00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
4c10: 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
4c20: 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
4c30: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
4c40: 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20  lue is a number 
4c50: 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
4c60: 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72   not, the number
4c70: 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
4c80: 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65  f both are numbe
4c90: 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72  rs, compare as r
4ca0: 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61  eals if one is a
4cb0: 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74   real, or as int
4cc0: 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f  egers.  ** if bo
4cd0: 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e  th values are in
4ce0: 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  tegers..  */.  i
4cf0: 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
4d00: 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
4d10: 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  eal) ){.    if( 
4d20: 21 28 66 31 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  !(f1&(MEM_Int|ME
4d30: 4d 5f 52 65 61 6c 29 29 20 29 7b 0a 20 20 20 20  M_Real)) ){.    
4d40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4d50: 7d 0a 20 20 20 20 69 66 28 20 21 28 66 32 26 28  }.    if( !(f2&(
4d60: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
4d70: 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  )) ){.      retu
4d80: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
4d90: 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
4da0: 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
4db0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20       double r1, 
4dc0: 72 32 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66  r2;.      if( (f
4dd0: 31 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29  1&MEM_Real)==0 )
4de0: 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 70  {.        r1 = p
4df0: 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  Mem1->u.i;.     
4e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4e10: 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 72 3b 0a 20  r1 = pMem1->r;. 
4e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4e30: 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d   (f2&MEM_Real)==
4e40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 32 20  0 ){.        r2 
4e50: 3d 20 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20  = pMem2->u.i;.  
4e60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e70: 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 72     r2 = pMem2->r
4e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4e90: 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75  if( r1<r2 ) retu
4ea0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
4eb0: 20 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20   r1>r2 ) return 
4ec0: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
4ed0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
4ee0: 20 20 20 20 61 73 73 65 72 74 28 20 66 31 26 4d      assert( f1&M
4ef0: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
4f00: 61 73 73 65 72 74 28 20 66 32 26 4d 45 4d 5f 49  assert( f2&MEM_I
4f10: 6e 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt );.      if( 
4f20: 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
4f30: 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
4f40: 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
4f50: 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
4f60: 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
4f70: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
4f80: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
4f90: 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
4fa0: 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
4fb0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
4fc0: 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
4fd0: 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
4fe0: 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
4ff0: 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
5000: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
5010: 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
5020: 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
5030: 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
5040: 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
5050: 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
5060: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5070: 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
5080: 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
5090: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
50a0: 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
50b0: 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
50c0: 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20  Mem2->enc );.   
50d0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
50e0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
50f0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
5100: 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
5110: 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
5120: 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
5130: 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
5140: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
5150: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
5160: 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
5170: 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
5180: 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
5190: 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
51a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
51b0: 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
51c0: 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
51d0: 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
51e0: 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
51f0: 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
5200: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
5210: 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
5220: 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
5230: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
5240: 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
5250: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
5260: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72        /* The str
5270: 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
5280: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
5290: 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
52a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
52b0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
52c0: 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
52d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
52e0: 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
52f0: 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
5300: 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
5310: 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 20  n,pMem2->z);.   
5320: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5330: 20 20 75 38 20 6f 72 69 67 45 6e 63 20 3d 20 70    u8 origEnc = p
5340: 4d 65 6d 31 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  Mem1->enc;.     
5350: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
5360: 31 2c 20 2a 76 32 3b 0a 20 20 20 20 20 20 20 20  1, *v2;.        
5370: 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20  int n1, n2;.    
5380: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
5390: 68 65 20 73 74 72 69 6e 67 73 20 69 6e 74 6f 20  he strings into 
53a0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 68 61  the encoding tha
53b0: 74 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  t the comparison
53c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
53d0: 74 69 6f 6e 20 65 78 70 65 63 74 73 20 2a 2f 0a  tion expects */.
53e0: 20 20 20 20 20 20 20 20 76 31 20 3d 20 73 71 6c          v1 = sql
53f0: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
5400: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 4d  qlite3_value*)pM
5410: 65 6d 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  em1, pColl->enc)
5420: 3b 0a 20 20 20 20 20 20 20 20 6e 31 20 3d 20 76  ;.        n1 = v
5430: 31 3d 3d 30 20 3f 20 30 20 3a 20 70 4d 65 6d 31  1==0 ? 0 : pMem1
5440: 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ->n;.        ass
5450: 65 72 74 28 20 6e 31 3d 3d 73 71 6c 69 74 65 33  ert( n1==sqlite3
5460: 56 61 6c 75 65 42 79 74 65 73 28 28 73 71 6c 69  ValueBytes((sqli
5470: 74 65 33 5f 76 61 6c 75 65 2a 29 70 4d 65 6d 31  te3_value*)pMem1
5480: 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 20 29 3b  , pColl->enc) );
5490: 0a 20 20 20 20 20 20 20 20 76 32 20 3d 20 73 71  .        v2 = sq
54a0: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
54b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
54c0: 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  Mem2, pColl->enc
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 32 20 3d 20  );.        n2 = 
54e0: 76 32 3d 3d 30 20 3f 20 30 20 3a 20 70 4d 65 6d  v2==0 ? 0 : pMem
54f0: 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  2->n;.        as
5500: 73 65 72 74 28 20 6e 32 3d 3d 73 71 6c 69 74 65  sert( n2==sqlite
5510: 33 56 61 6c 75 65 42 79 74 65 73 28 28 73 71 6c  3ValueBytes((sql
5520: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 4d 65 6d  ite3_value*)pMem
5530: 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 20 29  2, pColl->enc) )
5540: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ;.        /* Do 
5550: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a  the comparison *
5560: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
5570: 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
5580: 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
5590: 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 20 20   n2, v2);.      
55a0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
55b0: 20 73 74 72 69 6e 67 73 20 62 61 63 6b 20 69 6e   strings back in
55c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
55d0: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20  encoding */.    
55e0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
55f0: 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
5600: 6c 75 65 2a 29 70 4d 65 6d 31 2c 20 6f 72 69 67  lue*)pMem1, orig
5610: 45 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Enc);.        sq
5620: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
5630: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
5640: 4d 65 6d 32 2c 20 6f 72 69 67 45 6e 63 29 3b 0a  Mem2, origEnc);.
5650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
5660: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
5670: 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c  .    /* If a NUL
5680: 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61  L pointer was pa
5690: 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c  ssed as the coll
56a0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61  ate function, fa
56b0: 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a  ll through.    *
56c0: 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61  * to the blob ca
56d0: 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d  se and use memcm
56e0: 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20  p().  */.  }. . 
56f0: 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20   /* Both values 
5700: 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20  must be blobs.  
5710: 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65  Compare using me
5720: 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63  mcmp().  */.  rc
5730: 20 3d 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d   = memcmp(pMem1-
5740: 3e 7a 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70  >z, pMem2->z, (p
5750: 4d 65 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e  Mem1->n>pMem2->n
5760: 29 3f 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31  )?pMem2->n:pMem1
5770: 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ->n);.  if( rc==
5780: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d  0 ){.    rc = pM
5790: 65 6d 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e  em1->n - pMem2->
57a0: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
57b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
57c0: 65 20 64 61 74 61 20 6f 75 74 20 6f 66 20 61 20  e data out of a 
57d0: 62 74 72 65 65 20 6b 65 79 20 6f 72 20 64 61 74  btree key or dat
57e0: 61 20 66 69 65 6c 64 20 61 6e 64 20 69 6e 74 6f  a field and into
57f0: 20 61 20 4d 65 6d 20 73 74 72 75 63 74 75 72 65   a Mem structure
5800: 2e 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 6f 72  ..** The data or
5810: 20 6b 65 79 20 69 73 20 74 61 6b 65 6e 20 66 72   key is taken fr
5820: 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
5830: 74 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  t pCur is curren
5840: 74 6c 79 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  tly pointing.** 
5850: 74 6f 2e 20 20 6f 66 66 73 65 74 20 61 6e 64 20  to.  offset and 
5860: 61 6d 74 20 64 65 74 65 72 6d 69 6e 65 20 77 68  amt determine wh
5870: 61 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  at portion of th
5880: 65 20 64 61 74 61 20 6f 72 20 6b 65 79 20 74 6f  e data or key to
5890: 20 72 65 74 72 69 65 76 65 2e 0a 2a 2a 20 6b 65   retrieve..** ke
58a0: 79 20 69 73 20 74 72 75 65 20 74 6f 20 67 65 74  y is true to get
58b0: 20 74 68 65 20 6b 65 79 20 6f 72 20 66 61 6c 73   the key or fals
58c0: 65 20 74 6f 20 67 65 74 20 64 61 74 61 2e 20 20  e to get data.  
58d0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 77 72  The result is wr
58e0: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
58f0: 65 20 70 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a  e pMem element..
5900: 2a 2a 0a 2a 2a 20 54 68 65 20 70 4d 65 6d 20 73  **.** The pMem s
5910: 74 72 75 63 74 75 72 65 20 69 73 20 61 73 73 75  tructure is assu
5920: 6d 65 64 20 74 6f 20 62 65 20 75 6e 69 6e 69 74  med to be uninit
5930: 69 61 6c 69 7a 65 64 2e 20 20 41 6e 79 20 70 72  ialized.  Any pr
5940: 69 6f 72 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 69  ior content.** i
5950: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
5960: 74 68 6f 75 74 20 62 65 69 6e 67 20 66 72 65 65  thout being free
5970: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
5980: 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
5990: 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 20 28 6d  or any reason (m
59a0: 61 6c 6c 6f 63 20 72 65 74 75 72 6e 73 20 4e 55  alloc returns NU
59b0: 4c 4c 20 6f 72 20 75 6e 61 62 6c 65 0a 2a 2a 20  LL or unable.** 
59c0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  to read from the
59d0: 20 64 69 73 6b 29 20 74 68 65 6e 20 74 68 65 20   disk) then the 
59e0: 70 4d 65 6d 20 69 73 20 6c 65 66 74 20 69 6e 20  pMem is left in 
59f0: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
5a00: 73 74 61 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  state..*/.int sq
5a10: 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
5a20: 42 74 72 65 65 28 0a 20 20 42 74 43 75 72 73 6f  Btree(.  BtCurso
5a30: 72 20 2a 70 43 75 72 2c 20 20 20 2f 2a 20 43 75  r *pCur,   /* Cu
5a40: 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  rsor pointing at
5a50: 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 72 69   record to retri
5a60: 65 76 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  eve. */.  int of
5a70: 66 73 65 74 2c 20 20 20 20 20 20 20 2f 2a 20 4f  fset,       /* O
5a80: 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20 73  ffset from the s
5a90: 74 61 72 74 20 6f 66 20 64 61 74 61 20 74 6f 20  tart of data to 
5aa0: 72 65 74 75 72 6e 20 62 79 74 65 73 20 66 72 6f  return bytes fro
5ab0: 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  m. */.  int amt,
5ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5ad0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
5ae0: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69 6e 74  return. */.  int
5af0: 20 6b 65 79 2c 20 20 20 20 20 20 20 20 20 20 2f   key,          /
5b00: 2a 20 49 66 20 74 72 75 65 2c 20 72 65 74 72 69  * If true, retri
5b10: 65 76 65 20 66 72 6f 6d 20 74 68 65 20 62 74 72  eve from the btr
5b20: 65 65 20 6b 65 79 2c 20 6e 6f 74 20 64 61 74 61  ee key, not data
5b30: 2e 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  . */.  Mem *pMem
5b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
5b50: 20 52 65 74 75 72 6e 20 64 61 74 61 20 69 6e 20   Return data in 
5b60: 74 68 69 73 20 4d 65 6d 20 73 74 72 75 63 74 75  this Mem structu
5b70: 72 65 2e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  re. */.){.  char
5b80: 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20 2f   *zData;       /
5b90: 2a 20 44 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * Data from the 
5ba0: 62 74 72 65 65 20 6c 61 79 65 72 20 2a 2f 0a 20  btree layer */. 
5bb0: 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 20 3d   int available =
5bc0: 20 30 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66   0; /* Number of
5bd0: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
5be0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 62 74   on the local bt
5bf0: 72 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  ree page */.  sq
5c00: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
5c10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
5c20: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
5c30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5c40: 0a 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  ..  db = sqlite3
5c50: 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 70 43  BtreeCursorDb(pC
5c60: 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ur);.  assert( s
5c70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5c80: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
5c90: 20 20 69 66 28 20 6b 65 79 20 29 7b 0a 20 20 20    if( key ){.   
5ca0: 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a   zData = (char *
5cb0: 29 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  )sqlite3BtreeKey
5cc0: 46 65 74 63 68 28 70 43 75 72 2c 20 26 61 76 61  Fetch(pCur, &ava
5cd0: 69 6c 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  ilable);.  }else
5ce0: 7b 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 28 63  {.    zData = (c
5cf0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 42 74 72  har *)sqlite3Btr
5d00: 65 65 44 61 74 61 46 65 74 63 68 28 70 43 75 72  eeDataFetch(pCur
5d10: 2c 20 26 61 76 61 69 6c 61 62 6c 65 29 3b 0a 20  , &available);. 
5d20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61   }.  assert( zDa
5d30: 74 61 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta!=0 );..  if( 
5d40: 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 61 76 61 69  offset+amt<=avai
5d50: 6c 61 62 6c 65 20 26 26 20 28 28 70 4d 65 6d 2d  lable && ((pMem-
5d60: 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 3d  >flags&MEM_Dyn)=
5d70: 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 78 44 65 6c  =0 || pMem->xDel
5d80: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5d90: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
5da0: 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  Mem);.    pMem->
5db0: 7a 20 3d 20 26 7a 44 61 74 61 5b 6f 66 66 73 65  z = &zData[offse
5dc0: 74 5d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  t];.    pMem->fl
5dd0: 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ags = MEM_Blob|M
5de0: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 7d 65 6c 73  EM_Ephem;.  }els
5df0: 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  e if( SQLITE_OK=
5e00: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64  =(rc = sqlite3Vd
5e10: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
5e20: 61 6d 74 2b 32 2c 20 30 29 29 20 29 7b 0a 20 20  amt+2, 0)) ){.  
5e30: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5e40: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 44 79 6e  MEM_Blob|MEM_Dyn
5e50: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70  |MEM_Term;.    p
5e60: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 30 3b 0a 20 20  Mem->enc = 0;.  
5e70: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5e80: 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 20 20  QLITE_BLOB;.    
5e90: 69 66 28 20 6b 65 79 20 29 7b 0a 20 20 20 20 20  if( key ){.     
5ea0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5eb0: 65 65 4b 65 79 28 70 43 75 72 2c 20 6f 66 66 73  eeKey(pCur, offs
5ec0: 65 74 2c 20 61 6d 74 2c 20 70 4d 65 6d 2d 3e 7a  et, amt, pMem->z
5ed0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5ee0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5ef0: 42 74 72 65 65 44 61 74 61 28 70 43 75 72 2c 20  BtreeData(pCur, 
5f00: 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 4d 65  offset, amt, pMe
5f10: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->z);.    }.   
5f20: 20 70 4d 65 6d 2d 3e 7a 5b 61 6d 74 5d 20 3d 20   pMem->z[amt] = 
5f30: 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 61  0;.    pMem->z[a
5f40: 6d 74 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 69  mt+1] = 0;.    i
5f50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5f60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5f70: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
5f80: 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pMem);.    }.  }
5f90: 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 61 6d 74  .  pMem->n = amt
5fa0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
5fb0: 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50  }..#if 0./*.** P
5fc0: 65 72 66 6f 72 6d 20 76 61 72 69 6f 75 73 20 63  erform various c
5fd0: 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 6d 65 6d  hecks on the mem
5fe0: 6f 72 79 20 63 65 6c 6c 20 70 4d 65 6d 2e 20 41  ory cell pMem. A
5ff0: 6e 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c 0a  n assert() will.
6000: 2a 2a 20 66 61 69 6c 20 69 66 20 70 4d 65 6d 20  ** fail if pMem 
6010: 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  is internally in
6020: 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 76  consistent..*/.v
6030: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
6040: 65 6d 53 61 6e 69 74 79 28 4d 65 6d 20 2a 70 4d  emSanity(Mem *pM
6050: 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  em){.  int flags
6060: 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
6070: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 21    assert( flags!
6080: 3d 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 64  =0 );  /* Must d
6090: 65 66 69 6e 65 20 73 6f 6d 65 20 74 79 70 65 20  efine some type 
60a0: 2a 2f 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  */.  if( flags &
60b0: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
60c0: 6f 62 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  ob) ){.    int x
60d0: 20 3d 20 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f   = flags & (MEM_
60e0: 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 7c 4d  Static|MEM_Dyn|M
60f0: 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 68 6f  EM_Ephem|MEM_Sho
6100: 72 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rt);.    assert(
6110: 20 78 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20   x!=0 );        
6120: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 73 20 6d      /* Strings m
6130: 75 73 74 20 64 65 66 69 6e 65 20 61 20 73 74 72  ust define a str
6140: 69 6e 67 20 73 75 62 74 79 70 65 20 2a 2f 0a 20  ing subtype */. 
6150: 20 20 20 61 73 73 65 72 74 28 20 28 78 20 26 20     assert( (x & 
6160: 28 78 2d 31 29 29 3d 3d 30 20 29 3b 20 20 2f 2a  (x-1))==0 );  /*
6170: 20 4f 6e 6c 79 20 6f 6e 65 20 73 74 72 69 6e 67   Only one string
6180: 20 73 75 62 74 79 70 65 20 63 61 6e 20 62 65 20   subtype can be 
6190: 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 20 20 61  defined */.    a
61a0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
61b0: 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 53 74 72  0 );      /* Str
61c0: 69 6e 67 73 20 6d 75 73 74 20 68 61 76 65 20 61  ings must have a
61d0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 2f 2a   value */.    /*
61e0: 20 4d 65 6d 2e 7a 20 70 6f 69 6e 74 73 20 74 6f   Mem.z points to
61f0: 20 4d 65 6d 2e 7a 53 68 6f 72 74 20 69 66 66 20   Mem.zShort iff 
6200: 74 68 65 20 73 75 62 74 79 70 65 20 69 73 20 4d  the subtype is M
6210: 45 4d 5f 53 68 6f 72 74 20 2a 2f 0a 20 20 20 20  EM_Short */.    
6220: 61 73 73 65 72 74 28 20 28 78 20 26 20 4d 45 4d  assert( (x & MEM
6230: 5f 53 68 6f 72 74 29 3d 3d 30 20 7c 7c 20 70 4d  _Short)==0 || pM
6240: 65 6d 2d 3e 7a 3d 3d 70 4d 65 6d 2d 3e 7a 53 68  em->z==pMem->zSh
6250: 6f 72 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ort );.    asser
6260: 74 28 20 28 78 20 26 20 4d 45 4d 5f 53 68 6f 72  t( (x & MEM_Shor
6270: 74 29 21 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 7a  t)!=0 || pMem->z
6280: 21 3d 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 20 29  !=pMem->zShort )
6290: 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74  ;.    /* No dest
62a0: 72 75 63 74 6f 72 20 75 6e 6c 65 73 73 20 74 68  ructor unless th
62b0: 65 72 65 20 69 73 20 4d 45 4d 5f 44 79 6e 20 2a  ere is MEM_Dyn *
62c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  /.    assert( pM
62d0: 65 6d 2d 3e 78 44 65 6c 3d 3d 30 20 7c 7c 20 28  em->xDel==0 || (
62e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
62f0: 4d 5f 44 79 6e 29 21 3d 30 20 29 3b 0a 0a 20 20  M_Dyn)!=0 );..  
6300: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d    if( (flags & M
6310: 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20 20 20 20  EM_Str) ){.     
6320: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 65   assert( pMem->e
6330: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
6340: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
6350: 20 20 70 4d 65 6d 2d 3e 65 6e 63 3d 3d 53 51 4c    pMem->enc==SQL
6360: 49 54 45 5f 55 54 46 31 36 42 45 20 7c 7c 0a 20  ITE_UTF16BE ||. 
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65               pMe
6380: 6d 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  m->enc==SQLITE_U
6390: 54 46 31 36 4c 45 20 0a 20 20 20 20 20 20 29 3b  TF16LE .      );
63a0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
63b0: 20 73 74 72 69 6e 67 20 69 73 20 55 54 46 2d 38   string is UTF-8
63c0: 20 65 6e 63 6f 64 65 64 20 61 6e 64 20 6e 75 6c   encoded and nul
63d0: 20 74 65 72 6d 69 6e 61 74 65 64 2c 20 74 68 65   terminated, the
63e0: 6e 20 70 4d 65 6d 2d 3e 6e 0a 20 20 20 20 20 20  n pMem->n.      
63f0: 2a 2a 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  ** must be the l
6400: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 74 72  ength of the str
6410: 69 6e 67 2e 20 20 28 4c 61 74 65 72 3a 29 20 20  ing.  (Later:)  
6420: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
6430: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  file.      ** ha
6440: 73 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64  s been corrupted
6450: 2c 20 27 5c 30 30 30 27 20 63 68 61 72 61 63 74  , '\000' charact
6460: 65 72 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ers might have b
6470: 65 65 6e 20 69 6e 73 65 72 74 65 64 0a 20 20 20  een inserted.   
6480: 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6d     ** into the m
6490: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 74 72  iddle of the str
64a0: 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ing.  In that ca
64b0: 73 65 2c 20 74 68 65 20 73 74 72 6c 65 6e 28 29  se, the strlen()
64c0: 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20   might.      ** 
64d0: 62 65 20 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a  be less..      *
64e0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  /.      if( pMem
64f0: 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
6500: 46 38 20 26 26 20 28 66 6c 61 67 73 20 26 20 4d  F8 && (flags & M
6510: 45 4d 5f 54 65 72 6d 29 20 29 7b 20 0a 20 20 20  EM_Term) ){ .   
6520: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72       assert( str
6530: 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3c 3d 70 4d  len(pMem->z)<=pM
6540: 65 6d 2d 3e 6e 20 29 3b 0a 20 20 20 20 20 20 20  em->n );.       
6550: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
6560: 5b 70 4d 65 6d 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a  [pMem->n]==0 );.
6570: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6580: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 61  }else{.    /* Ca
6590: 6e 6e 6f 74 20 64 65 66 69 6e 65 20 61 20 73 74  nnot define a st
65a0: 72 69 6e 67 20 73 75 62 74 79 70 65 20 66 6f 72  ring subtype for
65b0: 20 6e 6f 6e 2d 73 74 72 69 6e 67 20 6f 62 6a 65   non-string obje
65c0: 63 74 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  cts */.    asser
65d0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
65e0: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
65f0: 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 7c  M_Dyn|MEM_Ephem|
6600: 4d 45 4d 5f 53 68 6f 72 74 29 29 3d 3d 30 20 29  MEM_Short))==0 )
6610: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
6620: 65 6d 2d 3e 78 44 65 6c 3d 3d 30 20 29 3b 0a 20  em->xDel==0 );. 
6630: 20 7d 0a 20 20 2f 2a 20 4d 45 4d 5f 4e 75 6c 6c   }.  /* MEM_Null
6640: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
6650: 68 65 72 20 74 79 70 65 73 20 2a 2f 0a 20 20 61  her types */.  a
6660: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
6670: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
6680: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45  _Int|MEM_Real|ME
6690: 4d 5f 42 6c 6f 62 29 29 3d 3d 30 0a 20 20 20 20  M_Blob))==0.    
66a0: 20 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 2d 3e        || (pMem->
66b0: 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 29 3d  flags&MEM_Null)=
66c0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 49 66 20 74 68  =0 );.  /* If th
66d0: 65 20 4d 45 4d 20 69 73 20 62 6f 74 68 20 72 65  e MEM is both re
66e0: 61 6c 20 61 6e 64 20 69 6e 74 65 67 65 72 2c 20  al and integer, 
66f0: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 65  the values are e
6700: 71 75 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  qual */.  assert
6710: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
6720: 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65   (MEM_Int|MEM_Re
6730: 61 6c 29 29 21 3d 28 4d 45 4d 5f 49 6e 74 7c 4d  al))!=(MEM_Int|M
6740: 45 4d 5f 52 65 61 6c 29 20 0a 20 20 20 20 20 20  EM_Real) .      
6750: 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e 72 3d 3d      || pMem->r==
6760: 70 4d 65 6d 2d 3e 75 2e 69 20 29 3b 0a 7d 0a 23  pMem->u.i );.}.#
6770: 65 6e 64 69 66 0a 0a 2f 2a 20 54 68 69 73 20 66  endif../* This f
6780: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
6790: 61 76 61 69 6c 61 62 6c 65 20 69 6e 74 65 72 6e  available intern
67a0: 61 6c 6c 79 2c 20 69 74 20 69 73 20 6e 6f 74 20  ally, it is not 
67b0: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 65  part of the.** e
67c0: 78 74 65 72 6e 61 6c 20 41 50 49 2e 20 49 74 20  xternal API. It 
67d0: 77 6f 72 6b 73 20 69 6e 20 61 20 73 69 6d 69 6c  works in a simil
67e0: 61 72 20 77 61 79 20 74 6f 20 73 71 6c 69 74 65  ar way to sqlite
67f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 2c 0a  3_value_text(),.
6800: 2a 2a 20 65 78 63 65 70 74 20 74 68 65 20 64 61  ** except the da
6810: 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 69  ta returned is i
6820: 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 73  n the encoding s
6830: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
6840: 73 65 63 6f 6e 64 0a 2a 2a 20 70 61 72 61 6d 65  second.** parame
6850: 74 65 72 2c 20 77 68 69 63 68 20 6d 75 73 74 20  ter, which must 
6860: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
6870: 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45  _UTF16BE, SQLITE
6880: 5f 55 54 46 31 36 4c 45 20 6f 72 0a 2a 2a 20 53  _UTF16LE or.** S
6890: 51 4c 49 54 45 5f 55 54 46 38 2e 0a 2a 2a 0a 2a  QLITE_UTF8..**.*
68a0: 2a 20 28 32 30 30 36 2d 30 32 2d 31 36 3a 29 20  * (2006-02-16:) 
68b0: 20 54 68 65 20 65 6e 63 20 76 61 6c 75 65 20 63   The enc value c
68c0: 61 6e 20 62 65 20 6f 72 2d 65 64 20 77 69 74 68  an be or-ed with
68d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
68e0: 49 47 4e 45 44 2e 0a 2a 2a 20 49 66 20 74 68 61  IGNED..** If tha
68f0: 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
6900: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6d  hen the result m
6910: 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
6920: 6e 20 61 6e 20 65 76 65 6e 20 62 79 74 65 0a 2a  n an even byte.*
6930: 2a 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 63  * boundary..*/.c
6940: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
6950: 65 33 56 61 6c 75 65 54 65 78 74 28 73 71 6c 69  e3ValueText(sqli
6960: 74 65 33 5f 76 61 6c 75 65 2a 20 70 56 61 6c 2c  te3_value* pVal,
6970: 20 75 38 20 65 6e 63 29 7b 0a 20 20 69 66 28 20   u8 enc){.  if( 
6980: 21 70 56 61 6c 20 29 20 72 65 74 75 72 6e 20 30  !pVal ) return 0
6990: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 61  ;..  assert( pVa
69a0: 6c 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  l->db==0 || sqli
69b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
69c0: 56 61 6c 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  Val->db->mutex) 
69d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 6e  );.  assert( (en
69e0: 63 26 33 29 3d 3d 28 65 6e 63 26 7e 53 51 4c 49  c&3)==(enc&~SQLI
69f0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
6a00: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 56 61 6c  ) );..  if( pVal
6a10: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ->flags&MEM_Null
6a20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6a30: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6a40: 28 4d 45 4d 5f 42 6c 6f 62 3e 3e 33 29 20 3d 3d  (MEM_Blob>>3) ==
6a50: 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 70 56   MEM_Str );.  pV
6a60: 61 6c 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 56  al->flags |= (pV
6a70: 61 6c 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  al->flags & MEM_
6a80: 42 6c 6f 62 29 3e 3e 33 3b 0a 20 20 65 78 70 61  Blob)>>3;.  expa
6a90: 6e 64 42 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  ndBlob(pVal);.  
6aa0: 69 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 26  if( pVal->flags&
6ab0: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 73  MEM_Str ){.    s
6ac0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6ad0: 45 6e 63 6f 64 69 6e 67 28 70 56 61 6c 2c 20 65  Encoding(pVal, e
6ae0: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
6af0: 31 36 5f 41 4c 49 47 4e 45 44 29 3b 0a 20 20 20  16_ALIGNED);.   
6b00: 20 69 66 28 20 28 65 6e 63 20 26 20 53 51 4c 49   if( (enc & SQLI
6b10: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
6b20: 29 21 3d 30 20 26 26 20 31 3d 3d 28 31 26 28 69  )!=0 && 1==(1&(i
6b30: 6e 74 29 70 56 61 6c 2d 3e 7a 29 20 29 7b 0a 20  nt)pVal->z) ){. 
6b40: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 56       assert( (pV
6b50: 61 6c 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  al->flags & (MEM
6b60: 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69  _Ephem|MEM_Stati
6b70: 63 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  c))!=0 );.      
6b80: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
6b90: 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65 28  emMakeWriteable(
6ba0: 70 56 61 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  pVal)!=SQLITE_OK
6bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6bc0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6bd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
6be0: 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61  dbeMemNulTermina
6bf0: 74 65 28 70 56 61 6c 29 3b 0a 20 20 7d 65 6c 73  te(pVal);.  }els
6c00: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
6c10: 70 56 61 6c 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pVal->flags&MEM_
6c20: 42 6c 6f 62 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Blob)==0 );.    
6c30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
6c40: 72 69 6e 67 69 66 79 28 70 56 61 6c 2c 20 65 6e  ringify(pVal, en
6c50: 63 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  c);.    assert( 
6c60: 30 3d 3d 28 31 26 28 69 6e 74 29 70 56 61 6c 2d  0==(1&(int)pVal-
6c70: 3e 7a 29 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  >z) );.  }.  ass
6c80: 65 72 74 28 70 56 61 6c 2d 3e 65 6e 63 3d 3d 28  ert(pVal->enc==(
6c90: 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
6ca0: 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 7c 7c 20  F16_ALIGNED) || 
6cb0: 70 56 61 6c 2d 3e 64 62 3d 3d 30 0a 20 20 20 20  pVal->db==0.    
6cc0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 56 61            || pVa
6cd0: 6c 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  l->db->mallocFai
6ce0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 56 61  led );.  if( pVa
6cf0: 6c 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20 26 20 7e  l->enc==(enc & ~
6d00: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
6d10: 47 4e 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74  GNED) ){.    ret
6d20: 75 72 6e 20 70 56 61 6c 2d 3e 7a 3b 0a 20 20 7d  urn pVal->z;.  }
6d30: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6d40: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
6d50: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 71   Create a new sq
6d60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65  lite3_value obje
6d70: 63 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ct..*/.sqlite3_v
6d80: 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 61 6c  alue *sqlite3Val
6d90: 75 65 4e 65 77 28 73 71 6c 69 74 65 33 20 2a 64  ueNew(sqlite3 *d
6da0: 62 29 7b 0a 20 20 4d 65 6d 20 2a 70 20 3d 20 73  b){.  Mem *p = s
6db0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6dc0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
6dd0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
6de0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
6df0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 2d 3e 74  M_Null;.    p->t
6e00: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ype = SQLITE_NUL
6e10: 4c 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  L;.    p->db = d
6e20: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
6e30: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  p;.}../*.** Crea
6e40: 74 65 20 61 20 6e 65 77 20 73 71 6c 69 74 65 33  te a new sqlite3
6e50: 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 2c 20 63  _value object, c
6e60: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
6e70: 6c 75 65 20 6f 66 20 70 45 78 70 72 2e 0a 2a 2a  lue of pExpr..**
6e80: 0a 2a 2a 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f  .** This only wo
6e90: 72 6b 73 20 66 6f 72 20 76 65 72 79 20 73 69 6d  rks for very sim
6ea0: 70 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ple expressions 
6eb0: 74 68 61 74 20 63 6f 6e 73 69 73 74 20 6f 66 20  that consist of 
6ec0: 6f 6e 65 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  one constant.** 
6ed0: 74 6f 6b 65 6e 20 28 69 2e 65 2e 20 22 35 22 2c  token (i.e. "5",
6ee0: 20 22 35 2e 31 22 2c 20 22 27 61 20 73 74 72 69   "5.1", "'a stri
6ef0: 6e 67 27 22 29 2e 20 49 66 20 74 68 65 20 65 78  ng'"). If the ex
6f00: 70 72 65 73 73 69 6f 6e 20 63 61 6e 0a 2a 2a 20  pression can.** 
6f10: 62 65 20 63 6f 6e 76 65 72 74 65 64 20 64 69 72  be converted dir
6f20: 65 63 74 6c 79 20 69 6e 74 6f 20 61 20 76 61 6c  ectly into a val
6f30: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ue, then the val
6f40: 75 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ue is allocated 
6f50: 61 6e 64 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  and.** a pointer
6f60: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70 56   written to *ppV
6f70: 61 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  al. The caller i
6f80: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
6f90: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 0a 2a  r deallocating.*
6fa0: 2a 20 74 68 65 20 76 61 6c 75 65 20 62 79 20 70  * the value by p
6fb0: 61 73 73 69 6e 67 20 69 74 20 74 6f 20 73 71 6c  assing it to sql
6fc0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 20  ite3ValueFree() 
6fd0: 6c 61 74 65 72 20 6f 6e 2e 20 49 66 20 74 68 65  later on. If the
6fe0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 63   expression.** c
6ff0: 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  annot be convert
7000: 65 64 20 74 6f 20 61 20 76 61 6c 75 65 2c 20 74  ed to a value, t
7010: 68 65 6e 20 2a 70 70 56 61 6c 20 69 73 20 73 65  hen *ppVal is se
7020: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e  t to NULL..*/.in
7030: 74 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  t sqlite3ValueFr
7040: 6f 6d 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  omExpr(.  sqlite
7050: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
7060: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
7070: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7080: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70a0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
70b0: 74 6f 20 65 76 61 6c 75 61 74 65 20 2a 2f 0a 20  to evaluate */. 
70c0: 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20   u8 enc,        
70d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
70e0: 63 6f 64 69 6e 67 20 74 6f 20 75 73 65 20 2a 2f  coding to use */
70f0: 0a 20 20 75 38 20 61 66 66 69 6e 69 74 79 2c 20  .  u8 affinity, 
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7110: 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  Affinity to use 
7120: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
7130: 75 65 20 2a 2a 70 70 56 61 6c 20 20 20 20 20 2f  ue **ppVal     /
7140: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
7150: 76 61 6c 75 65 20 68 65 72 65 20 2a 2f 0a 29 7b  value here */.){
7160: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 63 68 61  .  int op;.  cha
7170: 72 20 2a 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 73  r *zVal = 0;.  s
7180: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
7190: 61 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21  al = 0;..  if( !
71a0: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 2a 70 70  pExpr ){.    *pp
71b0: 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Val = 0;.    ret
71c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
71d0: 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d   }.  op = pExpr-
71e0: 3e 6f 70 3b 0a 0a 20 20 69 66 28 20 6f 70 3d 3d  >op;..  if( op==
71f0: 54 4b 5f 53 54 52 49 4e 47 20 7c 7c 20 6f 70 3d  TK_STRING || op=
7200: 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 6f 70 3d  =TK_FLOAT || op=
7210: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
7220: 20 20 20 7a 56 61 6c 20 3d 20 73 71 6c 69 74 65     zVal = sqlite
7230: 33 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  3StrNDup((char*)
7240: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
7250: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
7260: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
7270: 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
7280: 0a 20 20 20 20 69 66 28 20 21 7a 56 61 6c 20 7c  .    if( !zVal |
7290: 7c 20 21 70 56 61 6c 20 29 20 67 6f 74 6f 20 6e  | !pVal ) goto n
72a0: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  o_mem;.    sqlit
72b0: 65 33 44 65 71 75 6f 74 65 28 7a 56 61 6c 29 3b  e3Dequote(zVal);
72c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
72d0: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
72e0: 2c 20 7a 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  , zVal, SQLITE_U
72f0: 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  TF8, sqlite3_fre
7300: 65 29 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d  e);.    if( (op=
7310: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c 20 6f  =TK_INTEGER || o
7320: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 26 26  p==TK_FLOAT ) &&
7330: 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54   affinity==SQLIT
7340: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
7350: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
7360: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 56  ApplyAffinity(pV
7370: 61 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  al, SQLITE_AFF_N
7380: 55 4d 45 52 49 43 2c 20 65 6e 63 29 3b 0a 20 20  UMERIC, enc);.  
7390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
73a0: 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
73b0: 41 66 66 69 6e 69 74 79 28 70 56 61 6c 2c 20 61  Affinity(pVal, a
73c0: 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b 0a 20  ffinity, enc);. 
73d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
73e0: 20 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29   op==TK_UMINUS )
73f0: 20 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   {.    if( SQLIT
7400: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 61 6c  E_OK==sqlite3Val
7410: 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 70 45  ueFromExpr(db,pE
7420: 78 70 72 2d 3e 70 4c 65 66 74 2c 65 6e 63 2c 61  xpr->pLeft,enc,a
7430: 66 66 69 6e 69 74 79 2c 26 70 56 61 6c 29 20 29  ffinity,&pVal) )
7440: 7b 0a 20 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e  {.      pVal->u.
7450: 69 20 3d 20 2d 31 20 2a 20 70 56 61 6c 2d 3e 75  i = -1 * pVal->u
7460: 2e 69 3b 0a 20 20 20 20 20 20 70 56 61 6c 2d 3e  .i;.      pVal->
7470: 72 20 3d 20 2d 31 2e 30 20 2a 20 70 56 61 6c 2d  r = -1.0 * pVal-
7480: 3e 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  >r;.    }.  }.#i
7490: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
74a0: 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
74b0: 20 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b   else if( op==TK
74c0: 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 69 6e 74  _BLOB ){.    int
74d0: 20 6e 56 61 6c 3b 0a 20 20 20 20 61 73 73 65 72   nVal;.    asser
74e0: 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  t( pExpr->token.
74f0: 6e 3e 3d 33 20 29 3b 0a 20 20 20 20 61 73 73 65  n>=3 );.    asse
7500: 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
7510: 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45  .z[0]=='x' || pE
7520: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
7530: 3d 27 58 27 20 29 3b 0a 20 20 20 20 61 73 73 65  ='X' );.    asse
7540: 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
7550: 2e 7a 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  .z[1]=='\'' );. 
7560: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
7570: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 70 45 78 70 72 2d  ->token.z[pExpr-
7580: 3e 74 6f 6b 65 6e 2e 6e 2d 31 5d 3d 3d 27 5c 27  >token.n-1]=='\'
7590: 27 20 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  ' );.    pVal = 
75a0: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
75b0: 64 62 29 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20  db);.    nVal = 
75c0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d  pExpr->token.n -
75d0: 20 33 3b 0a 20 20 20 20 7a 56 61 6c 20 3d 20 28   3;.    zVal = (
75e0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
75f0: 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 73 71  en.z + 2;.    sq
7600: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
7610: 74 72 28 70 56 61 6c 2c 20 73 71 6c 69 74 65 33  tr(pVal, sqlite3
7620: 48 65 78 54 6f 42 6c 6f 62 28 64 62 2c 20 7a 56  HexToBlob(db, zV
7630: 61 6c 2c 20 6e 56 61 6c 29 2c 20 6e 56 61 6c 2f  al, nVal), nVal/
7640: 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
7650: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
7660: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
7670: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 70 56  }.#endif..  *ppV
7680: 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72 65 74  al = pVal;.  ret
7690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
76a0: 6e 6f 5f 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61  no_mem:.  db->ma
76b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
76c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
76d0: 56 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Val);.  sqlite3V
76e0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
76f0: 20 20 2a 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20    *ppVal = 0;.  
7700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7710: 4d 45 4d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  MEM;.}../*.** Ch
7720: 61 6e 67 65 20 74 68 65 20 73 74 72 69 6e 67 20  ange the string 
7730: 76 61 6c 75 65 20 6f 66 20 61 6e 20 73 71 6c 69  value of an sqli
7740: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
7750: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7760: 56 61 6c 75 65 53 65 74 53 74 72 28 0a 20 20 73  ValueSetStr(.  s
7770: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 76 2c  qlite3_value *v,
7780: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
7790: 20 62 65 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74   be set */.  int
77a0: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
77b0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
77c0: 73 74 72 69 6e 67 20 7a 20 2a 2f 0a 20 20 63 6f  string z */.  co
77d0: 6e 73 74 20 76 6f 69 64 20 2a 7a 2c 20 20 20 20  nst void *z,    
77e0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
77f0: 68 65 20 6e 65 77 20 73 74 72 69 6e 67 20 2a 2f  he new string */
7800: 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20  .  u8 enc,      
7810: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f           /* Enco
7820: 64 69 6e 67 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ding to use */. 
7830: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
7840: 69 64 2a 29 20 20 20 2f 2a 20 44 65 73 74 72 75  id*)   /* Destru
7850: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 72  ctor for the str
7860: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
7870: 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  v ) sqlite3VdbeM
7880: 65 6d 53 65 74 53 74 72 28 28 4d 65 6d 20 2a 29  emSetStr((Mem *)
7890: 76 2c 20 7a 2c 20 6e 2c 20 65 6e 63 2c 20 78 44  v, z, n, enc, xD
78a0: 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  el);.}../*.** Fr
78b0: 65 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  ee an sqlite3_va
78c0: 6c 75 65 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  lue object.*/.vo
78d0: 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  id sqlite3ValueF
78e0: 72 65 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ree(sqlite3_valu
78f0: 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 21 76 20  e *v){.  if( !v 
7900: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
7910: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
7920: 65 28 28 4d 65 6d 20 2a 29 76 29 3b 0a 20 20 73  e((Mem *)v);.  s
7930: 71 6c 69 74 65 33 5f 66 72 65 65 28 76 29 3b 0a  qlite3_free(v);.
7940: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7950: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
7960: 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
7970: 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20  e3_value object 
7980: 61 73 73 75 6d 69 6e 67 0a 2a 2a 20 74 68 61 74  assuming.** that
7990: 20 69 74 20 75 73 65 73 20 74 68 65 20 65 6e 63   it uses the enc
79a0: 6f 64 69 6e 67 20 22 65 6e 63 22 0a 2a 2f 0a 69  oding "enc".*/.i
79b0: 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75 65 42  nt sqlite3ValueB
79c0: 79 74 65 73 28 73 71 6c 69 74 65 33 5f 76 61 6c  ytes(sqlite3_val
79d0: 75 65 20 2a 70 56 61 6c 2c 20 75 38 20 65 6e 63  ue *pVal, u8 enc
79e0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d  ){.  Mem *p = (M
79f0: 65 6d 2a 29 70 56 61 6c 3b 0a 20 20 69 66 28 20  em*)pVal;.  if( 
7a00: 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  (p->flags & MEM_
7a10: 42 6c 6f 62 29 21 3d 30 20 7c 7c 20 73 71 6c 69  Blob)!=0 || sqli
7a20: 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
7a30: 6c 2c 20 65 6e 63 29 20 29 7b 0a 20 20 20 20 69  l, enc) ){.    i
7a40: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  f( p->flags & ME
7a50: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
7a60: 72 65 74 75 72 6e 20 70 2d 3e 6e 2b 70 2d 3e 75  return p->n+p->u
7a70: 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
7a80: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e       return p->n
7a90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7aa0: 74 75 72 6e 20 30 3b 0a 7d 0a                    turn 0;.}.