From: dan Date: Mon, 11 Feb 2019 19:34:38 +0000 (+0000) Subject: Add eponymous virtual table "schemapool". For inspecting the current contents of... X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d4e11dd78fbeede475e397ed8347c8dfb0d705fb;p=thirdparty%2Fsqlite.git Add eponymous virtual table "schemapool". For inspecting the current contents of the schema-pool. FossilOrigin-Name: 2ebeb747832bd53284ab23b4c2558f0fa550c0ea2b4a6c1640eeb83f8132c556 --- diff --git a/Makefile.in b/Makefile.in index 65530e33c5..c899ec8e9d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -416,6 +416,7 @@ TESTSRC = \ $(TOP)/src/test_quota.c \ $(TOP)/src/test_rtree.c \ $(TOP)/src/test_schema.c \ + $(TOP)/src/test_schemapool.c \ $(TOP)/src/test_server.c \ $(TOP)/src/test_superlock.c \ $(TOP)/src/test_syscall.c \ @@ -471,6 +472,7 @@ TESTSRC2 = \ $(TOP)/src/bitvec.c \ $(TOP)/src/btree.c \ $(TOP)/src/build.c \ + $(TOP)/src/callback.c \ $(TOP)/src/ctime.c \ $(TOP)/src/date.c \ $(TOP)/src/dbpage.c \ diff --git a/Makefile.msc b/Makefile.msc index b4fa372f9a..6af0080f57 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1491,6 +1491,7 @@ TESTSRC = \ $(TOP)\src\test_quota.c \ $(TOP)\src\test_rtree.c \ $(TOP)\src\test_schema.c \ + $(TOP)\src\test_schemapool.c \ $(TOP)\src\test_server.c \ $(TOP)\src\test_superlock.c \ $(TOP)\src\test_syscall.c \ diff --git a/main.mk b/main.mk index c4e8b78e91..b7f831471b 100644 --- a/main.mk +++ b/main.mk @@ -341,6 +341,7 @@ TESTSRC = \ $(TOP)/src/test_quota.c \ $(TOP)/src/test_rtree.c \ $(TOP)/src/test_schema.c \ + $(TOP)/src/test_schemapool.c \ $(TOP)/src/test_server.c \ $(TOP)/src/test_sqllog.c \ $(TOP)/src/test_superlock.c \ @@ -392,6 +393,7 @@ TESTSRC2 = \ $(TOP)/src/backup.c \ $(TOP)/src/btree.c \ $(TOP)/src/build.c \ + $(TOP)/src/callback.c \ $(TOP)/src/date.c \ $(TOP)/src/dbpage.c \ $(TOP)/src/dbstat.c \ diff --git a/manifest b/manifest index 963a935655..b102a88836 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C Fix\svirtual\stable\ssupport\sfor\sSQLITE_OPEN_REUSABLE_SCHEMA\sconnections. -D 2019-02-09T17:47:14.573 +C Add\seponymous\svirtual\stable\s"schemapool".\sFor\sinspecting\sthe\scurrent\scontents\sof\sthe\sschema-pool. +D 2019-02-11T19:34:38.391 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 +F Makefile.in 56456706c4da271309914c756c9c8ea537685f1c79f8785afa72f968d6810482 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 +F Makefile.msc bdc4f060e04769b7729b309becc0c3c5623c0f9d98b4d06da9b9ab029f2bad99 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee F VERSION 453e2f4529ca208196d5567db28d549d7151f79efd33f6e6cfe6e613e583a0be F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -436,7 +436,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 3930eb2fcbebe49ab7408f6fef3baa8c4bf3c84540f9f29dfe849bf561ff6e51 +F main.mk 150a31e9c6e1345af86c8382fbe75027c19bb83ec8af759ee72e0554edc05371 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -459,7 +459,7 @@ F src/btree.c 84b7c5c3829b60823e15e7a8407462b69be3818f96518fef28f97ac0fbbca72b F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 F src/build.c 5c99b58734e8a5ddb94b1f5734b550d91a762926d11094067aeb5e85da0541bf -F src/callback.c 6d9504d0d3c0af2e288d001b1077ba6ab924e3758b4cbf7bb358693e3855dd7b +F src/callback.c eca06835c52403036e200f0add94174aa3ca6bd128546a1877f6826697ebdf5b F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 @@ -509,7 +509,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c fffd5250a323579384a3b3904302b9fe87e186ba24602af3013f749a0234ae98 F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 F src/pragma.h 66f3e237cbba0a40a322d4a5bb58fcffa35bff8289ca9e5635424300479f1a38 -F src/prepare.c e9fcf4a4f6dc6895ddb7ec8a1b06d6c90d38863a4b8e274d6f8bc10440e287e9 +F src/prepare.c c73b6ab0290a41066850b4c855643bd1d2c854e540373351492cdbb6628e51ae F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 @@ -563,11 +563,12 @@ F src/test_quota.c 6cb9297115b551f433a9ad1741817a9831abed99 F src/test_quota.h 2a8ad1952d1d2ca9af0ce0465e56e6c023b5e15d F src/test_rtree.c 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b F src/test_schema.c f575932cb6274d12147a77e13ea4b49d52408513 +F src/test_schemapool.c 5a2f06baeb4071ba547db5b47fb0fb43ffe7bdc96e65e0d5045703a726f32c10 F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 -F src/test_tclsh.c 06317648b0d85a85fd823f7973b55535c59a3156c1ef59394fe511f932cfa78d +F src/test_tclsh.c ed90fbc48a92ddcbdc12d8c1ce9c5ff3bdb95a82092e62cf401e1e9217463039 F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc F src/test_thread.c 911d15fb14e19c0c542bdc8aabf981c2f10a4858 F src/test_vfs.c c6c6a58f66b26876c7b5769fb323a58b2c7120299b5084e7212c4116f902cbaa @@ -1226,7 +1227,7 @@ F test/releasetest.tcl b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875c F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/reuse1.test 34781abbe671ec6858fb5969efadc1b3be1f95a6b46483c227fa6055645a8482 -F test/reuse2.test b17689a33e75c49a79d422cb112c26cbc198f8da412b16422d85a22469ea6e48 +F test/reuse2.test 5722f9da159adc271af2b0e658ab0455253f63f8613b6016b2963685c813081d F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a @@ -1806,7 +1807,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2b2e9f81cdc7a3ac1eacc087fbd0414ead732878aae296bab6b54b4a7cd0a06e -R c880c7120bfc1f9326a01d7ac35e8916 +P 3ca8856a7b1c36885cea007b8fb05b59f1fdc9d4b54436819193f498519a23c7 +R 61e5a7e6c56dada7e2c808e07073efff U dan -Z c5e2ad0351b6e43deaf12ac670af6294 +Z 2ad6a7c4287694402a3e6fa2e115f13a diff --git a/manifest.uuid b/manifest.uuid index 5c31d7c1d9..5f6707473f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ca8856a7b1c36885cea007b8fb05b59f1fdc9d4b54436819193f498519a23c7 \ No newline at end of file +2ebeb747832bd53284ab23b4c2558f0fa550c0ea2b4a6c1640eeb83f8132c556 \ No newline at end of file diff --git a/src/callback.c b/src/callback.c index fdd1cf27e2..8030bf9043 100644 --- a/src/callback.c +++ b/src/callback.c @@ -47,18 +47,18 @@ static void assert_schema_state_ok(sqlite3 *db){ if( i!=1 ){ Db *pDb = &db->aDb[i]; Btree *pBt = pDb->pBt; + assert( pBt==0 || sqlite3BtreeSchema(pBt, 0, 0)==0 ); + assert( pDb->pSchema ); if( pDb->pSPool ){ if( DbHasProperty(db, i, DB_SchemaLoaded)==0 ){ assert( pDb->pSchema->tblHash.count==0 ); assert( pDb->pSchema==&pDb->pSPool->sSchema ); }else{ - assert( pBt==0 || pDb->pSchema!=sqlite3BtreeSchema(pBt, 0, 0) ); assert( pDb->pSchema!=&pDb->pSPool->sSchema ); } }else{ assert( DbHasProperty(db, i, DB_SchemaLoaded)==0 ); assert( pDb->pSchema->tblHash.count==0 ); - assert( pBt==0 || pDb->pSchema!=sqlite3BtreeSchema(pBt, 0, 0) ); assert( pDb->pSchema!=&pDb->pSPool->sSchema ); } } @@ -538,6 +538,10 @@ void sqlite3SchemaZero(sqlite3 *db, int iDb){ */ static SchemaPool *SQLITE_WSD schemaPoolList = 0; +#ifdef SQLITE_TEST +SchemaPool *sqlite3SchemaPoolList(void){ return schemaPoolList; } +#endif + /* ** Check that the schema of db iDb is writable (either because it is the temp ** db schema or because the db handle was opened without @@ -661,7 +665,6 @@ int sqlite3SchemaDisconnect(sqlite3 *db, int iDb, int bNew){ pDb->pSPool = 0; pSPool->nRef--; if( pSPool->nRef<=0 ){ - Schema *pNext; SchemaPool **pp; while( pSPool->pSchema ){ Schema *pNext = pSPool->pSchema->pNext; diff --git a/src/prepare.c b/src/prepare.c index bae9b28714..86c8559673 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -226,6 +226,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; initData.nInitRow = 0; + initData.cksum = 0; sqlite3InitCallback(&initData, 3, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; diff --git a/src/test_schemapool.c b/src/test_schemapool.c new file mode 100644 index 0000000000..241e54cde0 --- /dev/null +++ b/src/test_schemapool.c @@ -0,0 +1,266 @@ +/* +** 2006 June 10 +** +** 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. +** +************************************************************************* +** Code for testing the virtual table interfaces. This code +** is not included in the SQLite library. It is used for automated +** testing of the SQLite library. +*/ + +/* +** None of this works unless we have virtual tables. +*/ +#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_TEST) + +#include "sqliteInt.h" +#include + +/* The code in this file defines a sqlite3 virtual-table module with +** the following schema. +*/ +#define SCHEMAPOOL_SCHEMA \ +"CREATE TABLE x(" \ +" cksum INTEGER, " \ +" nref INTEGER, " \ +" nschema INTEGER " \ +")" + +typedef struct schemapool_vtab schemapool_vtab; +typedef struct schemapool_cursor schemapool_cursor; + +/* A schema table object */ +struct schemapool_vtab { + sqlite3_vtab base; +}; + +/* A schema table cursor object */ +struct schemapool_cursor { + sqlite3_vtab_cursor base; + sqlite3_int64 *aData; + int iRow; + int nRow; +}; + +/* +** Table destructor for the schema module. +*/ +static int schemaPoolDestroy(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return 0; +} + +/* +** Table constructor for the schema module. +*/ +static int schemaPoolCreate( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + int rc = SQLITE_NOMEM; + schemapool_vtab *pVtab = sqlite3_malloc(sizeof(schemapool_vtab)); + if( pVtab ){ + memset(pVtab, 0, sizeof(schemapool_vtab)); + rc = sqlite3_declare_vtab(db, SCHEMAPOOL_SCHEMA); + } + *ppVtab = (sqlite3_vtab *)pVtab; + return rc; +} + +/* +** Open a new cursor on the schema table. +*/ +static int schemaPoolOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + int rc = SQLITE_NOMEM; + schemapool_cursor *pCur; + pCur = sqlite3_malloc(sizeof(schemapool_cursor)); + if( pCur ){ + memset(pCur, 0, sizeof(schemapool_cursor)); + *ppCursor = (sqlite3_vtab_cursor*)pCur; + rc = SQLITE_OK; + } + return rc; +} + +/* +** Close a schema table cursor. +*/ +static int schemaPoolClose(sqlite3_vtab_cursor *cur){ + schemapool_cursor *pCur = (schemapool_cursor*)cur; + sqlite3_free(pCur->aData); + sqlite3_free(pCur); + return SQLITE_OK; +} + +/* +** Retrieve a column of data. +*/ +static int schemaPoolColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ + schemapool_cursor *pCur = (schemapool_cursor*)cur; + assert( i==0 || i==1 || i==2 ); + sqlite3_result_int64(ctx, pCur->aData[pCur->iRow*3 + i]); + return SQLITE_OK; +} + +/* +** Retrieve the current rowid. +*/ +static int schemaPoolRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + schemapool_cursor *pCur = (schemapool_cursor*)cur; + *pRowid = pCur->iRow + 1; + return SQLITE_OK; +} + +static int schemaPoolEof(sqlite3_vtab_cursor *cur){ + schemapool_cursor *pCur = (schemapool_cursor*)cur; + return pCur->iRow>=pCur->nRow; +} + +/* +** Advance the cursor to the next row. +*/ +static int schemaPoolNext(sqlite3_vtab_cursor *cur){ + schemapool_cursor *pCur = (schemapool_cursor*)cur; + pCur->iRow++; + return SQLITE_OK; +} + +struct SchemaPool { + int nRef; /* Number of pointers to this object */ + u64 cksum; /* Checksum for this Schema contents */ + Schema *pSchema; /* Linked list of Schema objects */ + Schema sSchema; /* The single dummy schema object */ + SchemaPool *pNext; /* Next element in schemaPoolList */ +}; +extern SchemaPool *sqlite3SchemaPoolList(void); + +/* +** Reset a schemaPool table cursor. +*/ +static int schemaPoolFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + SchemaPool *pSPool; + schemapool_cursor *pCur = (schemapool_cursor*)pVtabCursor; + + sqlite3_free(pCur->aData); + pCur->aData = 0; + pCur->nRow = 0; + pCur->iRow = 0; + + for(pSPool = sqlite3SchemaPoolList(); pSPool; pSPool=pSPool->pNext){ + pCur->nRow++; + } + + if( pCur->nRow ){ + int iRow = 0; + pCur->aData = (i64*)sqlite3_malloc(3 * pCur->nRow * sizeof(i64)); + if( pCur->aData==0 ) return SQLITE_NOMEM; + for(pSPool = sqlite3SchemaPoolList(); pSPool; pSPool=pSPool->pNext){ + Schema *p; + i64 nSchema = 0; + for(p=pSPool->pSchema; p; p=p->pNext){ + nSchema++; + } + pCur->aData[0 + iRow*3] = pSPool->cksum; + pCur->aData[1 + iRow*3] = (i64)pSPool->nRef; + pCur->aData[2 + iRow*3] = nSchema; + iRow++; + } + } + + return SQLITE_OK; +} + +/* +** Analyse the WHERE condition. +*/ +static int schemaPoolBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + return SQLITE_OK; +} + +/* +** A virtual table module that merely echos method calls into TCL +** variables. +*/ +static sqlite3_module schemaPoolModule = { + 0, /* iVersion */ + schemaPoolCreate, + schemaPoolCreate, + schemaPoolBestIndex, + schemaPoolDestroy, + schemaPoolDestroy, + schemaPoolOpen, /* xOpen - open a cursor */ + schemaPoolClose, /* xClose - close a cursor */ + schemaPoolFilter, /* xFilter - configure scan constraints */ + schemaPoolNext, /* xNext - advance a cursor */ + schemaPoolEof, /* xEof */ + schemaPoolColumn, /* xColumn - read data */ + schemaPoolRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ +}; + +/* +** Decode a pointer to an sqlite3 object. +*/ +extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); + +/* +** Register the schema virtual table module. +*/ +static int SQLITE_TCLAPI register_schemapool_module( + ClientData clientData, /* Not used */ + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ + int objc, /* Number of arguments */ + Tcl_Obj *CONST objv[] /* Command arguments */ +){ + sqlite3 *db; + if( objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; +#ifndef SQLITE_OMIT_VIRTUALTABLE + sqlite3_create_module(db, "schemapool", &schemaPoolModule, 0); +#endif + return TCL_OK; +} + +#endif + +/* +** Register commands with the TCL interpreter. +*/ +int Sqlitetestschemapool_Init(Tcl_Interp *interp){ + static struct { + char *zName; + Tcl_ObjCmdProc *xProc; + void *clientData; + } aObjCmd[] = { + { "register_schemapool_module", register_schemapool_module, 0 }, + }; + int i; + for(i=0; i