$(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 \
$(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 \
$(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 \
$(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 \
$(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 \
-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
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
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
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
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
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
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
-3ca8856a7b1c36885cea007b8fb05b59f1fdc9d4b54436819193f498519a23c7
\ No newline at end of file
+2ebeb747832bd53284ab23b4c2558f0fa550c0ea2b4a6c1640eeb83f8132c556
\ No newline at end of file
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 );
}
}
*/
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
pDb->pSPool = 0;
pSPool->nRef--;
if( pSPool->nRef<=0 ){
- Schema *pNext;
SchemaPool **pp;
while( pSPool->pSchema ){
Schema *pNext = pSPool->pSchema->pNext;
initData.pzErrMsg = pzErrMsg;
initData.mInitFlags = mFlags;
initData.nInitRow = 0;
+ initData.cksum = 0;
sqlite3InitCallback(&initData, 3, (char **)azArg, 0);
if( initData.rc ){
rc = initData.rc;
--- /dev/null
+/*
+** 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 <tcl.h>
+
+/* 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<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
+ Tcl_CreateObjCommand(interp, aObjCmd[i].zName,
+ aObjCmd[i].xProc, aObjCmd[i].clientData, 0);
+ }
+ return TCL_OK;
+}
+
extern int Sqlitetest_malloc_Init(Tcl_Interp*);
extern int Sqlitetest_mutex_Init(Tcl_Interp*);
extern int Sqlitetestschema_Init(Tcl_Interp*);
+ extern int Sqlitetestschemapool_Init(Tcl_Interp*);
extern int Sqlitetestsse_Init(Tcl_Interp*);
extern int Sqlitetesttclvar_Init(Tcl_Interp*);
extern int Sqlitetestfs_Init(Tcl_Interp*);
Sqlitetest_malloc_Init(interp);
Sqlitetest_mutex_Init(interp);
Sqlitetestschema_Init(interp);
+ Sqlitetestschemapool_Init(interp);
Sqlitetesttclvar_Init(interp);
Sqlitetestfs_Init(interp);
SqlitetestThread_Init(interp);
} {{one two three}}
}
+#--------------------------------------------------------------------------
+reset_db
+do_execsql_test 3.0 {
+ CREATE TABLE t1(x INTEGER PRIMARY KEY, y UNIQUE, z);
+ CREATE INDEX i1 ON t1(z);
+ PRAGMA schema_version;
+} {2}
+
+do_test 3.1 {
+ sqlite3 db1 test.db -reuse-schema 1
+ sqlite3 db2 test.db -reuse-schema 1
+} {}
+
+do_execsql_test -db db1 3.2.1 { SELECT * FROM t1 }
+do_execsql_test -db db2 3.2.2 { SELECT * FROM t1 }
+
+register_schemapool_module db
+do_execsql_test 3.3 {
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool;
+} {nref=2 nschema=1}
+
+sqlite3 db3 test.db -reuse-schema 1
+register_schemapool_module db3
+
+do_execsql_test 3.5 {
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool;
+} {nref=2 nschema=1}
+
+do_execsql_test -db db3 3.6 {
+ SELECT * FROM t1;
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool;
+} {nref=3 nschema=1}
+
+do_execsql_test 3.7 {
+ CREATE TABLE t2(x);
+}
+
+do_execsql_test 3.8 {
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool;
+} {nref=3 nschema=1}
+
+do_execsql_test -db db1 3.9.1 { SELECT * FROM t1 }
+do_execsql_test 3.9.2 {
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool ORDER BY 1;
+} {nref=1 nschema=1 nref=2 nschema=1}
+
+do_execsql_test -db db2 3.10.1 { SELECT * FROM t1 }
+do_execsql_test 3.10.2 {
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool ORDER BY 1;
+} {nref=1 nschema=1 nref=2 nschema=1}
+
+do_execsql_test -db db3 3.11.1 { SELECT * FROM t1 }
+do_execsql_test 3.11.2 {
+ SELECT 'nref=' || nRef, 'nschema=' || nSchema FROM schemapool ORDER BY 1;
+} {nref=3 nschema=1}
+
finish_test
+