15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2004 May 26
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains code use to manipulate "Mem" structure.  A "Mem"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stores a single value in the VDBE.  Mem is an opaque structure visible
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only within the VDBE.  Interface routines refer to a Mem using the
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** name sqlite_value
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vdbeInt.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P if required.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define expandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pMem is an object with a valid string representation, this routine
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ensures the internal encoding for the string representation is
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pMem is not a string object, or the encoding of the string
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** representation is already stored using the requested encoding, then this
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine is a no-op.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_OK is returned if the conversion is successful (or not required).
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_NOMEM may be returned if a malloc() fails during conversion
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** between formats.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags&MEM_RowSet)==0 );
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           || desiredEnc==SQLITE_UTF16BE );
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_OK;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_UTF16
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_ERROR;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** then the encoding of the value may not have changed.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(rc==SQLITE_OK    || rc==SQLITE_NOMEM);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(rc==SQLITE_OK    || pMem->enc!=desiredEnc);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make sure pMem->z points to a writable allocation of at least
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** n bytes.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the memory cell currently contains string or blob data
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and the third argument passed to this function is true, the
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** current content of the cell is preserved. Otherwise, it may
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be discarded.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function sets the MEM_Dyn flag and clears any xDel callback.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It also clears MEM_Ephem and MEM_Static. If the preserve flag is
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not set, Mem.n is zeroed.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( 1 >=
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((pMem->zMalloc && pMem->zMalloc==pMem->z) ? 1 : 0) +
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (((pMem->flags&MEM_Dyn)&&pMem->xDel) ? 1 : 0) +
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((pMem->flags&MEM_Ephem) ? 1 : 0) +
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((pMem->flags&MEM_Static) ? 1 : 0)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags&MEM_RowSet)==0 );
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n<32 ) n = 32;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)<n ){
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( preserve && pMem->z==pMem->zMalloc ){
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preserve = 0;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(pMem->db, pMem->zMalloc);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->z && preserve && pMem->zMalloc && pMem->z!=pMem->zMalloc ){
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(pMem->zMalloc, pMem->z, pMem->n);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->flags&MEM_Dyn && pMem->xDel ){
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->xDel((void *)(pMem->z));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->z = pMem->zMalloc;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->z==0 ){
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags = MEM_Null;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags &= ~(MEM_Ephem|MEM_Static);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->xDel = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (pMem->z ? SQLITE_OK : SQLITE_NOMEM);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make the given Mem object MEM_Dyn.  In other words, make it so
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that any TEXT or BLOB content is stored in memory obtained from
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** malloc().  In this way, we know that the memory is safe to be
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** overwritten or altered.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemMakeWriteable(Mem *pMem){
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags&MEM_RowSet)==0 );
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expandBlob(pMem);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  f = pMem->flags;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (f&(MEM_Str|MEM_Blob)) && pMem->z!=pMem->zMalloc ){
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_NOMEM;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->z[pMem->n] = 0;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->z[pMem->n+1] = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags |= MEM_Term;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->pScopyFrom = 0;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the given Mem* has a zero-filled tail, turn it into an ordinary
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** blob stored in dynamically allocated space.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_INCRBLOB
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemExpandBlob(Mem *pMem){
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->flags & MEM_Zero ){
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nByte;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->flags&MEM_Blob );
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (pMem->flags&MEM_RowSet)==0 );
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Set nByte to the number of bytes required to store the expanded blob. */
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nByte = pMem->n + pMem->u.nZero;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( nByte<=0 ){
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nByte = 1;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_NOMEM;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->n += pMem->u.nZero;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags &= ~(MEM_Zero|MEM_Term);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make sure the given Mem is \u0000 terminated.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemNulTerminate(Mem *pMem){
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pMem->flags & MEM_Term)!=0 || (pMem->flags & MEM_Str)==0 ){
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_OK;   /* Nothing to do */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_NOMEM;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->z[pMem->n] = 0;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->z[pMem->n+1] = 0;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->flags |= MEM_Term;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add MEM_Str to the set of representations for the given Mem.  Numbers
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are converted using sqlite3_snprintf().  Converting a BLOB to a string
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a no-op.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Existing representations MEM_Int and MEM_Real are *not* invalidated.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A MEM_Null value will never be passed to this function. This function is
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used for converting values to text for returning to the user (i.e. via
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_value_text()), or for ensuring that values to be used as btree
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** keys are strings. In the former case a NULL pointer is returned the
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** user and the later is an internal programming error.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemStringify(Mem *pMem, int enc){
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fg = pMem->flags;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int nByte = 32;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !(fg&MEM_Zero) );
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !(fg&(MEM_Str|MEM_Blob)) );
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( fg&(MEM_Int|MEM_Real) );
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags&MEM_RowSet)==0 );
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_NOMEM;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* For a Real or Integer, use sqlite3_mprintf() to produce the UTF-8
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** string representation of the value. Then, if the required encoding
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is UTF-16le or UTF-16be do a translation.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** FIX ME: It would be better if sqlite3_snprintf() could do UTF-16.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( fg & MEM_Int ){
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( fg & MEM_Real );
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->n = sqlite3Strlen30(pMem->z);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->enc = SQLITE_UTF8;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->flags |= MEM_Str|MEM_Term;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeEncoding(pMem, enc);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Memory cell pMem contains the context of an aggregate function.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine calls the finalize method for that function.  The
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result of the aggregate is stored back into pMem.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return SQLITE_ERROR if the finalizer reports an error.  SQLITE_OK
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** otherwise.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pFunc && pFunc->xFinalize) ){
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_context ctx;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(&ctx, 0, sizeof(ctx));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.s.flags = MEM_Null;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.s.db = pMem->db;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pMem = pMem;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pFunc = pFunc;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( 0==(pMem->flags&MEM_Dyn) && !pMem->xDel );
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(pMem->db, pMem->zMalloc);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(pMem, &ctx.s, sizeof(ctx.s));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = ctx.isError;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the memory cell contains a string value that must be freed by
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invoking an external callback, free it now. Calling this function
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** does not free any Mem.zMalloc buffer.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemReleaseExternal(Mem *p){
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) );
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( p->flags & MEM_Agg );
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( p->flags & MEM_Dyn );
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( p->flags & MEM_RowSet );
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( p->flags & MEM_Frame );
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame) ){
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->flags&MEM_Agg ){
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemFinalize(p, p->u.pDef);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (p->flags & MEM_Agg)==0 );
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemRelease(p);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( p->flags&MEM_Dyn && p->xDel ){
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (p->flags&MEM_RowSet)==0 );
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->xDel((void *)p->z);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->xDel = 0;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( p->flags&MEM_RowSet ){
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3RowSetClear(p->u.pRowSet);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( p->flags&MEM_Frame ){
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemSetNull(p);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Release any memory held by the Mem. This may leave the Mem in an
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** inconsistent state, for example with (Mem.z==0) and
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (Mem.type==SQLITE_TEXT).
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemRelease(Mem *p){
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemReleaseExternal(p);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(p->db, p->zMalloc);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->z = 0;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->zMalloc = 0;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->xDel = 0;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert a 64-bit IEEE double into a 64-bit signed integer.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the double is too large, return 0x8000000000000000.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Most systems appear to do this simply by assigning
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variables and without the extra range tests.  But
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** there are reports that windows throws an expection
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the floating point value is out of range. (See ticket #2880.)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Because we do not completely understand the problem, we will
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** take the conservative approach and always do range tests
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** before attempting the conversion.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static i64 doubleToInt64(double r){
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* When floating-point is omitted, double and int64 are the same thing */
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return r;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Many compilers we encounter do not define constants for the
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** minimum and maximum 64-bit integers, or they define them
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** inconsistently.  And many do not understand the "LL" notation.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** So we define our own static constants here using nothing
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** larger than a 32-bit integer constant.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const i64 maxInt = LARGEST_INT64;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const i64 minInt = SMALLEST_INT64;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( r<(double)minInt ){
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return minInt;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( r>(double)maxInt ){
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* minInt is correct here - not maxInt.  It turns out that assigning
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a very large positive number to an integer results in a very large
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** negative integer.  This makes no sense, but it is what x86 hardware
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** does so for compatibility we will do the same in software. */
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return minInt;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (i64)r;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return some kind of integer value which is the best we can do
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** at representing the value that *pMem describes as an integer.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pMem is an integer, then the value is exact.  If pMem is
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a floating-point then the value returned is the integer part.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pMem is a string or blob, then we make an attempt to convert
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it into a integer and return that.  If pMem represents an
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an SQL-NULL value, return 0.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pMem represents a string value, its encoding might be changed.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i64 sqlite3VdbeIntValue(Mem *pMem){
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags = pMem->flags;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( flags & MEM_Int ){
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pMem->u.i;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( flags & MEM_Real ){
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return doubleToInt64(pMem->r);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( flags & (MEM_Str|MEM_Blob) ){
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i64 value = 0;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->z || pMem->n==0 );
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( pMem->z==0 );
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return value;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the best representation of pMem that we can get into a
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** double.  If pMem is already a double or an integer, return its
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value.  If it is a string or blob, try to convert it to a double.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If it is a NULL, return 0.0.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double sqlite3VdbeRealValue(Mem *pMem){
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->flags & MEM_Real ){
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pMem->r;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pMem->flags & MEM_Int ){
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (double)pMem->u.i;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pMem->flags & (MEM_Str|MEM_Blob) ){
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double val = (double)0;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return val;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (double)0;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The MEM structure is already a MEM_Real.  Try to also make it a
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** MEM_Int if we can.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeIntegerAffinity(Mem *pMem){
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->flags & MEM_Real );
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & MEM_RowSet)==0 );
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->u.i = doubleToInt64(pMem->r);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Only mark the value as an integer if
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **    (1) the round-trip conversion real->int->real is a no-op, and
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **    (2) The integer is neither the largest nor the smallest
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **        possible integer (ticket #3922)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The second and third terms in the following conditional enforces
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the second condition under the assumption that addition overflow causes
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** values to wrap around.  On x86 hardware, the third term is always
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** true and could be omitted.  But we leave it in because other
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** architectures might behave differently.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->r==(double)pMem->u.i && pMem->u.i>SMALLEST_INT64
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      && ALWAYS(pMem->u.i<LARGEST_INT64) ){
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags |= MEM_Int;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert pMem to type integer.  Invalidate any prior representations.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemIntegerify(Mem *pMem){
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & MEM_RowSet)==0 );
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->u.i = sqlite3VdbeIntValue(pMem);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pMem, MEM_Int);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert pMem so that it is of type MEM_Real.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invalidate any prior representations.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemRealify(Mem *pMem){
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( EIGHT_BYTE_ALIGNMENT(pMem) );
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->r = sqlite3VdbeRealValue(pMem);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pMem, MEM_Real);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert pMem so that it has types MEM_Real or MEM_Int or both.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invalidate any prior representations.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Every effort is made to force the conversion, even if the input
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a string that does not look completely like a number.  Convert
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as much of the string as we can and ignore the rest.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemNumerify(Mem *pMem){
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))==0 ){
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 );
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( 0==sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc) ){
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MemSetTypeFlag(pMem, MEM_Int);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->r = sqlite3VdbeRealValue(pMem);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MemSetTypeFlag(pMem, MEM_Real);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeIntegerAffinity(pMem);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 );
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->flags &= ~(MEM_Str|MEM_Blob);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete any previous value and set the value stored in *pMem to NULL.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetNull(Mem *pMem){
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->flags & MEM_Frame ){
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VdbeFrame *pFrame = pMem->u.pFrame;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->pParent = pFrame->v->pDelFrame;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->v->pDelFrame = pFrame;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->flags & MEM_RowSet ){
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3RowSetClear(pMem->u.pRowSet);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pMem, MEM_Null);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->type = SQLITE_NULL;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete any previous value and set the value to be a BLOB of length
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** n containing all zeros.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease(pMem);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->flags = MEM_Blob|MEM_Zero;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->type = SQLITE_BLOB;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->n = 0;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n<0 ) n = 0;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->u.nZero = n;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->enc = SQLITE_UTF8;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_INCRBLOB
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemGrow(pMem, n, 0);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->z ){
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->n = n;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(pMem->z, 0, n);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete any previous value and set the value stored in *pMem to val,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** manifest type INTEGER.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease(pMem);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->u.i = val;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->flags = MEM_Int;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->type = SQLITE_INTEGER;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete any previous value and set the value stored in *pMem to val,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** manifest type REAL.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetDouble(Mem *pMem, double val){
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3IsNaN(val) ){
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pMem);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(pMem);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->r = val;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags = MEM_Real;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_FLOAT;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete any previous value and set the value of pMem to be an
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** empty boolean index.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetRowSet(Mem *pMem){
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pMem->db;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & MEM_RowSet)==0 );
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease(pMem);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->zMalloc = sqlite3DbMallocRaw(db, 64);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags = MEM_Null;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->zMalloc );
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       sqlite3DbMallocSize(db, pMem->zMalloc));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem->u.pRowSet!=0 );
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags = MEM_RowSet;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if the Mem object contains a TEXT or BLOB that is
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** too large - whose size exceeds SQLITE_MAX_LENGTH.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemTooBig(Mem *p){
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->db!=0 );
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->flags & (MEM_Str|MEM_Blob) ){
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int n = p->n;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->flags & MEM_Zero ){
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      n += p->u.nZero;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return n>p->db->aLimit[SQLITE_LIMIT_LENGTH];
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine prepares a memory cell for modication by breaking
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** its link to a shallow copy and by marking any current shallow
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** copies of this cell as invalid.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is used for testing and debugging only - to make sure shallow
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** copies are not misused.
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemPrepareToChange(Vdbe *pVdbe, Mem *pMem){
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pX;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pX->pScopyFrom==pMem ){
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pX->flags |= MEM_Invalid;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pX->pScopyFrom = 0;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->pScopyFrom = 0;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_DEBUG */
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Size of struct Mem not including the Mem.zMalloc member.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEMCELLSIZE (size_t)(&(((Mem *)0)->zMalloc))
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make an shallow copy of pFrom into pTo.  Prior contents of
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pTo are freed.  The pFrom->z field is not duplicated.  If
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pFrom->z is used, then pTo->z points to the same thing as pFrom->z
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and flags gets srcType (either MEM_Ephem or MEM_Static).
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pFrom->flags & MEM_RowSet)==0 );
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemReleaseExternal(pTo);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(pTo, pFrom, MEMCELLSIZE);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTo->xDel = 0;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pFrom->flags&MEM_Static)==0 ){
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( srcType==MEM_Ephem || srcType==MEM_Static );
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTo->flags |= srcType;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make a full copy of pFrom into pTo.  Prior contents of pTo are
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** freed before the copy is made.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pFrom->flags & MEM_RowSet)==0 );
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemReleaseExternal(pTo);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(pTo, pFrom, MEMCELLSIZE);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTo->flags &= ~MEM_Dyn;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTo->flags&(MEM_Str|MEM_Blob) ){
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( 0==(pFrom->flags&MEM_Static) ){
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTo->flags |= MEM_Ephem;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3VdbeMemMakeWriteable(pTo);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Transfer the contents of pFrom to pTo. Any existing value in pTo is
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** freed. If pFrom contains ephemeral data, a copy is made.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pFrom contains an SQL NULL when this routine returns.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pFrom->db==0 || sqlite3_mutex_held(pFrom->db->mutex) );
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTo->db==0 || sqlite3_mutex_held(pTo->db->mutex) );
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pFrom->db==0 || pTo->db==0 || pFrom->db==pTo->db );
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease(pTo);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(pTo, pFrom, sizeof(Mem));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrom->flags = MEM_Null;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrom->xDel = 0;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrom->zMalloc = 0;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Change the value of a Mem to be a string or a BLOB.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The memory management strategy depends on the value of the xDel
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter. If the value passed is SQLITE_TRANSIENT, then the
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string is copied into a (possibly existing) buffer managed by the
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Mem structure. Otherwise, any existing buffer is freed and the
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointer copied.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** size limit) then no memory allocation occurs.  If the string can be
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stored without allocating memory, then it is.  If a memory allocation
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is required to store the string, then value of pMem is unchanged.  In
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** either case, SQLITE_TOOBIG is returned.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemSetStr(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem,          /* Memory cell to set to string value */
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z,      /* String pointer */
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,              /* Bytes in string, or negative */
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc,             /* Encoding of z.  0 for BLOBs */
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*) /* Destructor function */
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte = n;      /* New value for pMem->n */
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iLimit;         /* Maximum allowed string or blob size */
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 flags = 0;      /* New value for pMem->flags */
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & MEM_RowSet)==0 );
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If z is a NULL pointer, set pMem to contain an SQL NULL. */
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !z ){
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pMem);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_OK;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->db ){
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH];
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iLimit = SQLITE_MAX_LENGTH;
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags = (enc==0?MEM_Blob:MEM_Str);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nByte<0 ){
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( enc!=0 );
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( enc==SQLITE_UTF8 ){
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(nByte=0; nByte<=iLimit && z[nByte]; nByte++){}
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){}
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= MEM_Term;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The following block sets the new values of Mem.z and Mem.xDel. It
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** also sets a flag in local variable "flags" to indicate the memory
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** management (one of MEM_Dyn or MEM_Static).
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( xDel==SQLITE_TRANSIENT ){
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nAlloc = nByte;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( flags&MEM_Term ){
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nAlloc += (enc==SQLITE_UTF8?1:2);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( nByte>iLimit ){
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_TOOBIG;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3VdbeMemGrow(pMem, nAlloc, 0) ){
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SQLITE_NOMEM;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(pMem->z, z, nAlloc);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( xDel==SQLITE_DYNAMIC ){
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(pMem);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->zMalloc = pMem->z = (char *)z;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->xDel = 0;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(pMem);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->z = (char *)z;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->xDel = xDel;
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->n = nByte;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->flags = flags;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->enc = (enc==0 ? SQLITE_UTF8 : enc);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->type = (enc==0 ? SQLITE_BLOB : SQLITE_TEXT);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_NOMEM;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nByte>iLimit ){
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_TOOBIG;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare the values contained by the two memory cells, returning
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** negative, zero or positive if pMem1 is less than, equal to, or greater
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** than pMem2. Sorting order is NULL's first, followed by numbers (integers
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and reals) sorted numerically, followed by text ordered by the collating
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence pColl and finally blob's ordered by memcmp().
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Two NULL values are considered equal by this function.
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f1, f2;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int combined_flags;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  f1 = pMem1->flags;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  f2 = pMem2->flags;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  combined_flags = f1|f2;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (combined_flags & MEM_RowSet)==0 );
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If one value is NULL, it is less than the other. If both values
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** are NULL, return 0.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( combined_flags&MEM_Null ){
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (f2&MEM_Null) - (f1&MEM_Null);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If one value is a number and the other is not, the number is less.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If both are numbers, compare as reals if one is a real, or as integers
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** if both values are integers.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( combined_flags&(MEM_Int|MEM_Real) ){
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !(f1&(MEM_Int|MEM_Real)) ){
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !(f2&(MEM_Int|MEM_Real)) ){
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (f1 & f2 & MEM_Int)==0 ){
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double r1, r2;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (f1&MEM_Real)==0 ){
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r1 = (double)pMem1->u.i;
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r1 = pMem1->r;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (f2&MEM_Real)==0 ){
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r2 = (double)pMem2->u.i;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        r2 = pMem2->r;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( r1<r2 ) return -1;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( r1>r2 ) return 1;
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( f1&MEM_Int );
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( f2&MEM_Int );
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pMem1->u.i < pMem2->u.i ) return -1;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pMem1->u.i > pMem2->u.i ) return 1;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If one value is a string and the other is a blob, the string is less.
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If both are strings, compare using the collating functions.
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( combined_flags&MEM_Str ){
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (f1 & MEM_Str)==0 ){
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (f2 & MEM_Str)==0 ){
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem1->enc==pMem2->enc );
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pMem1->enc==SQLITE_UTF8 ||
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE );
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The collation sequence must be defined at this point, even if
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the user deletes the collation sequence after the vdbe program is
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** compiled (this was not always the case).
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !pColl || pColl->xCmp );
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pColl ){
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pMem1->enc==pColl->enc ){
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* The strings are already in the correct encoding.  Call the
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** comparison function directly */
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z);
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const void *v1, *v2;
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int n1, n2;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Mem c1;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Mem c2;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memset(&c1, 0, sizeof(c1));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memset(&c2, 0, sizeof(c2));
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        n1 = v1==0 ? 0 : c1.n;
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        n2 = v2==0 ? 0 : c2.n;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeMemRelease(&c1);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeMemRelease(&c2);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return rc;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If a NULL pointer was passed as the collate function, fall through
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to the blob case and use memcmp().  */
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Both values must be blobs.  Compare using memcmp().  */
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = memcmp(pMem1->z, pMem2->z, (pMem1->n>pMem2->n)?pMem2->n:pMem1->n);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==0 ){
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = pMem1->n - pMem2->n;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Move data out of a btree key or data field and into a Mem structure.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The data or key is taken from the entry that pCur is currently pointing
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to.  offset and amt determine what portion of the data or key to retrieve.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** key is true to get the key or false to get data.  The result is written
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into the pMem element.
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The pMem structure is assumed to be uninitialized.  Any prior content
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is overwritten without being freed.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If this routine fails for any reason (malloc returns NULL or unable
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to read from the disk) then the pMem is left in an inconsistent state.
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemFromBtree(
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCur,   /* Cursor pointing at record to retrieve. */
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int offset,       /* Offset from the start of data to return bytes from. */
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int amt,          /* Number of bytes to return. */
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int key,          /* If true, retrieve from the btree key, not data. */
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem         /* OUT: Return data in this Mem structure. */
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zData;        /* Data from the btree layer */
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int available = 0;  /* Number of bytes available on the local btree page */
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK; /* Return code */
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3BtreeCursorIsValid(pCur) );
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert()
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** that both the BtShared and database handle mutexes are held. */
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & MEM_RowSet)==0 );
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( key ){
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zData = (char *)sqlite3BtreeKeyFetch(pCur, &available);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zData = (char *)sqlite3BtreeDataFetch(pCur, &available);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zData!=0 );
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( offset+amt<=available && (pMem->flags&MEM_Dyn)==0 ){
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(pMem);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->z = &zData[offset];
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags = MEM_Blob|MEM_Ephem;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( SQLITE_OK==(rc = sqlite3VdbeMemGrow(pMem, amt+2, 0)) ){
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->flags = MEM_Blob|MEM_Dyn|MEM_Term;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->enc = 0;
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_BLOB;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( key ){
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeData(pCur, offset, amt, pMem->z);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->z[amt] = 0;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->z[amt+1] = 0;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc!=SQLITE_OK ){
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemRelease(pMem);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->n = amt;
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function is only available internally, it is not part of the
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** external API. It works in a similar way to sqlite3_value_text(),
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** except the data returned is in the encoding specified by the second
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_UTF8.
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2006-02-16:)  The enc value can be or-ed with SQLITE_UTF16_ALIGNED.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If that is the case, then the result must be aligned on an even byte
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** boundary.
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pVal ) return 0;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) );
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pVal->flags & MEM_RowSet)==0 );
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVal->flags&MEM_Null ){
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (MEM_Blob>>3) == MEM_Str );
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVal->flags |= (pVal->flags & MEM_Blob)>>3;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expandBlob(pVal);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVal->flags&MEM_Str ){
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 );
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return 0;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-59893-45467 */
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (pVal->flags&MEM_Blob)==0 );
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemStringify(pVal, enc);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) );
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              || pVal->db->mallocFailed );
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return pVal->z;
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Create a new sqlite3_value object.
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3_value *sqlite3ValueNew(sqlite3 *db){
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *p = sqlite3DbMallocZero(db, sizeof(*p));
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p ){
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->flags = MEM_Null;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->type = SQLITE_NULL;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->db = db;
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Create a new sqlite3_value object, containing the value of pExpr.
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This only works for very simple expressions that consist of one constant
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** token (i.e. "5", "5.1", "'a string'"). If the expression can
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be converted directly into a value, then the value is allocated and
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a pointer written to *ppVal. The caller is responsible for deallocating
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the value by passing it to sqlite3ValueFree() later on. If the expression
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cannot be converted to a value, then *ppVal is set to NULL.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ValueFromExpr(
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,              /* The database connection */
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pExpr,              /* The expression to evaluate */
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc,                   /* Encoding to use */
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 affinity,              /* Affinity to use */
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **ppVal     /* Write the new value here */
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zVal = 0;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value *pVal = 0;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int negInt = 1;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zNeg = "";
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pExpr ){
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ppVal = 0;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_OK;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  op = pExpr->op;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT2.
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The ifdef here is to enable us to achieve 100% branch test coverage even
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** when SQLITE_ENABLE_STAT2 is omitted.
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_STAT2
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_REGISTER ) op = pExpr->op2;
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Handle negative integers in a single step.  This is needed in the
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** case when the value is -9223372036854775808.
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_UMINUS
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pExpr = pExpr->pLeft;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    op = pExpr->op;
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    negInt = -1;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zNeg = "-";
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVal = sqlite3ValueNew(db);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pVal==0 ) goto no_mem;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( ExprHasProperty(pExpr, EP_IntValue) ){
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt);
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( zVal==0 ) goto no_mem;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( op==TK_FLOAT ) pVal->type = SQLITE_FLOAT;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( enc!=SQLITE_UTF8 ){
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeChangeEncoding(pVal, enc);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( op==TK_UMINUS ) {
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This branch happens for multiple negative signs.  Ex: -(-5) */
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) ){
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemNumerify(pVal);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pVal->u.i==SMALLEST_INT64 ){
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pVal->flags &= MEM_Int;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pVal->flags |= MEM_Real;
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pVal->r = (double)LARGEST_INT64;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pVal->u.i = -pVal->u.i;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pVal->r = -pVal->r;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ValueApplyAffinity(pVal, affinity, enc);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( op==TK_NULL ){
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVal = sqlite3ValueNew(db);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pVal==0 ) goto no_mem;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BLOB_LITERAL
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if( op==TK_BLOB ){
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nVal;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pExpr->u.zToken[1]=='\'' );
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVal = sqlite3ValueNew(db);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pVal ) goto no_mem;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zVal = &pExpr->u.zToken[2];
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nVal = sqlite3Strlen30(zVal)-1;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( zVal[nVal]=='\'' );
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2,
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         0, SQLITE_DYNAMIC);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVal ){
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemStoreType(pVal);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ppVal = pVal;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)no_mem:
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->mallocFailed = 1;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zVal);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ValueFree(pVal);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ppVal = 0;
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_NOMEM;
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Change the string value of an sqlite3_value object
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ValueSetStr(
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value *v,     /* Value to be set */
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n,                /* Length of string z */
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void *z,        /* Text of the new string */
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc,               /* Encoding to use */
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void*)   /* Destructor for the string */
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v ) sqlite3VdbeMemSetStr((Mem *)v, z, n, enc, xDel);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Free an sqlite3_value object
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ValueFree(sqlite3_value *v){
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !v ) return;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease((Mem *)v);
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(((Mem*)v)->db, v);
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes in the sqlite3_value object assuming
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that it uses the encoding "enc"
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *p = (Mem*)pVal;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->flags & MEM_Zero ){
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return p->n + p->u.nZero;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return p->n;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1160