| Index: third_party/sqlite/src/src/vdbemem.c
|
| diff --git a/third_party/sqlite/src/src/vdbemem.c b/third_party/sqlite/src/src/vdbemem.c
|
| index fae69b18a4f1810092a436c44fa19b8b31ad3e6a..656e19bfa890a20b63c9710bb7bbd5a4fac565c2 100644
|
| --- a/third_party/sqlite/src/src/vdbemem.c
|
| +++ b/third_party/sqlite/src/src/vdbemem.c
|
| @@ -116,6 +116,7 @@ int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
|
| SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){
|
| assert( sqlite3VdbeCheckMemInvariants(pMem) );
|
| assert( (pMem->flags&MEM_RowSet)==0 );
|
| + testcase( pMem->db==0 );
|
|
|
| /* If the bPreserve flag is set to true, then the memory cell must already
|
| ** contain a valid string or blob value. */
|
| @@ -137,7 +138,7 @@ SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){
|
| sqlite3VdbeMemSetNull(pMem);
|
| pMem->z = 0;
|
| pMem->szMalloc = 0;
|
| - return SQLITE_NOMEM;
|
| + return SQLITE_NOMEM_BKPT;
|
| }else{
|
| pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc);
|
| }
|
| @@ -188,18 +189,18 @@ int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){
|
| ** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
|
| */
|
| int sqlite3VdbeMemMakeWriteable(Mem *pMem){
|
| - int f;
|
| assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
|
| assert( (pMem->flags&MEM_RowSet)==0 );
|
| - ExpandBlob(pMem);
|
| - f = pMem->flags;
|
| - if( (f&(MEM_Str|MEM_Blob)) && (pMem->szMalloc==0 || pMem->z!=pMem->zMalloc) ){
|
| - if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){
|
| - return SQLITE_NOMEM;
|
| + if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){
|
| + if( ExpandBlob(pMem) ) return SQLITE_NOMEM;
|
| + if( pMem->szMalloc==0 || pMem->z!=pMem->zMalloc ){
|
| + if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){
|
| + return SQLITE_NOMEM_BKPT;
|
| + }
|
| + pMem->z[pMem->n] = 0;
|
| + pMem->z[pMem->n+1] = 0;
|
| + pMem->flags |= MEM_Term;
|
| }
|
| - pMem->z[pMem->n] = 0;
|
| - pMem->z[pMem->n+1] = 0;
|
| - pMem->flags |= MEM_Term;
|
| }
|
| pMem->flags &= ~MEM_Ephem;
|
| #ifdef SQLITE_DEBUG
|
| @@ -215,25 +216,24 @@ int sqlite3VdbeMemMakeWriteable(Mem *pMem){
|
| */
|
| #ifndef SQLITE_OMIT_INCRBLOB
|
| int sqlite3VdbeMemExpandBlob(Mem *pMem){
|
| - if( pMem->flags & MEM_Zero ){
|
| - int nByte;
|
| - assert( pMem->flags&MEM_Blob );
|
| - assert( (pMem->flags&MEM_RowSet)==0 );
|
| - assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
|
| -
|
| - /* Set nByte to the number of bytes required to store the expanded blob. */
|
| - nByte = pMem->n + pMem->u.nZero;
|
| - if( nByte<=0 ){
|
| - nByte = 1;
|
| - }
|
| - if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){
|
| - return SQLITE_NOMEM;
|
| - }
|
| + int nByte;
|
| + assert( pMem->flags & MEM_Zero );
|
| + assert( pMem->flags&MEM_Blob );
|
| + assert( (pMem->flags&MEM_RowSet)==0 );
|
| + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
|
|
|
| - memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
|
| - pMem->n += pMem->u.nZero;
|
| - pMem->flags &= ~(MEM_Zero|MEM_Term);
|
| + /* Set nByte to the number of bytes required to store the expanded blob. */
|
| + nByte = pMem->n + pMem->u.nZero;
|
| + if( nByte<=0 ){
|
| + nByte = 1;
|
| }
|
| + if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){
|
| + return SQLITE_NOMEM_BKPT;
|
| + }
|
| +
|
| + memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
|
| + pMem->n += pMem->u.nZero;
|
| + pMem->flags &= ~(MEM_Zero|MEM_Term);
|
| return SQLITE_OK;
|
| }
|
| #endif
|
| @@ -244,7 +244,7 @@ int sqlite3VdbeMemExpandBlob(Mem *pMem){
|
| */
|
| static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){
|
| if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){
|
| - return SQLITE_NOMEM;
|
| + return SQLITE_NOMEM_BKPT;
|
| }
|
| pMem->z[pMem->n] = 0;
|
| pMem->z[pMem->n+1] = 0;
|
| @@ -293,7 +293,8 @@ int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){
|
|
|
|
|
| if( sqlite3VdbeMemClearAndResize(pMem, nByte) ){
|
| - return SQLITE_NOMEM;
|
| + pMem->enc = 0;
|
| + return SQLITE_NOMEM_BKPT;
|
| }
|
|
|
| /* For a Real or Integer, use sqlite3_snprintf() to produce the UTF-8
|
| @@ -574,7 +575,7 @@ int sqlite3VdbeMemNumerify(Mem *pMem){
|
| }
|
| }
|
| assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 );
|
| - pMem->flags &= ~(MEM_Str|MEM_Blob);
|
| + pMem->flags &= ~(MEM_Str|MEM_Blob|MEM_Zero);
|
| return SQLITE_OK;
|
| }
|
|
|
| @@ -592,7 +593,7 @@ void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){
|
| if( (pMem->flags & MEM_Blob)==0 ){
|
| sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding);
|
| assert( pMem->flags & MEM_Str || pMem->db->mallocFailed );
|
| - MemSetTypeFlag(pMem, MEM_Blob);
|
| + if( pMem->flags & MEM_Str ) MemSetTypeFlag(pMem, MEM_Blob);
|
| }else{
|
| pMem->flags &= ~(MEM_TypeMask&~MEM_Blob);
|
| }
|
| @@ -719,7 +720,7 @@ void sqlite3VdbeMemSetRowSet(Mem *pMem){
|
| assert( db!=0 );
|
| assert( (pMem->flags & MEM_RowSet)==0 );
|
| sqlite3VdbeMemRelease(pMem);
|
| - pMem->zMalloc = sqlite3DbMallocRaw(db, 64);
|
| + pMem->zMalloc = sqlite3DbMallocRawNN(db, 64);
|
| if( db->mallocFailed ){
|
| pMem->flags = MEM_Null;
|
| pMem->szMalloc = 0;
|
| @@ -760,7 +761,7 @@ int sqlite3VdbeMemTooBig(Mem *p){
|
| void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
|
| int i;
|
| Mem *pX;
|
| - for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){
|
| + for(i=0, pX=pVdbe->aMem; i<pVdbe->nMem; i++, pX++){
|
| if( pX->pScopyFrom==pMem ){
|
| pX->flags |= MEM_Undefined;
|
| pX->pScopyFrom = 0;
|
| @@ -801,10 +802,6 @@ void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
|
| int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
|
| int rc = SQLITE_OK;
|
|
|
| - /* The pFrom==0 case in the following assert() is when an sqlite3_value
|
| - ** from sqlite3_value_dup() is used as the argument
|
| - ** to sqlite3_result_value(). */
|
| - assert( pTo->db==pFrom->db || pFrom->db==0 );
|
| assert( (pFrom->flags & MEM_RowSet)==0 );
|
| if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo);
|
| memcpy(pTo, pFrom, MEMCELLSIZE);
|
| @@ -904,7 +901,7 @@ int sqlite3VdbeMemSetStr(
|
| testcase( nAlloc==31 );
|
| testcase( nAlloc==32 );
|
| if( sqlite3VdbeMemClearAndResize(pMem, MAX(nAlloc,32)) ){
|
| - return SQLITE_NOMEM;
|
| + return SQLITE_NOMEM_BKPT;
|
| }
|
| memcpy(pMem->z, z, nAlloc);
|
| }else if( xDel==SQLITE_DYNAMIC ){
|
| @@ -924,7 +921,7 @@ int sqlite3VdbeMemSetStr(
|
|
|
| #ifndef SQLITE_OMIT_UTF16
|
| if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){
|
| - return SQLITE_NOMEM;
|
| + return SQLITE_NOMEM_BKPT;
|
| }
|
| #endif
|
|
|
| @@ -937,10 +934,9 @@ int sqlite3VdbeMemSetStr(
|
|
|
| /*
|
| ** Move data out of a btree key or data field and into a Mem structure.
|
| -** The data or key is taken from the entry that pCur is currently pointing
|
| +** The data is payload from the entry that pCur is currently pointing
|
| ** to. offset and amt determine what portion of the data or key to retrieve.
|
| -** key is true to get the key or false to get data. The result is written
|
| -** into the pMem element.
|
| +** The result is written into the pMem element.
|
| **
|
| ** The pMem object must have been initialized. This routine will use
|
| ** pMem->zMalloc to hold the content from the btree, if possible. New
|
| @@ -955,17 +951,12 @@ static SQLITE_NOINLINE int vdbeMemFromBtreeResize(
|
| BtCursor *pCur, /* Cursor pointing at record to retrieve. */
|
| u32 offset, /* Offset from the start of data to return bytes from. */
|
| u32 amt, /* Number of bytes to return. */
|
| - int key, /* If true, retrieve from the btree key, not data. */
|
| Mem *pMem /* OUT: Return data in this Mem structure. */
|
| ){
|
| int rc;
|
| pMem->flags = MEM_Null;
|
| if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){
|
| - if( key ){
|
| - rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z);
|
| - }else{
|
| - rc = sqlite3BtreeData(pCur, offset, amt, pMem->z);
|
| - }
|
| + rc = sqlite3BtreePayload(pCur, offset, amt, pMem->z);
|
| if( rc==SQLITE_OK ){
|
| pMem->z[amt] = 0;
|
| pMem->z[amt+1] = 0;
|
| @@ -981,7 +972,6 @@ int sqlite3VdbeMemFromBtree(
|
| BtCursor *pCur, /* Cursor pointing at record to retrieve. */
|
| u32 offset, /* Offset from the start of data to return bytes from. */
|
| u32 amt, /* Number of bytes to return. */
|
| - int key, /* If true, retrieve from the btree key, not data. */
|
| Mem *pMem /* OUT: Return data in this Mem structure. */
|
| ){
|
| char *zData; /* Data from the btree layer */
|
| @@ -994,11 +984,7 @@ int sqlite3VdbeMemFromBtree(
|
| /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert()
|
| ** that both the BtShared and database handle mutexes are held. */
|
| assert( (pMem->flags & MEM_RowSet)==0 );
|
| - if( key ){
|
| - zData = (char *)sqlite3BtreeKeyFetch(pCur, &available);
|
| - }else{
|
| - zData = (char *)sqlite3BtreeDataFetch(pCur, &available);
|
| - }
|
| + zData = (char *)sqlite3BtreePayloadFetch(pCur, &available);
|
| assert( zData!=0 );
|
|
|
| if( offset+amt<=available ){
|
| @@ -1006,7 +992,7 @@ int sqlite3VdbeMemFromBtree(
|
| pMem->flags = MEM_Blob|MEM_Ephem;
|
| pMem->n = (int)amt;
|
| }else{
|
| - rc = vdbeMemFromBtreeResize(pCur, offset, amt, key, pMem);
|
| + rc = vdbeMemFromBtreeResize(pCur, offset, amt, pMem);
|
| }
|
|
|
| return rc;
|
| @@ -1024,10 +1010,8 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){
|
| assert( (pVal->flags & MEM_RowSet)==0 );
|
| assert( (pVal->flags & (MEM_Null))==0 );
|
| if( pVal->flags & (MEM_Blob|MEM_Str) ){
|
| + if( ExpandBlob(pVal) ) return 0;
|
| pVal->flags |= MEM_Str;
|
| - if( pVal->flags & MEM_Zero ){
|
| - sqlite3VdbeMemExpandBlob(pVal);
|
| - }
|
| if( pVal->enc != (enc & ~SQLITE_UTF16_ALIGNED) ){
|
| sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED);
|
| }
|
| @@ -1185,7 +1169,6 @@ static int valueFromFunction(
|
| FuncDef *pFunc = 0; /* Function definition */
|
| sqlite3_value *pVal = 0; /* New value */
|
| int rc = SQLITE_OK; /* Return code */
|
| - int nName; /* Size of function name in bytes */
|
| ExprList *pList = 0; /* Function arguments */
|
| int i; /* Iterator variable */
|
|
|
| @@ -1193,8 +1176,7 @@ static int valueFromFunction(
|
| assert( (p->flags & EP_TokenOnly)==0 );
|
| pList = p->x.pList;
|
| if( pList ) nVal = pList->nExpr;
|
| - nName = sqlite3Strlen30(p->u.zToken);
|
| - pFunc = sqlite3FindFunction(db, p->u.zToken, nName, nVal, enc, 0);
|
| + pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0);
|
| assert( pFunc );
|
| if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0
|
| || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)
|
| @@ -1205,7 +1187,7 @@ static int valueFromFunction(
|
| if( pList ){
|
| apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal);
|
| if( apVal==0 ){
|
| - rc = SQLITE_NOMEM;
|
| + rc = SQLITE_NOMEM_BKPT;
|
| goto value_from_function_out;
|
| }
|
| for(i=0; i<nVal; i++){
|
| @@ -1216,7 +1198,7 @@ static int valueFromFunction(
|
|
|
| pVal = valueNew(db, pCtx);
|
| if( pVal==0 ){
|
| - rc = SQLITE_NOMEM;
|
| + rc = SQLITE_NOMEM_BKPT;
|
| goto value_from_function_out;
|
| }
|
|
|
| @@ -1224,7 +1206,7 @@ static int valueFromFunction(
|
| memset(&ctx, 0, sizeof(ctx));
|
| ctx.pOut = pVal;
|
| ctx.pFunc = pFunc;
|
| - pFunc->xFunc(&ctx, nVal, apVal);
|
| + pFunc->xSFunc(&ctx, nVal, apVal);
|
| if( ctx.isError ){
|
| rc = ctx.isError;
|
| sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal));
|
| @@ -1282,11 +1264,8 @@ static int valueFromExpr(
|
| const char *zNeg = "";
|
| int rc = SQLITE_OK;
|
|
|
| - if( !pExpr ){
|
| - *ppVal = 0;
|
| - return SQLITE_OK;
|
| - }
|
| - while( (op = pExpr->op)==TK_UPLUS ) pExpr = pExpr->pLeft;
|
| + assert( pExpr!=0 );
|
| + while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft;
|
| if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
|
|
|
| /* Compressed expressions only appear when parsing the DEFAULT clause
|
| @@ -1355,6 +1334,7 @@ static int valueFromExpr(
|
| }else if( op==TK_NULL ){
|
| pVal = valueNew(db, pCtx);
|
| if( pVal==0 ) goto no_mem;
|
| + sqlite3VdbeMemNumerify(pVal);
|
| }
|
| #ifndef SQLITE_OMIT_BLOB_LITERAL
|
| else if( op==TK_BLOB ){
|
| @@ -1381,7 +1361,7 @@ static int valueFromExpr(
|
| return rc;
|
|
|
| no_mem:
|
| - db->mallocFailed = 1;
|
| + sqlite3OomFault(db);
|
| sqlite3DbFree(db, zVal);
|
| assert( *ppVal==0 );
|
| #ifdef SQLITE_ENABLE_STAT3_OR_STAT4
|
| @@ -1389,7 +1369,7 @@ no_mem:
|
| #else
|
| assert( pCtx==0 ); sqlite3ValueFree(pVal);
|
| #endif
|
| - return SQLITE_NOMEM;
|
| + return SQLITE_NOMEM_BKPT;
|
| }
|
|
|
| /*
|
| @@ -1409,7 +1389,7 @@ int sqlite3ValueFromExpr(
|
| u8 affinity, /* Affinity to use */
|
| sqlite3_value **ppVal /* Write the new value here */
|
| ){
|
| - return valueFromExpr(db, pExpr, enc, affinity, ppVal, 0);
|
| + return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0;
|
| }
|
|
|
| #ifdef SQLITE_ENABLE_STAT3_OR_STAT4
|
| @@ -1440,7 +1420,7 @@ static void recordFunc(
|
| db = sqlite3_context_db_handle(context);
|
|
|
| nRet = 1 + nSerial + nVal;
|
| - aRet = sqlite3DbMallocRaw(db, nRet);
|
| + aRet = sqlite3DbMallocRawNN(db, nRet);
|
| if( aRet==0 ){
|
| sqlite3_result_error_nomem(context);
|
| }else{
|
| @@ -1456,15 +1436,10 @@ static void recordFunc(
|
| ** Register built-in functions used to help read ANALYZE data.
|
| */
|
| void sqlite3AnalyzeFunctions(void){
|
| - static SQLITE_WSD FuncDef aAnalyzeTableFuncs[] = {
|
| + static FuncDef aAnalyzeTableFuncs[] = {
|
| FUNCTION(sqlite_record, 1, 0, 0, recordFunc),
|
| };
|
| - int i;
|
| - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
|
| - FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aAnalyzeTableFuncs);
|
| - for(i=0; i<ArraySize(aAnalyzeTableFuncs); i++){
|
| - sqlite3FuncDefInsert(pHash, &aFunc[i]);
|
| - }
|
| + sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs));
|
| }
|
|
|
| /*
|
| @@ -1534,9 +1509,9 @@ static int stat4ValueFromExpr(
|
| ** structures intended to be compared against sample index keys stored
|
| ** in the sqlite_stat4 table.
|
| **
|
| -** A single call to this function attempts to populates field iVal (leftmost
|
| -** is 0 etc.) of the unpacked record with a value extracted from expression
|
| -** pExpr. Extraction of values is possible if:
|
| +** A single call to this function populates zero or more fields of the
|
| +** record starting with field iVal (fields are numbered from left to
|
| +** right starting with 0). A single field is populated if:
|
| **
|
| ** * (pExpr==0). In this case the value is assumed to be an SQL NULL,
|
| **
|
| @@ -1545,10 +1520,14 @@ static int stat4ValueFromExpr(
|
| ** * The sqlite3ValueFromExpr() function is able to extract a value
|
| ** from the expression (i.e. the expression is a literal value).
|
| **
|
| -** If a value can be extracted, the affinity passed as the 5th argument
|
| -** is applied to it before it is copied into the UnpackedRecord. Output
|
| -** parameter *pbOk is set to true if a value is extracted, or false
|
| -** otherwise.
|
| +** Or, if pExpr is a TK_VECTOR, one field is populated for each of the
|
| +** vector components that match either of the two latter criteria listed
|
| +** above.
|
| +**
|
| +** Before any value is appended to the record, the affinity of the
|
| +** corresponding column within index pIdx is applied to it. Before
|
| +** this function returns, output parameter *pnExtract is set to the
|
| +** number of values appended to the record.
|
| **
|
| ** When this function is called, *ppRec must either point to an object
|
| ** allocated by an earlier call to this function, or must be NULL. If it
|
| @@ -1564,22 +1543,33 @@ int sqlite3Stat4ProbeSetValue(
|
| Index *pIdx, /* Index being probed */
|
| UnpackedRecord **ppRec, /* IN/OUT: Probe record */
|
| Expr *pExpr, /* The expression to extract a value from */
|
| - u8 affinity, /* Affinity to use */
|
| + int nElem, /* Maximum number of values to append */
|
| int iVal, /* Array element to populate */
|
| - int *pbOk /* OUT: True if value was extracted */
|
| + int *pnExtract /* OUT: Values appended to the record */
|
| ){
|
| - int rc;
|
| - sqlite3_value *pVal = 0;
|
| - struct ValueNewStat4Ctx alloc;
|
| + int rc = SQLITE_OK;
|
| + int nExtract = 0;
|
|
|
| - alloc.pParse = pParse;
|
| - alloc.pIdx = pIdx;
|
| - alloc.ppRec = ppRec;
|
| - alloc.iVal = iVal;
|
| + if( pExpr==0 || pExpr->op!=TK_SELECT ){
|
| + int i;
|
| + struct ValueNewStat4Ctx alloc;
|
| +
|
| + alloc.pParse = pParse;
|
| + alloc.pIdx = pIdx;
|
| + alloc.ppRec = ppRec;
|
| +
|
| + for(i=0; i<nElem; i++){
|
| + sqlite3_value *pVal = 0;
|
| + Expr *pElem = (pExpr ? sqlite3VectorFieldSubexpr(pExpr, i) : 0);
|
| + u8 aff = sqlite3IndexColumnAffinity(pParse->db, pIdx, iVal+i);
|
| + alloc.iVal = iVal+i;
|
| + rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc, &pVal);
|
| + if( !pVal ) break;
|
| + nExtract++;
|
| + }
|
| + }
|
|
|
| - rc = stat4ValueFromExpr(pParse, pExpr, affinity, &alloc, &pVal);
|
| - assert( pVal==0 || pVal->db==pParse->db );
|
| - *pbOk = (pVal!=0);
|
| + *pnExtract = nExtract;
|
| return rc;
|
| }
|
|
|
| @@ -1643,7 +1633,7 @@ int sqlite3Stat4Column(
|
| if( iField>nRec ) return SQLITE_CORRUPT_BKPT;
|
| if( pMem==0 ){
|
| pMem = *ppVal = sqlite3ValueNew(db);
|
| - if( pMem==0 ) return SQLITE_NOMEM;
|
| + if( pMem==0 ) return SQLITE_NOMEM_BKPT;
|
| }
|
| sqlite3VdbeSerialGet(&a[iField-szField], t, pMem);
|
| pMem->enc = ENC(db);
|
|
|