Annotation of embedaddon/sqlite3/src/vdbemem.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2004 May 26
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             7: **    May you do good and not evil.
        !             8: **    May you find forgiveness for yourself and forgive others.
        !             9: **    May you share freely, never taking more than you give.
        !            10: **
        !            11: *************************************************************************
        !            12: **
        !            13: ** This file contains code use to manipulate "Mem" structure.  A "Mem"
        !            14: ** stores a single value in the VDBE.  Mem is an opaque structure visible
        !            15: ** only within the VDBE.  Interface routines refer to a Mem using the
        !            16: ** name sqlite_value
        !            17: */
        !            18: #include "sqliteInt.h"
        !            19: #include "vdbeInt.h"
        !            20: 
        !            21: /*
        !            22: ** If pMem is an object with a valid string representation, this routine
        !            23: ** ensures the internal encoding for the string representation is
        !            24: ** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE.
        !            25: **
        !            26: ** If pMem is not a string object, or the encoding of the string
        !            27: ** representation is already stored using the requested encoding, then this
        !            28: ** routine is a no-op.
        !            29: **
        !            30: ** SQLITE_OK is returned if the conversion is successful (or not required).
        !            31: ** SQLITE_NOMEM may be returned if a malloc() fails during conversion
        !            32: ** between formats.
        !            33: */
        !            34: int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
        !            35:   int rc;
        !            36:   assert( (pMem->flags&MEM_RowSet)==0 );
        !            37:   assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
        !            38:            || desiredEnc==SQLITE_UTF16BE );
        !            39:   if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
        !            40:     return SQLITE_OK;
        !            41:   }
        !            42:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !            43: #ifdef SQLITE_OMIT_UTF16
        !            44:   return SQLITE_ERROR;
        !            45: #else
        !            46: 
        !            47:   /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned,
        !            48:   ** then the encoding of the value may not have changed.
        !            49:   */
        !            50:   rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc);
        !            51:   assert(rc==SQLITE_OK    || rc==SQLITE_NOMEM);
        !            52:   assert(rc==SQLITE_OK    || pMem->enc!=desiredEnc);
        !            53:   assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc);
        !            54:   return rc;
        !            55: #endif
        !            56: }
        !            57: 
        !            58: /*
        !            59: ** Make sure pMem->z points to a writable allocation of at least 
        !            60: ** n bytes.
        !            61: **
        !            62: ** If the memory cell currently contains string or blob data
        !            63: ** and the third argument passed to this function is true, the 
        !            64: ** current content of the cell is preserved. Otherwise, it may
        !            65: ** be discarded.  
        !            66: **
        !            67: ** This function sets the MEM_Dyn flag and clears any xDel callback.
        !            68: ** It also clears MEM_Ephem and MEM_Static. If the preserve flag is 
        !            69: ** not set, Mem.n is zeroed.
        !            70: */
        !            71: int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){
        !            72:   assert( 1 >=
        !            73:     ((pMem->zMalloc && pMem->zMalloc==pMem->z) ? 1 : 0) +
        !            74:     (((pMem->flags&MEM_Dyn)&&pMem->xDel) ? 1 : 0) + 
        !            75:     ((pMem->flags&MEM_Ephem) ? 1 : 0) + 
        !            76:     ((pMem->flags&MEM_Static) ? 1 : 0)
        !            77:   );
        !            78:   assert( (pMem->flags&MEM_RowSet)==0 );
        !            79: 
        !            80:   if( n<32 ) n = 32;
        !            81:   if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)<n ){
        !            82:     if( preserve && pMem->z==pMem->zMalloc ){
        !            83:       pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n);
        !            84:       preserve = 0;
        !            85:     }else{
        !            86:       sqlite3DbFree(pMem->db, pMem->zMalloc);
        !            87:       pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n);
        !            88:     }
        !            89:   }
        !            90: 
        !            91:   if( pMem->z && preserve && pMem->zMalloc && pMem->z!=pMem->zMalloc ){
        !            92:     memcpy(pMem->zMalloc, pMem->z, pMem->n);
        !            93:   }
        !            94:   if( pMem->flags&MEM_Dyn && pMem->xDel ){
        !            95:     pMem->xDel((void *)(pMem->z));
        !            96:   }
        !            97: 
        !            98:   pMem->z = pMem->zMalloc;
        !            99:   if( pMem->z==0 ){
        !           100:     pMem->flags = MEM_Null;
        !           101:   }else{
        !           102:     pMem->flags &= ~(MEM_Ephem|MEM_Static);
        !           103:   }
        !           104:   pMem->xDel = 0;
        !           105:   return (pMem->z ? SQLITE_OK : SQLITE_NOMEM);
        !           106: }
        !           107: 
        !           108: /*
        !           109: ** Make the given Mem object MEM_Dyn.  In other words, make it so
        !           110: ** that any TEXT or BLOB content is stored in memory obtained from
        !           111: ** malloc().  In this way, we know that the memory is safe to be
        !           112: ** overwritten or altered.
        !           113: **
        !           114: ** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
        !           115: */
        !           116: int sqlite3VdbeMemMakeWriteable(Mem *pMem){
        !           117:   int f;
        !           118:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           119:   assert( (pMem->flags&MEM_RowSet)==0 );
        !           120:   ExpandBlob(pMem);
        !           121:   f = pMem->flags;
        !           122:   if( (f&(MEM_Str|MEM_Blob)) && pMem->z!=pMem->zMalloc ){
        !           123:     if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){
        !           124:       return SQLITE_NOMEM;
        !           125:     }
        !           126:     pMem->z[pMem->n] = 0;
        !           127:     pMem->z[pMem->n+1] = 0;
        !           128:     pMem->flags |= MEM_Term;
        !           129: #ifdef SQLITE_DEBUG
        !           130:     pMem->pScopyFrom = 0;
        !           131: #endif
        !           132:   }
        !           133: 
        !           134:   return SQLITE_OK;
        !           135: }
        !           136: 
        !           137: /*
        !           138: ** If the given Mem* has a zero-filled tail, turn it into an ordinary
        !           139: ** blob stored in dynamically allocated space.
        !           140: */
        !           141: #ifndef SQLITE_OMIT_INCRBLOB
        !           142: int sqlite3VdbeMemExpandBlob(Mem *pMem){
        !           143:   if( pMem->flags & MEM_Zero ){
        !           144:     int nByte;
        !           145:     assert( pMem->flags&MEM_Blob );
        !           146:     assert( (pMem->flags&MEM_RowSet)==0 );
        !           147:     assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           148: 
        !           149:     /* Set nByte to the number of bytes required to store the expanded blob. */
        !           150:     nByte = pMem->n + pMem->u.nZero;
        !           151:     if( nByte<=0 ){
        !           152:       nByte = 1;
        !           153:     }
        !           154:     if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){
        !           155:       return SQLITE_NOMEM;
        !           156:     }
        !           157: 
        !           158:     memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
        !           159:     pMem->n += pMem->u.nZero;
        !           160:     pMem->flags &= ~(MEM_Zero|MEM_Term);
        !           161:   }
        !           162:   return SQLITE_OK;
        !           163: }
        !           164: #endif
        !           165: 
        !           166: 
        !           167: /*
        !           168: ** Make sure the given Mem is \u0000 terminated.
        !           169: */
        !           170: int sqlite3VdbeMemNulTerminate(Mem *pMem){
        !           171:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           172:   if( (pMem->flags & MEM_Term)!=0 || (pMem->flags & MEM_Str)==0 ){
        !           173:     return SQLITE_OK;   /* Nothing to do */
        !           174:   }
        !           175:   if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){
        !           176:     return SQLITE_NOMEM;
        !           177:   }
        !           178:   pMem->z[pMem->n] = 0;
        !           179:   pMem->z[pMem->n+1] = 0;
        !           180:   pMem->flags |= MEM_Term;
        !           181:   return SQLITE_OK;
        !           182: }
        !           183: 
        !           184: /*
        !           185: ** Add MEM_Str to the set of representations for the given Mem.  Numbers
        !           186: ** are converted using sqlite3_snprintf().  Converting a BLOB to a string
        !           187: ** is a no-op.
        !           188: **
        !           189: ** Existing representations MEM_Int and MEM_Real are *not* invalidated.
        !           190: **
        !           191: ** A MEM_Null value will never be passed to this function. This function is
        !           192: ** used for converting values to text for returning to the user (i.e. via
        !           193: ** sqlite3_value_text()), or for ensuring that values to be used as btree
        !           194: ** keys are strings. In the former case a NULL pointer is returned the
        !           195: ** user and the later is an internal programming error.
        !           196: */
        !           197: int sqlite3VdbeMemStringify(Mem *pMem, int enc){
        !           198:   int rc = SQLITE_OK;
        !           199:   int fg = pMem->flags;
        !           200:   const int nByte = 32;
        !           201: 
        !           202:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           203:   assert( !(fg&MEM_Zero) );
        !           204:   assert( !(fg&(MEM_Str|MEM_Blob)) );
        !           205:   assert( fg&(MEM_Int|MEM_Real) );
        !           206:   assert( (pMem->flags&MEM_RowSet)==0 );
        !           207:   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
        !           208: 
        !           209: 
        !           210:   if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
        !           211:     return SQLITE_NOMEM;
        !           212:   }
        !           213: 
        !           214:   /* For a Real or Integer, use sqlite3_mprintf() to produce the UTF-8
        !           215:   ** string representation of the value. Then, if the required encoding
        !           216:   ** is UTF-16le or UTF-16be do a translation.
        !           217:   ** 
        !           218:   ** FIX ME: It would be better if sqlite3_snprintf() could do UTF-16.
        !           219:   */
        !           220:   if( fg & MEM_Int ){
        !           221:     sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i);
        !           222:   }else{
        !           223:     assert( fg & MEM_Real );
        !           224:     sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
        !           225:   }
        !           226:   pMem->n = sqlite3Strlen30(pMem->z);
        !           227:   pMem->enc = SQLITE_UTF8;
        !           228:   pMem->flags |= MEM_Str|MEM_Term;
        !           229:   sqlite3VdbeChangeEncoding(pMem, enc);
        !           230:   return rc;
        !           231: }
        !           232: 
        !           233: /*
        !           234: ** Memory cell pMem contains the context of an aggregate function.
        !           235: ** This routine calls the finalize method for that function.  The
        !           236: ** result of the aggregate is stored back into pMem.
        !           237: **
        !           238: ** Return SQLITE_ERROR if the finalizer reports an error.  SQLITE_OK
        !           239: ** otherwise.
        !           240: */
        !           241: int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
        !           242:   int rc = SQLITE_OK;
        !           243:   if( ALWAYS(pFunc && pFunc->xFinalize) ){
        !           244:     sqlite3_context ctx;
        !           245:     assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
        !           246:     assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           247:     memset(&ctx, 0, sizeof(ctx));
        !           248:     ctx.s.flags = MEM_Null;
        !           249:     ctx.s.db = pMem->db;
        !           250:     ctx.pMem = pMem;
        !           251:     ctx.pFunc = pFunc;
        !           252:     pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
        !           253:     assert( 0==(pMem->flags&MEM_Dyn) && !pMem->xDel );
        !           254:     sqlite3DbFree(pMem->db, pMem->zMalloc);
        !           255:     memcpy(pMem, &ctx.s, sizeof(ctx.s));
        !           256:     rc = ctx.isError;
        !           257:   }
        !           258:   return rc;
        !           259: }
        !           260: 
        !           261: /*
        !           262: ** If the memory cell contains a string value that must be freed by
        !           263: ** invoking an external callback, free it now. Calling this function
        !           264: ** does not free any Mem.zMalloc buffer.
        !           265: */
        !           266: void sqlite3VdbeMemReleaseExternal(Mem *p){
        !           267:   assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) );
        !           268:   if( p->flags&MEM_Agg ){
        !           269:     sqlite3VdbeMemFinalize(p, p->u.pDef);
        !           270:     assert( (p->flags & MEM_Agg)==0 );
        !           271:     sqlite3VdbeMemRelease(p);
        !           272:   }else if( p->flags&MEM_Dyn && p->xDel ){
        !           273:     assert( (p->flags&MEM_RowSet)==0 );
        !           274:     p->xDel((void *)p->z);
        !           275:     p->xDel = 0;
        !           276:   }else if( p->flags&MEM_RowSet ){
        !           277:     sqlite3RowSetClear(p->u.pRowSet);
        !           278:   }else if( p->flags&MEM_Frame ){
        !           279:     sqlite3VdbeMemSetNull(p);
        !           280:   }
        !           281: }
        !           282: 
        !           283: /*
        !           284: ** Release any memory held by the Mem. This may leave the Mem in an
        !           285: ** inconsistent state, for example with (Mem.z==0) and
        !           286: ** (Mem.type==SQLITE_TEXT).
        !           287: */
        !           288: void sqlite3VdbeMemRelease(Mem *p){
        !           289:   VdbeMemRelease(p);
        !           290:   sqlite3DbFree(p->db, p->zMalloc);
        !           291:   p->z = 0;
        !           292:   p->zMalloc = 0;
        !           293:   p->xDel = 0;
        !           294: }
        !           295: 
        !           296: /*
        !           297: ** Convert a 64-bit IEEE double into a 64-bit signed integer.
        !           298: ** If the double is too large, return 0x8000000000000000.
        !           299: **
        !           300: ** Most systems appear to do this simply by assigning
        !           301: ** variables and without the extra range tests.  But
        !           302: ** there are reports that windows throws an expection
        !           303: ** if the floating point value is out of range. (See ticket #2880.)
        !           304: ** Because we do not completely understand the problem, we will
        !           305: ** take the conservative approach and always do range tests
        !           306: ** before attempting the conversion.
        !           307: */
        !           308: static i64 doubleToInt64(double r){
        !           309: #ifdef SQLITE_OMIT_FLOATING_POINT
        !           310:   /* When floating-point is omitted, double and int64 are the same thing */
        !           311:   return r;
        !           312: #else
        !           313:   /*
        !           314:   ** Many compilers we encounter do not define constants for the
        !           315:   ** minimum and maximum 64-bit integers, or they define them
        !           316:   ** inconsistently.  And many do not understand the "LL" notation.
        !           317:   ** So we define our own static constants here using nothing
        !           318:   ** larger than a 32-bit integer constant.
        !           319:   */
        !           320:   static const i64 maxInt = LARGEST_INT64;
        !           321:   static const i64 minInt = SMALLEST_INT64;
        !           322: 
        !           323:   if( r<(double)minInt ){
        !           324:     return minInt;
        !           325:   }else if( r>(double)maxInt ){
        !           326:     /* minInt is correct here - not maxInt.  It turns out that assigning
        !           327:     ** a very large positive number to an integer results in a very large
        !           328:     ** negative integer.  This makes no sense, but it is what x86 hardware
        !           329:     ** does so for compatibility we will do the same in software. */
        !           330:     return minInt;
        !           331:   }else{
        !           332:     return (i64)r;
        !           333:   }
        !           334: #endif
        !           335: }
        !           336: 
        !           337: /*
        !           338: ** Return some kind of integer value which is the best we can do
        !           339: ** at representing the value that *pMem describes as an integer.
        !           340: ** If pMem is an integer, then the value is exact.  If pMem is
        !           341: ** a floating-point then the value returned is the integer part.
        !           342: ** If pMem is a string or blob, then we make an attempt to convert
        !           343: ** it into a integer and return that.  If pMem represents an
        !           344: ** an SQL-NULL value, return 0.
        !           345: **
        !           346: ** If pMem represents a string value, its encoding might be changed.
        !           347: */
        !           348: i64 sqlite3VdbeIntValue(Mem *pMem){
        !           349:   int flags;
        !           350:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           351:   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
        !           352:   flags = pMem->flags;
        !           353:   if( flags & MEM_Int ){
        !           354:     return pMem->u.i;
        !           355:   }else if( flags & MEM_Real ){
        !           356:     return doubleToInt64(pMem->r);
        !           357:   }else if( flags & (MEM_Str|MEM_Blob) ){
        !           358:     i64 value = 0;
        !           359:     assert( pMem->z || pMem->n==0 );
        !           360:     testcase( pMem->z==0 );
        !           361:     sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc);
        !           362:     return value;
        !           363:   }else{
        !           364:     return 0;
        !           365:   }
        !           366: }
        !           367: 
        !           368: /*
        !           369: ** Return the best representation of pMem that we can get into a
        !           370: ** double.  If pMem is already a double or an integer, return its
        !           371: ** value.  If it is a string or blob, try to convert it to a double.
        !           372: ** If it is a NULL, return 0.0.
        !           373: */
        !           374: double sqlite3VdbeRealValue(Mem *pMem){
        !           375:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           376:   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
        !           377:   if( pMem->flags & MEM_Real ){
        !           378:     return pMem->r;
        !           379:   }else if( pMem->flags & MEM_Int ){
        !           380:     return (double)pMem->u.i;
        !           381:   }else if( pMem->flags & (MEM_Str|MEM_Blob) ){
        !           382:     /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
        !           383:     double val = (double)0;
        !           384:     sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc);
        !           385:     return val;
        !           386:   }else{
        !           387:     /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
        !           388:     return (double)0;
        !           389:   }
        !           390: }
        !           391: 
        !           392: /*
        !           393: ** The MEM structure is already a MEM_Real.  Try to also make it a
        !           394: ** MEM_Int if we can.
        !           395: */
        !           396: void sqlite3VdbeIntegerAffinity(Mem *pMem){
        !           397:   assert( pMem->flags & MEM_Real );
        !           398:   assert( (pMem->flags & MEM_RowSet)==0 );
        !           399:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           400:   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
        !           401: 
        !           402:   pMem->u.i = doubleToInt64(pMem->r);
        !           403: 
        !           404:   /* Only mark the value as an integer if
        !           405:   **
        !           406:   **    (1) the round-trip conversion real->int->real is a no-op, and
        !           407:   **    (2) The integer is neither the largest nor the smallest
        !           408:   **        possible integer (ticket #3922)
        !           409:   **
        !           410:   ** The second and third terms in the following conditional enforces
        !           411:   ** the second condition under the assumption that addition overflow causes
        !           412:   ** values to wrap around.  On x86 hardware, the third term is always
        !           413:   ** true and could be omitted.  But we leave it in because other
        !           414:   ** architectures might behave differently.
        !           415:   */
        !           416:   if( pMem->r==(double)pMem->u.i && pMem->u.i>SMALLEST_INT64
        !           417:       && ALWAYS(pMem->u.i<LARGEST_INT64) ){
        !           418:     pMem->flags |= MEM_Int;
        !           419:   }
        !           420: }
        !           421: 
        !           422: /*
        !           423: ** Convert pMem to type integer.  Invalidate any prior representations.
        !           424: */
        !           425: int sqlite3VdbeMemIntegerify(Mem *pMem){
        !           426:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           427:   assert( (pMem->flags & MEM_RowSet)==0 );
        !           428:   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
        !           429: 
        !           430:   pMem->u.i = sqlite3VdbeIntValue(pMem);
        !           431:   MemSetTypeFlag(pMem, MEM_Int);
        !           432:   return SQLITE_OK;
        !           433: }
        !           434: 
        !           435: /*
        !           436: ** Convert pMem so that it is of type MEM_Real.
        !           437: ** Invalidate any prior representations.
        !           438: */
        !           439: int sqlite3VdbeMemRealify(Mem *pMem){
        !           440:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           441:   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
        !           442: 
        !           443:   pMem->r = sqlite3VdbeRealValue(pMem);
        !           444:   MemSetTypeFlag(pMem, MEM_Real);
        !           445:   return SQLITE_OK;
        !           446: }
        !           447: 
        !           448: /*
        !           449: ** Convert pMem so that it has types MEM_Real or MEM_Int or both.
        !           450: ** Invalidate any prior representations.
        !           451: **
        !           452: ** Every effort is made to force the conversion, even if the input
        !           453: ** is a string that does not look completely like a number.  Convert
        !           454: ** as much of the string as we can and ignore the rest.
        !           455: */
        !           456: int sqlite3VdbeMemNumerify(Mem *pMem){
        !           457:   if( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))==0 ){
        !           458:     assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 );
        !           459:     assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           460:     if( 0==sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc) ){
        !           461:       MemSetTypeFlag(pMem, MEM_Int);
        !           462:     }else{
        !           463:       pMem->r = sqlite3VdbeRealValue(pMem);
        !           464:       MemSetTypeFlag(pMem, MEM_Real);
        !           465:       sqlite3VdbeIntegerAffinity(pMem);
        !           466:     }
        !           467:   }
        !           468:   assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 );
        !           469:   pMem->flags &= ~(MEM_Str|MEM_Blob);
        !           470:   return SQLITE_OK;
        !           471: }
        !           472: 
        !           473: /*
        !           474: ** Delete any previous value and set the value stored in *pMem to NULL.
        !           475: */
        !           476: void sqlite3VdbeMemSetNull(Mem *pMem){
        !           477:   if( pMem->flags & MEM_Frame ){
        !           478:     VdbeFrame *pFrame = pMem->u.pFrame;
        !           479:     pFrame->pParent = pFrame->v->pDelFrame;
        !           480:     pFrame->v->pDelFrame = pFrame;
        !           481:   }
        !           482:   if( pMem->flags & MEM_RowSet ){
        !           483:     sqlite3RowSetClear(pMem->u.pRowSet);
        !           484:   }
        !           485:   MemSetTypeFlag(pMem, MEM_Null);
        !           486:   pMem->type = SQLITE_NULL;
        !           487: }
        !           488: 
        !           489: /*
        !           490: ** Delete any previous value and set the value to be a BLOB of length
        !           491: ** n containing all zeros.
        !           492: */
        !           493: void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
        !           494:   sqlite3VdbeMemRelease(pMem);
        !           495:   pMem->flags = MEM_Blob|MEM_Zero;
        !           496:   pMem->type = SQLITE_BLOB;
        !           497:   pMem->n = 0;
        !           498:   if( n<0 ) n = 0;
        !           499:   pMem->u.nZero = n;
        !           500:   pMem->enc = SQLITE_UTF8;
        !           501: 
        !           502: #ifdef SQLITE_OMIT_INCRBLOB
        !           503:   sqlite3VdbeMemGrow(pMem, n, 0);
        !           504:   if( pMem->z ){
        !           505:     pMem->n = n;
        !           506:     memset(pMem->z, 0, n);
        !           507:   }
        !           508: #endif
        !           509: }
        !           510: 
        !           511: /*
        !           512: ** Delete any previous value and set the value stored in *pMem to val,
        !           513: ** manifest type INTEGER.
        !           514: */
        !           515: void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){
        !           516:   sqlite3VdbeMemRelease(pMem);
        !           517:   pMem->u.i = val;
        !           518:   pMem->flags = MEM_Int;
        !           519:   pMem->type = SQLITE_INTEGER;
        !           520: }
        !           521: 
        !           522: #ifndef SQLITE_OMIT_FLOATING_POINT
        !           523: /*
        !           524: ** Delete any previous value and set the value stored in *pMem to val,
        !           525: ** manifest type REAL.
        !           526: */
        !           527: void sqlite3VdbeMemSetDouble(Mem *pMem, double val){
        !           528:   if( sqlite3IsNaN(val) ){
        !           529:     sqlite3VdbeMemSetNull(pMem);
        !           530:   }else{
        !           531:     sqlite3VdbeMemRelease(pMem);
        !           532:     pMem->r = val;
        !           533:     pMem->flags = MEM_Real;
        !           534:     pMem->type = SQLITE_FLOAT;
        !           535:   }
        !           536: }
        !           537: #endif
        !           538: 
        !           539: /*
        !           540: ** Delete any previous value and set the value of pMem to be an
        !           541: ** empty boolean index.
        !           542: */
        !           543: void sqlite3VdbeMemSetRowSet(Mem *pMem){
        !           544:   sqlite3 *db = pMem->db;
        !           545:   assert( db!=0 );
        !           546:   assert( (pMem->flags & MEM_RowSet)==0 );
        !           547:   sqlite3VdbeMemRelease(pMem);
        !           548:   pMem->zMalloc = sqlite3DbMallocRaw(db, 64);
        !           549:   if( db->mallocFailed ){
        !           550:     pMem->flags = MEM_Null;
        !           551:   }else{
        !           552:     assert( pMem->zMalloc );
        !           553:     pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc, 
        !           554:                                        sqlite3DbMallocSize(db, pMem->zMalloc));
        !           555:     assert( pMem->u.pRowSet!=0 );
        !           556:     pMem->flags = MEM_RowSet;
        !           557:   }
        !           558: }
        !           559: 
        !           560: /*
        !           561: ** Return true if the Mem object contains a TEXT or BLOB that is
        !           562: ** too large - whose size exceeds SQLITE_MAX_LENGTH.
        !           563: */
        !           564: int sqlite3VdbeMemTooBig(Mem *p){
        !           565:   assert( p->db!=0 );
        !           566:   if( p->flags & (MEM_Str|MEM_Blob) ){
        !           567:     int n = p->n;
        !           568:     if( p->flags & MEM_Zero ){
        !           569:       n += p->u.nZero;
        !           570:     }
        !           571:     return n>p->db->aLimit[SQLITE_LIMIT_LENGTH];
        !           572:   }
        !           573:   return 0; 
        !           574: }
        !           575: 
        !           576: #ifdef SQLITE_DEBUG
        !           577: /*
        !           578: ** This routine prepares a memory cell for modication by breaking
        !           579: ** its link to a shallow copy and by marking any current shallow
        !           580: ** copies of this cell as invalid.
        !           581: **
        !           582: ** This is used for testing and debugging only - to make sure shallow
        !           583: ** copies are not misused.
        !           584: */
        !           585: void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
        !           586:   int i;
        !           587:   Mem *pX;
        !           588:   for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){
        !           589:     if( pX->pScopyFrom==pMem ){
        !           590:       pX->flags |= MEM_Invalid;
        !           591:       pX->pScopyFrom = 0;
        !           592:     }
        !           593:   }
        !           594:   pMem->pScopyFrom = 0;
        !           595: }
        !           596: #endif /* SQLITE_DEBUG */
        !           597: 
        !           598: /*
        !           599: ** Size of struct Mem not including the Mem.zMalloc member.
        !           600: */
        !           601: #define MEMCELLSIZE (size_t)(&(((Mem *)0)->zMalloc))
        !           602: 
        !           603: /*
        !           604: ** Make an shallow copy of pFrom into pTo.  Prior contents of
        !           605: ** pTo are freed.  The pFrom->z field is not duplicated.  If
        !           606: ** pFrom->z is used, then pTo->z points to the same thing as pFrom->z
        !           607: ** and flags gets srcType (either MEM_Ephem or MEM_Static).
        !           608: */
        !           609: void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
        !           610:   assert( (pFrom->flags & MEM_RowSet)==0 );
        !           611:   VdbeMemRelease(pTo);
        !           612:   memcpy(pTo, pFrom, MEMCELLSIZE);
        !           613:   pTo->xDel = 0;
        !           614:   if( (pFrom->flags&MEM_Static)==0 ){
        !           615:     pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem);
        !           616:     assert( srcType==MEM_Ephem || srcType==MEM_Static );
        !           617:     pTo->flags |= srcType;
        !           618:   }
        !           619: }
        !           620: 
        !           621: /*
        !           622: ** Make a full copy of pFrom into pTo.  Prior contents of pTo are
        !           623: ** freed before the copy is made.
        !           624: */
        !           625: int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
        !           626:   int rc = SQLITE_OK;
        !           627: 
        !           628:   assert( (pFrom->flags & MEM_RowSet)==0 );
        !           629:   VdbeMemRelease(pTo);
        !           630:   memcpy(pTo, pFrom, MEMCELLSIZE);
        !           631:   pTo->flags &= ~MEM_Dyn;
        !           632: 
        !           633:   if( pTo->flags&(MEM_Str|MEM_Blob) ){
        !           634:     if( 0==(pFrom->flags&MEM_Static) ){
        !           635:       pTo->flags |= MEM_Ephem;
        !           636:       rc = sqlite3VdbeMemMakeWriteable(pTo);
        !           637:     }
        !           638:   }
        !           639: 
        !           640:   return rc;
        !           641: }
        !           642: 
        !           643: /*
        !           644: ** Transfer the contents of pFrom to pTo. Any existing value in pTo is
        !           645: ** freed. If pFrom contains ephemeral data, a copy is made.
        !           646: **
        !           647: ** pFrom contains an SQL NULL when this routine returns.
        !           648: */
        !           649: void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){
        !           650:   assert( pFrom->db==0 || sqlite3_mutex_held(pFrom->db->mutex) );
        !           651:   assert( pTo->db==0 || sqlite3_mutex_held(pTo->db->mutex) );
        !           652:   assert( pFrom->db==0 || pTo->db==0 || pFrom->db==pTo->db );
        !           653: 
        !           654:   sqlite3VdbeMemRelease(pTo);
        !           655:   memcpy(pTo, pFrom, sizeof(Mem));
        !           656:   pFrom->flags = MEM_Null;
        !           657:   pFrom->xDel = 0;
        !           658:   pFrom->zMalloc = 0;
        !           659: }
        !           660: 
        !           661: /*
        !           662: ** Change the value of a Mem to be a string or a BLOB.
        !           663: **
        !           664: ** The memory management strategy depends on the value of the xDel
        !           665: ** parameter. If the value passed is SQLITE_TRANSIENT, then the 
        !           666: ** string is copied into a (possibly existing) buffer managed by the 
        !           667: ** Mem structure. Otherwise, any existing buffer is freed and the
        !           668: ** pointer copied.
        !           669: **
        !           670: ** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH
        !           671: ** size limit) then no memory allocation occurs.  If the string can be
        !           672: ** stored without allocating memory, then it is.  If a memory allocation
        !           673: ** is required to store the string, then value of pMem is unchanged.  In
        !           674: ** either case, SQLITE_TOOBIG is returned.
        !           675: */
        !           676: int sqlite3VdbeMemSetStr(
        !           677:   Mem *pMem,          /* Memory cell to set to string value */
        !           678:   const char *z,      /* String pointer */
        !           679:   int n,              /* Bytes in string, or negative */
        !           680:   u8 enc,             /* Encoding of z.  0 for BLOBs */
        !           681:   void (*xDel)(void*) /* Destructor function */
        !           682: ){
        !           683:   int nByte = n;      /* New value for pMem->n */
        !           684:   int iLimit;         /* Maximum allowed string or blob size */
        !           685:   u16 flags = 0;      /* New value for pMem->flags */
        !           686: 
        !           687:   assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
        !           688:   assert( (pMem->flags & MEM_RowSet)==0 );
        !           689: 
        !           690:   /* If z is a NULL pointer, set pMem to contain an SQL NULL. */
        !           691:   if( !z ){
        !           692:     sqlite3VdbeMemSetNull(pMem);
        !           693:     return SQLITE_OK;
        !           694:   }
        !           695: 
        !           696:   if( pMem->db ){
        !           697:     iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH];
        !           698:   }else{
        !           699:     iLimit = SQLITE_MAX_LENGTH;
        !           700:   }
        !           701:   flags = (enc==0?MEM_Blob:MEM_Str);
        !           702:   if( nByte<0 ){
        !           703:     assert( enc!=0 );
        !           704:     if( enc==SQLITE_UTF8 ){
        !           705:       for(nByte=0; nByte<=iLimit && z[nByte]; nByte++){}
        !           706:     }else{
        !           707:       for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){}
        !           708:     }
        !           709:     flags |= MEM_Term;
        !           710:   }
        !           711: 
        !           712:   /* The following block sets the new values of Mem.z and Mem.xDel. It
        !           713:   ** also sets a flag in local variable "flags" to indicate the memory
        !           714:   ** management (one of MEM_Dyn or MEM_Static).
        !           715:   */
        !           716:   if( xDel==SQLITE_TRANSIENT ){
        !           717:     int nAlloc = nByte;
        !           718:     if( flags&MEM_Term ){
        !           719:       nAlloc += (enc==SQLITE_UTF8?1:2);
        !           720:     }
        !           721:     if( nByte>iLimit ){
        !           722:       return SQLITE_TOOBIG;
        !           723:     }
        !           724:     if( sqlite3VdbeMemGrow(pMem, nAlloc, 0) ){
        !           725:       return SQLITE_NOMEM;
        !           726:     }
        !           727:     memcpy(pMem->z, z, nAlloc);
        !           728:   }else if( xDel==SQLITE_DYNAMIC ){
        !           729:     sqlite3VdbeMemRelease(pMem);
        !           730:     pMem->zMalloc = pMem->z = (char *)z;
        !           731:     pMem->xDel = 0;
        !           732:   }else{
        !           733:     sqlite3VdbeMemRelease(pMem);
        !           734:     pMem->z = (char *)z;
        !           735:     pMem->xDel = xDel;
        !           736:     flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn);
        !           737:   }
        !           738: 
        !           739:   pMem->n = nByte;
        !           740:   pMem->flags = flags;
        !           741:   pMem->enc = (enc==0 ? SQLITE_UTF8 : enc);
        !           742:   pMem->type = (enc==0 ? SQLITE_BLOB : SQLITE_TEXT);
        !           743: 
        !           744: #ifndef SQLITE_OMIT_UTF16
        !           745:   if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){
        !           746:     return SQLITE_NOMEM;
        !           747:   }
        !           748: #endif
        !           749: 
        !           750:   if( nByte>iLimit ){
        !           751:     return SQLITE_TOOBIG;
        !           752:   }
        !           753: 
        !           754:   return SQLITE_OK;
        !           755: }
        !           756: 
        !           757: /*
        !           758: ** Compare the values contained by the two memory cells, returning
        !           759: ** negative, zero or positive if pMem1 is less than, equal to, or greater
        !           760: ** than pMem2. Sorting order is NULL's first, followed by numbers (integers
        !           761: ** and reals) sorted numerically, followed by text ordered by the collating
        !           762: ** sequence pColl and finally blob's ordered by memcmp().
        !           763: **
        !           764: ** Two NULL values are considered equal by this function.
        !           765: */
        !           766: int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){
        !           767:   int rc;
        !           768:   int f1, f2;
        !           769:   int combined_flags;
        !           770: 
        !           771:   f1 = pMem1->flags;
        !           772:   f2 = pMem2->flags;
        !           773:   combined_flags = f1|f2;
        !           774:   assert( (combined_flags & MEM_RowSet)==0 );
        !           775:  
        !           776:   /* If one value is NULL, it is less than the other. If both values
        !           777:   ** are NULL, return 0.
        !           778:   */
        !           779:   if( combined_flags&MEM_Null ){
        !           780:     return (f2&MEM_Null) - (f1&MEM_Null);
        !           781:   }
        !           782: 
        !           783:   /* If one value is a number and the other is not, the number is less.
        !           784:   ** If both are numbers, compare as reals if one is a real, or as integers
        !           785:   ** if both values are integers.
        !           786:   */
        !           787:   if( combined_flags&(MEM_Int|MEM_Real) ){
        !           788:     if( !(f1&(MEM_Int|MEM_Real)) ){
        !           789:       return 1;
        !           790:     }
        !           791:     if( !(f2&(MEM_Int|MEM_Real)) ){
        !           792:       return -1;
        !           793:     }
        !           794:     if( (f1 & f2 & MEM_Int)==0 ){
        !           795:       double r1, r2;
        !           796:       if( (f1&MEM_Real)==0 ){
        !           797:         r1 = (double)pMem1->u.i;
        !           798:       }else{
        !           799:         r1 = pMem1->r;
        !           800:       }
        !           801:       if( (f2&MEM_Real)==0 ){
        !           802:         r2 = (double)pMem2->u.i;
        !           803:       }else{
        !           804:         r2 = pMem2->r;
        !           805:       }
        !           806:       if( r1<r2 ) return -1;
        !           807:       if( r1>r2 ) return 1;
        !           808:       return 0;
        !           809:     }else{
        !           810:       assert( f1&MEM_Int );
        !           811:       assert( f2&MEM_Int );
        !           812:       if( pMem1->u.i < pMem2->u.i ) return -1;
        !           813:       if( pMem1->u.i > pMem2->u.i ) return 1;
        !           814:       return 0;
        !           815:     }
        !           816:   }
        !           817: 
        !           818:   /* If one value is a string and the other is a blob, the string is less.
        !           819:   ** If both are strings, compare using the collating functions.
        !           820:   */
        !           821:   if( combined_flags&MEM_Str ){
        !           822:     if( (f1 & MEM_Str)==0 ){
        !           823:       return 1;
        !           824:     }
        !           825:     if( (f2 & MEM_Str)==0 ){
        !           826:       return -1;
        !           827:     }
        !           828: 
        !           829:     assert( pMem1->enc==pMem2->enc );
        !           830:     assert( pMem1->enc==SQLITE_UTF8 || 
        !           831:             pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE );
        !           832: 
        !           833:     /* The collation sequence must be defined at this point, even if
        !           834:     ** the user deletes the collation sequence after the vdbe program is
        !           835:     ** compiled (this was not always the case).
        !           836:     */
        !           837:     assert( !pColl || pColl->xCmp );
        !           838: 
        !           839:     if( pColl ){
        !           840:       if( pMem1->enc==pColl->enc ){
        !           841:         /* The strings are already in the correct encoding.  Call the
        !           842:         ** comparison function directly */
        !           843:         return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z);
        !           844:       }else{
        !           845:         const void *v1, *v2;
        !           846:         int n1, n2;
        !           847:         Mem c1;
        !           848:         Mem c2;
        !           849:         memset(&c1, 0, sizeof(c1));
        !           850:         memset(&c2, 0, sizeof(c2));
        !           851:         sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem);
        !           852:         sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem);
        !           853:         v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc);
        !           854:         n1 = v1==0 ? 0 : c1.n;
        !           855:         v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc);
        !           856:         n2 = v2==0 ? 0 : c2.n;
        !           857:         rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2);
        !           858:         sqlite3VdbeMemRelease(&c1);
        !           859:         sqlite3VdbeMemRelease(&c2);
        !           860:         return rc;
        !           861:       }
        !           862:     }
        !           863:     /* If a NULL pointer was passed as the collate function, fall through
        !           864:     ** to the blob case and use memcmp().  */
        !           865:   }
        !           866:  
        !           867:   /* Both values must be blobs.  Compare using memcmp().  */
        !           868:   rc = memcmp(pMem1->z, pMem2->z, (pMem1->n>pMem2->n)?pMem2->n:pMem1->n);
        !           869:   if( rc==0 ){
        !           870:     rc = pMem1->n - pMem2->n;
        !           871:   }
        !           872:   return rc;
        !           873: }
        !           874: 
        !           875: /*
        !           876: ** Move data out of a btree key or data field and into a Mem structure.
        !           877: ** The data or key is taken from the entry that pCur is currently pointing
        !           878: ** to.  offset and amt determine what portion of the data or key to retrieve.
        !           879: ** key is true to get the key or false to get data.  The result is written
        !           880: ** into the pMem element.
        !           881: **
        !           882: ** The pMem structure is assumed to be uninitialized.  Any prior content
        !           883: ** is overwritten without being freed.
        !           884: **
        !           885: ** If this routine fails for any reason (malloc returns NULL or unable
        !           886: ** to read from the disk) then the pMem is left in an inconsistent state.
        !           887: */
        !           888: int sqlite3VdbeMemFromBtree(
        !           889:   BtCursor *pCur,   /* Cursor pointing at record to retrieve. */
        !           890:   int offset,       /* Offset from the start of data to return bytes from. */
        !           891:   int amt,          /* Number of bytes to return. */
        !           892:   int key,          /* If true, retrieve from the btree key, not data. */
        !           893:   Mem *pMem         /* OUT: Return data in this Mem structure. */
        !           894: ){
        !           895:   char *zData;        /* Data from the btree layer */
        !           896:   int available = 0;  /* Number of bytes available on the local btree page */
        !           897:   int rc = SQLITE_OK; /* Return code */
        !           898: 
        !           899:   assert( sqlite3BtreeCursorIsValid(pCur) );
        !           900: 
        !           901:   /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() 
        !           902:   ** that both the BtShared and database handle mutexes are held. */
        !           903:   assert( (pMem->flags & MEM_RowSet)==0 );
        !           904:   if( key ){
        !           905:     zData = (char *)sqlite3BtreeKeyFetch(pCur, &available);
        !           906:   }else{
        !           907:     zData = (char *)sqlite3BtreeDataFetch(pCur, &available);
        !           908:   }
        !           909:   assert( zData!=0 );
        !           910: 
        !           911:   if( offset+amt<=available && (pMem->flags&MEM_Dyn)==0 ){
        !           912:     sqlite3VdbeMemRelease(pMem);
        !           913:     pMem->z = &zData[offset];
        !           914:     pMem->flags = MEM_Blob|MEM_Ephem;
        !           915:   }else if( SQLITE_OK==(rc = sqlite3VdbeMemGrow(pMem, amt+2, 0)) ){
        !           916:     pMem->flags = MEM_Blob|MEM_Dyn|MEM_Term;
        !           917:     pMem->enc = 0;
        !           918:     pMem->type = SQLITE_BLOB;
        !           919:     if( key ){
        !           920:       rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z);
        !           921:     }else{
        !           922:       rc = sqlite3BtreeData(pCur, offset, amt, pMem->z);
        !           923:     }
        !           924:     pMem->z[amt] = 0;
        !           925:     pMem->z[amt+1] = 0;
        !           926:     if( rc!=SQLITE_OK ){
        !           927:       sqlite3VdbeMemRelease(pMem);
        !           928:     }
        !           929:   }
        !           930:   pMem->n = amt;
        !           931: 
        !           932:   return rc;
        !           933: }
        !           934: 
        !           935: /* This function is only available internally, it is not part of the
        !           936: ** external API. It works in a similar way to sqlite3_value_text(),
        !           937: ** except the data returned is in the encoding specified by the second
        !           938: ** parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or
        !           939: ** SQLITE_UTF8.
        !           940: **
        !           941: ** (2006-02-16:)  The enc value can be or-ed with SQLITE_UTF16_ALIGNED.
        !           942: ** If that is the case, then the result must be aligned on an even byte
        !           943: ** boundary.
        !           944: */
        !           945: const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
        !           946:   if( !pVal ) return 0;
        !           947: 
        !           948:   assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) );
        !           949:   assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
        !           950:   assert( (pVal->flags & MEM_RowSet)==0 );
        !           951: 
        !           952:   if( pVal->flags&MEM_Null ){
        !           953:     return 0;
        !           954:   }
        !           955:   assert( (MEM_Blob>>3) == MEM_Str );
        !           956:   pVal->flags |= (pVal->flags & MEM_Blob)>>3;
        !           957:   ExpandBlob(pVal);
        !           958:   if( pVal->flags&MEM_Str ){
        !           959:     sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED);
        !           960:     if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){
        !           961:       assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 );
        !           962:       if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){
        !           963:         return 0;
        !           964:       }
        !           965:     }
        !           966:     sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-31275-44060 */
        !           967:   }else{
        !           968:     assert( (pVal->flags&MEM_Blob)==0 );
        !           969:     sqlite3VdbeMemStringify(pVal, enc);
        !           970:     assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) );
        !           971:   }
        !           972:   assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0
        !           973:               || pVal->db->mallocFailed );
        !           974:   if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){
        !           975:     return pVal->z;
        !           976:   }else{
        !           977:     return 0;
        !           978:   }
        !           979: }
        !           980: 
        !           981: /*
        !           982: ** Create a new sqlite3_value object.
        !           983: */
        !           984: sqlite3_value *sqlite3ValueNew(sqlite3 *db){
        !           985:   Mem *p = sqlite3DbMallocZero(db, sizeof(*p));
        !           986:   if( p ){
        !           987:     p->flags = MEM_Null;
        !           988:     p->type = SQLITE_NULL;
        !           989:     p->db = db;
        !           990:   }
        !           991:   return p;
        !           992: }
        !           993: 
        !           994: /*
        !           995: ** Create a new sqlite3_value object, containing the value of pExpr.
        !           996: **
        !           997: ** This only works for very simple expressions that consist of one constant
        !           998: ** token (i.e. "5", "5.1", "'a string'"). If the expression can
        !           999: ** be converted directly into a value, then the value is allocated and
        !          1000: ** a pointer written to *ppVal. The caller is responsible for deallocating
        !          1001: ** the value by passing it to sqlite3ValueFree() later on. If the expression
        !          1002: ** cannot be converted to a value, then *ppVal is set to NULL.
        !          1003: */
        !          1004: int sqlite3ValueFromExpr(
        !          1005:   sqlite3 *db,              /* The database connection */
        !          1006:   Expr *pExpr,              /* The expression to evaluate */
        !          1007:   u8 enc,                   /* Encoding to use */
        !          1008:   u8 affinity,              /* Affinity to use */
        !          1009:   sqlite3_value **ppVal     /* Write the new value here */
        !          1010: ){
        !          1011:   int op;
        !          1012:   char *zVal = 0;
        !          1013:   sqlite3_value *pVal = 0;
        !          1014:   int negInt = 1;
        !          1015:   const char *zNeg = "";
        !          1016: 
        !          1017:   if( !pExpr ){
        !          1018:     *ppVal = 0;
        !          1019:     return SQLITE_OK;
        !          1020:   }
        !          1021:   op = pExpr->op;
        !          1022: 
        !          1023:   /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT3.
        !          1024:   ** The ifdef here is to enable us to achieve 100% branch test coverage even
        !          1025:   ** when SQLITE_ENABLE_STAT3 is omitted.
        !          1026:   */
        !          1027: #ifdef SQLITE_ENABLE_STAT3
        !          1028:   if( op==TK_REGISTER ) op = pExpr->op2;
        !          1029: #else
        !          1030:   if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
        !          1031: #endif
        !          1032: 
        !          1033:   /* Handle negative integers in a single step.  This is needed in the
        !          1034:   ** case when the value is -9223372036854775808.
        !          1035:   */
        !          1036:   if( op==TK_UMINUS
        !          1037:    && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){
        !          1038:     pExpr = pExpr->pLeft;
        !          1039:     op = pExpr->op;
        !          1040:     negInt = -1;
        !          1041:     zNeg = "-";
        !          1042:   }
        !          1043: 
        !          1044:   if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){
        !          1045:     pVal = sqlite3ValueNew(db);
        !          1046:     if( pVal==0 ) goto no_mem;
        !          1047:     if( ExprHasProperty(pExpr, EP_IntValue) ){
        !          1048:       sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt);
        !          1049:     }else{
        !          1050:       zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken);
        !          1051:       if( zVal==0 ) goto no_mem;
        !          1052:       sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC);
        !          1053:       if( op==TK_FLOAT ) pVal->type = SQLITE_FLOAT;
        !          1054:     }
        !          1055:     if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){
        !          1056:       sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8);
        !          1057:     }else{
        !          1058:       sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8);
        !          1059:     }
        !          1060:     if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str;
        !          1061:     if( enc!=SQLITE_UTF8 ){
        !          1062:       sqlite3VdbeChangeEncoding(pVal, enc);
        !          1063:     }
        !          1064:   }else if( op==TK_UMINUS ) {
        !          1065:     /* This branch happens for multiple negative signs.  Ex: -(-5) */
        !          1066:     if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) ){
        !          1067:       sqlite3VdbeMemNumerify(pVal);
        !          1068:       if( pVal->u.i==SMALLEST_INT64 ){
        !          1069:         pVal->flags &= MEM_Int;
        !          1070:         pVal->flags |= MEM_Real;
        !          1071:         pVal->r = (double)LARGEST_INT64;
        !          1072:       }else{
        !          1073:         pVal->u.i = -pVal->u.i;
        !          1074:       }
        !          1075:       pVal->r = -pVal->r;
        !          1076:       sqlite3ValueApplyAffinity(pVal, affinity, enc);
        !          1077:     }
        !          1078:   }else if( op==TK_NULL ){
        !          1079:     pVal = sqlite3ValueNew(db);
        !          1080:     if( pVal==0 ) goto no_mem;
        !          1081:   }
        !          1082: #ifndef SQLITE_OMIT_BLOB_LITERAL
        !          1083:   else if( op==TK_BLOB ){
        !          1084:     int nVal;
        !          1085:     assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
        !          1086:     assert( pExpr->u.zToken[1]=='\'' );
        !          1087:     pVal = sqlite3ValueNew(db);
        !          1088:     if( !pVal ) goto no_mem;
        !          1089:     zVal = &pExpr->u.zToken[2];
        !          1090:     nVal = sqlite3Strlen30(zVal)-1;
        !          1091:     assert( zVal[nVal]=='\'' );
        !          1092:     sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2,
        !          1093:                          0, SQLITE_DYNAMIC);
        !          1094:   }
        !          1095: #endif
        !          1096: 
        !          1097:   if( pVal ){
        !          1098:     sqlite3VdbeMemStoreType(pVal);
        !          1099:   }
        !          1100:   *ppVal = pVal;
        !          1101:   return SQLITE_OK;
        !          1102: 
        !          1103: no_mem:
        !          1104:   db->mallocFailed = 1;
        !          1105:   sqlite3DbFree(db, zVal);
        !          1106:   sqlite3ValueFree(pVal);
        !          1107:   *ppVal = 0;
        !          1108:   return SQLITE_NOMEM;
        !          1109: }
        !          1110: 
        !          1111: /*
        !          1112: ** Change the string value of an sqlite3_value object
        !          1113: */
        !          1114: void sqlite3ValueSetStr(
        !          1115:   sqlite3_value *v,     /* Value to be set */
        !          1116:   int n,                /* Length of string z */
        !          1117:   const void *z,        /* Text of the new string */
        !          1118:   u8 enc,               /* Encoding to use */
        !          1119:   void (*xDel)(void*)   /* Destructor for the string */
        !          1120: ){
        !          1121:   if( v ) sqlite3VdbeMemSetStr((Mem *)v, z, n, enc, xDel);
        !          1122: }
        !          1123: 
        !          1124: /*
        !          1125: ** Free an sqlite3_value object
        !          1126: */
        !          1127: void sqlite3ValueFree(sqlite3_value *v){
        !          1128:   if( !v ) return;
        !          1129:   sqlite3VdbeMemRelease((Mem *)v);
        !          1130:   sqlite3DbFree(((Mem*)v)->db, v);
        !          1131: }
        !          1132: 
        !          1133: /*
        !          1134: ** Return the number of bytes in the sqlite3_value object assuming
        !          1135: ** that it uses the encoding "enc"
        !          1136: */
        !          1137: int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
        !          1138:   Mem *p = (Mem*)pVal;
        !          1139:   if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){
        !          1140:     if( p->flags & MEM_Zero ){
        !          1141:       return p->n + p->u.nZero;
        !          1142:     }else{
        !          1143:       return p->n;
        !          1144:     }
        !          1145:   }
        !          1146:   return 0;
        !          1147: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>