]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix valueFromExpr() so that it returns SQLITE_NOMEM following an OOM when
authordrh <drh@noemail.net>
Fri, 16 Aug 2013 14:49:00 +0000 (14:49 +0000)
committerdrh <drh@noemail.net>
Fri, 16 Aug 2013 14:49:00 +0000 (14:49 +0000)
changing text encodings.  Also fix some asserts to accommodate OOM errors.

FossilOrigin-Name: dc1ccd09c443cebc4731dbe1a0dea84a9ccf6a9b

manifest
manifest.uuid
src/vdbemem.c
src/where.c

index 2f0577a5e23d009928d3e1c18fca377b96de16d6..d3b84aa06c16ae2f1ecc690b427d4d66983e1a7e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sextra\stests.\sNo\scode\schanges.
-D 2013-08-16T14:23:02.198
+C Fix\svalueFromExpr()\sso\sthat\sit\sreturns\sSQLITE_NOMEM\sfollowing\san\sOOM\swhen\nchanging\stext\sencodings.\s\sAlso\sfix\ssome\sasserts\sto\saccommodate\sOOM\serrors.
+D 2013-08-16T14:49:00.182
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -283,14 +283,14 @@ F src/vdbeInt.h e9b7c6b165a31a4715c5aa97223d20d265515231
 F src/vdbeapi.c 4d13580bd058b39623e8fcfc233b7df4b8191e8b
 F src/vdbeaux.c a6ea36a9dc714e1128a0173249a0532ddcab0489
 F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69
-F src/vdbemem.c c08dd81009fd6708dbb961d8ec7f82549765d680
+F src/vdbemem.c 374c2c80202db87032800653361a63681176e6aa
 F src/vdbesort.c 3937e06b2a0e354500e17dc206ef4c35770a5017
 F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
 F src/vtab.c 2e8b489db47e20ae36cd247932dc671c9ded0624
 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
-F src/where.c d97b5cb215c2e3e5b172b84000d2f3ee67ca0e86
+F src/where.c 9be69c42a02376c46d44907b38edd70f8a2cea7a
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
@@ -1107,7 +1107,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 9f85b6a52a0b9b1524daa6f24d85257e7f591e95
-R 236823b823655ed29e083b8eac1f75f3
-U dan
-Z b297cf1029f061cc4748c85c1d9ef2e3
+P 949127d53e0a907ed6f73c6828637d94b265468c
+R 48e5653eb5a198286249664d90ff2dc2
+U drh
+Z c981aacf279c866f9ae15fcea49df2b7
index 070ba78f13a0dc0663e5bcb7c0210075b7b6326c..b169310d7ed452d6505d63b6cdd8c71771f49542 100644 (file)
@@ -1 +1 @@
-949127d53e0a907ed6f73c6828637d94b265468c
\ No newline at end of file
+dc1ccd09c443cebc4731dbe1a0dea84a9ccf6a9b
\ No newline at end of file
index b75e86b0354d2557d536c0c424156ce9e12bc56f..109db96acebf0393e8d567b088e7ba3e141f190c 100644 (file)
@@ -1091,6 +1091,7 @@ int valueFromExpr(
   sqlite3_value *pVal = 0;
   int negInt = 1;
   const char *zNeg = "";
+  int rc = SQLITE_OK;
 
   if( !pExpr ){
     *ppVal = 0;
@@ -1137,7 +1138,7 @@ int valueFromExpr(
     }
     if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str;
     if( enc!=SQLITE_UTF8 ){
-      sqlite3VdbeChangeEncoding(pVal, enc);
+      rc = sqlite3VdbeChangeEncoding(pVal, enc);
     }
   }else if( op==TK_UMINUS ) {
     /* This branch happens for multiple negative signs.  Ex: -(-5) */
@@ -1178,7 +1179,7 @@ int valueFromExpr(
     sqlite3VdbeMemStoreType(pVal);
   }
   *ppVal = pVal;
-  return SQLITE_OK;
+  return rc;
 
 no_mem:
   db->mallocFailed = 1;
index 3b9d0239385bd6d255ea91c43fcec81aed046ffe..5180d9e166643998c38a859abd88312852f82ed2 100644 (file)
@@ -2440,14 +2440,17 @@ static void whereKeyStats(
   if( res==0 ){
     /* If (res==0) is true, then sample $i must be equal to pRec */
     assert( i<pIdx->nSample );
-    assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) );
+    assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)
+         || pParse->db->mallocFailed );
   }else{
     /* Otherwise, pRec must be smaller than sample $i and larger than
     ** sample ($i-1).  */
     assert( i==pIdx->nSample 
-         || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 );
+         || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0
+         || pParse->db->mallocFailed );
     assert( i==0
-         || sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 );
+         || sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0
+         || pParse->db->mallocFailed );
   }
 #endif /* ifdef SQLITE_DEBUG */