/ Hex Artifact Content
Login

Artifact 05183d46094aa99b8f8350e5761b9369dbef35a8:


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 34 37 20 32 30 30  em.c,v 1.147 200
0280: 39 2f 30 35 2f 32 38 20 31 31 3a 30 35 3a 35 37  9/05/28 11:05:57
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 22 76 64 62 65 49 6e 74 2e 68  clude "vdbeInt.h
02d0: 22 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  "../*.** Call sq
02e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61  lite3VdbeMemExpa
02f0: 6e 64 42 6c 6f 62 28 29 20 6f 6e 20 74 68 65 20  ndBlob() on the 
0300: 73 75 70 70 6c 69 65 64 20 76 61 6c 75 65 20 28  supplied value (
0310: 74 79 70 65 20 4d 65 6d 2a 29 0a 2a 2a 20 50 20  type Mem*).** P 
0320: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  if required..*/.
0330: 23 64 65 66 69 6e 65 20 65 78 70 61 6e 64 42 6c  #define expandBl
0340: 6f 62 28 50 29 20 28 28 28 50 29 2d 3e 66 6c 61  ob(P) (((P)->fla
0350: 67 73 26 4d 45 4d 5f 5a 65 72 6f 29 3f 73 71 6c  gs&MEM_Zero)?sql
0360: 69 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e  ite3VdbeMemExpan
0370: 64 42 6c 6f 62 28 50 29 3a 30 29 0a 0a 2f 2a 0a  dBlob(P):0)../*.
0380: 2a 2a 20 49 66 20 70 4d 65 6d 20 69 73 20 61 6e  ** If pMem is an
0390: 20 6f 62 6a 65 63 74 20 77 69 74 68 20 61 20 76   object with a v
03a0: 61 6c 69 64 20 73 74 72 69 6e 67 20 72 65 70 72  alid string repr
03b0: 65 73 65 6e 74 61 74 69 6f 6e 2c 20 74 68 69 73  esentation, this
03c0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 6e 73 75   routine.** ensu
03d0: 72 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  res the internal
03e0: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
03f0: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
0400: 6e 74 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 27 64  ntation is.** 'd
0410: 65 73 69 72 65 64 45 6e 63 27 2c 20 6f 6e 65 20  esiredEnc', one 
0420: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  of SQLITE_UTF8, 
0430: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
0440: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
0450: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4d 65 6d 20  ..**.** If pMem 
0460: 69 73 20 6e 6f 74 20 61 20 73 74 72 69 6e 67 20  is not a string 
0470: 6f 62 6a 65 63 74 2c 20 6f 72 20 74 68 65 20 65  object, or the e
0480: 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 73  ncoding of the s
0490: 74 72 69 6e 67 0a 2a 2a 20 72 65 70 72 65 73 65  tring.** represe
04a0: 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  ntation is alrea
04b0: 64 79 20 73 74 6f 72 65 64 20 75 73 69 6e 67 20  dy stored using 
04c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 65 6e  the requested en
04d0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 69  coding, then thi
04e0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
04f0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
0500: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
0510: 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6e 76  rned if the conv
0520: 65 72 73 69 6f 6e 20 69 73 20 73 75 63 63 65 73  ersion is succes
0530: 73 66 75 6c 20 28 6f 72 20 6e 6f 74 20 72 65 71  sful (or not req
0540: 75 69 72 65 64 29 2e 0a 2a 2a 20 53 51 4c 49 54  uired)..** SQLIT
0550: 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 62 65 20 72  E_NOMEM may be r
0560: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
0570: 6c 6f 63 28 29 20 66 61 69 6c 73 20 64 75 72 69  loc() fails duri
0580: 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a  ng conversion.**
0590: 20 62 65 74 77 65 65 6e 20 66 6f 72 6d 61 74 73   between formats
05a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
05b0: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
05c0: 6e 67 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  ng(Mem *pMem, in
05d0: 74 20 64 65 73 69 72 65 64 45 6e 63 29 7b 0a 20  t desiredEnc){. 
05e0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
05f0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  t( (pMem->flags&
0600: 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
0610: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
0620: 72 65 64 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  redEnc==SQLITE_U
0630: 54 46 38 20 7c 7c 20 64 65 73 69 72 65 64 45 6e  TF8 || desiredEn
0640: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
0650: 45 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  E.           || 
0660: 64 65 73 69 72 65 64 45 6e 63 3d 3d 53 51 4c 49  desiredEnc==SQLI
0670: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
0680: 69 66 28 20 21 28 70 4d 65 6d 2d 3e 66 6c 61 67  if( !(pMem->flag
0690: 73 26 4d 45 4d 5f 53 74 72 29 20 7c 7c 20 70 4d  s&MEM_Str) || pM
06a0: 65 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65 64  em->enc==desired
06b0: 45 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Enc ){.    retur
06c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
06d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
06e0: 3e 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  >db==0 || sqlite
06f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65  3_mutex_held(pMe
0700: 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  m->db->mutex) );
0710: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0720: 4d 49 54 5f 55 54 46 31 36 0a 20 20 72 65 74 75  MIT_UTF16.  retu
0730: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
0740: 0a 23 65 6c 73 65 0a 0a 20 20 2f 2a 20 4d 65 6d  .#else..  /* Mem
0750: 54 72 61 6e 73 6c 61 74 65 28 29 20 6d 61 79 20  Translate() may 
0760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0770: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
0780: 2e 20 49 66 20 4e 4f 4d 45 4d 20 69 73 20 72 65  . If NOMEM is re
0790: 74 75 72 6e 65 64 2c 0a 20 20 2a 2a 20 74 68 65  turned,.  ** the
07a0: 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  n the encoding o
07b0: 66 20 74 68 65 20 76 61 6c 75 65 20 6d 61 79 20  f the value may 
07c0: 6e 6f 74 20 68 61 76 65 20 63 68 61 6e 67 65 64  not have changed
07d0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
07e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 72 61 6e  lite3VdbeMemTran
07f0: 73 6c 61 74 65 28 70 4d 65 6d 2c 20 28 75 38 29  slate(pMem, (u8)
0800: 64 65 73 69 72 65 64 45 6e 63 29 3b 0a 20 20 61  desiredEnc);.  a
0810: 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
0820: 5f 4f 4b 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51  _OK    || rc==SQ
0830: 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 61  LITE_NOMEM);.  a
0840: 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
0850: 5f 4f 4b 20 20 20 20 7c 7c 20 70 4d 65 6d 2d 3e  _OK    || pMem->
0860: 65 6e 63 21 3d 64 65 73 69 72 65 64 45 6e 63 29  enc!=desiredEnc)
0870: 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ;.  assert(rc==S
0880: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70  QLITE_NOMEM || p
0890: 4d 65 6d 2d 3e 65 6e 63 3d 3d 64 65 73 69 72 65  Mem->enc==desire
08a0: 64 45 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  dEnc);.  return 
08b0: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
08c0: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 4d  .** Make sure pM
08d0: 65 6d 2d 3e 7a 20 70 6f 69 6e 74 73 20 74 6f 20  em->z points to 
08e0: 61 20 77 72 69 74 61 62 6c 65 20 61 6c 6c 6f 63  a writable alloc
08f0: 61 74 69 6f 6e 20 6f 66 20 61 74 20 6c 65 61 73  ation of at leas
0900: 74 20 0a 2a 2a 20 6e 20 62 79 74 65 73 2e 0a 2a  t .** n bytes..*
0910: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 65 6d 6f  *.** If the memo
0920: 72 79 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c  ry cell currentl
0930: 79 20 63 6f 6e 74 61 69 6e 73 20 73 74 72 69 6e  y contains strin
0940: 67 20 6f 72 20 62 6c 6f 62 20 64 61 74 61 0a 2a  g or blob data.*
0950: 2a 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 20  * and the third 
0960: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
0970: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
0980: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 0a 2a   is true, the .*
0990: 2a 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  * current conten
09a0: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  t of the cell is
09b0: 20 70 72 65 73 65 72 76 65 64 2e 20 4f 74 68 65   preserved. Othe
09c0: 72 77 69 73 65 2c 20 69 74 20 6d 61 79 0a 2a 2a  rwise, it may.**
09d0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
09e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
09f0: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 4d 45  tion sets the ME
0a00: 4d 5f 44 79 6e 20 66 6c 61 67 20 61 6e 64 20 63  M_Dyn flag and c
0a10: 6c 65 61 72 73 20 61 6e 79 20 78 44 65 6c 20 63  lears any xDel c
0a20: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 49 74 20 61  allback..** It a
0a30: 6c 73 6f 20 63 6c 65 61 72 73 20 4d 45 4d 5f 45  lso clears MEM_E
0a40: 70 68 65 6d 20 61 6e 64 20 4d 45 4d 5f 53 74 61  phem and MEM_Sta
0a50: 74 69 63 2e 20 49 66 20 74 68 65 20 70 72 65 73  tic. If the pres
0a60: 65 72 76 65 20 66 6c 61 67 20 69 73 20 0a 2a 2a  erve flag is .**
0a70: 20 6e 6f 74 20 73 65 74 2c 20 4d 65 6d 2e 6e 20   not set, Mem.n 
0a80: 69 73 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 69 6e  is zeroed..*/.in
0a90: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
0aa0: 47 72 6f 77 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Grow(Mem *pMem, 
0ab0: 69 6e 74 20 6e 2c 20 69 6e 74 20 70 72 65 73 65  int n, int prese
0ac0: 72 76 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rve){.  assert( 
0ad0: 31 20 3e 3d 0a 20 20 20 20 28 28 70 4d 65 6d 2d  1 >=.    ((pMem-
0ae0: 3e 7a 4d 61 6c 6c 6f 63 20 26 26 20 70 4d 65 6d  >zMalloc && pMem
0af0: 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4d 65 6d 2d  ->zMalloc==pMem-
0b00: 3e 7a 29 20 3f 20 31 20 3a 20 30 29 20 2b 0a 20  >z) ? 1 : 0) +. 
0b10: 20 20 20 28 28 28 70 4d 65 6d 2d 3e 66 6c 61 67     (((pMem->flag
0b20: 73 26 4d 45 4d 5f 44 79 6e 29 26 26 70 4d 65 6d  s&MEM_Dyn)&&pMem
0b30: 2d 3e 78 44 65 6c 29 20 3f 20 31 20 3a 20 30 29  ->xDel) ? 1 : 0)
0b40: 20 2b 20 0a 20 20 20 20 28 28 70 4d 65 6d 2d 3e   + .    ((pMem->
0b50: 66 6c 61 67 73 26 4d 45 4d 5f 45 70 68 65 6d 29  flags&MEM_Ephem)
0b60: 20 3f 20 31 20 3a 20 30 29 20 2b 20 0a 20 20 20   ? 1 : 0) + .   
0b70: 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d   ((pMem->flags&M
0b80: 45 4d 5f 53 74 61 74 69 63 29 20 3f 20 31 20 3a  EM_Static) ? 1 :
0b90: 20 30 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   0).  );.  asser
0ba0: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 26  t( (pMem->flags&
0bb0: 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
0bc0: 3b 0a 0a 20 20 69 66 28 20 6e 3c 33 32 20 29 20  ;..  if( n<32 ) 
0bd0: 6e 20 3d 20 33 32 3b 0a 20 20 69 66 28 20 73 71  n = 32;.  if( sq
0be0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
0bf0: 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d  e(pMem->db, pMem
0c00: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3c 6e 20 29 7b 0a  ->zMalloc)<n ){.
0c10: 20 20 20 20 69 66 28 20 70 72 65 73 65 72 76 65      if( preserve
0c20: 20 26 26 20 70 4d 65 6d 2d 3e 7a 3d 3d 70 4d 65   && pMem->z==pMe
0c30: 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  m->zMalloc ){.  
0c40: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4d      pMem->z = pM
0c50: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 71  em->zMalloc = sq
0c60: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0c70: 46 72 65 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  Free(pMem->db, p
0c80: 4d 65 6d 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20  Mem->z, n);.    
0c90: 20 20 70 72 65 73 65 72 76 65 20 3d 20 30 3b 0a    preserve = 0;.
0ca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0cb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
0cc0: 4d 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a  Mem->db, pMem->z
0cd0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 70  Malloc);.      p
0ce0: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73  Mem->zMalloc = s
0cf0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
0d00: 77 28 70 4d 65 6d 2d 3e 64 62 2c 20 6e 29 3b 0a  w(pMem->db, n);.
0d10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
0d20: 20 70 72 65 73 65 72 76 65 20 26 26 20 70 4d 65   preserve && pMe
0d30: 6d 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e 7a 4d  m->z && pMem->zM
0d40: 61 6c 6c 6f 63 20 26 26 20 70 4d 65 6d 2d 3e 7a  alloc && pMem->z
0d50: 21 3d 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  !=pMem->zMalloc 
0d60: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4d  ){.    memcpy(pM
0d70: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 70 4d 65  em->zMalloc, pMe
0d80: 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a  m->z, pMem->n);.
0d90: 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e    }.  if( pMem->
0da0: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 26 26  flags&MEM_Dyn &&
0db0: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 7b 0a 20   pMem->xDel ){. 
0dc0: 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 28 28 76     pMem->xDel((v
0dd0: 6f 69 64 20 2a 29 28 70 4d 65 6d 2d 3e 7a 29 29  oid *)(pMem->z))
0de0: 3b 0a 20 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 7a  ;.  }..  pMem->z
0df0: 20 3d 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63   = pMem->zMalloc
0e00: 3b 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 3d  ;.  if( pMem->z=
0e10: 3d 30 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  =0 ){.    pMem->
0e20: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
0e30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0e40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  Mem->flags &= ~(
0e50: 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74  MEM_Ephem|MEM_St
0e60: 61 74 69 63 29 3b 0a 20 20 7d 0a 20 20 70 4d 65  atic);.  }.  pMe
0e70: 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 72  m->xDel = 0;.  r
0e80: 65 74 75 72 6e 20 28 70 4d 65 6d 2d 3e 7a 20 3f  eturn (pMem->z ?
0e90: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0ea0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f  ITE_NOMEM);.}../
0eb0: 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 67 69  *.** Make the gi
0ec0: 76 65 6e 20 4d 65 6d 20 6f 62 6a 65 63 74 20 4d  ven Mem object M
0ed0: 45 4d 5f 44 79 6e 2e 20 20 49 6e 20 6f 74 68 65  EM_Dyn.  In othe
0ee0: 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 69 74  r words, make it
0ef0: 20 73 6f 0a 2a 2a 20 74 68 61 74 20 61 6e 79 20   so.** that any 
0f00: 54 45 58 54 20 6f 72 20 42 4c 4f 42 20 63 6f 6e  TEXT or BLOB con
0f10: 74 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  tent is stored i
0f20: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
0f30: 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63  d from.** malloc
0f40: 28 29 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  ().  In this way
0f50: 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  , we know that t
0f60: 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 73 61 66  he memory is saf
0f70: 65 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77  e to be.** overw
0f80: 72 69 74 74 65 6e 20 6f 72 20 61 6c 74 65 72 65  ritten or altere
0f90: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
0fa0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
0fb0: 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e  cess or SQLITE_N
0fc0: 4f 4d 45 4d 20 69 66 20 6d 61 6c 6c 6f 63 20 66  OMEM if malloc f
0fd0: 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
0fe0: 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57  ite3VdbeMemMakeW
0ff0: 72 69 74 65 61 62 6c 65 28 4d 65 6d 20 2a 70 4d  riteable(Mem *pM
1000: 65 6d 29 7b 0a 20 20 69 6e 74 20 66 3b 0a 20 20  em){.  int f;.  
1010: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
1020: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
1030: 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e  utex_held(pMem->
1040: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1050: 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66  assert( (pMem->f
1060: 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53 65 74 29  lags&MEM_RowSet)
1070: 3d 3d 30 20 29 3b 0a 20 20 65 78 70 61 6e 64 42  ==0 );.  expandB
1080: 6c 6f 62 28 70 4d 65 6d 29 3b 0a 20 20 66 20 3d  lob(pMem);.  f =
1090: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
10a0: 69 66 28 20 28 66 26 28 4d 45 4d 5f 53 74 72 7c  if( (f&(MEM_Str|
10b0: 4d 45 4d 5f 42 6c 6f 62 29 29 20 26 26 20 70 4d  MEM_Blob)) && pM
10c0: 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d 3e 7a 4d 61  em->z!=pMem->zMa
10d0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 66 28 20  lloc ){.    if( 
10e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
10f0: 6f 77 28 70 4d 65 6d 2c 20 70 4d 65 6d 2d 3e 6e  ow(pMem, pMem->n
1100: 20 2b 20 32 2c 20 31 29 20 29 7b 0a 20 20 20 20   + 2, 1) ){.    
1110: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1120: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
1130: 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e   pMem->z[pMem->n
1140: 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  ] = 0;.    pMem-
1150: 3e 7a 5b 70 4d 65 6d 2d 3e 6e 2b 31 5d 20 3d 20  >z[pMem->n+1] = 
1160: 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  0;.    pMem->fla
1170: 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
1180: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1190: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11a0: 2a 20 49 66 20 74 68 65 20 67 69 76 65 6e 20 4d  * If the given M
11b0: 65 6d 2a 20 68 61 73 20 61 20 7a 65 72 6f 2d 66  em* has a zero-f
11c0: 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 75 72 6e  illed tail, turn
11d0: 20 69 74 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69   it into an ordi
11e0: 6e 61 72 79 0a 2a 2a 20 62 6c 6f 62 20 73 74 6f  nary.** blob sto
11f0: 72 65 64 20 69 6e 20 64 79 6e 61 6d 69 63 61 6c  red in dynamical
1200: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  ly allocated spa
1210: 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ce..*/.#ifndef S
1220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1230: 4c 4f 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  LOB.int sqlite3V
1240: 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62  dbeMemExpandBlob
1250: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69  (Mem *pMem){.  i
1260: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
1270: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1280: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
1290: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
12a0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  ags&MEM_Blob );.
12b0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
12c0: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77  m->flags&MEM_Row
12d0: 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Set)==0 );.    a
12e0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d  ssert( pMem->db=
12f0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
1300: 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64  tex_held(pMem->d
1310: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
1320: 20 20 2f 2a 20 53 65 74 20 6e 42 79 74 65 20 74    /* Set nByte t
1330: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1340: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  bytes required t
1350: 6f 20 73 74 6f 72 65 20 74 68 65 20 65 78 70 61  o store the expa
1360: 6e 64 65 64 20 62 6c 6f 62 2e 20 2a 2f 0a 20 20  nded blob. */.  
1370: 20 20 6e 42 79 74 65 20 3d 20 70 4d 65 6d 2d 3e    nByte = pMem->
1380: 6e 20 2b 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  n + pMem->u.nZer
1390: 6f 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  o;.    if( nByte
13a0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 42 79  <=0 ){.      nBy
13b0: 74 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  te = 1;.    }.  
13c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
13d0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e  eMemGrow(pMem, n
13e0: 42 79 74 65 2c 20 31 29 20 29 7b 0a 20 20 20 20  Byte, 1) ){.    
13f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1400: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
1410: 20 20 6d 65 6d 73 65 74 28 26 70 4d 65 6d 2d 3e    memset(&pMem->
1420: 7a 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 70  z[pMem->n], 0, p
1430: 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20  Mem->u.nZero);. 
1440: 20 20 20 70 4d 65 6d 2d 3e 6e 20 2b 3d 20 70 4d     pMem->n += pM
1450: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  em->u.nZero;.   
1460: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 3d 20   pMem->flags &= 
1470: 7e 28 4d 45 4d 5f 5a 65 72 6f 7c 4d 45 4d 5f 54  ~(MEM_Zero|MEM_T
1480: 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erm);.  }.  retu
1490: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14a0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  #endif.../*.** M
14b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 69 76  ake sure the giv
14c0: 65 6e 20 4d 65 6d 20 69 73 20 5c 75 30 30 30 30  en Mem is \u0000
14d0: 20 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a   terminated..*/.
14e0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
14f0: 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 4d  emNulTerminate(M
1500: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73  em *pMem){.  ass
1510: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
1520: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
1530: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
1540: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
1550: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
1560: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 7c 7c 20  MEM_Term)!=0 || 
1570: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1580: 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15a0: 4f 4b 3b 20 20 20 2f 2a 20 4e 6f 74 68 69 6e 67  OK;   /* Nothing
15b0: 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 0a 20 20   to do */.  }.  
15c0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
15d0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 70 4d 65  emGrow(pMem, pMe
15e0: 6d 2d 3e 6e 2b 32 2c 20 31 29 20 29 7b 0a 20 20  m->n+2, 1) ){.  
15f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1600: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4d 65  NOMEM;.  }.  pMe
1610: 6d 2d 3e 7a 5b 70 4d 65 6d 2d 3e 6e 5d 20 3d 20  m->z[pMem->n] = 
1620: 30 3b 0a 20 20 70 4d 65 6d 2d 3e 7a 5b 70 4d 65  0;.  pMem->z[pMe
1630: 6d 2d 3e 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  m->n+1] = 0;.  p
1640: 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Mem->flags |= ME
1650: 4d 5f 54 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e  M_Term;.  return
1660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1670: 2a 0a 2a 2a 20 41 64 64 20 4d 45 4d 5f 53 74 72  *.** Add MEM_Str
1680: 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20 72   to the set of r
1690: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 20 66  epresentations f
16a0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 4d 65 6d  or the given Mem
16b0: 2e 20 20 4e 75 6d 62 65 72 73 0a 2a 2a 20 61 72  .  Numbers.** ar
16c0: 65 20 63 6f 6e 76 65 72 74 65 64 20 75 73 69 6e  e converted usin
16d0: 67 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  g sqlite3_snprin
16e0: 74 66 28 29 2e 20 20 43 6f 6e 76 65 72 74 69 6e  tf().  Convertin
16f0: 67 20 61 20 42 4c 4f 42 20 74 6f 20 61 20 73 74  g a BLOB to a st
1700: 72 69 6e 67 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  ring.** is a no-
1710: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 69 73 74 69  op..**.** Existi
1720: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
1730: 6e 73 20 4d 45 4d 5f 49 6e 74 20 61 6e 64 20 4d  ns MEM_Int and M
1740: 45 4d 5f 52 65 61 6c 20 61 72 65 20 2a 6e 6f 74  EM_Real are *not
1750: 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
1760: 2a 0a 2a 2a 20 41 20 4d 45 4d 5f 4e 75 6c 6c 20  *.** A MEM_Null 
1770: 76 61 6c 75 65 20 77 69 6c 6c 20 6e 65 76 65 72  value will never
1780: 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
1790: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 69  is function. Thi
17a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
17b0: 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 76 65 72   used for conver
17c0: 74 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 74  ting values to t
17d0: 65 78 74 20 66 6f 72 20 72 65 74 75 72 6e 69 6e  ext for returnin
17e0: 67 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 69  g to the user (i
17f0: 2e 65 2e 20 76 69 61 0a 2a 2a 20 73 71 6c 69 74  .e. via.** sqlit
1800: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 29  e3_value_text())
1810: 2c 20 6f 72 20 66 6f 72 20 65 6e 73 75 72 69 6e  , or for ensurin
1820: 67 20 74 68 61 74 20 76 61 6c 75 65 73 20 74 6f  g that values to
1830: 20 62 65 20 75 73 65 64 20 61 73 20 62 74 72 65   be used as btre
1840: 65 0a 2a 2a 20 6b 65 79 73 20 61 72 65 20 73 74  e.** keys are st
1850: 72 69 6e 67 73 2e 20 49 6e 20 74 68 65 20 66 6f  rings. In the fo
1860: 72 6d 65 72 20 63 61 73 65 20 61 20 4e 55 4c 4c  rmer case a NULL
1870: 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75   pointer is retu
1880: 72 6e 65 64 20 74 68 65 0a 2a 2a 20 75 73 65 72  rned the.** user
1890: 20 61 6e 64 20 74 68 65 20 6c 61 74 65 72 20 69   and the later i
18a0: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 72  s an internal pr
18b0: 6f 67 72 61 6d 6d 69 6e 67 20 65 72 72 6f 72 2e  ogramming error.
18c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
18d0: 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28  dbeMemStringify(
18e0: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 65  Mem *pMem, int e
18f0: 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1900: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1910: 20 66 67 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67   fg = pMem->flag
1920: 73 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  s;.  const int n
1930: 42 79 74 65 20 3d 20 33 32 3b 0a 0a 20 20 61 73  Byte = 32;..  as
1940: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d  sert( pMem->db==
1950: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
1960: 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62  ex_held(pMem->db
1970: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1980: 73 65 72 74 28 20 21 28 66 67 26 4d 45 4d 5f 5a  sert( !(fg&MEM_Z
1990: 65 72 6f 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ero) );.  assert
19a0: 28 20 21 28 66 67 26 28 4d 45 4d 5f 53 74 72 7c  ( !(fg&(MEM_Str|
19b0: 4d 45 4d 5f 42 6c 6f 62 29 29 20 29 3b 0a 20 20  MEM_Blob)) );.  
19c0: 61 73 73 65 72 74 28 20 66 67 26 28 4d 45 4d 5f  assert( fg&(MEM_
19d0: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 3b  Int|MEM_Real) );
19e0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
19f0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77 53  ->flags&MEM_RowS
1a00: 65 74 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  et)==0 );.  asse
1a10: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1a20: 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1a30: 3b 0a 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ;...  if( sqlite
1a40: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
1a50: 6d 2c 20 6e 42 79 74 65 2c 20 30 29 20 29 7b 0a  m, nByte, 0) ){.
1a60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
1a80: 2f 2a 20 46 6f 72 20 61 20 52 65 61 6c 20 6f 72  /* For a Real or
1a90: 20 49 6e 74 65 67 65 72 2c 20 75 73 65 20 73 71   Integer, use sq
1aa0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 29 20  lite3_mprintf() 
1ab0: 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 55  to produce the U
1ac0: 54 46 2d 38 0a 20 20 2a 2a 20 73 74 72 69 6e 67  TF-8.  ** string
1ad0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1ae0: 6f 66 20 74 68 65 20 76 61 6c 75 65 2e 20 54 68  of the value. Th
1af0: 65 6e 2c 20 69 66 20 74 68 65 20 72 65 71 75 69  en, if the requi
1b00: 72 65 64 20 65 6e 63 6f 64 69 6e 67 0a 20 20 2a  red encoding.  *
1b10: 2a 20 69 73 20 55 54 46 2d 31 36 6c 65 20 6f 72  * is UTF-16le or
1b20: 20 55 54 46 2d 31 36 62 65 20 64 6f 20 61 20 74   UTF-16be do a t
1b30: 72 61 6e 73 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2a  ranslation..  **
1b40: 20 0a 20 20 2a 2a 20 46 49 58 20 4d 45 3a 20 49   .  ** FIX ME: I
1b50: 74 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65  t would be bette
1b60: 72 20 69 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  r if sqlite3_snp
1b70: 72 69 6e 74 66 28 29 20 63 6f 75 6c 64 20 64 6f  rintf() could do
1b80: 20 55 54 46 2d 31 36 2e 0a 20 20 2a 2f 0a 20 20   UTF-16..  */.  
1b90: 69 66 28 20 66 67 20 26 20 4d 45 4d 5f 49 6e 74  if( fg & MEM_Int
1ba0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1bb0: 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2c 20  snprintf(nByte, 
1bc0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 6c 6c 64 22 2c  pMem->z, "%lld",
1bd0: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 7d   pMem->u.i);.  }
1be0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1bf0: 28 20 66 67 20 26 20 4d 45 4d 5f 52 65 61 6c 20  ( fg & MEM_Real 
1c00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1c10: 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2c 20 70  nprintf(nByte, p
1c20: 4d 65 6d 2d 3e 7a 2c 20 22 25 21 2e 31 35 67 22  Mem->z, "%!.15g"
1c30: 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 7d 0a  , pMem->r);.  }.
1c40: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
1c50: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
1c60: 2d 3e 7a 29 3b 0a 20 20 70 4d 65 6d 2d 3e 65 6e  ->z);.  pMem->en
1c70: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
1c80: 0a 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c  .  pMem->flags |
1c90: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
1ca0: 72 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rm;.  sqlite3Vdb
1cb0: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
1cc0: 70 4d 65 6d 2c 20 65 6e 63 29 3b 0a 20 20 72 65  pMem, enc);.  re
1cd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ce0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 4d  * Memory cell pM
1cf0: 65 6d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  em contains the 
1d00: 63 6f 6e 74 65 78 74 20 6f 66 20 61 6e 20 61 67  context of an ag
1d10: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1d20: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1d30: 65 20 63 61 6c 6c 73 20 74 68 65 20 66 69 6e 61  e calls the fina
1d40: 6c 69 7a 65 20 6d 65 74 68 6f 64 20 66 6f 72 20  lize method for 
1d50: 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2e 20 20  that function.  
1d60: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 6f 66  The.** result of
1d70: 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 69   the aggregate i
1d80: 73 20 73 74 6f 72 65 64 20 62 61 63 6b 20 69 6e  s stored back in
1d90: 74 6f 20 70 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 52  to pMem..**.** R
1da0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1db0: 4f 52 20 69 66 20 74 68 65 20 66 69 6e 61 6c 69  OR if the finali
1dc0: 7a 65 72 20 72 65 70 6f 72 74 73 20 61 6e 20 65  zer reports an e
1dd0: 72 72 6f 72 2e 20 20 53 51 4c 49 54 45 5f 4f 4b  rror.  SQLITE_OK
1de0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1df0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1e00: 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 4d 65 6d  eMemFinalize(Mem
1e10: 20 2a 70 4d 65 6d 2c 20 46 75 6e 63 44 65 66 20   *pMem, FuncDef 
1e20: 2a 70 46 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  *pFunc){.  int r
1e30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e40: 20 69 66 28 20 70 46 75 6e 63 20 26 26 20 70 46   if( pFunc && pF
1e50: 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 29  unc->xFinalize )
1e60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  {.    sqlite3_co
1e70: 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 20 20 61  ntext ctx;.    a
1e80: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
1e90: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21  ags & MEM_Null)!
1ea0: 3d 30 20 7c 7c 20 70 46 75 6e 63 3d 3d 70 4d 65  =0 || pFunc==pMe
1eb0: 6d 2d 3e 75 2e 70 44 65 66 20 29 3b 0a 20 20 20  m->u.pDef );.   
1ec0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
1ed0: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
1ee0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d  mutex_held(pMem-
1ef0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1f00: 20 20 20 6d 65 6d 73 65 74 28 26 63 74 78 2c 20     memset(&ctx, 
1f10: 30 2c 20 73 69 7a 65 6f 66 28 63 74 78 29 29 3b  0, sizeof(ctx));
1f20: 0a 20 20 20 20 63 74 78 2e 73 2e 66 6c 61 67 73  .    ctx.s.flags
1f30: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
1f40: 20 63 74 78 2e 73 2e 64 62 20 3d 20 70 4d 65 6d   ctx.s.db = pMem
1f50: 2d 3e 64 62 3b 0a 20 20 20 20 63 74 78 2e 70 4d  ->db;.    ctx.pM
1f60: 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 63  em = pMem;.    c
1f70: 74 78 2e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  tx.pFunc = pFunc
1f80: 3b 0a 20 20 20 20 70 46 75 6e 63 2d 3e 78 46 69  ;.    pFunc->xFi
1f90: 6e 61 6c 69 7a 65 28 26 63 74 78 29 3b 0a 20 20  nalize(&ctx);.  
1fa0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 4d    assert( 0==(pM
1fb0: 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79  em->flags&MEM_Dy
1fc0: 6e 29 20 26 26 20 21 70 4d 65 6d 2d 3e 78 44 65  n) && !pMem->xDe
1fd0: 6c 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  l );.    sqlite3
1fe0: 44 62 46 72 65 65 28 70 4d 65 6d 2d 3e 64 62 2c  DbFree(pMem->db,
1ff0: 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b   pMem->zMalloc);
2000: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4d 65 6d  .    memcpy(pMem
2010: 2c 20 26 63 74 78 2e 73 2c 20 73 69 7a 65 6f 66  , &ctx.s, sizeof
2020: 28 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63  (ctx.s));.    rc
2030: 20 3d 20 28 63 74 78 2e 69 73 45 72 72 6f 72 3f   = (ctx.isError?
2040: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 53 51 4c  SQLITE_ERROR:SQL
2050: 49 54 45 5f 4f 4b 29 3b 0a 20 20 7d 0a 20 20 72  ITE_OK);.  }.  r
2060: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2070: 2a 2a 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** If the memory
2080: 20 63 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 61   cell contains a
2090: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 74 68   string value th
20a0: 61 74 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  at must be freed
20b0: 20 62 79 0a 2a 2a 20 69 6e 76 6f 6b 69 6e 67 20   by.** invoking 
20c0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 63 61 6c 6c  an external call
20d0: 62 61 63 6b 2c 20 66 72 65 65 20 69 74 20 6e 6f  back, free it no
20e0: 77 2e 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  w. Calling this 
20f0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 64 6f 65 73  function.** does
2100: 20 6e 6f 74 20 66 72 65 65 20 61 6e 79 20 4d 65   not free any Me
2110: 6d 2e 7a 4d 61 6c 6c 6f 63 20 62 75 66 66 65 72  m.zMalloc buffer
2120: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2130: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45  3VdbeMemReleaseE
2140: 78 74 65 72 6e 61 6c 28 4d 65 6d 20 2a 70 29 7b  xternal(Mem *p){
2150: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2160: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
2170: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
2180: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2190: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
21a0: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 52  gg|MEM_Dyn|MEM_R
21b0: 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 69 66  owSet) ){.    if
21c0: 28 20 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 41  ( p->flags&MEM_A
21d0: 67 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  gg ){.      sqli
21e0: 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69  te3VdbeMemFinali
21f0: 7a 65 28 70 2c 20 70 2d 3e 75 2e 70 44 65 66 29  ze(p, p->u.pDef)
2200: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2210: 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  (p->flags & MEM_
2220: 41 67 67 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Agg)==0 );.     
2230: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
2240: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 7d  elease(p);.    }
2250: 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67  else if( p->flag
2260: 73 26 4d 45 4d 5f 44 79 6e 20 26 26 20 70 2d 3e  s&MEM_Dyn && p->
2270: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 61 73  xDel ){.      as
2280: 73 65 72 74 28 20 28 70 2d 3e 66 6c 61 67 73 26  sert( (p->flags&
2290: 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
22a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28  ;.      p->xDel(
22b0: 28 76 6f 69 64 20 2a 29 70 2d 3e 7a 29 3b 0a 20  (void *)p->z);. 
22c0: 20 20 20 20 20 70 2d 3e 78 44 65 6c 20 3d 20 30       p->xDel = 0
22d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
22e0: 70 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 52 6f 77  p->flags&MEM_Row
22f0: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
2300: 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72 28  ite3RowSetClear(
2310: 70 2d 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20  p->u.pRowSet);. 
2320: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2330: 2a 20 52 65 6c 65 61 73 65 20 61 6e 79 20 6d 65  * Release any me
2340: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
2350: 20 4d 65 6d 2e 20 54 68 69 73 20 6d 61 79 20 6c   Mem. This may l
2360: 65 61 76 65 20 74 68 65 20 4d 65 6d 20 69 6e 20  eave the Mem in 
2370: 61 6e 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73 74 65  an.** inconsiste
2380: 6e 74 20 73 74 61 74 65 2c 20 66 6f 72 20 65 78  nt state, for ex
2390: 61 6d 70 6c 65 20 77 69 74 68 20 28 4d 65 6d 2e  ample with (Mem.
23a0: 7a 3d 3d 30 29 20 61 6e 64 0a 2a 2a 20 28 4d 65  z==0) and.** (Me
23b0: 6d 2e 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54  m.type==SQLITE_T
23c0: 45 58 54 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  EXT)..*/.void sq
23d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
23e0: 61 73 65 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 73  ase(Mem *p){.  s
23f0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
2400: 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70 29 3b  easeExternal(p);
2410: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2420: 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  (p->db, p->zMall
2430: 6f 63 29 3b 0a 20 20 70 2d 3e 7a 20 3d 20 30 3b  oc);.  p->z = 0;
2440: 0a 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  .  p->zMalloc = 
2450: 30 3b 0a 20 20 70 2d 3e 78 44 65 6c 20 3d 20 30  0;.  p->xDel = 0
2460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
2470: 72 74 20 61 20 36 34 2d 62 69 74 20 49 45 45 45  rt a 64-bit IEEE
2480: 20 64 6f 75 62 6c 65 20 69 6e 74 6f 20 61 20 36   double into a 6
2490: 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74  4-bit signed int
24a0: 65 67 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20  eger..** If the 
24b0: 64 6f 75 62 6c 65 20 69 73 20 74 6f 6f 20 6c 61  double is too la
24c0: 72 67 65 2c 20 72 65 74 75 72 6e 20 30 78 38 30  rge, return 0x80
24d0: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 2e 0a  00000000000000..
24e0: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 73 79 73 74 65  **.** Most syste
24f0: 6d 73 20 61 70 70 65 61 72 20 74 6f 20 64 6f 20  ms appear to do 
2500: 74 68 69 73 20 73 69 6d 70 6c 79 20 62 79 20 61  this simply by a
2510: 73 73 69 67 6e 69 6e 67 0a 2a 2a 20 76 61 72 69  ssigning.** vari
2520: 61 62 6c 65 73 20 61 6e 64 20 77 69 74 68 6f 75  ables and withou
2530: 74 20 74 68 65 20 65 78 74 72 61 20 72 61 6e 67  t the extra rang
2540: 65 20 74 65 73 74 73 2e 20 20 42 75 74 0a 2a 2a  e tests.  But.**
2550: 20 74 68 65 72 65 20 61 72 65 20 72 65 70 6f 72   there are repor
2560: 74 73 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20  ts that windows 
2570: 74 68 72 6f 77 73 20 61 6e 20 65 78 70 65 63 74  throws an expect
2580: 69 6f 6e 0a 2a 2a 20 69 66 20 74 68 65 20 66 6c  ion.** if the fl
2590: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
25a0: 75 65 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e  ue is out of ran
25b0: 67 65 2e 20 28 53 65 65 20 74 69 63 6b 65 74 20  ge. (See ticket 
25c0: 23 32 38 38 30 2e 29 0a 2a 2a 20 42 65 63 61 75  #2880.).** Becau
25d0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 6f 6d  se we do not com
25e0: 70 6c 65 74 65 6c 79 20 75 6e 64 65 72 73 74 61  pletely understa
25f0: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
2600: 77 65 20 77 69 6c 6c 0a 2a 2a 20 74 61 6b 65 20  we will.** take 
2610: 74 68 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  the conservative
2620: 20 61 70 70 72 6f 61 63 68 20 61 6e 64 20 61 6c   approach and al
2630: 77 61 79 73 20 64 6f 20 72 61 6e 67 65 20 74 65  ways do range te
2640: 73 74 73 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74  sts.** before at
2650: 74 65 6d 70 74 69 6e 67 20 74 68 65 20 63 6f 6e  tempting the con
2660: 76 65 72 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  version..*/.stat
2670: 69 63 20 69 36 34 20 64 6f 75 62 6c 65 54 6f 49  ic i64 doubleToI
2680: 6e 74 36 34 28 64 6f 75 62 6c 65 20 72 29 7b 0a  nt64(double r){.
2690: 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6e 79 20 63    /*.  ** Many c
26a0: 6f 6d 70 69 6c 65 72 73 20 77 65 20 65 6e 63 6f  ompilers we enco
26b0: 75 6e 74 65 72 20 64 6f 20 6e 6f 74 20 64 65 66  unter do not def
26c0: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 66 6f  ine constants fo
26d0: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 69 6e 69 6d  r the.  ** minim
26e0: 75 6d 20 61 6e 64 20 6d 61 78 69 6d 75 6d 20 36  um and maximum 6
26f0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2c 20  4-bit integers, 
2700: 6f 72 20 74 68 65 79 20 64 65 66 69 6e 65 20 74  or they define t
2710: 68 65 6d 0a 20 20 2a 2a 20 69 6e 63 6f 6e 73 69  hem.  ** inconsi
2720: 73 74 65 6e 74 6c 79 2e 20 20 41 6e 64 20 6d 61  stently.  And ma
2730: 6e 79 20 64 6f 20 6e 6f 74 20 75 6e 64 65 72 73  ny do not unders
2740: 74 61 6e 64 20 74 68 65 20 22 4c 4c 22 20 6e 6f  tand the "LL" no
2750: 74 61 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  tation..  ** So 
2760: 77 65 20 64 65 66 69 6e 65 20 6f 75 72 20 6f 77  we define our ow
2770: 6e 20 73 74 61 74 69 63 20 63 6f 6e 73 74 61 6e  n static constan
2780: 74 73 20 68 65 72 65 20 75 73 69 6e 67 20 6e 6f  ts here using no
2790: 74 68 69 6e 67 0a 20 20 2a 2a 20 6c 61 72 67 65  thing.  ** large
27a0: 72 20 74 68 61 6e 20 61 20 33 32 2d 62 69 74 20  r than a 32-bit 
27b0: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
27c0: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
27d0: 63 6f 6e 73 74 20 69 36 34 20 6d 61 78 49 6e 74  const i64 maxInt
27e0: 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
27f0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2800: 20 69 36 34 20 6d 69 6e 49 6e 74 20 3d 20 53 4d   i64 minInt = SM
2810: 41 4c 4c 45 53 54 5f 49 4e 54 36 34 3b 0a 0a 20  ALLEST_INT64;.. 
2820: 20 69 66 28 20 72 3c 28 64 6f 75 62 6c 65 29 6d   if( r<(double)m
2830: 69 6e 49 6e 74 20 29 7b 0a 20 20 20 20 72 65 74  inInt ){.    ret
2840: 75 72 6e 20 6d 69 6e 49 6e 74 3b 0a 20 20 7d 65  urn minInt;.  }e
2850: 6c 73 65 20 69 66 28 20 72 3e 28 64 6f 75 62 6c  lse if( r>(doubl
2860: 65 29 6d 61 78 49 6e 74 20 29 7b 0a 20 20 20 20  e)maxInt ){.    
2870: 2f 2a 20 6d 69 6e 49 6e 74 20 69 73 20 63 6f 72  /* minInt is cor
2880: 72 65 63 74 20 68 65 72 65 20 2d 20 6e 6f 74 20  rect here - not 
2890: 6d 61 78 49 6e 74 2e 20 20 49 74 20 74 75 72 6e  maxInt.  It turn
28a0: 73 20 6f 75 74 20 74 68 61 74 20 61 73 73 69 67  s out that assig
28b0: 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 61 20 76 65  ning.    ** a ve
28c0: 72 79 20 6c 61 72 67 65 20 70 6f 73 69 74 69 76  ry large positiv
28d0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 69  e number to an i
28e0: 6e 74 65 67 65 72 20 72 65 73 75 6c 74 73 20 69  nteger results i
28f0: 6e 20 61 20 76 65 72 79 20 6c 61 72 67 65 0a 20  n a very large. 
2900: 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 20 69     ** negative i
2910: 6e 74 65 67 65 72 2e 20 20 54 68 69 73 20 6d 61  nteger.  This ma
2920: 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2c 20 62 75  kes no sense, bu
2930: 74 20 69 74 20 69 73 20 77 68 61 74 20 78 38 36  t it is what x86
2940: 20 68 61 72 64 77 61 72 65 0a 20 20 20 20 2a 2a   hardware.    **
2950: 20 64 6f 65 73 20 73 6f 20 66 6f 72 20 63 6f 6d   does so for com
2960: 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 77 69  patibility we wi
2970: 6c 6c 20 64 6f 20 74 68 65 20 73 61 6d 65 20 69  ll do the same i
2980: 6e 20 73 6f 66 74 77 61 72 65 2e 20 2a 2f 0a 20  n software. */. 
2990: 20 20 20 72 65 74 75 72 6e 20 6d 69 6e 49 6e 74     return minInt
29a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29b0: 65 74 75 72 6e 20 28 69 36 34 29 72 3b 0a 20 20  eturn (i64)r;.  
29c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
29d0: 6e 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69  n some kind of i
29e0: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 77 68 69  nteger value whi
29f0: 63 68 20 69 73 20 74 68 65 20 62 65 73 74 20 77  ch is the best w
2a00: 65 20 63 61 6e 20 64 6f 0a 2a 2a 20 61 74 20 72  e can do.** at r
2a10: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
2a20: 76 61 6c 75 65 20 74 68 61 74 20 2a 70 4d 65 6d  value that *pMem
2a30: 20 64 65 73 63 72 69 62 65 73 20 61 73 20 61 6e   describes as an
2a40: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 49 66 20   integer..** If 
2a50: 70 4d 65 6d 20 69 73 20 61 6e 20 69 6e 74 65 67  pMem is an integ
2a60: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  er, then the val
2a70: 75 65 20 69 73 20 65 78 61 63 74 2e 20 20 49 66  ue is exact.  If
2a80: 20 70 4d 65 6d 20 69 73 0a 2a 2a 20 61 20 66 6c   pMem is.** a fl
2a90: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 74 68 65  oating-point the
2aa0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
2ab0: 72 6e 65 64 20 69 73 20 74 68 65 20 69 6e 74 65  rned is the inte
2ac0: 67 65 72 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20  ger part..** If 
2ad0: 70 4d 65 6d 20 69 73 20 61 20 73 74 72 69 6e 67  pMem is a string
2ae0: 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e 20 77   or blob, then w
2af0: 65 20 6d 61 6b 65 20 61 6e 20 61 74 74 65 6d 70  e make an attemp
2b00: 74 20 74 6f 20 63 6f 6e 76 65 72 74 0a 2a 2a 20  t to convert.** 
2b10: 69 74 20 69 6e 74 6f 20 61 20 69 6e 74 65 67 65  it into a intege
2b20: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  r and return tha
2b30: 74 2e 20 20 49 66 20 70 4d 65 6d 20 72 65 70 72  t.  If pMem repr
2b40: 65 73 65 6e 74 73 20 61 6e 0a 2a 2a 20 61 6e 20  esents an.** an 
2b50: 53 51 4c 2d 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  SQL-NULL value, 
2b60: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
2b70: 49 66 20 70 4d 65 6d 20 72 65 70 72 65 73 65 6e  If pMem represen
2b80: 74 73 20 61 20 73 74 72 69 6e 67 20 76 61 6c 75  ts a string valu
2b90: 65 2c 20 69 74 73 20 65 6e 63 6f 64 69 6e 67 20  e, its encoding 
2ba0: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 65 64  might be changed
2bb0: 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
2bc0: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 4d 65 6d  VdbeIntValue(Mem
2bd0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66   *pMem){.  int f
2be0: 6c 61 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20  lags;.  assert( 
2bf0: 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73  pMem->db==0 || s
2c00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c10: 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65  d(pMem->db->mute
2c20: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2c30: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2c40: 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
2c50: 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
2c60: 61 67 73 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ags;.  if( flags
2c70: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
2c80: 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 75    return pMem->u
2c90: 2e 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  .i;.  }else if( 
2ca0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
2cb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 64   ){.    return d
2cc0: 6f 75 62 6c 65 54 6f 49 6e 74 36 34 28 70 4d 65  oubleToInt64(pMe
2cd0: 6d 2d 3e 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  m->r);.  }else i
2ce0: 66 28 20 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  f( flags & (MEM_
2cf0: 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b  Str|MEM_Blob) ){
2d00: 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
2d10: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
2d20: 7c 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20  |= MEM_Str;.    
2d30: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  if( sqlite3VdbeC
2d40: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d  hangeEncoding(pM
2d50: 65 6d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  em, SQLITE_UTF8)
2d60: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2d70: 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d  e3VdbeMemNulTerm
2d80: 69 6e 61 74 65 28 70 4d 65 6d 29 20 29 7b 0a 20  inate(pMem) ){. 
2d90: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2da0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2db0: 20 70 4d 65 6d 2d 3e 7a 20 29 3b 0a 20 20 20 20   pMem->z );.    
2dc0: 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70 4d  sqlite3Atoi64(pM
2dd0: 65 6d 2d 3e 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  em->z, &value);.
2de0: 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65      return value
2df0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2e00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
2e10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e20: 20 62 65 73 74 20 72 65 70 72 65 73 65 6e 74 61   best representa
2e30: 74 69 6f 6e 20 6f 66 20 70 4d 65 6d 20 74 68 61  tion of pMem tha
2e40: 74 20 77 65 20 63 61 6e 20 67 65 74 20 69 6e 74  t we can get int
2e50: 6f 20 61 0a 2a 2a 20 64 6f 75 62 6c 65 2e 20 20  o a.** double.  
2e60: 49 66 20 70 4d 65 6d 20 69 73 20 61 6c 72 65 61  If pMem is alrea
2e70: 64 79 20 61 20 64 6f 75 62 6c 65 20 6f 72 20 61  dy a double or a
2e80: 6e 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  n integer, retur
2e90: 6e 20 69 74 73 0a 2a 2a 20 76 61 6c 75 65 2e 20  n its.** value. 
2ea0: 20 49 66 20 69 74 20 69 73 20 61 20 73 74 72 69   If it is a stri
2eb0: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20  ng or blob, try 
2ec0: 74 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f  to convert it to
2ed0: 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2a 20 49 66   a double..** If
2ee0: 20 69 74 20 69 73 20 61 20 4e 55 4c 4c 2c 20 72   it is a NULL, r
2ef0: 65 74 75 72 6e 20 30 2e 30 2e 0a 2a 2f 0a 64 6f  eturn 0.0..*/.do
2f00: 75 62 6c 65 20 73 71 6c 69 74 65 33 56 64 62 65  uble sqlite3Vdbe
2f10: 52 65 61 6c 56 61 6c 75 65 28 4d 65 6d 20 2a 70  RealValue(Mem *p
2f20: 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Mem){.  assert( 
2f30: 70 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73  pMem->db==0 || s
2f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f50: 64 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65  d(pMem->db->mute
2f60: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2f70: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2f80: 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
2f90: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
2fa0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
2fb0: 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 72    return pMem->r
2fc0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d  ;.  }else if( pM
2fd0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
2fe0: 49 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Int ){.    retur
2ff0: 6e 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 2d 3e  n (double)pMem->
3000: 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  u.i;.  }else if(
3010: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
3020: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
3030: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 28 64 6f 75  ) ){.    /* (dou
3040: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
3050: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
3060: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
3070: 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  /.    double val
3080: 20 3d 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20   = (double)0;.  
3090: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 7c 3d    pMem->flags |=
30a0: 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 69 66   MEM_Str;.    if
30b0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ( sqlite3VdbeCha
30c0: 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d  ngeEncoding(pMem
30d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 20  , SQLITE_UTF8). 
30e0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
30f0: 56 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e  VdbeMemNulTermin
3100: 61 74 65 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20  ate(pMem) ){.   
3110: 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20     /* (double)0 
3120: 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54  In case of SQLIT
3130: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
3140: 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20  POINT... */.    
3150: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
3160: 29 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  )0;.    }.    as
3170: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 20 29 3b  sert( pMem->z );
3180: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46  .    sqlite3AtoF
3190: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 76 61 6c 29 3b  (pMem->z, &val);
31a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c 3b  .    return val;
31b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
31c0: 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61   (double)0 In ca
31d0: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
31e0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
31f0: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ... */.    retur
3200: 6e 20 28 64 6f 75 62 6c 65 29 30 3b 0a 20 20 7d  n (double)0;.  }
3210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 45  .}../*.** The ME
3220: 4d 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  M structure is a
3230: 6c 72 65 61 64 79 20 61 20 4d 45 4d 5f 52 65 61  lready a MEM_Rea
3240: 6c 2e 20 20 54 72 79 20 74 6f 20 61 6c 73 6f 20  l.  Try to also 
3250: 6d 61 6b 65 20 69 74 20 61 0a 2a 2a 20 4d 45 4d  make it a.** MEM
3260: 5f 49 6e 74 20 69 66 20 77 65 20 63 61 6e 2e 0a  _Int if we can..
3270: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3280: 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e 69  dbeIntegerAffini
3290: 74 79 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  ty(Mem *pMem){. 
32a0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
32b0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
32c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  );.  assert( (pM
32d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
32e0: 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 20  RowSet)==0 );.  
32f0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
3300: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
3310: 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e  utex_held(pMem->
3320: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
3330: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
3340: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
3350: 6d 29 20 29 3b 0a 0a 20 20 70 4d 65 6d 2d 3e 75  m) );..  pMem->u
3360: 2e 69 20 3d 20 64 6f 75 62 6c 65 54 6f 49 6e 74  .i = doubleToInt
3370: 36 34 28 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 69  64(pMem->r);.  i
3380: 66 28 20 70 4d 65 6d 2d 3e 72 3d 3d 28 64 6f 75  f( pMem->r==(dou
3390: 62 6c 65 29 70 4d 65 6d 2d 3e 75 2e 69 20 29 7b  ble)pMem->u.i ){
33a0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
33b0: 20 7c 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d   |= MEM_Int;.  }
33c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
33d0: 74 20 70 4d 65 6d 20 74 6f 20 74 79 70 65 20 69  t pMem to type i
33e0: 6e 74 65 67 65 72 2e 20 20 49 6e 76 61 6c 69 64  nteger.  Invalid
33f0: 61 74 65 20 61 6e 79 20 70 72 69 6f 72 20 72 65  ate any prior re
3400: 70 72 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  presentations..*
3410: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3420: 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 4d  eMemIntegerify(M
3430: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73  em *pMem){.  ass
3440: 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d 3d 30  ert( pMem->db==0
3450: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
3460: 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64 62 2d  x_held(pMem->db-
3470: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
3480: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
3490: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
34a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34b0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
34c0: 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a 20  MENT(pMem) );.. 
34d0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 71 6c   pMem->u.i = sql
34e0: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
34f0: 28 70 4d 65 6d 29 3b 0a 20 20 4d 65 6d 53 65 74  (pMem);.  MemSet
3500: 54 79 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d  TypeFlag(pMem, M
3510: 45 4d 5f 49 6e 74 29 3b 0a 20 20 72 65 74 75 72  EM_Int);.  retur
3520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3530: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d  /*.** Convert pM
3540: 65 6d 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  em so that it is
3550: 20 6f 66 20 74 79 70 65 20 4d 45 4d 5f 52 65 61   of type MEM_Rea
3560: 6c 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  l..** Invalidate
3570: 20 61 6e 79 20 70 72 69 6f 72 20 72 65 70 72 65   any prior repre
3580: 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 69  sentations..*/.i
3590: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  nt sqlite3VdbeMe
35a0: 6d 52 65 61 6c 69 66 79 28 4d 65 6d 20 2a 70 4d  mRealify(Mem *pM
35b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  em){.  assert( p
35c0: 4d 65 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20 73 71  Mem->db==0 || sq
35d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35e0: 28 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 75 74 65 78  (pMem->db->mutex
35f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
3600: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
3610: 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20  ENT(pMem) );..  
3620: 70 4d 65 6d 2d 3e 72 20 3d 20 73 71 6c 69 74 65  pMem->r = sqlite
3630: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
3640: 4d 65 6d 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79  Mem);.  MemSetTy
3650: 70 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d  peFlag(pMem, MEM
3660: 5f 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  _Real);.  return
3670: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
3680: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 70 4d 65  *.** Convert pMe
3690: 6d 20 73 6f 20 74 68 61 74 20 69 74 20 68 61 73  m so that it has
36a0: 20 74 79 70 65 73 20 4d 45 4d 5f 52 65 61 6c 20   types MEM_Real 
36b0: 6f 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 20 62 6f  or MEM_Int or bo
36c0: 74 68 2e 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  th..** Invalidat
36d0: 65 20 61 6e 79 20 70 72 69 6f 72 20 72 65 70 72  e any prior repr
36e0: 65 73 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  esentations..*/.
36f0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
3700: 65 6d 4e 75 6d 65 72 69 66 79 28 4d 65 6d 20 2a  emNumerify(Mem *
3710: 70 4d 65 6d 29 7b 0a 20 20 64 6f 75 62 6c 65 20  pMem){.  double 
3720: 72 31 2c 20 72 32 3b 0a 20 20 69 36 34 20 69 3b  r1, r2;.  i64 i;
3730: 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
3740: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49  ->flags & (MEM_I
3750: 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
3760: 4e 75 6c 6c 29 29 3d 3d 30 20 29 3b 0a 20 20 61  Null))==0 );.  a
3770: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
3780: 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
3790: 4d 45 4d 5f 53 74 72 29 29 21 3d 30 20 29 3b 0a  MEM_Str))!=0 );.
37a0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
37b0: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
37c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d  _mutex_held(pMem
37d0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
37e0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64    r1 = sqlite3Vd
37f0: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 4d 65 6d  beRealValue(pMem
3800: 29 3b 0a 20 20 69 20 3d 20 64 6f 75 62 6c 65 54  );.  i = doubleT
3810: 6f 49 6e 74 36 34 28 72 31 29 3b 0a 20 20 72 32  oInt64(r1);.  r2
3820: 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
3830: 69 66 28 20 72 31 3d 3d 72 32 20 29 7b 0a 20 20  if( r1==r2 ){.  
3840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3850: 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65 6d 29  Integerify(pMem)
3860: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3870: 4d 65 6d 2d 3e 72 20 3d 20 72 31 3b 0a 20 20 20  Mem->r = r1;.   
3880: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
3890: 70 4d 65 6d 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pMem, MEM_Real);
38a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
38b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
38c0: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72 65  * Delete any pre
38d0: 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64 20  vious value and 
38e0: 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 73 74  set the value st
38f0: 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74 6f  ored in *pMem to
3900: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   NULL..*/.void s
3910: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
3920: 4e 75 6c 6c 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b  Null(Mem *pMem){
3930: 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  .  if( pMem->fla
3940: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
3950: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f  ){.    sqlite3Ro
3960: 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d 3e  wSetClear(pMem->
3970: 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 7d 0a  u.pRowSet);.  }.
3980: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
3990: 28 70 4d 65 6d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  (pMem, MEM_Null)
39a0: 3b 0a 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d  ;.  pMem->type =
39b0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 7d 0a   SQLITE_NULL;.}.
39c0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
39d0: 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  y previous value
39e0: 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61 6c   and set the val
39f0: 75 65 20 74 6f 20 62 65 20 61 20 42 4c 4f 42 20  ue to be a BLOB 
3a00: 6f 66 20 6c 65 6e 67 74 68 0a 2a 2a 20 6e 20 63  of length.** n c
3a10: 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 7a 65  ontaining all ze
3a20: 72 6f 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ros..*/.void sql
3a30: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 5a 65  ite3VdbeMemSetZe
3a40: 72 6f 42 6c 6f 62 28 4d 65 6d 20 2a 70 4d 65 6d  roBlob(Mem *pMem
3a50: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 73 71 6c 69  , int n){.  sqli
3a60: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
3a70: 65 28 70 4d 65 6d 29 3b 0a 20 20 70 4d 65 6d 2d  e(pMem);.  pMem-
3a80: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f  >flags = MEM_Blo
3a90: 62 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 70 4d  b|MEM_Zero;.  pM
3aa0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
3ab0: 45 5f 42 4c 4f 42 3b 0a 20 20 70 4d 65 6d 2d 3e  E_BLOB;.  pMem->
3ac0: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30  n = 0;.  if( n<0
3ad0: 20 29 20 6e 20 3d 20 30 3b 0a 20 20 70 4d 65 6d   ) n = 0;.  pMem
3ae0: 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 3b 0a 20  ->u.nZero = n;. 
3af0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
3b00: 49 54 45 5f 55 54 46 38 3b 0a 7d 0a 0a 2f 2a 0a  ITE_UTF8;.}../*.
3b10: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 72  ** Delete any pr
3b20: 65 76 69 6f 75 73 20 76 61 6c 75 65 20 61 6e 64  evious value and
3b30: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 73   set the value s
3b40: 74 6f 72 65 64 20 69 6e 20 2a 70 4d 65 6d 20 74  tored in *pMem t
3b50: 6f 20 76 61 6c 2c 0a 2a 2a 20 6d 61 6e 69 66 65  o val,.** manife
3b60: 73 74 20 74 79 70 65 20 49 4e 54 45 47 45 52 2e  st type INTEGER.
3b70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b80: 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
3b90: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 36 34 20 76  Mem *pMem, i64 v
3ba0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
3bb0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
3bc0: 6d 29 3b 0a 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  m);.  pMem->u.i 
3bd0: 3d 20 76 61 6c 3b 0a 20 20 70 4d 65 6d 2d 3e 66  = val;.  pMem->f
3be0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
3bf0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
3c00: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 7d  QLITE_INTEGER;.}
3c10: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
3c20: 6e 79 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ny previous valu
3c30: 65 20 61 6e 64 20 73 65 74 20 74 68 65 20 76 61  e and set the va
3c40: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  lue stored in *p
3c50: 4d 65 6d 20 74 6f 20 76 61 6c 2c 0a 2a 2a 20 6d  Mem to val,.** m
3c60: 61 6e 69 66 65 73 74 20 74 79 70 65 20 52 45 41  anifest type REA
3c70: 4c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  L..*/.void sqlit
3c80: 65 33 56 64 62 65 4d 65 6d 53 65 74 44 6f 75 62  e3VdbeMemSetDoub
3c90: 6c 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 64 6f  le(Mem *pMem, do
3ca0: 75 62 6c 65 20 76 61 6c 29 7b 0a 20 20 69 66 28  uble val){.  if(
3cb0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61   sqlite3IsNaN(va
3cc0: 6c 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  l) ){.    sqlite
3cd0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
3ce0: 70 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pMem);.  }else{.
3cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
3d00: 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
3d10: 0a 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 76  .    pMem->r = v
3d20: 61 6c 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  al;.    pMem->fl
3d30: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
3d40: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
3d50: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3b 0a 20   SQLITE_FLOAT;. 
3d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
3d70: 74 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 20  te any previous 
3d80: 76 61 6c 75 65 20 61 6e 64 20 73 65 74 20 74 68  value and set th
3d90: 65 20 76 61 6c 75 65 20 6f 66 20 70 4d 65 6d 20  e value of pMem 
3da0: 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 6d 70 74  to be an.** empt
3db0: 79 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 2e  y boolean index.
3dc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3dd0: 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65 74  VdbeMemSetRowSet
3de0: 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 73  (Mem *pMem){.  s
3df0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 4d 65  qlite3 *db = pMe
3e00: 6d 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  m->db;.  assert(
3e10: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
3e20: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
3e30: 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20  M_RowSet ){.    
3e40: 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65  sqlite3RowSetCle
3e50: 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53  ar(pMem->u.pRowS
3e60: 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
3e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3e80: 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
3e90: 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
3ea0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3eb0: 6f 63 52 61 77 28 64 62 2c 20 36 34 29 3b 0a 20  ocRaw(db, 64);. 
3ec0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
3ed0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
3ee0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
3ef0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65  EM_Null;.  }else
3f00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
3f10: 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 3b 0a 20  em->zMalloc );. 
3f20: 20 20 20 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53     pMem->u.pRowS
3f30: 65 74 20 3d 20 73 71 6c 69 74 65 33 52 6f 77 53  et = sqlite3RowS
3f40: 65 74 49 6e 69 74 28 64 62 2c 20 70 4d 65 6d 2d  etInit(db, pMem-
3f50: 3e 7a 4d 61 6c 6c 6f 63 2c 20 0a 20 20 20 20 20  >zMalloc, .     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
3f90: 63 53 69 7a 65 28 64 62 2c 20 70 4d 65 6d 2d 3e  cSize(db, pMem->
3fa0: 7a 4d 61 6c 6c 6f 63 29 29 3b 0a 20 20 20 20 61  zMalloc));.    a
3fb0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 75 2e 70  ssert( pMem->u.p
3fc0: 52 6f 77 53 65 74 21 3d 30 20 29 3b 0a 20 20 20  RowSet!=0 );.   
3fd0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
3fe0: 45 4d 5f 52 6f 77 53 65 74 3b 0a 20 20 7d 0a 7d  EM_RowSet;.  }.}
3ff0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4000: 72 75 65 20 69 66 20 74 68 65 20 4d 65 6d 20 6f  rue if the Mem o
4010: 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
4020: 20 54 45 58 54 20 6f 72 20 42 4c 4f 42 20 74 68   TEXT or BLOB th
4030: 61 74 20 69 73 0a 2a 2a 20 74 6f 6f 20 6c 61 72  at is.** too lar
4040: 67 65 20 2d 20 77 68 6f 73 65 20 73 69 7a 65 20  ge - whose size 
4050: 65 78 63 65 65 64 73 20 53 51 4c 49 54 45 5f 4d  exceeds SQLITE_M
4060: 41 58 5f 4c 45 4e 47 54 48 2e 0a 2a 2f 0a 69 6e  AX_LENGTH..*/.in
4070: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  t sqlite3VdbeMem
4080: 54 6f 6f 42 69 67 28 4d 65 6d 20 2a 70 29 7b 0a  TooBig(Mem *p){.
4090: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
40a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 66  =0 );.  if( p->f
40b0: 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c  lags & (MEM_Str|
40c0: 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20  MEM_Blob) ){.   
40d0: 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 3b 0a 20   int n = p->n;. 
40e0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
40f0: 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
4100: 20 20 20 20 6e 20 2b 3d 20 70 2d 3e 75 2e 6e 5a      n += p->u.nZ
4110: 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ero;.    }.    r
4120: 65 74 75 72 6e 20 6e 3e 70 2d 3e 64 62 2d 3e 61  eturn n>p->db->a
4130: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4140: 49 54 5f 4c 45 4e 47 54 48 5d 3b 0a 20 20 7d 0a  IT_LENGTH];.  }.
4150: 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d 0a 0a    return 0; .}..
4160: 2f 2a 0a 2a 2a 20 53 69 7a 65 20 6f 66 20 73 74  /*.** Size of st
4170: 72 75 63 74 20 4d 65 6d 20 6e 6f 74 20 69 6e 63  ruct Mem not inc
4180: 6c 75 64 69 6e 67 20 74 68 65 20 4d 65 6d 2e 7a  luding the Mem.z
4190: 4d 61 6c 6c 6f 63 20 6d 65 6d 62 65 72 2e 0a 2a  Malloc member..*
41a0: 2f 0a 23 64 65 66 69 6e 65 20 4d 45 4d 43 45 4c  /.#define MEMCEL
41b0: 4c 53 49 5a 45 20 28 73 69 7a 65 5f 74 29 28 26  LSIZE (size_t)(&
41c0: 28 28 28 4d 65 6d 20 2a 29 30 29 2d 3e 7a 4d 61  (((Mem *)0)->zMa
41d0: 6c 6c 6f 63 29 29 0a 0a 2f 2a 0a 2a 2a 20 4d 61  lloc))../*.** Ma
41e0: 6b 65 20 61 6e 20 73 68 61 6c 6c 6f 77 20 63 6f  ke an shallow co
41f0: 70 79 20 6f 66 20 70 46 72 6f 6d 20 69 6e 74 6f  py of pFrom into
4200: 20 70 54 6f 2e 20 20 50 72 69 6f 72 20 63 6f 6e   pTo.  Prior con
4210: 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 70 54 6f 20  tents of.** pTo 
4220: 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 65 20  are freed.  The 
4230: 70 46 72 6f 6d 2d 3e 7a 20 66 69 65 6c 64 20 69  pFrom->z field i
4240: 73 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  s not duplicated
4250: 2e 20 20 49 66 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  .  If.** pFrom->
4260: 7a 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20  z is used, then 
4270: 70 54 6f 2d 3e 7a 20 70 6f 69 6e 74 73 20 74 6f  pTo->z points to
4280: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20   the same thing 
4290: 61 73 20 70 46 72 6f 6d 2d 3e 7a 0a 2a 2a 20 61  as pFrom->z.** a
42a0: 6e 64 20 66 6c 61 67 73 20 67 65 74 73 20 73 72  nd flags gets sr
42b0: 63 54 79 70 65 20 28 65 69 74 68 65 72 20 4d 45  cType (either ME
42c0: 4d 5f 45 70 68 65 6d 20 6f 72 20 4d 45 4d 5f 53  M_Ephem or MEM_S
42d0: 74 61 74 69 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  tatic)..*/.void 
42e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
42f0: 61 6c 6c 6f 77 43 6f 70 79 28 4d 65 6d 20 2a 70  allowCopy(Mem *p
4300: 54 6f 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  To, const Mem *p
4310: 46 72 6f 6d 2c 20 69 6e 74 20 73 72 63 54 79 70  From, int srcTyp
4320: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28 70  e){.  assert( (p
4330: 46 72 6f 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  From->flags & ME
4340: 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
4350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4360: 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28  ReleaseExternal(
4370: 70 54 6f 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  pTo);.  memcpy(p
4380: 54 6f 2c 20 70 46 72 6f 6d 2c 20 4d 45 4d 43 45  To, pFrom, MEMCE
4390: 4c 4c 53 49 5a 45 29 3b 0a 20 20 70 54 6f 2d 3e  LLSIZE);.  pTo->
43a0: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  xDel = 0;.  if( 
43b0: 28 70 46 72 6f 6d 2d 3e 66 6c 61 67 73 26 4d 45  (pFrom->flags&ME
43c0: 4d 5f 44 79 6e 29 21 3d 30 20 7c 7c 20 70 46 72  M_Dyn)!=0 || pFr
43d0: 6f 6d 2d 3e 7a 3d 3d 70 46 72 6f 6d 2d 3e 7a 4d  om->z==pFrom->zM
43e0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 54 6f  alloc ){.    pTo
43f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d  ->flags &= ~(MEM
4400: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Dyn|MEM_Static|
4410: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
4420: 61 73 73 65 72 74 28 20 73 72 63 54 79 70 65 3d  assert( srcType=
4430: 3d 4d 45 4d 5f 45 70 68 65 6d 20 7c 7c 20 73 72  =MEM_Ephem || sr
4440: 63 54 79 70 65 3d 3d 4d 45 4d 5f 53 74 61 74 69  cType==MEM_Stati
4450: 63 20 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 66 6c  c );.    pTo->fl
4460: 61 67 73 20 7c 3d 20 73 72 63 54 79 70 65 3b 0a  ags |= srcType;.
4470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
4480: 65 20 61 20 66 75 6c 6c 20 63 6f 70 79 20 6f 66  e a full copy of
4490: 20 70 46 72 6f 6d 20 69 6e 74 6f 20 70 54 6f 2e   pFrom into pTo.
44a0: 20 20 50 72 69 6f 72 20 63 6f 6e 74 65 6e 74 73    Prior contents
44b0: 20 6f 66 20 70 54 6f 20 61 72 65 0a 2a 2a 20 66   of pTo are.** f
44c0: 72 65 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  reed before the 
44d0: 63 6f 70 79 20 69 73 20 6d 61 64 65 2e 0a 2a 2f  copy is made..*/
44e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
44f0: 4d 65 6d 43 6f 70 79 28 4d 65 6d 20 2a 70 54 6f  MemCopy(Mem *pTo
4500: 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 46 72  , const Mem *pFr
4510: 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  om){.  int rc = 
4520: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
4530: 73 65 72 74 28 20 28 70 46 72 6f 6d 2d 3e 66 6c  sert( (pFrom->fl
4540: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
4550: 29 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  )==0 );.  sqlite
4560: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45  3VdbeMemReleaseE
4570: 78 74 65 72 6e 61 6c 28 70 54 6f 29 3b 0a 20 20  xternal(pTo);.  
4580: 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f  memcpy(pTo, pFro
4590: 6d 2c 20 4d 45 4d 43 45 4c 4c 53 49 5a 45 29 3b  m, MEMCELLSIZE);
45a0: 0a 20 20 70 54 6f 2d 3e 66 6c 61 67 73 20 26 3d  .  pTo->flags &=
45b0: 20 7e 4d 45 4d 5f 44 79 6e 3b 0a 0a 20 20 69 66   ~MEM_Dyn;..  if
45c0: 28 20 70 54 6f 2d 3e 66 6c 61 67 73 26 28 4d 45  ( pTo->flags&(ME
45d0: 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
45e0: 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ){.    if( 0==(p
45f0: 46 72 6f 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  From->flags&MEM_
4600: 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 20  Static) ){.     
4610: 20 70 54 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d   pTo->flags |= M
4620: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
4630: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
4640: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
4650: 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
4660: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
4670: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
4680: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4690: 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 2e 20 41   pFrom to pTo. A
46a0: 6e 79 20 65 78 69 73 74 69 6e 67 20 76 61 6c 75  ny existing valu
46b0: 65 20 69 6e 20 70 54 6f 20 69 73 0a 2a 2a 20 66  e in pTo is.** f
46c0: 72 65 65 64 2e 20 49 66 20 70 46 72 6f 6d 20 63  reed. If pFrom c
46d0: 6f 6e 74 61 69 6e 73 20 65 70 68 65 6d 65 72 61  ontains ephemera
46e0: 6c 20 64 61 74 61 2c 20 61 20 63 6f 70 79 20 69  l data, a copy i
46f0: 73 20 6d 61 64 65 2e 0a 2a 2a 0a 2a 2a 20 70 46  s made..**.** pF
4700: 72 6f 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  rom contains an 
4710: 53 51 4c 20 4e 55 4c 4c 20 77 68 65 6e 20 74 68  SQL NULL when th
4720: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
4730: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
4740: 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 4d  te3VdbeMemMove(M
4750: 65 6d 20 2a 70 54 6f 2c 20 4d 65 6d 20 2a 70 46  em *pTo, Mem *pF
4760: 72 6f 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rom){.  assert( 
4770: 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20  pFrom->db==0 || 
4780: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4790: 6c 64 28 70 46 72 6f 6d 2d 3e 64 62 2d 3e 6d 75  ld(pFrom->db->mu
47a0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
47b0: 28 20 70 54 6f 2d 3e 64 62 3d 3d 30 20 7c 7c 20  ( pTo->db==0 || 
47c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
47d0: 6c 64 28 70 54 6f 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pTo->db->mute
47e0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
47f0: 70 46 72 6f 6d 2d 3e 64 62 3d 3d 30 20 7c 7c 20  pFrom->db==0 || 
4800: 70 54 6f 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 46  pTo->db==0 || pF
4810: 72 6f 6d 2d 3e 64 62 3d 3d 70 54 6f 2d 3e 64 62  rom->db==pTo->db
4820: 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64   );..  sqlite3Vd
4830: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 54 6f  beMemRelease(pTo
4840: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c  );.  memcpy(pTo,
4850: 20 70 46 72 6f 6d 2c 20 73 69 7a 65 6f 66 28 4d   pFrom, sizeof(M
4860: 65 6d 29 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 66  em));.  pFrom->f
4870: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
4880: 0a 20 20 70 46 72 6f 6d 2d 3e 78 44 65 6c 20 3d  .  pFrom->xDel =
4890: 20 30 3b 0a 20 20 70 46 72 6f 6d 2d 3e 7a 4d 61   0;.  pFrom->zMa
48a0: 6c 6c 6f 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  lloc = 0;.}../*.
48b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
48c0: 6c 75 65 20 6f 66 20 61 20 4d 65 6d 20 74 6f 20  lue of a Mem to 
48d0: 62 65 20 61 20 73 74 72 69 6e 67 20 6f 72 20 61  be a string or a
48e0: 20 42 4c 4f 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   BLOB..**.** The
48f0: 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
4900: 6e 74 20 73 74 72 61 74 65 67 79 20 64 65 70 65  nt strategy depe
4910: 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
4920: 20 6f 66 20 74 68 65 20 78 44 65 6c 0a 2a 2a 20   of the xDel.** 
4930: 70 61 72 61 6d 65 74 65 72 2e 20 49 66 20 74 68  parameter. If th
4940: 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 69  e value passed i
4950: 73 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  s SQLITE_TRANSIE
4960: 4e 54 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  NT, then the .**
4970: 20 73 74 72 69 6e 67 20 69 73 20 63 6f 70 69 65   string is copie
4980: 64 20 69 6e 74 6f 20 61 20 28 70 6f 73 73 69 62  d into a (possib
4990: 6c 79 20 65 78 69 73 74 69 6e 67 29 20 62 75 66  ly existing) buf
49a0: 66 65 72 20 6d 61 6e 61 67 65 64 20 62 79 20 74  fer managed by t
49b0: 68 65 20 0a 2a 2a 20 4d 65 6d 20 73 74 72 75 63  he .** Mem struc
49c0: 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  ture. Otherwise,
49d0: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 62 75   any existing bu
49e0: 66 66 65 72 20 69 73 20 66 72 65 65 64 20 61 6e  ffer is freed an
49f0: 64 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  d the.** pointer
4a00: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20   copied..*/.int 
4a10: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
4a20: 74 53 74 72 28 0a 20 20 4d 65 6d 20 2a 70 4d 65  tStr(.  Mem *pMe
4a30: 6d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  m,          /* M
4a40: 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 65  emory cell to se
4a50: 74 20 74 6f 20 73 74 72 69 6e 67 20 76 61 6c 75  t to string valu
4a60: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
4a70: 72 20 2a 7a 2c 20 20 20 20 20 20 2f 2a 20 53 74  r *z,      /* St
4a80: 72 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ring pointer */.
4a90: 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
4aa0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
4ab0: 6e 20 73 74 72 69 6e 67 2c 20 6f 72 20 6e 65 67  n string, or neg
4ac0: 61 74 69 76 65 20 2a 2f 0a 20 20 75 38 20 65 6e  ative */.  u8 en
4ad0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c,             /
4ae0: 2a 20 45 6e 63 6f 64 69 6e 67 20 6f 66 20 7a 2e  * Encoding of z.
4af0: 20 20 30 20 66 6f 72 20 42 4c 4f 42 73 20 2a 2f    0 for BLOBs */
4b00: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
4b10: 76 6f 69 64 2a 29 20 2f 2a 20 44 65 73 74 72 75  void*) /* Destru
4b20: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ctor function */
4b30: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
4b40: 3d 20 6e 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77  = n;      /* New
4b50: 20 76 61 6c 75 65 20 66 6f 72 20 70 4d 65 6d 2d   value for pMem-
4b60: 3e 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  >n */.  int iLim
4b70: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  it;         /* M
4b80: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
4b90: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 73 69  tring or blob si
4ba0: 7a 65 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  ze */.  u16 flag
4bb0: 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  s = 0;      /* N
4bc0: 65 77 20 76 61 6c 75 65 20 66 6f 72 20 70 4d 65  ew value for pMe
4bd0: 6d 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 61  m->flags */..  a
4be0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 3d  ssert( pMem->db=
4bf0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
4c00: 74 65 78 5f 68 65 6c 64 28 70 4d 65 6d 2d 3e 64  tex_held(pMem->d
4c10: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
4c20: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
4c30: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
4c40: 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  )==0 );..  /* If
4c50: 20 7a 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69   z is a NULL poi
4c60: 6e 74 65 72 2c 20 73 65 74 20 70 4d 65 6d 20 74  nter, set pMem t
4c70: 6f 20 63 6f 6e 74 61 69 6e 20 61 6e 20 53 51 4c  o contain an SQL
4c80: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
4c90: 21 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !z ){.    sqlite
4ca0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
4cb0: 70 4d 65 6d 29 3b 0a 20 20 20 20 72 65 74 75 72  pMem);.    retur
4cc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
4cd0: 0a 0a 20 20 69 66 28 20 70 4d 65 6d 2d 3e 64 62  ..  if( pMem->db
4ce0: 20 29 7b 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d   ){.    iLimit =
4cf0: 20 70 4d 65 6d 2d 3e 64 62 2d 3e 61 4c 69 6d 69   pMem->db->aLimi
4d00: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
4d10: 45 4e 47 54 48 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ENGTH];.  }else{
4d20: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 53 51  .    iLimit = SQ
4d30: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3b  LITE_MAX_LENGTH;
4d40: 0a 20 20 7d 0a 20 20 66 6c 61 67 73 20 3d 20 28  .  }.  flags = (
4d50: 65 6e 63 3d 3d 30 3f 4d 45 4d 5f 42 6c 6f 62 3a  enc==0?MEM_Blob:
4d60: 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69 66 28 20  MEM_Str);.  if( 
4d70: 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20 20 20 61  nByte<0 ){.    a
4d80: 73 73 65 72 74 28 20 65 6e 63 21 3d 30 20 29 3b  ssert( enc!=0 );
4d90: 0a 20 20 20 20 69 66 28 20 65 6e 63 3d 3d 53 51  .    if( enc==SQ
4da0: 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20  LITE_UTF8 ){.   
4db0: 20 20 20 66 6f 72 28 6e 42 79 74 65 3d 30 3b 20     for(nByte=0; 
4dc0: 6e 42 79 74 65 3c 3d 69 4c 69 6d 69 74 20 26 26  nByte<=iLimit &&
4dd0: 20 7a 5b 6e 42 79 74 65 5d 3b 20 6e 42 79 74 65   z[nByte]; nByte
4de0: 2b 2b 29 7b 7d 0a 20 20 20 20 7d 65 6c 73 65 7b  ++){}.    }else{
4df0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 42 79 74 65  .      for(nByte
4e00: 3d 30 3b 20 6e 42 79 74 65 3c 3d 69 4c 69 6d 69  =0; nByte<=iLimi
4e10: 74 20 26 26 20 28 7a 5b 6e 42 79 74 65 5d 20 7c  t && (z[nByte] |
4e20: 20 7a 5b 6e 42 79 74 65 2b 31 5d 29 3b 20 6e 42   z[nByte+1]); nB
4e30: 79 74 65 2b 3d 32 29 7b 7d 0a 20 20 20 20 7d 0a  yte+=2){}.    }.
4e40: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 4d 45 4d      flags |= MEM
4e50: 5f 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _Term;.  }..  /*
4e60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
4e70: 6c 6f 63 6b 20 73 65 74 73 20 74 68 65 20 6e 65  lock sets the ne
4e80: 77 20 76 61 6c 75 65 73 20 6f 66 20 4d 65 6d 2e  w values of Mem.
4e90: 7a 20 61 6e 64 20 4d 65 6d 2e 78 44 65 6c 2e 20  z and Mem.xDel. 
4ea0: 49 74 0a 20 20 2a 2a 20 61 6c 73 6f 20 73 65 74  It.  ** also set
4eb0: 73 20 61 20 66 6c 61 67 20 69 6e 20 6c 6f 63 61  s a flag in loca
4ec0: 6c 20 76 61 72 69 61 62 6c 65 20 22 66 6c 61 67  l variable "flag
4ed0: 73 22 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  s" to indicate t
4ee0: 68 65 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 6d  he memory.  ** m
4ef0: 61 6e 61 67 65 6d 65 6e 74 20 28 6f 6e 65 20 6f  anagement (one o
4f00: 66 20 4d 45 4d 5f 44 79 6e 20 6f 72 20 4d 45 4d  f MEM_Dyn or MEM
4f10: 5f 53 74 61 74 69 63 29 2e 0a 20 20 2a 2f 0a 20  _Static)..  */. 
4f20: 20 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c 49 54   if( xDel==SQLIT
4f30: 45 5f 54 52 41 4e 53 49 45 4e 54 20 29 7b 0a 20  E_TRANSIENT ){. 
4f40: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
4f50: 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20 66  nByte;.    if( f
4f60: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 20 29 7b  lags&MEM_Term ){
4f70: 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d  .      nAlloc +=
4f80: 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
4f90: 46 38 3f 31 3a 32 29 3b 0a 20 20 20 20 7d 0a 20  F8?1:2);.    }. 
4fa0: 20 20 20 69 66 28 20 6e 42 79 74 65 3e 69 4c 69     if( nByte>iLi
4fb0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  mit ){.      ret
4fc0: 75 72 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  urn SQLITE_TOOBI
4fd0: 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  G;.    }.    if(
4fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
4ff0: 72 6f 77 28 70 4d 65 6d 2c 20 6e 41 6c 6c 6f 63  row(pMem, nAlloc
5000: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , 0) ){.      re
5010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5020: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
5030: 63 70 79 28 70 4d 65 6d 2d 3e 7a 2c 20 7a 2c 20  cpy(pMem->z, z, 
5040: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 7d 65 6c 73 65  nAlloc);.  }else
5050: 20 69 66 28 20 78 44 65 6c 3d 3d 53 51 4c 49 54   if( xDel==SQLIT
5060: 45 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  E_DYNAMIC ){.   
5070: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
5080: 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
5090: 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
50a0: 3d 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61  = pMem->z = (cha
50b0: 72 20 2a 29 7a 3b 0a 20 20 20 20 70 4d 65 6d 2d  r *)z;.    pMem-
50c0: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  >xDel = 0;.  }el
50d0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
50e0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
50f0: 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  em);.    pMem->z
5100: 20 3d 20 28 63 68 61 72 20 2a 29 7a 3b 0a 20 20   = (char *)z;.  
5110: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 78    pMem->xDel = x
5120: 44 65 6c 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c  Del;.    flags |
5130: 3d 20 28 28 78 44 65 6c 3d 3d 53 51 4c 49 54 45  = ((xDel==SQLITE
5140: 5f 53 54 41 54 49 43 29 3f 4d 45 4d 5f 53 74 61  _STATIC)?MEM_Sta
5150: 74 69 63 3a 4d 45 4d 5f 44 79 6e 29 3b 0a 20 20  tic:MEM_Dyn);.  
5160: 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 69 4c  }.  if( nByte>iL
5170: 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
5180: 72 6e 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  rn SQLITE_TOOBIG
5190: 3b 0a 20 20 7d 0a 0a 20 20 70 4d 65 6d 2d 3e 6e  ;.  }..  pMem->n
51a0: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 70 4d 65 6d   = nByte;.  pMem
51b0: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
51c0: 0a 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 28  .  pMem->enc = (
51d0: 65 6e 63 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f  enc==0 ? SQLITE_
51e0: 55 54 46 38 20 3a 20 65 6e 63 29 3b 0a 20 20 70  UTF8 : enc);.  p
51f0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 28 65 6e 63  Mem->type = (enc
5200: 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 42 4c 4f  ==0 ? SQLITE_BLO
5210: 42 20 3a 20 53 51 4c 49 54 45 5f 54 45 58 54 29  B : SQLITE_TEXT)
5220: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
5230: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
5240: 66 28 20 70 4d 65 6d 2d 3e 65 6e 63 21 3d 53 51  f( pMem->enc!=SQ
5250: 4c 49 54 45 5f 55 54 46 38 20 26 26 20 73 71 6c  LITE_UTF8 && sql
5260: 69 74 65 33 56 64 62 65 4d 65 6d 48 61 6e 64 6c  ite3VdbeMemHandl
5270: 65 42 6f 6d 28 70 4d 65 6d 29 20 29 7b 0a 20 20  eBom(pMem) ){.  
5280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5290: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
52a0: 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  f..  return SQLI
52b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
52c0: 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
52d0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
52e0: 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
52f0: 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
5300: 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
5310: 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
5320: 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
5330: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
5340: 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
5350: 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
5360: 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
5370: 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
5380: 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
5390: 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
53a0: 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
53b0: 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
53c0: 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
53d0: 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
53e0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
53f0: 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
5400: 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
5410: 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
5420: 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
5430: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
5440: 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
5450: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
5460: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
5470: 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
5480: 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
5490: 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
54a0: 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
54b0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 31 2c  nt rc;.  int f1,
54c0: 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
54d0: 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 2f 2a  ned_flags;..  /*
54e0: 20 49 6e 74 65 72 63 68 61 6e 67 65 20 70 4d 65   Interchange pMe
54f0: 6d 31 20 61 6e 64 20 70 4d 65 6d 32 20 69 66 20  m1 and pMem2 if 
5500: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
5510: 71 75 65 6e 63 65 20 73 70 65 63 69 66 69 65 73  quence specifies
5520: 0a 20 20 2a 2a 20 44 45 53 43 20 6f 72 64 65 72  .  ** DESC order
5530: 2e 0a 20 20 2a 2f 0a 20 20 66 31 20 3d 20 70 4d  ..  */.  f1 = pM
5540: 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
5550: 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
5560: 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
5570: 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
5580: 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
5590: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
55a0: 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
55b0: 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
55c0: 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
55d0: 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
55e0: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
55f0: 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
5600: 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
5610: 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
5620: 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
5630: 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
5640: 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
5650: 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
5660: 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
5670: 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20  is a number and 
5680: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
5690: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20  , the number is 
56a0: 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
56b0: 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20  th are numbers, 
56c0: 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73  compare as reals
56d0: 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61   if one is a rea
56e0: 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72  l, or as integer
56f0: 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76  s.  ** if both v
5700: 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65  alues are intege
5710: 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  rs..  */.  if( c
5720: 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
5730: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
5740: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 28 66 31   ){.    if( !(f1
5750: 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
5760: 61 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65  al)) ){.      re
5770: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
5780: 20 20 69 66 28 20 21 28 66 32 26 28 4d 45 4d 5f    if( !(f2&(MEM_
5790: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 20 29  Int|MEM_Real)) )
57a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
57b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
57c0: 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
57d0: 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Int)==0 ){.     
57e0: 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a   double r1, r2;.
57f0: 20 20 20 20 20 20 69 66 28 20 28 66 31 26 4d 45        if( (f1&ME
5800: 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Real)==0 ){.  
5810: 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62        r1 = (doub
5820: 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20  le)pMem1->u.i;. 
5830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5840: 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e      r1 = pMem1->
5850: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
5860: 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
5870: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
5880: 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d   r2 = (double)pM
5890: 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  em2->u.i;.      
58a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
58b0: 32 20 3d 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20  2 = pMem2->r;.  
58c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
58d0: 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d  r1<r2 ) return -
58e0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 31 3e  1;.      if( r1>
58f0: 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  r2 ) return 1;. 
5900: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5920: 61 73 73 65 72 74 28 20 66 31 26 4d 45 4d 5f 49  assert( f1&MEM_I
5930: 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nt );.      asse
5940: 72 74 28 20 66 32 26 4d 45 4d 5f 49 6e 74 20 29  rt( f2&MEM_Int )
5950: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
5960: 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
5970: 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
5980: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
5990: 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
59a0: 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  .i ) return 1;. 
59b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
59c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
59d0: 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
59e0: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
59f0: 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
5a00: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
5a10: 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
5a20: 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
5a30: 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
5a40: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
5a50: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
5a60: 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
5a70: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
5a80: 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
5a90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
5aa0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
5ab0: 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
5ac0: 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
5ad0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5ae0: 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
5af0: 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
5b00: 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  ->enc );.    ass
5b10: 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
5b20: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
5b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
5b40: 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
5b50: 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
5b60: 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
5b70: 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
5b80: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
5b90: 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
5ba0: 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
5bb0: 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
5bc0: 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
5bd0: 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
5be0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
5bf0: 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
5c00: 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
5c10: 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
5c20: 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
5c30: 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
5c40: 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
5c50: 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
5c60: 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
5c70: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
5c80: 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  pMem1->enc==pCol
5c90: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
5ca0: 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
5cb0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
5cc0: 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
5cd0: 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
5ce0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61          ** compa
5cf0: 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
5d00: 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 20  irectly */.     
5d10: 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
5d20: 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
5d30: 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
5d40: 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
5d50: 65 6d 32 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d  em2->z);.      }
5d60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
5d70: 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
5d80: 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  2;.        int n
5d90: 31 2c 20 6e 32 3b 0a 20 20 20 20 20 20 20 20 4d  1, n2;.        M
5da0: 65 6d 20 63 31 3b 0a 20 20 20 20 20 20 20 20 4d  em c1;.        M
5db0: 65 6d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 6d  em c2;.        m
5dc0: 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20 73 69  emset(&c1, 0, si
5dd0: 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20 20 20  zeof(c1));.     
5de0: 20 20 20 6d 65 6d 73 65 74 28 26 63 32 2c 20 30     memset(&c2, 0
5df0: 2c 20 73 69 7a 65 6f 66 28 63 32 29 29 3b 0a 20  , sizeof(c2));. 
5e00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e10: 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
5e20: 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d  (&c1, pMem1, MEM
5e30: 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 20 20 20  _Ephem);.       
5e40: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
5e50: 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
5e60: 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
5e70: 29 3b 0a 20 20 20 20 20 20 20 20 76 31 20 3d 20  );.        v1 = 
5e80: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
5e90: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
5ea0: 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
5eb0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 31 20 3d 20  );.        n1 = 
5ec0: 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
5ed0: 3b 0a 20 20 20 20 20 20 20 20 76 32 20 3d 20 73  ;.        v2 = s
5ee0: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
5ef0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
5f00: 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c2, pColl->enc)
5f10: 3b 0a 20 20 20 20 20 20 20 20 6e 32 20 3d 20 76  ;.        n2 = v
5f20: 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
5f30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 43  .        rc = pC
5f40: 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
5f50: 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
5f60: 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 20 20 20  n2, v2);.       
5f70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
5f80: 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
5f90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5fa0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b  MemRelease(&c2);
5fb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5fc0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
5fd0: 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
5fe0: 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
5ff0: 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
6000: 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
6010: 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
6020: 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
6030: 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
6040: 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
6050: 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
6060: 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
6070: 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
6080: 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
6090: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31  c = memcmp(pMem1
60a0: 2d 3e 7a 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28  ->z, pMem2->z, (
60b0: 70 4d 65 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e  pMem1->n>pMem2->
60c0: 6e 29 3f 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d  n)?pMem2->n:pMem
60d0: 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  1->n);.  if( rc=
60e0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
60f0: 4d 65 6d 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d  Mem1->n - pMem2-
6100: 3e 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >n;.  }.  return
6110: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
6120: 76 65 20 64 61 74 61 20 6f 75 74 20 6f 66 20 61  ve data out of a
6130: 20 62 74 72 65 65 20 6b 65 79 20 6f 72 20 64 61   btree key or da
6140: 74 61 20 66 69 65 6c 64 20 61 6e 64 20 69 6e 74  ta field and int
6150: 6f 20 61 20 4d 65 6d 20 73 74 72 75 63 74 75 72  o a Mem structur
6160: 65 2e 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 6f  e..** The data o
6170: 72 20 6b 65 79 20 69 73 20 74 61 6b 65 6e 20 66  r key is taken f
6180: 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
6190: 61 74 20 70 43 75 72 20 69 73 20 63 75 72 72 65  at pCur is curre
61a0: 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a  ntly pointing.**
61b0: 20 74 6f 2e 20 20 6f 66 66 73 65 74 20 61 6e 64   to.  offset and
61c0: 20 61 6d 74 20 64 65 74 65 72 6d 69 6e 65 20 77   amt determine w
61d0: 68 61 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  hat portion of t
61e0: 68 65 20 64 61 74 61 20 6f 72 20 6b 65 79 20 74  he data or key t
61f0: 6f 20 72 65 74 72 69 65 76 65 2e 0a 2a 2a 20 6b  o retrieve..** k
6200: 65 79 20 69 73 20 74 72 75 65 20 74 6f 20 67 65  ey is true to ge
6210: 74 20 74 68 65 20 6b 65 79 20 6f 72 20 66 61 6c  t the key or fal
6220: 73 65 20 74 6f 20 67 65 74 20 64 61 74 61 2e 20  se to get data. 
6230: 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 77   The result is w
6240: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
6250: 68 65 20 70 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e  he pMem element.
6260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4d 65 6d 20  .**.** The pMem 
6270: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 73 73  structure is ass
6280: 75 6d 65 64 20 74 6f 20 62 65 20 75 6e 69 6e 69  umed to be unini
6290: 74 69 61 6c 69 7a 65 64 2e 20 20 41 6e 79 20 70  tialized.  Any p
62a0: 72 69 6f 72 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  rior content.** 
62b0: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
62c0: 69 74 68 6f 75 74 20 62 65 69 6e 67 20 66 72 65  ithout being fre
62d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
62e0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
62f0: 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 20 28  for any reason (
6300: 6d 61 6c 6c 6f 63 20 72 65 74 75 72 6e 73 20 4e  malloc returns N
6310: 55 4c 4c 20 6f 72 20 75 6e 61 62 6c 65 0a 2a 2a  ULL or unable.**
6320: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 74 68   to read from th
6330: 65 20 64 69 73 6b 29 20 74 68 65 6e 20 74 68 65  e disk) then the
6340: 20 70 4d 65 6d 20 69 73 20 6c 65 66 74 20 69 6e   pMem is left in
6350: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
6360: 20 73 74 61 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73   state..*/.int s
6370: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
6380: 6d 42 74 72 65 65 28 0a 20 20 42 74 43 75 72 73  mBtree(.  BtCurs
6390: 6f 72 20 2a 70 43 75 72 2c 20 20 20 2f 2a 20 43  or *pCur,   /* C
63a0: 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61  ursor pointing a
63b0: 74 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 72  t record to retr
63c0: 69 65 76 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ieve. */.  int o
63d0: 66 66 73 65 74 2c 20 20 20 20 20 20 20 2f 2a 20  ffset,       /* 
63e0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20  Offset from the 
63f0: 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 74 6f  start of data to
6400: 20 72 65 74 75 72 6e 20 62 79 74 65 73 20 66 72   return bytes fr
6410: 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  om. */.  int amt
6420: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
6430: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
6440: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69 6e   return. */.  in
6450: 74 20 6b 65 79 2c 20 20 20 20 20 20 20 20 20 20  t key,          
6460: 2f 2a 20 49 66 20 74 72 75 65 2c 20 72 65 74 72  /* If true, retr
6470: 69 65 76 65 20 66 72 6f 6d 20 74 68 65 20 62 74  ieve from the bt
6480: 72 65 65 20 6b 65 79 2c 20 6e 6f 74 20 64 61 74  ree key, not dat
6490: 61 2e 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  a. */.  Mem *pMe
64a0: 6d 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  m         /* OUT
64b0: 3a 20 52 65 74 75 72 6e 20 64 61 74 61 20 69 6e  : Return data in
64c0: 20 74 68 69 73 20 4d 65 6d 20 73 74 72 75 63 74   this Mem struct
64d0: 75 72 65 2e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ure. */.){.  cha
64e0: 72 20 2a 7a 44 61 74 61 3b 20 20 20 20 20 20 20  r *zData;       
64f0: 20 2f 2a 20 44 61 74 61 20 66 72 6f 6d 20 74 68   /* Data from th
6500: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 2a 2f  e btree layer */
6510: 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65  .  int available
6520: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
6530: 20 6f 66 20 62 79 74 65 73 20 61 76 61 69 6c 61   of bytes availa
6540: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
6550: 20 62 74 72 65 65 20 70 61 67 65 20 2a 2f 0a 20   btree page */. 
6560: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6570: 5f 4f 4b 3b 20 2f 2a 20 52 65 74 75 72 6e 20 63  _OK; /* Return c
6580: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 74  ode */..  /* Not
6590: 65 3a 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20  e: the calls to 
65a0: 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 29 20  BtreeKeyFetch() 
65b0: 61 6e 64 20 44 61 74 61 46 65 74 63 68 28 29 20  and DataFetch() 
65c0: 62 65 6c 6f 77 20 61 73 73 65 72 74 28 29 20 0a  below assert() .
65d0: 20 20 2a 2a 20 74 68 61 74 20 62 6f 74 68 20 74    ** that both t
65e0: 68 65 20 42 74 53 68 61 72 65 64 20 61 6e 64 20  he BtShared and 
65f0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
6600: 6d 75 74 65 78 65 73 20 61 72 65 20 68 65 6c 64  mutexes are held
6610: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
6620: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
6630: 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
6640: 20 20 69 66 28 20 6b 65 79 20 29 7b 0a 20 20 20    if( key ){.   
6650: 20 7a 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a   zData = (char *
6660: 29 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  )sqlite3BtreeKey
6670: 46 65 74 63 68 28 70 43 75 72 2c 20 26 61 76 61  Fetch(pCur, &ava
6680: 69 6c 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65  ilable);.  }else
6690: 7b 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 28 63  {.    zData = (c
66a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 42 74 72  har *)sqlite3Btr
66b0: 65 65 44 61 74 61 46 65 74 63 68 28 70 43 75 72  eeDataFetch(pCur
66c0: 2c 20 26 61 76 61 69 6c 61 62 6c 65 29 3b 0a 20  , &available);. 
66d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61   }.  assert( zDa
66e0: 74 61 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta!=0 );..  if( 
66f0: 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 61 76 61 69  offset+amt<=avai
6700: 6c 61 62 6c 65 20 26 26 20 28 28 70 4d 65 6d 2d  lable && ((pMem-
6710: 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 3d  >flags&MEM_Dyn)=
6720: 3d 30 20 7c 7c 20 70 4d 65 6d 2d 3e 78 44 65 6c  =0 || pMem->xDel
6730: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
6740: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
6750: 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  Mem);.    pMem->
6760: 7a 20 3d 20 26 7a 44 61 74 61 5b 6f 66 66 73 65  z = &zData[offse
6770: 74 5d 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  t];.    pMem->fl
6780: 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ags = MEM_Blob|M
6790: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 7d 65 6c 73  EM_Ephem;.  }els
67a0: 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  e if( SQLITE_OK=
67b0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64  =(rc = sqlite3Vd
67c0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
67d0: 61 6d 74 2b 32 2c 20 30 29 29 20 29 7b 0a 20 20  amt+2, 0)) ){.  
67e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
67f0: 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 44 79 6e  MEM_Blob|MEM_Dyn
6800: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70  |MEM_Term;.    p
6810: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 30 3b 0a 20 20  Mem->enc = 0;.  
6820: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6830: 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 20 20  QLITE_BLOB;.    
6840: 69 66 28 20 6b 65 79 20 29 7b 0a 20 20 20 20 20  if( key ){.     
6850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6860: 65 65 4b 65 79 28 70 43 75 72 2c 20 6f 66 66 73  eeKey(pCur, offs
6870: 65 74 2c 20 61 6d 74 2c 20 70 4d 65 6d 2d 3e 7a  et, amt, pMem->z
6880: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6890: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
68a0: 42 74 72 65 65 44 61 74 61 28 70 43 75 72 2c 20  BtreeData(pCur, 
68b0: 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 4d 65  offset, amt, pMe
68c0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  m->z);.    }.   
68d0: 20 70 4d 65 6d 2d 3e 7a 5b 61 6d 74 5d 20 3d 20   pMem->z[amt] = 
68e0: 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 5b 61  0;.    pMem->z[a
68f0: 6d 74 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 69  mt+1] = 0;.    i
6900: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6910: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6920: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
6930: 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pMem);.    }.  }
6940: 0a 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 61 6d 74  .  pMem->n = amt
6950: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
6960: 7d 0a 0a 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  }../* This funct
6970: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ion is only avai
6980: 6c 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 6c 79  lable internally
6990: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  , it is not part
69a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 74 65 72   of the.** exter
69b0: 6e 61 6c 20 41 50 49 2e 20 49 74 20 77 6f 72 6b  nal API. It work
69c0: 73 20 69 6e 20 61 20 73 69 6d 69 6c 61 72 20 77  s in a similar w
69d0: 61 79 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ay to sqlite3_va
69e0: 6c 75 65 5f 74 65 78 74 28 29 2c 0a 2a 2a 20 65  lue_text(),.** e
69f0: 78 63 65 70 74 20 74 68 65 20 64 61 74 61 20 72  xcept the data r
6a00: 65 74 75 72 6e 65 64 20 69 73 20 69 6e 20 74 68  eturned is in th
6a10: 65 20 65 6e 63 6f 64 69 6e 67 20 73 70 65 63 69  e encoding speci
6a20: 66 69 65 64 20 62 79 20 74 68 65 20 73 65 63 6f  fied by the seco
6a30: 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  nd.** parameter,
6a40: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 6f   which must be o
6a50: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
6a60: 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46  16BE, SQLITE_UTF
6a70: 31 36 4c 45 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  16LE or.** SQLIT
6a80: 45 5f 55 54 46 38 2e 0a 2a 2a 0a 2a 2a 20 28 32  E_UTF8..**.** (2
6a90: 30 30 36 2d 30 32 2d 31 36 3a 29 20 20 54 68 65  006-02-16:)  The
6aa0: 20 65 6e 63 20 76 61 6c 75 65 20 63 61 6e 20 62   enc value can b
6ab0: 65 20 6f 72 2d 65 64 20 77 69 74 68 20 53 51 4c  e or-ed with SQL
6ac0: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
6ad0: 44 2e 0a 2a 2a 20 49 66 20 74 68 61 74 20 69 73  D..** If that is
6ae0: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
6af0: 74 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20  the result must 
6b00: 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e  be aligned on an
6b10: 20 65 76 65 6e 20 62 79 74 65 0a 2a 2a 20 62 6f   even byte.** bo
6b20: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 63 6f 6e 73 74  undary..*/.const
6b30: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 56 61   void *sqlite3Va
6b40: 6c 75 65 54 65 78 74 28 73 71 6c 69 74 65 33 5f  lueText(sqlite3_
6b50: 76 61 6c 75 65 2a 20 70 56 61 6c 2c 20 75 38 20  value* pVal, u8 
6b60: 65 6e 63 29 7b 0a 20 20 69 66 28 20 21 70 56 61  enc){.  if( !pVa
6b70: 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  l ) return 0;.. 
6b80: 20 61 73 73 65 72 74 28 20 70 56 61 6c 2d 3e 64   assert( pVal->d
6b90: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  b==0 || sqlite3_
6ba0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 56 61 6c 2d  mutex_held(pVal-
6bb0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
6bc0: 20 61 73 73 65 72 74 28 20 28 65 6e 63 26 33 29   assert( (enc&3)
6bd0: 3d 3d 28 65 6e 63 26 7e 53 51 4c 49 54 45 5f 55  ==(enc&~SQLITE_U
6be0: 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20 29 3b  TF16_ALIGNED) );
6bf0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 56 61 6c  .  assert( (pVal
6c00: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
6c10: 77 53 65 74 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  wSet)==0 );..  i
6c20: 66 28 20 70 56 61 6c 2d 3e 66 6c 61 67 73 26 4d  f( pVal->flags&M
6c30: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
6c40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
6c50: 73 73 65 72 74 28 20 28 4d 45 4d 5f 42 6c 6f 62  ssert( (MEM_Blob
6c60: 3e 3e 33 29 20 3d 3d 20 4d 45 4d 5f 53 74 72 20  >>3) == MEM_Str 
6c70: 29 3b 0a 20 20 70 56 61 6c 2d 3e 66 6c 61 67 73  );.  pVal->flags
6c80: 20 7c 3d 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73   |= (pVal->flags
6c90: 20 26 20 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33 3b   & MEM_Blob)>>3;
6ca0: 0a 20 20 65 78 70 61 6e 64 42 6c 6f 62 28 70 56  .  expandBlob(pV
6cb0: 61 6c 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 2d  al);.  if( pVal-
6cc0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  >flags&MEM_Str )
6cd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6ce0: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
6cf0: 70 56 61 6c 2c 20 65 6e 63 20 26 20 7e 53 51 4c  pVal, enc & ~SQL
6d00: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
6d10: 44 29 3b 0a 20 20 20 20 69 66 28 20 28 65 6e 63  D);.    if( (enc
6d20: 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
6d30: 41 4c 49 47 4e 45 44 29 21 3d 30 20 26 26 20 31  ALIGNED)!=0 && 1
6d40: 3d 3d 28 31 26 53 51 4c 49 54 45 5f 50 54 52 5f  ==(1&SQLITE_PTR_
6d50: 54 4f 5f 49 4e 54 28 70 56 61 6c 2d 3e 7a 29 29  TO_INT(pVal->z))
6d60: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
6d70: 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73 20 26  ( (pVal->flags &
6d80: 20 28 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f   (MEM_Ephem|MEM_
6d90: 53 74 61 74 69 63 29 29 21 3d 30 20 29 3b 0a 20  Static))!=0 );. 
6da0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6db0: 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65  VdbeMemMakeWrite
6dc0: 61 62 6c 65 28 70 56 61 6c 29 21 3d 53 51 4c 49  able(pVal)!=SQLI
6dd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6de0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
6df0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
6e00: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65  ite3VdbeMemNulTe
6e10: 72 6d 69 6e 61 74 65 28 70 56 61 6c 29 3b 0a 20  rminate(pVal);. 
6e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6e30: 72 74 28 20 28 70 56 61 6c 2d 3e 66 6c 61 67 73  rt( (pVal->flags
6e40: 26 4d 45 4d 5f 42 6c 6f 62 29 3d 3d 30 20 29 3b  &MEM_Blob)==0 );
6e50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e60: 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 56 61  MemStringify(pVa
6e70: 6c 2c 20 65 6e 63 29 3b 0a 20 20 20 20 61 73 73  l, enc);.    ass
6e80: 65 72 74 28 20 30 3d 3d 28 31 26 53 51 4c 49 54  ert( 0==(1&SQLIT
6e90: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 56 61  E_PTR_TO_INT(pVa
6ea0: 6c 2d 3e 7a 29 29 20 29 3b 0a 20 20 7d 0a 20 20  l->z)) );.  }.  
6eb0: 61 73 73 65 72 74 28 70 56 61 6c 2d 3e 65 6e 63  assert(pVal->enc
6ec0: 3d 3d 28 65 6e 63 20 26 20 7e 53 51 4c 49 54 45  ==(enc & ~SQLITE
6ed0: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 20  _UTF16_ALIGNED) 
6ee0: 7c 7c 20 70 56 61 6c 2d 3e 64 62 3d 3d 30 0a 20  || pVal->db==0. 
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6f00: 70 56 61 6c 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pVal->db->malloc
6f10: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6f20: 70 56 61 6c 2d 3e 65 6e 63 3d 3d 28 65 6e 63 20  pVal->enc==(enc 
6f30: 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
6f40: 41 4c 49 47 4e 45 44 29 20 29 7b 0a 20 20 20 20  ALIGNED) ){.    
6f50: 72 65 74 75 72 6e 20 70 56 61 6c 2d 3e 7a 3b 0a  return pVal->z;.
6f60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
6f70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6f80: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
6f90: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
6fa0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65  bject..*/.sqlite
6fb0: 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
6fc0: 56 61 6c 75 65 4e 65 77 28 73 71 6c 69 74 65 33  ValueNew(sqlite3
6fd0: 20 2a 64 62 29 7b 0a 20 20 4d 65 6d 20 2a 70 20   *db){.  Mem *p 
6fe0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6ff0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7000: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
7010: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  {.    p->flags =
7020: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
7030: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
7040: 4e 55 4c 4c 3b 0a 20 20 20 20 70 2d 3e 64 62 20  NULL;.    p->db 
7050: 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = db;.  }.  retu
7060: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
7070: 72 65 61 74 65 20 61 20 6e 65 77 20 73 71 6c 69  reate a new sqli
7080: 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74  te3_value object
7090: 2c 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  , containing the
70a0: 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2e   value of pExpr.
70b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 6e 6c 79  .**.** This only
70c0: 20 77 6f 72 6b 73 20 66 6f 72 20 76 65 72 79 20   works for very 
70d0: 73 69 6d 70 6c 65 20 65 78 70 72 65 73 73 69 6f  simple expressio
70e0: 6e 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20  ns that consist 
70f0: 6f 66 20 6f 6e 65 20 63 6f 6e 73 74 61 6e 74 0a  of one constant.
7100: 2a 2a 20 74 6f 6b 65 6e 20 28 69 2e 65 2e 20 22  ** token (i.e. "
7110: 35 22 2c 20 22 35 2e 31 22 2c 20 22 27 61 20 73  5", "5.1", "'a s
7120: 74 72 69 6e 67 27 22 29 2e 20 49 66 20 74 68 65  tring'"). If the
7130: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 0a   expression can.
7140: 2a 2a 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ** be converted 
7150: 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 61 20  directly into a 
7160: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
7170: 76 61 6c 75 65 20 69 73 20 61 6c 6c 6f 63 61 74  value is allocat
7180: 65 64 20 61 6e 64 0a 2a 2a 20 61 20 70 6f 69 6e  ed and.** a poin
7190: 74 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  ter written to *
71a0: 70 70 56 61 6c 2e 20 54 68 65 20 63 61 6c 6c 65  ppVal. The calle
71b0: 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
71c0: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e   for deallocatin
71d0: 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 62  g.** the value b
71e0: 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  y passing it to 
71f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7200: 28 29 20 6c 61 74 65 72 20 6f 6e 2e 20 49 66 20  () later on. If 
7210: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
7220: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76  * cannot be conv
7230: 65 72 74 65 64 20 74 6f 20 61 20 76 61 6c 75 65  erted to a value
7240: 2c 20 74 68 65 6e 20 2a 70 70 56 61 6c 20 69 73  , then *ppVal is
7250: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
7260: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 61 6c 75  .int sqlite3Valu
7270: 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 73 71 6c  eFromExpr(.  sql
7280: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
7290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
72a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
72b0: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
72c0: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
72d0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
72e0: 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 2a  on to evaluate *
72f0: 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20  /.  u8 enc,     
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73 65   Encoding to use
7320: 20 2a 2f 0a 20 20 75 38 20 61 66 66 69 6e 69 74   */.  u8 affinit
7330: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
7340: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75  /* Affinity to u
7350: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7360: 76 61 6c 75 65 20 2a 2a 70 70 56 61 6c 20 20 20  value **ppVal   
7370: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
7380: 65 77 20 76 61 6c 75 65 20 68 65 72 65 20 2a 2f  ew value here */
7390: 0a 29 7b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  .){.  int op;.  
73a0: 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 30 3b 0a  char *zVal = 0;.
73b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
73c0: 2a 70 56 61 6c 20 3d 20 30 3b 0a 0a 20 20 69 66  *pVal = 0;..  if
73d0: 28 20 21 70 45 78 70 72 20 29 7b 0a 20 20 20 20  ( !pExpr ){.    
73e0: 2a 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  *ppVal = 0;.    
73f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7400: 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78  ;.  }.  op = pEx
7410: 70 72 2d 3e 6f 70 3b 0a 0a 20 20 69 66 28 20 6f  pr->op;..  if( o
7420: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 7c 7c 20  p==TK_STRING || 
7430: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
7440: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
7450: 7b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  {.    pVal = sql
7460: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
7470: 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c 3d 3d  ;.    if( pVal==
7480: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
7490: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
74a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
74b0: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 7b 0a  EP_IntValue) ){.
74c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
74d0: 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 56 61  eMemSetInt64(pVa
74e0: 6c 2c 20 28 69 36 34 29 70 45 78 70 72 2d 3e 75  l, (i64)pExpr->u
74f0: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 65  .iValue);.    }e
7500: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 56 61 6c 20  lse{.      zVal 
7510: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7520: 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  p(db, pExpr->u.z
7530: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  Token);.      if
7540: 28 20 7a 56 61 6c 3d 3d 30 20 29 20 67 6f 74 6f  ( zVal==0 ) goto
7550: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20 73   no_mem;.      s
7560: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
7570: 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 56 61 6c  r(pVal, -1, zVal
7580: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
7590: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
75a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 6f      }.    if( (o
75b0: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p==TK_INTEGER ||
75c0: 20 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 20   op==TK_FLOAT ) 
75d0: 26 26 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  && affinity==SQL
75e0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a  ITE_AFF_NONE ){.
75f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
7600: 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
7610: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46  pVal, SQLITE_AFF
7620: 5f 4e 55 4d 45 52 49 43 2c 20 53 51 4c 49 54 45  _NUMERIC, SQLITE
7630: 5f 55 54 46 38 29 3b 0a 20 20 20 20 7d 65 6c 73  _UTF8);.    }els
7640: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
7650: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
7660: 74 79 28 70 56 61 6c 2c 20 61 66 66 69 6e 69 74  ty(pVal, affinit
7670: 79 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  y, SQLITE_UTF8);
7680: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
7690: 6e 63 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc!=SQLITE_UTF8 
76a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
76b0: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
76c0: 6e 67 28 70 56 61 6c 2c 20 65 6e 63 29 3b 0a 20  ng(pVal, enc);. 
76d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
76e0: 20 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29   op==TK_UMINUS )
76f0: 20 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   {.    if( SQLIT
7700: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 61 6c  E_OK==sqlite3Val
7710: 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 70 45  ueFromExpr(db,pE
7720: 78 70 72 2d 3e 70 4c 65 66 74 2c 65 6e 63 2c 61  xpr->pLeft,enc,a
7730: 66 66 69 6e 69 74 79 2c 26 70 56 61 6c 29 20 29  ffinity,&pVal) )
7740: 7b 0a 20 20 20 20 20 20 70 56 61 6c 2d 3e 75 2e  {.      pVal->u.
7750: 69 20 3d 20 2d 31 20 2a 20 70 56 61 6c 2d 3e 75  i = -1 * pVal->u
7760: 2e 69 3b 0a 20 20 20 20 20 20 2f 2a 20 28 64 6f  .i;.      /* (do
7770: 75 62 6c 65 29 2d 31 20 49 6e 20 63 61 73 65 20  uble)-1 In case 
7780: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  of SQLITE_OMIT_F
7790: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e  LOATING_POINT...
77a0: 20 2a 2f 0a 20 20 20 20 20 20 70 56 61 6c 2d 3e   */.      pVal->
77b0: 72 20 3d 20 28 64 6f 75 62 6c 65 29 2d 31 20 2a  r = (double)-1 *
77c0: 20 70 56 61 6c 2d 3e 72 3b 0a 20 20 20 20 7d 0a   pVal->r;.    }.
77d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
77e0: 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
77f0: 45 52 41 4c 0a 20 20 65 6c 73 65 20 69 66 28 20  ERAL.  else if( 
7800: 6f 70 3d 3d 54 4b 5f 42 4c 4f 42 20 29 7b 0a 20  op==TK_BLOB ){. 
7810: 20 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 20 20 20     int nVal;.   
7820: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7830: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27  u.zToken[0]=='x'
7840: 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   || pExpr->u.zTo
7850: 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20  ken[0]=='X' );. 
7860: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
7870: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27  ->u.zToken[1]=='
7880: 5c 27 27 20 29 3b 0a 20 20 20 20 70 56 61 6c 20  \'' );.    pVal 
7890: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
78a0: 77 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 21  w(db);.    if( !
78b0: 70 56 61 6c 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  pVal ) goto no_m
78c0: 65 6d 3b 0a 20 20 20 20 7a 56 61 6c 20 3d 20 26  em;.    zVal = &
78d0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
78e0: 32 5d 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 73  2];.    nVal = s
78f0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7900: 56 61 6c 29 2d 31 3b 0a 20 20 20 20 61 73 73 65  Val)-1;.    asse
7910: 72 74 28 20 7a 56 61 6c 5b 6e 56 61 6c 5d 3d 3d  rt( zVal[nVal]==
7920: 27 5c 27 27 20 29 3b 0a 20 20 20 20 73 71 6c 69  '\'' );.    sqli
7930: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
7940: 28 70 56 61 6c 2c 20 73 71 6c 69 74 65 33 48 65  (pVal, sqlite3He
7950: 78 54 6f 42 6c 6f 62 28 64 62 2c 20 7a 56 61 6c  xToBlob(db, zVal
7960: 2c 20 6e 56 61 6c 29 2c 20 6e 56 61 6c 2f 32 2c  , nVal), nVal/2,
7970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7980: 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 51 4c            0, SQL
7990: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
79a0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 70 56  }.#endif..  *ppV
79b0: 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 72 65 74  al = pVal;.  ret
79c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
79d0: 6e 6f 5f 6d 65 6d 3a 0a 20 20 64 62 2d 3e 6d 61  no_mem:.  db->ma
79e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
79f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7a00: 64 62 2c 20 7a 56 61 6c 29 3b 0a 20 20 73 71 6c  db, zVal);.  sql
7a10: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
7a20: 61 6c 29 3b 0a 20 20 2a 70 70 56 61 6c 20 3d 20  al);.  *ppVal = 
7a30: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
7a40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 7d 0a 0a 2f 2a 0a  TE_NOMEM;.}../*.
7a50: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 74  ** Change the st
7a60: 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 61 6e  ring value of an
7a70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
7a80: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
7a90: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
7aa0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  (.  sqlite3_valu
7ab0: 65 20 2a 76 2c 20 20 20 20 20 2f 2a 20 56 61 6c  e *v,     /* Val
7ac0: 75 65 20 74 6f 20 62 65 20 73 65 74 20 2a 2f 0a  ue to be set */.
7ad0: 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
7af0: 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 20 2a 2f  h of string z */
7b00: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
7b10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74  ,        /* Text
7b20: 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 72 69   of the new stri
7b30: 6e 67 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20  ng */.  u8 enc, 
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b50: 20 45 6e 63 6f 64 69 6e 67 20 74 6f 20 75 73 65   Encoding to use
7b60: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
7b70: 6c 29 28 76 6f 69 64 2a 29 20 20 20 2f 2a 20 44  l)(void*)   /* D
7b80: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
7b90: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  e string */.){. 
7ba0: 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33   if( v ) sqlite3
7bb0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 28 4d  VdbeMemSetStr((M
7bc0: 65 6d 20 2a 29 76 2c 20 7a 2c 20 6e 2c 20 65 6e  em *)v, z, n, en
7bd0: 63 2c 20 78 44 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  c, xDel);.}../*.
7be0: 2a 2a 20 46 72 65 65 20 61 6e 20 73 71 6c 69 74  ** Free an sqlit
7bf0: 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 0a  e3_value object.
7c00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7c10: 61 6c 75 65 46 72 65 65 28 73 71 6c 69 74 65 33  alueFree(sqlite3
7c20: 5f 76 61 6c 75 65 20 2a 76 29 7b 0a 20 20 69 66  _value *v){.  if
7c30: 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
7c40: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7c50: 65 6c 65 61 73 65 28 28 4d 65 6d 20 2a 29 76 29  elease((Mem *)v)
7c60: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
7c70: 65 28 28 28 4d 65 6d 2a 29 76 29 2d 3e 64 62 2c  e(((Mem*)v)->db,
7c80: 20 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   v);.}../*.** Re
7c90: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7ca0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
7cb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
7cc0: 6a 65 63 74 20 61 73 73 75 6d 69 6e 67 0a 2a 2a  ject assuming.**
7cd0: 20 74 68 61 74 20 69 74 20 75 73 65 73 20 74 68   that it uses th
7ce0: 65 20 65 6e 63 6f 64 69 6e 67 20 22 65 6e 63 22  e encoding "enc"
7cf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
7d00: 61 6c 75 65 42 79 74 65 73 28 73 71 6c 69 74 65  alueBytes(sqlite
7d10: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 75  3_value *pVal, u
7d20: 38 20 65 6e 63 29 7b 0a 20 20 4d 65 6d 20 2a 70  8 enc){.  Mem *p
7d30: 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20   = (Mem*)pVal;. 
7d40: 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
7d50: 20 4d 45 4d 5f 42 6c 6f 62 29 21 3d 30 20 7c 7c   MEM_Blob)!=0 ||
7d60: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
7d70: 74 28 70 56 61 6c 2c 20 65 6e 63 29 20 29 7b 0a  t(pVal, enc) ){.
7d80: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
7d90: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
7da0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e       return p->n
7db0: 20 2b 20 70 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20   + p->u.nZero;. 
7dc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7dd0: 72 65 74 75 72 6e 20 70 2d 3e 6e 3b 0a 20 20 20  return p->n;.   
7de0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7df0: 30 3b 0a 7d 0a                                   0;.}.