-C Test\ssuite\sfixes\sfor\sbuilds\sthat\sdefine\sOMIT\ssymbols.\s(CVS\s2962)
-D 2006-01-17T09:35:02
+C Various\sfixes\sthat\sallow\sthe\smalloc()\sfailure\stests\sto\spass\sagain.\s(CVS\s2963)
+D 2006-01-17T13:21:40
F Makefile.in ab3ffd8d469cef4477257169b82810030a6bb967
F Makefile.linux-gcc aee18d8a05546dcf1888bd4547e442008a49a092
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc
F sqlite3.def f756049b1bf3e8442baf6862db393ca423225262
F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a
-F src/alter.c 4139c8f1d0f12b1759e767b1d09dd594e2b5ac1d
+F src/alter.c f1b66e9a6d606450d6e8fc23e2a96cd84666fdd3
F src/analyze.c 7d2b7ab9a9c2fd6e55700f69064dfdd3e36d7a8a
-F src/attach.c d4b9d8bd71d72409720946355be41cafb6c09079
+F src/attach.c a447b4672a5125abc4ee27df10621abd84d18301
F src/auth.c 9ae84d2d94eb96195e04515715e08e85963e96c2
F src/btree.c fcf6aec3b6a6df8130213a45f7b543e0a025be9d
F src/btree.h 5663c4f43e8521546ccebc8fc95acb013b8f3184
F src/build.c 539b5c6e21aa633e480ff97706f331baef1a859a
F src/callback.c ba3e6cc7a6beb562e7a66f92e26fabcb21aab1e2
F src/complete.c df1681cef40dec33a286006981845f87b194e7a4
-F src/date.c 5f5850c6b5da68fdc47d124573715ba948c9d8e0
+F src/date.c 2f148728b53675266cd9e1a873fd702929d3f4ee
F src/delete.c c7bd5708a629585e073ce34cf3b1fcb52c2fef38
F src/experimental.c 50c1e3b34f752f4ac10c36f287db095c2b61766d
F src/expr.c f885cfe73fb235635fba72e78bb858c64529771f
-F src/func.c be4c026c1d2401f14c3186611e1131a895a3ca6e
+F src/func.c 96b26601c092b7b43a13e440e3f988b32a385f6a
F src/hash.c 8747cf51d12de46512880dfcf1b68b4e24072863
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
F src/insert.c a5595cf8d1d8ba087b676a63f1f7277ea44b5ac1
F src/legacy.c 9bf7ee1b63c99aac6669533986a5240b16101458
-F src/main.c 39d073fb1f95f874ee0c98366e99005cf14742dd
+F src/main.c e934ce6ce3b7166ad98c2778160f865761196480
F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217
F src/os.c 1d1a61cdf150e9f9520a3bc787c8465148ea2e78
F src/os.h 9debc3d3ca4cdafde222a0ea74a4c8415aef4f22
F src/pager.h e0acb095b3ad0bca48f2ab00c87346665643f64f
F src/parse.y 83df51fea35f68f7e07384d75dce83d1ed30434c
F src/pragma.c 4496cc77dc35824e1c978c3d1413b8a5a4c777d3
-F src/prepare.c 368f5c04755f03dc04353513e6afcebb8ca8d53f
+F src/prepare.c 84c3cbca337a49133554108d748864c5e13aef34
F src/printf.c f47a2f4b5387cd2ebb12e9117a1a5d6bd9a2b812
F src/random.c d40f8d356cecbd351ccfab6eaedd7ec1b54f5261
F src/select.c 28d449c7762dd580aaba49a9c6c16e93ca951e49
F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
F src/shell.c 66b073375efbdee19045e7e0cd38b85f9aff71da
F src/sqlite.h.in 492580f7e3ff71eb43193eb7bb98e2d549889ce3
-F src/sqliteInt.h 730d071c5272726b5e507ef6d6dd14ccdb2744ae
+F src/sqliteInt.h 0d0c3b40827557597ba388b1ef782e28ea623d30
F src/table.c 486dcfce532685b53b5a2b5da8bba0ded6fb2316
F src/tclsqlite.c d650bea0248fc0a310ddc2cb94273a3a5021fddf
-F src/test1.c b138bf5943c3122093b605e2132cacb87f4ea037
+F src/test1.c 4dccd51f786f24d8f947f1028d840ab35f46d4de
F src/test2.c ca74a1d8aeb7d9606e8f6b762c5daf85c1a3f92b
F src/test3.c 9742aa146eb750cab81c1d5605286c3a0eb88054
F src/test4.c 6633cb7b4a7429e938804a34f688d118c8b7f8e1
F src/vdbe.c 3db9bfc86e71dc0758524fb82cfcfd4c30e92716
F src/vdbe.h 8729a4ee16ff9aeab2af9667df3cf300ff978e13
F src/vdbeInt.h 5451cf71f229e366ac543607c0a17f36e5737ea9
-F src/vdbeapi.c cac3f5bfb8ab9864ce5cea35eaae3d0d2efdc8ac
+F src/vdbeapi.c 9cc9b7a0fc65c29c7d249c0101897ff27eedffe8
F src/vdbeaux.c 723e0ec773aeec53e9448b2ac5b136677e64ece0
F src/vdbefifo.c 9efb94c8c3f4c979ebd0028219483f88e57584f5
F src/vdbemem.c dd08a0eea4868ac4a2d91fdec32424308b1db772
F test/lock2.test d83ba79d3c4fffdb5b926c7d8ca7a36c34288a55
F test/lock3.test 615111293cf32aa2ed16d01c6611737651c96fb9
F test/main.test b12f01d49a5c805a33fa6c0ef168691f63056e79
-F test/malloc.test 6245418d1b6635a2095d9ed0f5e84e029990da06
+F test/malloc.test 34c2c0ce7f45bc5fe2f7f3c0b911e505af66e27f
F test/malloc2.test e6e321db96d6c94cb18bf82ad7215070c41e624e
F test/malloc3.test 265644c655497242f7c0a1bb5b36c8500a5fc27c
F test/malloc4.test 2e29d155eb4b4808019ef47eeedfcbe9e09e0f05
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P c058f483a52c8043178b6329aa5e58bedf0c8277
-R c86983ffa2db3b82ac2e0f38dbf58ee1
+P 3a54a33dcb7e765ee3773397407e8929a8cfe1a9
+R 675b739278e2c68c1d8f47ad7192ced7
U danielk1977
-Z fc44b9175931850bbe296b28d7e15e37
+Z 76c8e3304de47e86266e4fd438942871
-3a54a33dcb7e765ee3773397407e8929a8cfe1a9
\ No newline at end of file
+0505405fb9ae1068b7976718efbf2aabd07592d4
\ No newline at end of file
** This file contains C code routines that used to generate VDBE code
** that implements the ALTER TABLE command.
**
-** $Id: alter.c,v 1.16 2006/01/11 21:41:21 drh Exp $
+** $Id: alter.c,v 1.17 2006/01/17 13:21:40 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
int i;
for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
+ sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0);
}
}
*************************************************************************
** This file contains code used to implement the ATTACH and DETACH commands.
**
-** $Id: attach.c,v 1.46 2006/01/11 21:41:22 drh Exp $
+** $Id: attach.c,v 1.47 2006/01/17 13:21:40 danielk1977 Exp $
*/
#include "sqliteInt.h"
*/
void sqlite3AttachFunctions(sqlite3 *db){
static const int enc = SQLITE_UTF8;
- sqlite3_create_function(db, "sqlite_attach", 3, enc, db, attachFunc, 0, 0);
- sqlite3_create_function(db, "sqlite_detach", 1, enc, db, detachFunc, 0, 0);
+ sqlite3CreateFunc(db, "sqlite_attach", 3, enc, db, attachFunc, 0, 0);
+ sqlite3CreateFunc(db, "sqlite_detach", 1, enc, db, detachFunc, 0, 0);
}
/*
** sqlite3RegisterDateTimeFunctions() found at the bottom of the file.
** All other code has file scope.
**
-** $Id: date.c,v 1.51 2006/01/15 00:13:16 drh Exp $
+** $Id: date.c,v 1.52 2006/01/17 13:21:40 danielk1977 Exp $
**
** NOTES:
**
int i;
for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
+ sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0);
}
#else
int i;
for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
- sqlite3_create_function(db, aFuncs[i].zName, 0, SQLITE_UTF8,
+ sqlite3CreateFunc(db, aFuncs[i].zName, 0, SQLITE_UTF8,
aFuncs[i].zFormat, currentTimeFunc, 0, 0);
}
#endif
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
**
-** $Id: func.c,v 1.116 2006/01/12 22:17:50 drh Exp $
+** $Id: func.c,v 1.117 2006/01/17 13:21:40 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
case 1: pArg = db; break;
case 2: pArg = (void *)(-1); break;
}
- sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg,
+ sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
aFuncs[i].eTextRep, pArg, aFuncs[i].xFunc, 0, 0);
if( aFuncs[i].needCollSeq ){
FuncDef *pFunc = sqlite3FindFunction(db, aFuncs[i].zName,
case 1: pArg = db; break;
case 2: pArg = (void *)(-1); break;
}
- sqlite3_create_function(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
+ sqlite3CreateFunc(db, aAggs[i].zName, aAggs[i].nArg, SQLITE_UTF8,
pArg, 0, aAggs[i].xStep, aAggs[i].xFinalize);
if( aAggs[i].needCollSeq ){
FuncDef *pFunc = sqlite3FindFunction( db, aAggs[i].zName,
}else{
pInfo = (struct compareInfo*)&likeInfoNorm;
}
- sqlite3_create_function(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
- sqlite3_create_function(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
- sqlite3_create_function(db, "glob", 2, SQLITE_UTF8,
+ sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
+ sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0);
+ sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
(struct compareInfo*)&globInfo, likeFunc, 0,0);
setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
setLikeOptFlag(db, "like",
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
-** $Id: main.c,v 1.323 2006/01/11 21:41:22 drh Exp $
+** $Id: main.c,v 1.324 2006/01/17 13:21:40 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
void sqlite3_free(char *p){ free(p); }
/*
-** Create new user functions.
+** This function is exactly the same as sqlite3_create_function(), except
+** that it is designed to be called by internal code. The difference is
+** that if a malloc() fails in sqlite3_create_function(), an error code
+** is returned and the mallocFailed flag cleared.
*/
-int sqlite3_create_function(
+int sqlite3CreateFunc(
sqlite3 *db,
const char *zFunctionName,
int nArg,
enc = SQLITE_UTF16NATIVE;
}else if( enc==SQLITE_ANY ){
int rc;
- rc = sqlite3_create_function(db, zFunctionName, nArg, SQLITE_UTF8,
+ rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8,
pUserData, xFunc, xStep, xFinal);
if( rc!=SQLITE_OK ) return rc;
- rc = sqlite3_create_function(db, zFunctionName, nArg, SQLITE_UTF16LE,
+ rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE,
pUserData, xFunc, xStep, xFinal);
if( rc!=SQLITE_OK ) return rc;
enc = SQLITE_UTF16BE;
if( db->activeVdbeCnt ){
sqlite3Error(db, SQLITE_BUSY,
"Unable to delete/modify user-function due to active statements");
+ assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
return SQLITE_BUSY;
}else{
sqlite3ExpirePreparedStatements(db);
}
p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1);
- if( p==0 ) return SQLITE_NOMEM;
- p->flags = 0;
- p->xFunc = xFunc;
- p->xStep = xStep;
- p->xFinalize = xFinal;
- p->pUserData = pUserData;
+ if( p ){
+ p->flags = 0;
+ p->xFunc = xFunc;
+ p->xStep = xStep;
+ p->xFinalize = xFinal;
+ p->pUserData = pUserData;
+ }
return SQLITE_OK;
}
+
+/*
+** Create new user functions.
+*/
+int sqlite3_create_function(
+ sqlite3 *db,
+ const char *zFunctionName,
+ int nArg,
+ int enc,
+ void *p,
+ void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
+ void (*xStep)(sqlite3_context*,int,sqlite3_value **),
+ void (*xFinal)(sqlite3_context*)
+){
+ int rc;
+ assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
+ rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal);
+
+ if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ sqlite3MallocClearFailed();
+ rc = SQLITE_NOMEM;
+ sqlite3Error(db, SQLITE_NOMEM, 0);
+ }
+ return rc;
+}
+
#ifndef SQLITE_OMIT_UTF16
int sqlite3_create_function16(
sqlite3 *db,
const void *zFunctionName,
int nArg,
int eTextRep,
- void *pUserData,
+ void *p,
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
void (*xFinal)(sqlite3_context*)
){
int rc;
char *zFunc8;
+ assert( !sqlite3ThreadDataReadOnly()->mallocFailed );
- if( sqlite3SafetyCheck(db) ){
- return SQLITE_MISUSE;
- }
zFunc8 = sqlite3utf16to8(zFunctionName, -1);
- if( !zFunc8 ){
- return SQLITE_NOMEM;
- }
- rc = sqlite3_create_function(db, zFunc8, nArg, eTextRep,
- pUserData, xFunc, xStep, xFinal);
+ rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal);
sqliteFree(zFunc8);
+
+ if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ sqlite3MallocClearFailed();
+ rc = SQLITE_NOMEM;
+ sqlite3Error(db, SQLITE_NOMEM, 0);
+ }
return rc;
}
#endif
*/
const char *sqlite3_errmsg(sqlite3 *db){
const char *z;
- if( sqlite3ThreadDataReadOnly()->mallocFailed ){
+ if( !db || sqlite3ThreadDataReadOnly()->mallocFailed ){
return sqlite3ErrStr(SQLITE_NOMEM);
}
if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0);
sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0);
-#if 0
- for(i=0; i<db->nDb; i++){
- sqlite3HashInit(&db->aDb[i].tblHash, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&db->aDb[i].idxHash, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&db->aDb[i].trigHash, SQLITE_HASH_STRING, 0);
- sqlite3HashInit(&db->aDb[i].aFKey, SQLITE_HASH_STRING, 1);
- }
-#endif
-
/* Add the default collation sequence BINARY. BINARY works for both UTF-8
** and UTF-16, so add a version for each to avoid any unnecessary
** conversions. The only error that can occur here is a malloc() failure.
** database schema yet. This is delayed until the first time the database
** is accessed.
*/
- sqlite3RegisterBuiltinFunctions(db);
- sqlite3Error(db, SQLITE_OK, 0);
+ if( !sqlite3ThreadDataReadOnly()->mallocFailed ){
+ sqlite3RegisterBuiltinFunctions(db);
+ sqlite3Error(db, SQLITE_OK, 0);
+ }
db->magic = SQLITE_MAGIC_OPEN;
opendb_out:
** interface, and routines that contribute to loading the database schema
** from disk.
**
-** $Id: prepare.c,v 1.23 2006/01/16 11:29:20 danielk1977 Exp $
+** $Id: prepare.c,v 1.24 2006/01/17 13:21:40 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "os.h"
}
zSql8 = sqlite3utf16to8(zSql, nBytes);
if( !zSql8 ){
+ sqlite3MallocClearFailed();
sqlite3Error(db, SQLITE_NOMEM, 0);
return SQLITE_NOMEM;
}
*************************************************************************
** Internal interface definitions for SQLite.
**
-** @(#) $Id: sqliteInt.h,v 1.469 2006/01/16 15:14:28 danielk1977 Exp $
+** @(#) $Id: sqliteInt.h,v 1.470 2006/01/17 13:21:40 danielk1977 Exp $
*/
#ifndef _SQLITEINT_H_
#define _SQLITEINT_H_
** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out
** feature.
*/
-#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
+#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
# define NDEBUG 1
#endif
Schema *sqlite3SchemaGet(Btree *);
int sqlite3SchemaToIndex(sqlite3 *db, Schema *);
KeyInfo *sqlite3IndexKeyinfo(Parse *, Index *);
+int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
+ void (*)(sqlite3_context*,int,sqlite3_value **),
+ void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*));
#ifndef SQLITE_OMIT_SHARED_CACHE
void sqlite3TableLock(Parse *, int, int, u8, const char *);
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
-** $Id: test1.c,v 1.192 2006/01/16 15:32:23 danielk1977 Exp $
+** $Id: test1.c,v 1.193 2006/01/17 13:21:40 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
** because it is not tested anywhere else. */
if( rc==SQLITE_OK ){
sqlite3_value *pVal;
+#ifdef SQLITE_MEMDEBUG
+ if( sqlite3_iMallocFail>0 ){
+ sqlite3_iMallocFail++;
+ }
+#endif
pVal = sqlite3ValueNew();
sqlite3ValueSetStr(pVal, -1, "x_sqlite_exec", SQLITE_UTF8, SQLITE_STATIC);
rc = sqlite3_create_function16(db,
}
pVar = &p->aVar[i-1];
rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
- if( rc ){
- return rc;
- }
if( rc==SQLITE_OK && encoding!=0 ){
rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
}
+ sqlite3MallocClearFailed();
+ sqlite3Error(((Vdbe *)pStmt)->db, rc, 0);
return rc;
}
# special feature is used 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.26 2006/01/06 14:32:20 drh Exp $
+# $Id: malloc.test,v 1.27 2006/01/17 13:21:40 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# system. Then open (empty database) "test.db" with the handle [db].
#
sqlite_malloc_fail 0
- catch {db close}
+ catch {db close}
catch {file delete -force test.db}
catch {file delete -force test.db-journal}
catch {file delete -force test2.db}
catch {file delete -force test2.db-journal}
- set ::DB [sqlite3 db test.db]
+ catch {sqlite3 db test.db}
+ set ::DB [sqlite3_connection_pointer db]
# Execute any -tclprep and -sqlprep scripts.
#
do_malloc_test 10 -sqlprep {
CREATE TABLE abc(a, b, c);
} -tclbody {
- set ::DB [sqlite3 db2 test.db]
+ sqlite3 db2 test.db
db2 eval {SELECT * FROM sqlite_master}
db2 close
}