-C Allow\sVACUUM\sto\sdetach\sthe\sauxillary\sdatabase\safter\smalloc()\sfails.\s(CVS\s2804)
-D 2005-12-06T17:48:32
+C Add\ssome\stests\sfor\smalloc()\sfailure\swithin\sthe\scolumn_name()\sand\scolumn_decl()\sAPIs.\s(CVS\s2805)
+D 2005-12-07T06:27:44
F Makefile.in e3c6b3a38d734d41574c04f2fc90d18de2b87102
F Makefile.linux-gcc aee18d8a05546dcf1888bd4547e442008a49a092
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
F src/sqlite.h.in 8e648e1f386e4509f2f96c09ded7c07b0df0c9a2
F src/sqliteInt.h bbc310a83a32476aa960055a166af4a0ef503a79
F src/table.c 486dcfce532685b53b5a2b5da8bba0ded6fb2316
-F src/tclsqlite.c a497c3adfd2c85da6a934331ec0041e47884fbcb
+F src/tclsqlite.c 328060916c24d328cfab1622c9a0e7ad57c2da8c
F src/test1.c 0b4bf8ab9afb37f34a83c46f81de54adf519b23d
F src/test2.c 36390cdfc70c08e5ee0b466d0654a117f398bbff
F src/test3.c f4e6a16a602091696619a1171bda25c0e3df49f7
F src/vdbe.c 7f4a2affee140b7b57952ab2c081a9c22b950638
F src/vdbe.h 8729a4ee16ff9aeab2af9667df3cf300ff978e13
F src/vdbeInt.h 0055c37eccbf3a189fd893a90f8eb6a5fa60c871
-F src/vdbeapi.c 4fd33e87aa6cbd77e59da142e1df67ec0430225f
+F src/vdbeapi.c b80b3a1e8bf7866d96ca76d91bba979155bace57
F src/vdbeaux.c 90143aaffbe232a700fd05e4b2e7428d512b605b
F src/vdbefifo.c 9efb94c8c3f4c979ebd0028219483f88e57584f5
-F src/vdbemem.c cd9609c1e7f71ec76d9840c84c3a57ebfa6539cf
-F src/where.c c0882f2d42e636f78fb45b9279e2739d4291e6ab
+F src/vdbemem.c 1c70555d615c6001c4490dedb6a62cb2884b92ff
+F src/where.c 269569f380ddc018518f67765fe2f0d3c8760e28
F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
F test/all.test 7f0988442ab811dfa41793b5b550f5828ce316f3
F test/alter.test 9d6837a3d946b73df692b7cef2a7644d2e2f6bc6
F test/main.test b12f01d49a5c805a33fa6c0ef168691f63056e79
F test/malloc.test a5ed721cf7d1b12602ede4f98c11b65ab1582cc0
F test/malloc2.test e6e321db96d6c94cb18bf82ad7215070c41e624e
-F test/malloc3.test 1c7eebb2cf0f1fb1fbcaa1d6b3f25767c55aa6c9
+F test/malloc3.test 0d60a9d19196581e9279c2d040bebd8162ab495b
+F test/malloc4.test 593ae91bf69ab5abc68f7652e679e5d207e23166
F test/manydb.test d81debbf5871242e3b5df1d3bb5e14c50431b6f8
F test/memdb.test 1860e060be810bf0775bc57408a5b7c4954bcaea
F test/memleak.test df2b2b96e77f8ba159a332299535b1e5f18e49ac
F test/pragma.test 95ea907adf68459e1be6f310c9ae94d1d59c465b
F test/printf.test 9e10c74e16bf889f8495ddb3d6f5f891e75ff1b7
F test/progress.test 16496001da445e6534afb94562c286708316d82f x
-F test/quick.test a94d12658a2b590c1a5be580bef09bbb04c1266b
+F test/quick.test 84138c0fcc959a5e7761625aa52d37d55e56b748
F test/quote.test 5891f2338980916cf7415484b4ce785294044adb
F test/reindex.test 38b138abe36bf9a08c791ed44d9f76cd6b97b78b
F test/rollback.test 94cd981ee3a627d9f6466f69dcf1f7dbfe695d7a
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 5e04ec694add7a8331e3d6fbdfcaed51349ae7bc
-R f7226b3a88877e57bdcf4f6eccd9d5fd
+P 6824a78bc7b8582fc5c3a6ab05dd3ed996fc99b3
+R 531cb0ab110be0b71cbe712b6392904d
U danielk1977
-Z 48f4477e2bf6d1e22b59c59df71537c6
+Z 7e47f34607634a7d8a9c0da4aab29935
-6824a78bc7b8582fc5c3a6ab05dd3ed996fc99b3
\ No newline at end of file
+78f10ca0a6a02e9e8e6811489841a19e213f3afb
\ No newline at end of file
*************************************************************************
** A TCL Interface to SQLite
**
-** $Id: tclsqlite.c,v 1.134 2005/11/26 00:25:03 drh Exp $
+** $Id: tclsqlite.c,v 1.135 2005/12/07 06:27:44 danielk1977 Exp $
*/
#ifndef NO_TCL /* Omit this whole file if TCL is unavailable */
}
default: {
int bytes = sqlite3_value_bytes(pIn);
- pVal = Tcl_NewStringObj(sqlite3_value_text(pIn), bytes);
+ pVal = Tcl_NewStringObj((char *)sqlite3_value_text(pIn), bytes);
break;
}
}
Tcl_GetWideIntFromObj(0, pVar, &v);
sqlite3_result_int64(context, v);
}else{
- data = Tcl_GetStringFromObj(pVar, &n);
- sqlite3_result_text(context, data, n, SQLITE_TRANSIENT);
+ data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
+ sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT);
}
}
}
Tcl_GetWideIntFromObj(interp, pVar, &v);
sqlite3_bind_int64(pStmt, i, v);
}else{
- data = Tcl_GetStringFromObj(pVar, &n);
- sqlite3_bind_text(pStmt, i, data, n, SQLITE_STATIC);
+ data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
+ sqlite3_bind_text(pStmt, i, (char *)data, n, SQLITE_STATIC);
Tcl_IncrRefCount(pVar);
apParm[nParm++] = pVar;
}
break;
}
default: {
- pVal = dbTextToObj(sqlite3_column_text(pStmt, i));
+ pVal = dbTextToObj((char *)sqlite3_column_text(pStmt, i));
break;
}
}
return sqlite3VdbeIntValue((Mem*)pVal);
}
const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
- return (const char *)sqlite3ValueText(pVal, SQLITE_UTF8);
+ return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
}
#ifndef SQLITE_OMIT_UTF16
const void *sqlite3_value_text16(sqlite3_value* pVal){
const void *(*xFunc)(Mem*),
int useType
){
+ const void *ret;
Vdbe *p = (Vdbe *)pStmt;
int n = sqlite3_column_count(pStmt);
return 0;
}
N += useType*n;
- return xFunc(&p->aColName[N]);
+ ret = xFunc(&p->aColName[N]);
+
+ /* A malloc may have failed inside of the xFunc() call. If this is the case,
+ ** clear the mallocFailed flag and return NULL.
+ */
+ sqlite3ClearMallocFailed();
+ return ret;
}
#ifdef SQLITE_OMIT_UTF16
return SQLITE_ERROR;
#else
+
+ /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned,
+ ** then the encoding of the value may not have changed.
+ */
rc = sqlite3VdbeMemTranslate(pMem, desiredEnc);
+ assert(rc==SQLITE_OK || rc==SQLITE_NOMEM);
+ assert(rc==SQLITE_OK || pMem->enc!=desiredEnc);
+ assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc);
+
if( rc==SQLITE_NOMEM ){
+/*
sqlite3VdbeMemRelease(pMem);
pMem->flags = MEM_Null;
pMem->z = 0;
+*/
}
return rc;
#endif
}else if( !(pVal->flags&MEM_Blob) ){
sqlite3VdbeMemStringify(pVal, enc);
}
- return (const void *)(pVal->z);
+ assert(pVal->enc==enc || sqlite3Tsd()->mallocFailed);
+ return (const void *)(pVal->enc==enc ? (pVal->z) : 0);
}
/*
** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer".
**
-** $Id: where.c,v 1.186 2005/12/06 12:53:01 danielk1977 Exp $
+** $Id: where.c,v 1.187 2005/12/07 06:27:44 danielk1977 Exp $
*/
#include "sqliteInt.h"
return 0;
}
sqlite3DequoteExpr(pRight);
- z = pRight->token.z;
+ z = (char *)pRight->token.z;
for(cnt=0; (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2]; cnt++){}
if( cnt==0 || 255==(u8)z[cnt] ){
return 0;
#
#***********************************************************************
#
-# $Id: malloc3.test,v 1.2 2005/12/06 17:48:32 danielk1977 Exp $
+# This file contains tests to ensure that the library handles malloc() failures
+# correctly. The emphasis of these tests are the _prepare(), _step() and
+# _finalize() calls.
+#
+# $Id: malloc3.test,v 1.3 2005/12/07 06:27:45 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
} {a b c a b c 1 2 3 1 2 3}
}
-# Test a simple multi-file transaction
+# Test a simple multi-file transaction
#
file delete -force test2.db
SQL {ATTACH 'test2.db' AS aux;}
--- /dev/null
+# 2005 November 30
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# This file contains tests to ensure that the library handles malloc() failures
+# correctly. The emphasis in this file is on sqlite3_column_XXX() APIs.
+#
+# $Id: malloc4.test,v 1.1 2005/12/07 06:27:45 danielk1977 Exp $
+
+#---------------------------------------------------------------------------
+# NOTES ON EXPECTED BEHAVIOUR
+#
+#---------------------------------------------------------------------------
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+# Only run these tests if memory debugging is turned on.
+if {[info command sqlite_malloc_stat]==""} {
+ puts "Skipping malloc tests: not compiled with -DSQLITE_MEMDEBUG..."
+ finish_test
+ return
+}
+
+
+proc do_stmt_test {id sql} {
+ set ::sql $sql
+ set go 1
+ for {set n 1} {$go} {incr n} {
+ set testid "malloc4-$id.(iFail $n)"
+
+ # Prepare the statement
+ do_test ${testid}.1 {
+ set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
+ expr [string length $::STMT] > 0
+ } {1}
+
+ # Set the Nth malloc() to fail.
+ sqlite_malloc_fail $n
+
+ # Test malloc failure in the _name(), _name16(), decltype() and
+ # decltype16() APIs. Calls that occur after the malloc() failure should
+ # return NULL. No error is raised though.
+ do_test ${testid}.2.1 {
+ set mf1 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ set ::name8 [sqlite3_column_name $::STMT 0]
+ set mf2 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ expr {$mf1 == $mf2 || $::name8 == ""}
+ } {1}
+ do_test ${testid}.2.2 {
+ set mf1 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ set ::name16 [sqlite3_column_name16 $::STMT 0]
+ set ::name16 [encoding convertfrom unicode $::name16]
+ set ::name16 [string range $::name16 0 end-1]
+ set mf2 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ expr {$mf1 == $mf2 || $::name16 == ""}
+ } {1}
+ do_test ${testid}.2.3 {
+ set mf1 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ set ::name8_2 [sqlite3_column_name $::STMT 0]
+ set mf2 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ expr {$mf1 == $mf2 || $::name8_2 == ""}
+ } {1}
+ set ::mallocFailed [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+ do_test ${testid}.2.4 {
+ expr {
+ $::name8 == $::name8_2 && $::name16 == $::name8 && !$::mallocFailed ||
+ $::name8 == $::name8_2 && $::name16 == "" && $::mallocFailed ||
+ $::name8 == $::name16 && $::name8_2 == "" && $::mallocFailed ||
+ $::name8_2 == $::name16 && $::name8 == "" && $::mallocFailed
+ }
+ } {1}
+
+ if {$::mallocFailed == 0} {
+ sqlite_malloc_fail 0
+ set go 0
+ }
+
+if 0 {
+ # Test that if a malloc() failed the next call to sqlite3_step() returns
+ # SQLITE_ERROR. If malloc() did not fail, it should return SQLITE_ROW.
+ #
+ # Before running sqlite3_step(), make sure that malloc() is not about to
+ # fail. Memory allocation failures that occur within sqlite3_step() are
+ # tested elsewhere.
+ do_test ${testid}.3 {
+ set rc [sqlite3_step $::STMT]
+ list [expr $rc=="SQLITE_ERROR"] [expr $rc=="SQLITE_ROW"]
+ } [list $mallocFailed [expr !$mallocFailed]]
+}
+
+ do_test ${testid}.4 {
+ sqlite3_finalize $::STMT
+ } {SQLITE_OK}
+ }
+}
+
+execsql {
+ CREATE TABLE tbl(
+ the_first_reasonably_long_column_name that_also_has_quite_a_lengthy_type
+ );
+}
+do_stmt_test 1 "SELECT * FROM tbl"
+
+sqlite_malloc_fail 0
+finish_test
+
-# 2001 September 15
-#
-# The author disclaims copyright to this source code. In place of
-# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
#***********************************************************************
# This file runs all tests.
#
-# $Id: quick.test,v 1.36 2005/03/29 08:26:13 danielk1977 Exp $
+# $Id: quick.test,v 1.37 2005/12/07 06:27:45 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
crash.test
malloc.test
malloc2.test
+ malloc3.test
+ malloc4.test
memleak.test
misuse.test
quick.test