diff options
author | danielk1977 <danielk1977@noemail.net> | 2006-01-11 14:09:31 +0000 |
---|---|---|
committer | danielk1977 <danielk1977@noemail.net> | 2006-01-11 14:09:31 +0000 |
commit | b82e7edae9c6f8b0c9f2f6745442b5663a55b51a (patch) | |
tree | c388bb764973fcc40e8812c26ed450e7288a9c45 /src | |
parent | 003437a0a7563fddadb95d4103630da3a9d7f2ae (diff) | |
download | sqlite-b82e7edae9c6f8b0c9f2f6745442b5663a55b51a.tar.gz sqlite-b82e7edae9c6f8b0c9f2f6745442b5663a55b51a.zip |
Fix bugs caused by assuming that shared-schemas are initialized. (CVS 2917)
FossilOrigin-Name: 3970eb875d1830d35b3a70a7583a8ab6b238cad6
Diffstat (limited to 'src')
-rw-r--r-- | src/attach.c | 3 | ||||
-rw-r--r-- | src/btree.c | 27 | ||||
-rw-r--r-- | src/build.c | 5 | ||||
-rw-r--r-- | src/pragma.c | 7 | ||||
-rw-r--r-- | src/prepare.c | 45 | ||||
-rw-r--r-- | src/sqliteInt.h | 4 | ||||
-rw-r--r-- | src/test1.c | 6 |
7 files changed, 52 insertions, 45 deletions
diff --git a/src/attach.c b/src/attach.c index eca7eb7ec..f1f1bbbd9 100644 --- a/src/attach.c +++ b/src/attach.c @@ -11,7 +11,7 @@ ************************************************************************* ** This file contains code used to implement the ATTACH and DETACH commands. ** -** $Id: attach.c,v 1.44 2006/01/10 07:14:23 danielk1977 Exp $ +** $Id: attach.c,v 1.45 2006/01/11 14:09:31 danielk1977 Exp $ */ #include "sqliteInt.h" @@ -171,7 +171,6 @@ static void attachFunc( ** we found it. */ if( rc==SQLITE_OK ){ - db->flags &= ~SQLITE_Initialized; sqlite3SafetyOn(db); rc = sqlite3Init(db, &zErrDyn); sqlite3SafetyOff(db); diff --git a/src/btree.c b/src/btree.c index daa45277a..b1bd141ed 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.289 2006/01/10 13:58:48 drh Exp $ +** $Id: btree.c,v 1.290 2006/01/11 14:09:31 danielk1977 Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to @@ -1579,6 +1579,7 @@ int sqlite3BtreeOpen( return SQLITE_NOMEM; } for(pBt=pTsd->pBtree; pBt; pBt=pBt->pNext){ + assert( pBt->nRef>0 ); if( 0==strcmp(zFullPathname, sqlite3pager_filename(pBt->pPager)) ){ p->pBt = pBt; *ppBtree = p; @@ -6498,3 +6499,27 @@ int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ #endif return rc; } + +#if defined(SQLITE_TEST) && !defined(NO_TCL) +#include <tcl.h> +int sqlite3_shared_cache_report( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + ThreadData *pTd = sqlite3ThreadData(); + if( pTd->useSharedData ){ + BtShared *pBt; + Tcl_Obj *pRet = Tcl_NewObj(); + for(pBt=pTd->pBtree; pBt; pBt=pBt->pNext){ + const char *zFile = sqlite3pager_filename(pBt->pPager); + Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj(zFile, -1)); + Tcl_ListObjAppendElement(interp, pRet, Tcl_NewIntObj(pBt->nRef)); + } + Tcl_SetObjResult(interp, pRet); + } + return TCL_OK; +} +#endif + diff --git a/src/build.c b/src/build.c index e7c1742e2..65ce2e533 100644 --- a/src/build.c +++ b/src/build.c @@ -22,7 +22,7 @@ ** COMMIT ** ROLLBACK ** -** $Id: build.c,v 1.375 2006/01/10 17:58:23 danielk1977 Exp $ +** $Id: build.c,v 1.376 2006/01/11 14:09:32 danielk1977 Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -255,7 +255,6 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ Table *p = 0; int i; assert( zName!=0 ); - assert( (db->flags & SQLITE_Initialized) || db->init.busy ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; @@ -311,7 +310,6 @@ Table *sqlite3LocateTable(Parse *pParse, const char *zName, const char *zDbase){ Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ Index *p = 0; int i; - assert( (db->flags & SQLITE_Initialized) || db->init.busy ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ Schema *pSchema = db->aDb[j].pSchema; @@ -393,7 +391,6 @@ void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){ int i, j; assert( iDb>=0 && iDb<db->nDb ); - db->flags &= ~SQLITE_Initialized; for(i=iDb; i<db->nDb; i++){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ diff --git a/src/pragma.c b/src/pragma.c index b9f510cd7..54fb19f64 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -11,7 +11,7 @@ ************************************************************************* ** This file contains code used to implement the PRAGMA command. ** -** $Id: pragma.c,v 1.112 2006/01/10 17:58:23 danielk1977 Exp $ +** $Id: pragma.c,v 1.113 2006/01/11 14:09:32 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" @@ -808,7 +808,10 @@ void sqlite3Pragma( ** will be overwritten when the schema is next loaded. If it does not ** already exists, it will be created to use the new encoding value. */ - if( !(pParse->db->flags&SQLITE_Initialized) ){ + if( + !(DbHasProperty(db, 0, DB_SchemaLoaded)) || + DbHasProperty(db, 0, DB_Empty) + ){ for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ ENC(pParse->db) = pEnc->enc; diff --git a/src/prepare.c b/src/prepare.c index c59d7fc82..fcd0d19bd 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -13,7 +13,7 @@ ** interface, and routines that contribute to loading the database schema ** from disk. ** -** $Id: prepare.c,v 1.18 2006/01/10 17:58:23 danielk1977 Exp $ +** $Id: prepare.c,v 1.19 2006/01/11 14:09:32 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" @@ -154,27 +154,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ #endif assert( iDb>=0 && iDb<db->nDb ); - assert( db->aDb[iDb].pSchema ); -#if 0 - if( 0==db->aDb[iDb].pSchema ){ - Schema *pS = sqlite3SchemaGet(db->aDb[iDb].pBt); - db->aDb[iDb].pSchema = pS; - if( !pS ){ - return SQLITE_NOMEM; - }else if( pS->file_format!=0 ){ - /* This means that the shared-schema associated with the the btree - ** is already open and populated. - */ - if( pS->enc!=ENC(db) ){ - sqlite3SetString(pzErrMsg, "attached databases must use the same" - " text encoding as main database", (char*)0); - return SQLITE_ERROR; - } - return SQLITE_OK; - } - } -#endif /* zMasterSchema and zInitScript are set to point at the master schema ** and initialisation script appropriate for the database being @@ -212,7 +192,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ */ pDb = &db->aDb[iDb]; if( pDb->pBt==0 ){ - if( !OMIT_TEMPDB && iDb==1 ) DbSetProperty(db, 1, DB_SchemaLoaded); + if( !OMIT_TEMPDB && iDb==1 ){ + DbSetProperty(db, 1, DB_SchemaLoaded); + } return SQLITE_OK; } rc = sqlite3BtreeCursor(pDb->pBt, MASTER_ROOT, 0, 0, 0, &curMain); @@ -272,6 +254,8 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ return SQLITE_ERROR; } } + }else{ + DbSetProperty(db, iDb, DB_Empty); } pDb->pSchema->enc = ENC(db); @@ -343,9 +327,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ */ int sqlite3Init(sqlite3 *db, char **pzErrMsg){ int i, rc; + int called_initone = 0; if( db->init.busy ) return SQLITE_OK; - assert( (db->flags & SQLITE_Initialized)==0 ); rc = SQLITE_OK; db->init.busy = 1; for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ @@ -354,6 +338,7 @@ int sqlite3Init(sqlite3 *db, char **pzErrMsg){ if( rc ){ sqlite3ResetInternalSchema(db, i); } + called_initone = 1; } /* Once all the other databases have been initialised, load the schema @@ -366,19 +351,16 @@ int sqlite3Init(sqlite3 *db, char **pzErrMsg){ if( rc ){ sqlite3ResetInternalSchema(db, 1); } + called_initone = 1; } #endif db->init.busy = 0; - if( rc==SQLITE_OK ){ - db->flags |= SQLITE_Initialized; + if( rc==SQLITE_OK && called_initone ){ sqlite3CommitInternalChanges(db); } - if( rc!=SQLITE_OK ){ - db->flags &= ~SQLITE_Initialized; - } - return rc; + return rc; } /* @@ -389,11 +371,8 @@ int sqlite3ReadSchema(Parse *pParse){ int rc = SQLITE_OK; sqlite3 *db = pParse->db; if( !db->init.busy ){ - if( (db->flags & SQLITE_Initialized)==0 ){ - rc = sqlite3Init(db, &pParse->zErrMsg); - } + rc = sqlite3Init(db, &pParse->zErrMsg); } - assert( rc!=SQLITE_OK || (db->flags & SQLITE_Initialized) || db->init.busy ); if( rc!=SQLITE_OK ){ pParse->rc = rc; pParse->nErr++; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5dc84f2de..1710f9293 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.460 2006/01/10 17:58:23 danielk1977 Exp $ +** @(#) $Id: sqliteInt.h,v 1.461 2006/01/11 14:09:32 danielk1977 Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -423,6 +423,7 @@ struct Schema { */ #define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ #define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ #define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) @@ -522,7 +523,6 @@ struct sqlite3 { ** transaction is active on that particular database file. */ #define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ -#define SQLITE_Initialized 0x00000002 /* True after initialization */ #define SQLITE_Interrupt 0x00000004 /* Cancel current operation */ #define SQLITE_InTrans 0x00000008 /* True if in a transaction */ #define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */ diff --git a/src/test1.c b/src/test1.c index 6e54789a9..d98640b4c 100644 --- a/src/test1.c +++ b/src/test1.c @@ -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.186 2006/01/09 16:12:05 danielk1977 Exp $ +** $Id: test1.c,v 1.187 2006/01/11 14:09:32 danielk1977 Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -3523,5 +3523,9 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ (char*)&sqlite3_fullsync_count, TCL_LINK_INT); #endif /* OS_UNIX */ set_options(interp); + + int sqlite3_shared_cache_report(void *, Tcl_Interp *, int, Tcl_Obj *CONST[]); + Tcl_CreateObjCommand(interp, "sqlite_shared_cache_report", + sqlite3_shared_cache_report, 0, 0); return TCL_OK; } |