]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Handle transient malloc() failures in sqlite3CreateFunc(). (CVS 4371)
authordanielk1977 <danielk1977@noemail.net>
Mon, 3 Sep 2007 11:04:22 +0000 (11:04 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Mon, 3 Sep 2007 11:04:22 +0000 (11:04 +0000)
FossilOrigin-Name: c0ce63196458c81e0859fc8a38f2dd2145a580bc

manifest
manifest.uuid
src/func.c
src/main.c
src/test1.c
test/func.test
test/malloc.test
test/malloc5.test

index 85ccf2c81df5da7e76ea69725435b02b7579b5c0..9fe44c0c77323e09eba2226c580170b1dd50a65e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fixes\sto\stest\scode\sso\sthat\sthe\stest\ssuite\spasses\swithout\sSQLITE_MEMDEBUG\sdefined.\s(CVS\s4370)
-D 2007-09-03T07:31:10
+C Handle\stransient\smalloc()\sfailures\sin\ssqlite3CreateFunc().\s(CVS\s4371)
+D 2007-09-03T11:04:22
 F Makefile.in bfcc303429a5d9dcd552d807ee016c77427418c3
 F Makefile.linux-gcc 65241babba6faf1152bf86574477baab19190499
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -91,7 +91,7 @@ F src/date.c af235f38f50809abd0a96da3bb3e0cc32be6226e
 F src/delete.c 849846d06d29851dde0d9f424a5de5817eb140d1
 F src/experimental.c 1b2d1a6cd62ecc39610e97670332ca073c50792b
 F src/expr.c 7853a8161ec0b0fce62fc8da921db557899f1ec1
-F src/func.c 7c59882c72b2a2b7bf5a2e121f0727e7527bf7cd
+F src/func.c 9d88141c4cffb3a04719e5a0fda65cde34bfa1e5
 F src/hash.c 8fe2fa52bd17869c87748e42cff5b1e7fbf90822
 F src/hash.h 3ad3da76bfb954978d227bf495568b0e6da2c19e
 F src/insert.c b11e5ca0d68bf2a7a56f47a052a0ee67dd4e2f89
@@ -99,7 +99,7 @@ F src/journal.c 63f8a40827e871997272eb2598f5cd9e66aa0947
 F src/legacy.c 4ac53191fad2e3c4d59bde1228879b2dc5a96d66
 F src/limits.h 71ab25f17e35e0a9f3f6f234b8ed49cc56731d35
 F src/loadext.c 6894dbbf1666577d957922811620375d6c2f058d
-F src/main.c c271d9104b6bff13d2ddd9a72fcf0926e635a9fd
+F src/main.c 04191005169375a45a8ef2afe9596d3bda8194b2
 F src/malloc.c de4e77fe70a9a0ac47a1c3a874422b107231bf31
 F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217
 F src/mem1.c 1f85902b98b38bd8a8b0c24012933957256db13e
@@ -136,7 +136,7 @@ F src/sqliteInt.h adc8a20e80ccf9eef24cc32f241a3427915a136e
 F src/sqliteLimit.h 1bcbbdfa856f8b71b561abb31edb864b0eca1d12
 F src/table.c 1aeb9eab57b4235db86fe15a35dec76fb445a9c4
 F src/tclsqlite.c 8db035768623779c97d0509eb88ecbb49c51abca
-F src/test1.c f43580b00e3f764015acd52892690ee4f28ce775
+F src/test1.c 6103787d839c2056a42b88082b53d0b79f62285d
 F src/test2.c 4ab230fbdc0decfa7422f6a052b609ba54f4dfac
 F src/test3.c 199a440ba2b38b26251393b609451a3484a15907
 F src/test4.c c2c0f5dc907f1346f5d4b65eb5799f11eb9e4071
@@ -302,7 +302,7 @@ F test/fts3an.test 2da4df52fe8ea8389f6fa7a01e4c1a0f091118d6
 F test/fts3ao.test 0aa29dd4fc1c8d46b1f7cfe5926f7ac97551bea9
 F test/fts3atoken.test 25c2070e1e8755d414bf9c8200427b277a9f99fa
 F test/fts3b.test 94cd8a2fb709c99c1617df01f6908de77892d8bc
-F test/func.test 605989453d1b42cec1d05c17aa232dc98e3e04e6
+F test/func.test 71b39d44a0dffe123145b7c2973e8c4fb8a67ffd
 F test/fuzz.test 62fc19dd36a427777fd671b569df07166548628a
 F test/fuzz2.test ea38692ce2da99ad79fe0be5eb1a452c1c4d37bb
 F test/fuzz_common.tcl ff4bc2dfc465f6878f8e2d819620914365382731
@@ -345,11 +345,11 @@ F test/lock2.test 5f9557b775662c2a5ee435378f39e10d64f65cb3
 F test/lock3.test 615111293cf32aa2ed16d01c6611737651c96fb9
 F test/lock4.test 49e22396b9be6e047b3d35469f233be79153c9d5
 F test/main.test 913427b847c6cfba055c9d0629f7479f51ba1a48
-F test/malloc.test 52306f056e7359e68ed2e204f37f47a0e2020c57
+F test/malloc.test bb1c95fb536cfefd3a5b4ce8ca1d4c99e73b1e33
 F test/malloc2.test c1a74f46a3581b56df29ff46a4e1c99b41c44ad9
 F test/malloc3.test 39b72b04436a81e0c3d548d195f8bdbf1ebf4b52
 F test/malloc4.test 2691bdd25fc764449051b2098692e739555246a7
-F test/malloc5.test 9db9205a5d444e23043368f961f92641c7770199
+F test/malloc5.test 4ff75206deb43120a6fc686220db13b45b9f76c7
 F test/malloc6.test 3733b9bd4e039c3239f869c40edbb88172025e2e
 F test/malloc7.test dd66d8f82916becf1d29b6640e4f4855485570f8
 F test/malloc8.test 5ff95278bc73e815e295971afcdd175f6ba19258
@@ -568,7 +568,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 4a9999a36d01a8c6490792605a6f7e233cc4402c
-R 7d21bfe5332f51fbfd47107d9eb37c68
+P ed2a2e0102c4fd2221096028d55a6f1d54f97274
+R a8071f6051ea0c2f23cdc36ae305ef4b
 U danielk1977
-Z 34ef56b14cc4c07e252ab613eb7ad3cf
+Z fb15b228bac149e738b86ec4993bbe7d
index 06992977b676acc89d828095020a2b8648436c5c..47846f5dc21cc6dd3a628bfcf36521847cbaea83 100644 (file)
@@ -1 +1 @@
-ed2a2e0102c4fd2221096028d55a6f1d54f97274
\ No newline at end of file
+c0ce63196458c81e0859fc8a38f2dd2145a580bc
\ No newline at end of file
index 334dfd9fb7a49c1dc72363575091e93ed3447ee2..1760626ff2b7af97979cb6beaf0b81aa85df50ce 100644 (file)
@@ -16,7 +16,7 @@
 ** sqliteRegisterBuildinFunctions() found at the bottom of the file.
 ** All other code has file scope.
 **
-** $Id: func.c,v 1.173 2007/09/01 17:00:13 danielk1977 Exp $
+** $Id: func.c,v 1.174 2007/09/03 11:04:22 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -1133,17 +1133,17 @@ static void test_auxdata(
       if( zAux ){
         zRet[i*2] = '1';
         if( strcmp(zAux, z) ){
-          free_test_auxdata((void *)zRet);
           sqlite3_result_error(pCtx, "Auxilary data corruption", -1);
           return;
         }
-      }else{
+      }else {
         zRet[i*2] = '0';
-        zAux = contextMalloc(pCtx, strlen(z)+1);
-        if( zAux ){
-          strcpy(zAux, z);
-          sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
-        }
+      }
+
+      zAux = contextMalloc(pCtx, strlen(z)+1);
+      if( zAux ){
+        strcpy(zAux, z);
+        sqlite3_set_auxdata(pCtx, i, zAux, free_test_auxdata);
       }
       zRet[i*2+1] = ' ';
     }
index 803a30333d516e3cc89e545544273a51cfb1b2e5..51ed40d998e550496f7575f491a4754398b8bfa0 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.402 2007/09/01 06:51:28 danielk1977 Exp $
+** $Id: main.c,v 1.403 2007/09/03 11:04:22 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -511,14 +511,16 @@ int sqlite3CreateFunc(
   }
 
   p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1);
-  if( p ){
-    p->flags = 0;
-    p->xFunc = xFunc;
-    p->xStep = xStep;
-    p->xFinalize = xFinal;
-    p->pUserData = pUserData;
-    p->nArg = nArg;
+  assert(p || db->mallocFailed);
+  if( !p ){
+    return SQLITE_NOMEM;
   }
+  p->flags = 0;
+  p->xFunc = xFunc;
+  p->xStep = xStep;
+  p->xFinalize = xFinal;
+  p->pUserData = pUserData;
+  p->nArg = nArg;
   return SQLITE_OK;
 }
 
index 1baee9866b9e6c10186b088ec01052d6e03af6d1..72ff8bb8fd952a3b7af201771ec27297827531a1 100644 (file)
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test1.c,v 1.274 2007/09/01 11:04:26 danielk1977 Exp $
+** $Id: test1.c,v 1.275 2007/09/03 11:04:22 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include "tcl.h"
@@ -1012,12 +1012,24 @@ static void t1CountFinalize(sqlite3_context *context){
   }
 }
 
+static void legacyCountStep(
+  sqlite3_context *context,
+  int argc,
+  sqlite3_value **argv
+){
+  /* no-op */
+}
+static void legacyCountFinalize(sqlite3_context *context){
+  sqlite3_result_int(context, sqlite3_aggregate_count(context));
+}
+
 /*
-** Usage:  sqlite_test_create_aggregate DB
+** Usage:  sqlite3_create_aggregate DB
 **
 ** Call the sqlite3_create_function API on the given database in order
-** to create a function named "x_count".  This function does the same thing
-** as the "md5sum" function.
+** to create a function named "x_count".  This function is similar
+** to the built-in count() function, with a few special quirks
+** for testing the sqlite3_result_error() APIs.
 **
 ** The original motivation for this routine was to be able to call the
 ** sqlite3_create_aggregate function while a query is in progress in order
@@ -1025,6 +1037,10 @@ static void t1CountFinalize(sqlite3_context *context){
 **
 ** This routine was later extended to test the use of sqlite3_result_error()
 ** within aggregate functions.
+**
+** Later: It is now also extended to register the aggregate function
+** "legacy_count()" with the supplied database handle. This is used
+** to test the deprecated sqlite3_aggregate_count() API.
 */
 static int test_create_aggregate(
   void *NotUsed,
@@ -1043,10 +1059,16 @@ static int test_create_aggregate(
   rc = sqlite3_create_function(db, "x_count", 0, SQLITE_UTF8, 0, 0,
       t1CountStep,t1CountFinalize);
   if( rc==SQLITE_OK ){
-    sqlite3_create_function(db, "x_count", 1, SQLITE_UTF8, 0, 0,
+    rc = sqlite3_create_function(db, "x_count", 1, SQLITE_UTF8, 0, 0,
         t1CountStep,t1CountFinalize);
   }
+  if( rc==SQLITE_OK ){
+    rc = sqlite3_create_function(db, "legacy_count", 0, SQLITE_ANY, 0, 0,
+        legacyCountStep, legacyCountFinalize
+    );
+  }
   if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR;
+  Tcl_SetResult(interp, (char *)t1ErrorName(rc), 0);
   return TCL_OK;
 }
 
index a5774d813003f3418ef3e35b7a45539c243f640c..2df2a2ead68ff559caa6545a77bfe18e536e464c 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing built-in functions.
 #
-# $Id: func.test,v 1.67 2007/05/15 18:35:21 drh Exp $
+# $Id: func.test,v 1.68 2007/09/03 11:04:22 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -870,4 +870,13 @@ do_test func-22.22 {
   execsql {SELECT typeof(trim('hello',NULL));}
 } {null}
 
+# This is to test the deprecated sqlite3_aggregate_count() API.
+#
+do_test func-23.1 {
+  sqlite3_create_aggregate db
+  execsql {
+    SELECT legacy_count() FROM t6;
+  }
+} {3}
+
 finish_test
index de81cf7202150860618a3a19a967c0501595969d..59ac5398a790e3a8c05cf06c7805182ce0799d22 100644 (file)
@@ -16,7 +16,7 @@
 # to see what happens in the library if a malloc were to really fail
 # due to an out-of-memory situation.
 #
-# $Id: malloc.test,v 1.45 2007/08/29 12:31:29 danielk1977 Exp $
+# $Id: malloc.test,v 1.46 2007/09/03 11:04:22 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -259,6 +259,9 @@ do_malloc_test 10 -sqlprep {
 # sqlite3_create_function().
 do_malloc_test 11 -tclbody {
   set rc [sqlite3_create_function db]
+  if {[string match $rc SQLITE_OK]} {
+    set rc [sqlite3_create_aggregate db]
+  }
   if {[string match $rc SQLITE_NOMEM]} {
     error "out of memory"
   }
index 3d8af2d3fe33eeaf318338ec3a7c196c8445c570..f18ea26ba925c81269ab397854fc8707ea1f0a6e 100644 (file)
@@ -12,7 +12,7 @@
 # This file contains test cases focused on the two memory-management APIs, 
 # sqlite3_soft_heap_limit() and sqlite3_release_memory().
 #
-# $Id: malloc5.test,v 1.14 2007/08/28 08:00:18 danielk1977 Exp $
+# $Id: malloc5.test,v 1.15 2007/09/03 11:04:22 danielk1977 Exp $
 
 #---------------------------------------------------------------------------
 # NOTES ON EXPECTED BEHAVIOUR
@@ -298,8 +298,9 @@ do_test malloc5-6.1.1 {
   } 
   copy_file test.db test2.db
   sqlite3 db2 test2.db
-  list [expr [file size test.db]/1024] [expr [file size test2.db]/1024]
-} {23 23}
+  list \
+    [expr ([file size test.db]/1024)>20] [expr ([file size test2.db]/1024)>20]
+} {1 1}
 do_test malloc5-6.1.2 {
   list [execsql {PRAGMA cache_size}] [execsql {PRAGMA cache_size} db2]
 } {10 10}