From 1bbfc6744c6e8309c41aaf60bc7502323f6c4a20 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 15 Oct 2021 23:02:27 +0000 Subject: [PATCH 01/76] Demostrate a prototype sqlite3_autovacuum_pages() interface. FossilOrigin-Name: bb6f2b8b486c225043bc64e5f74ff6bbad6c5d1f337f0c81eeb6172b087bb943 --- manifest | 30 ++++++++------ manifest.uuid | 2 +- src/btree.c | 53 ++++++++++++++++++------ src/loadext.c | 2 + src/main.c | 31 +++++++++++++++ src/sqlite.h.in | 66 ++++++++++++++++++++++++++++++ src/sqlite3ext.h | 9 +++++ src/sqliteInt.h | 3 ++ src/test1.c | 93 +++++++++++++++++++++++++++++++++++++++++++ test/autovacuum.test | 3 +- test/autovacuum2.test | 87 ++++++++++++++++++++++++++++++++++++++++ 11 files changed, 350 insertions(+), 29 deletions(-) create mode 100644 test/autovacuum2.test diff --git a/manifest b/manifest index 1d0f55672f..d233a28ae7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Protect\sthe\sWhereTerm.u\sunion\susing\snearby\sassert()s\sand/or\sbranches. -D 2021-10-15T17:06:16.174 +C Demostrate\sa\sprototype\ssqlite3_autovacuum_pages()\sinterface. +D 2021-10-15T23:02:27.945 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 35782a608c940e219a01cf9d84de55e11668a42ede3b7b2d2fb4a6edb52e97e5 +F src/btree.c faa3248f55eb34269874273a85e682e25dc4a3aa50334ec80564c6fc1e394e23 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c f70d6375ea5b78daac5b1d24eab53ed7b81c3e68a17dff9581c50c0c06180e00 @@ -512,8 +512,8 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c bfe067d61ebbd0e6eb023f1fb6b353021e621cf1657e061d629064a740bfbf6f +F src/loadext.c e1dcff1c916bf6834e150b492eddda5d9792453182d2ad64294d2266b6e93c4c +F src/main.c 546dd2418c4f5d59aced76c68e55290735feb420ee305051fbd55ab8fff0d255 F src/malloc.c ef796bcc0e81d845d59a469f1cf235056caf9024172fd524e32136e65593647b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -551,15 +551,15 @@ F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa637 -F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 +F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 642c17df9e5a3517db452ac73a2b953143449a8bc2f6570c60de455a89a8571c +F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a +F src/sqliteInt.h 896cc476bb814ad1f893715e7e174dede81c94b4fed4073de0e76b68f11bf827 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 428e813dabf82804bc13196af35a0c3c6ef4347fe557fa6717c5c66bba6e8520 -F src/test1.c 63761c2be2607f1b425fde991beda48aed384f8d67f2b4ee549174c88b433009 +F src/test1.c f69bb12219d440b3f6ed382136d9aabe82a146532143afcb3b583d810bd9a57b F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159 @@ -705,7 +705,8 @@ F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2d13958a5617e987624a428d7aed91bf51f322b49b476e3573fadec697ce6da5 F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf F test/autoindex5.test 2ee94f033b87ca0160e08d81034c507aff8e230df2627f0304fa309b2fee19a3 -F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 +F test/autovacuum.test 00671369bbf96c6a49989a9425f5b78b94075d6a4b031e5e00000c2c32f365df +F test/autovacuum2.test 76f7eb4fe6a6bf6d33a196a7141dba98886d2fb53a268d7feca285d5da4759d7 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avfs.test 0c3a38e03cccb0fc3127838462dc05dc3f4c1480d770c084b388304c25de3652 F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e @@ -1929,7 +1930,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7b8ea2298927fd34f27b3345add3ce751ed728387fe3d9207b601ba6449d5af9 -R f8f24b4e90ad954c123bdee77c1d3c2d +P 8a56de5b9c6f4522000f8d991373490b67b9e9d97f03c1ca2cf32816d84789ef +R f133145eb98f519a7c135450fb3d5209 +T *branch * autovacuum-pages-callback +T *sym-autovacuum-pages-callback * +T -sym-trunk * U drh -Z 0a05442607cc8af1d2c0566962c413f4 +Z ead09303b823a782b5e7be4edc1ec190 diff --git a/manifest.uuid b/manifest.uuid index 98a43c8614..ec3f9f41a6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a56de5b9c6f4522000f8d991373490b67b9e9d97f03c1ca2cf32816d84789ef \ No newline at end of file +bb6f2b8b486c225043bc64e5f74ff6bbad6c5d1f337f0c81eeb6172b087bb943 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 766fd0805b..94649a9675 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3939,16 +3939,18 @@ int sqlite3BtreeIncrVacuum(Btree *p){ /* ** This routine is called prior to sqlite3PagerCommit when a transaction ** is committed for an auto-vacuum database. -** -** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages -** the database file should be truncated to during the commit process. -** i.e. the database has been reorganized so that only the first *pnTrunc -** pages are in use. */ -static int autoVacuumCommit(BtShared *pBt){ +static int autoVacuumCommit(Btree *p){ int rc = SQLITE_OK; - Pager *pPager = pBt->pPager; - VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager); ) + Pager *pPager; + BtShared *pBt; + sqlite3 *db; + VVA_ONLY( int nRef ); + + assert( p!=0 ); + pBt = p->pBt; + pPager = pBt->pPager; + VVA_ONLY( nRef = sqlite3PagerRefcount(pPager); ) assert( sqlite3_mutex_held(pBt->mutex) ); invalidateAllOverflowCache(pBt); @@ -3956,6 +3958,7 @@ static int autoVacuumCommit(BtShared *pBt){ if( !pBt->incrVacuum ){ Pgno nFin; /* Number of pages in database after autovacuuming */ Pgno nFree; /* Number of pages on the freelist initially */ + Pgno nVac; /* Number of pages to vacuum */ Pgno iFree; /* The next page to be freed */ Pgno nOrig; /* Database size before freeing */ @@ -3969,18 +3972,42 @@ static int autoVacuumCommit(BtShared *pBt){ } nFree = get4byte(&pBt->pPage1->aData[36]); - nFin = finalDbSize(pBt, nOrig, nFree); + db = p->db; + if( db->xAutovacPages ){ + int iDb; + for(iDb=0; ALWAYS(iDbnDb); iDb++){ + if( db->aDb[iDb].pBt==p ) break; + } + nVac = db->xAutovacPages( + db->pAutovacPagesArg, + db->aDb[iDb].zDbSName, + nOrig, + nFree, + pBt->pageSize + ); + if( nVac>nFree ){ + nVac = nFree; + } + if( nVac==0 ){ + return SQLITE_OK; + } + }else{ + nVac = nFree; + } + nFin = finalDbSize(pBt, nOrig, nVac); if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT; if( nFinnFin && rc==SQLITE_OK; iFree--){ - rc = incrVacuumStep(pBt, nFin, iFree, 1); + rc = incrVacuumStep(pBt, nFin, iFree, nVac==nFree); } if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){ rc = sqlite3PagerWrite(pBt->pPage1->pDbPage); - put4byte(&pBt->pPage1->aData[32], 0); - put4byte(&pBt->pPage1->aData[36], 0); + if( nVac==nFree ){ + put4byte(&pBt->pPage1->aData[32], 0); + put4byte(&pBt->pPage1->aData[36], 0); + } put4byte(&pBt->pPage1->aData[28], nFin); pBt->bDoTruncate = 1; pBt->nPage = nFin; @@ -4031,7 +4058,7 @@ int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zSuperJrnl){ sqlite3BtreeEnter(p); #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ - rc = autoVacuumCommit(pBt); + rc = autoVacuumCommit(p); if( rc!=SQLITE_OK ){ sqlite3BtreeLeave(p); return rc; diff --git a/src/loadext.c b/src/loadext.c index 29371336c4..4edefec0c9 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -483,6 +483,8 @@ static const sqlite3_api_routines sqlite3Apis = { /* Version 3.36.1 and later */ sqlite3_changes64, sqlite3_total_changes64, + /* Version 3.37.0 and later */ + sqlite3_autovacuum_pages, }; /* True if x is the directory separator character diff --git a/src/main.c b/src/main.c index bf33b640b8..aa34977bf9 100644 --- a/src/main.c +++ b/src/main.c @@ -1403,6 +1403,9 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ ** structure? */ sqlite3DbFree(db, db->aDb[1].pSchema); + if( db->xAutovacDestr ){ + db->xAutovacDestr(db->pAutovacPagesArg); + } sqlite3_mutex_leave(db->mutex); db->eOpenState = SQLITE_STATE_CLOSED; sqlite3_mutex_free(db->mutex); @@ -2304,6 +2307,34 @@ void *sqlite3_preupdate_hook( } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ +/* +** Register a function to be invoked prior to each autovacuum that +** determines the number of pages to vacuum. +*/ +int sqlite3_autovacuum_pages( + sqlite3 *db, /* Attach the hook to this database */ + unsigned int (*xCallback)(void*,const char*,u32,u32,u32), + void *pArg, /* Argument to the function */ + void (*xDestructor)(void*) /* Destructor for pArg */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + if( xDestructor ) xDestructor(pArg); + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( db->xAutovacDestr ){ + db->xAutovacDestr(db->pAutovacPagesArg); + } + db->xAutovacPages = xCallback; + db->pAutovacPagesArg = pArg; + db->xAutovacDestr = xDestructor; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + + #ifndef SQLITE_OMIT_WAL /* ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 4435925de4..f20d457e3a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -6406,6 +6406,72 @@ sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); +/* +** CAPI3REF: Autovacuum Compaction Amount Callback +** METHOD: sqlite3 +** +** ^The sqlite3_autovacuum_pages(D,C,P,X) interface registers a callback +** function C that is invoked prior to each autovacuum of the database +** file. ^The callback is passed a copy of the generic data pointer (P), +** the schema-name of the attached database that is being autovacuumed, +** the the size of the database file in pages, the number of free pages, +** and the number of bytes per page, respectively. The callback should +** return the number of free pages that should be removed by the +** autovacuum. ^If the callback returns zero, then no autovacuum happens. +** ^If the value returned is greater than or equal to the number of +** free pages, then a complete autovacuum happens. +** +**

^If there are multiple ATTACH-ed database files that are being +** modified as part of a transaction commit, then the autovacuum pages +** callback is invoked separately for each file. +** +**

The callback is not reentrant. The callback function should +** not attempt to invoke any other SQLite interface. If it does, bad +** things may happen, including segmentation faults and corrupt database +** files. The callback function should be a simple function that +** does some arithmetic on its input parameters and returns a result. +** +** ^The X parameter to sqlite3_autovacuum_pages(D,C,P,X) is an optional +** destructor for the P parameter. ^If X is not NULL, then X(P) is +** invoked whenever the database connection closes or when the callback +** is overwritten by another invocation of sqlite3_autovacuum_pages(). +** +**

^There is only one autovacuum pages callback per database connection. +** ^Each call to the sqlite3_autovacuum_pages() interface overrides all +** previous invocations for that database connection. ^If the callback +** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer, +** then the autovacuum steps callback is cancelled. The return value +** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might +** be some other error code if something goes wrong. The current +** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other +** return codes might be added in future releases. +** +**

If no autovacuum pages callback is specified (the usual case) or +** a NULL pointer is provided for the callback, +** then the default behavior is to vacuum all free pages. So, in other +** words, the default behavior is the same as if the callback function +** were something like this: +** +**

+**     unsigned int demonstration_autovac_pages_callback(
+**       void *pClientData,
+**       const char *zSchema,
+**       unsigned int nDbPage,
+**       unsigned int nFreePage,
+**       unsigned int nBytePerPage
+**     ){
+**       return nFreePage;
+**     }
+** 
+*/ +int sqlite3_autovacuum_pages( + sqlite3 *db, + unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), + void*, + void(*)(void*) +); + + /* ** CAPI3REF: Data Change Notification Callbacks ** METHOD: sqlite3 diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 98d9305240..4ec11324b2 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -340,6 +340,10 @@ struct sqlite3_api_routines { /* Version 3.36.1 and later */ sqlite3_int64 (*changes64)(sqlite3*); sqlite3_int64 (*total_changes64)(sqlite3*); + /* Version 3.37.0 and later */ + int (*autovacuum_pages)(sqlite3*, + unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), + void*, void(*)(void*)); }; /* @@ -646,6 +650,11 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_database_file_object sqlite3_api->database_file_object /* Version 3.34.0 and later */ #define sqlite3_txn_state sqlite3_api->txn_state +/* Version 3.36.1 and later */ +#define sqlite3_changes64 sqlite3_api->changes64 +#define sqlite3_total_changes64 sqlite3_api->total_changes64 +* Version 3.37.0 and later */ +#define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) diff --git a/src/sqliteInt.h b/src/sqliteInt.h index dbf994d53f..b50800c667 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1565,6 +1565,9 @@ struct sqlite3 { void (*xRollbackCallback)(void*); /* Invoked at every commit. */ void *pUpdateArg; void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); + void *pAutovacPagesArg; /* Client argument to autovac_pages */ + void (*xAutovacDestr)(void*); /* Destructor for pAutovacPAgesArg */ + unsigned int (*xAutovacPages)(void*,const char*,u32,u32,u32); Parse *pParse; /* Current parse */ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ diff --git a/src/test1.c b/src/test1.c index ceafbe5038..6bf7b17d3f 100644 --- a/src/test1.c +++ b/src/test1.c @@ -8233,6 +8233,98 @@ static int SQLITE_TCLAPI test_decode_hexdb( return TCL_OK; } +/* +** Client data for the autovacuum_pages callback. +*/ +struct AutovacPageData { + Tcl_Interp *interp; + char *zScript; +}; +typedef struct AutovacPageData AutovacPageData; + +/* +** Callback functions for sqlite3_autovacuum_pages +*/ +static unsigned int test_autovacuum_pages_callback( + void *pClientData, + const char *zSchema, + unsigned int nFilePages, + unsigned int nFreePages, + unsigned int nBytePerPage +){ + AutovacPageData *pData = (AutovacPageData*)pClientData; + Tcl_DString str; + unsigned int x; + char zBuf[100]; + Tcl_DStringInit(&str); + Tcl_DStringAppend(&str, pData->zScript, -1); + Tcl_DStringAppendElement(&str, zSchema); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%u", nFilePages); + Tcl_DStringAppendElement(&str, zBuf); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%u", nFreePages); + Tcl_DStringAppendElement(&str, zBuf); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%u", nBytePerPage); + Tcl_DStringAppendElement(&str, zBuf); + Tcl_ResetResult(pData->interp); + Tcl_Eval(pData->interp, Tcl_DStringValue(&str)); + Tcl_DStringFree(&str); + x = nFreePages; + (void)Tcl_GetIntFromObj(0, Tcl_GetObjResult(pData->interp), (int*)&x); + return x; +} + +/* +** Usage: sqlite3_autovacuum_pages DB SCRIPT +** +** Add an autovacuum-pages callback to database connection DB. The callback +** will invoke SCRIPT, after appending parameters. +** +** If SCRIPT is an empty string or is omitted, then the callback is +** cancelled. +*/ +static int SQLITE_TCLAPI test_autovacuum_pages( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + AutovacPageData *pData; + sqlite3 *db; + int rc; + const char *zScript; + size_t nScript; + if( objc!=2 && objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB ?SCRIPT?"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + zScript = objc==3 ? Tcl_GetString(objv[2]) : 0; + nScript = zScript ? strlen(zScript) : 0; + pData = sqlite3_malloc64( sizeof(*pData) + nScript + 1 ); + if( pData==0 ){ + Tcl_AppendResult(interp, "out of memory", (void*)0); + return TCL_ERROR; + } + pData->interp = interp; + if( zScript ){ + pData->zScript = (char*)&pData[1]; + memcpy(pData->zScript, zScript, nScript+1); + rc = sqlite3_autovacuum_pages(db,test_autovacuum_pages_callback, + pData, sqlite3_free); + }else{ + pData->zScript = 0; + rc = sqlite3_autovacuum_pages(db, 0, 0, 0); + } + if( rc ){ + char zBuf[1000]; + sqlite3_snprintf(sizeof(zBuf), zBuf, + "sqlite3_autovacuum_pages() returns %d", rc); + Tcl_AppendResult(interp, zBuf, (void*)0); + return TCL_ERROR; + } + return TCL_OK; +} + /* ** Register commands with the TCL interpreter. @@ -8524,6 +8616,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "atomic_batch_write", test_atomic_batch_write, 0 }, { "sqlite3_mmap_warm", test_mmap_warm, 0 }, { "sqlite3_config_sorterref", test_config_sorterref, 0 }, + { "sqlite3_autovacuum_pages", test_autovacuum_pages, 0 }, { "decode_hexdb", test_decode_hexdb, 0 }, { "test_write_db", test_write_db, 0 }, { "sqlite3_register_cksumvfs", test_register_cksumvfs, 0 }, diff --git a/test/autovacuum.test b/test/autovacuum.test index 431c4b8a2a..245ea8b51d 100644 --- a/test/autovacuum.test +++ b/test/autovacuum.test @@ -9,9 +9,8 @@ # #*********************************************************************** # This file implements regression tests for SQLite library. The -# focus of this file is testing the SELECT statement. +# focus of this file is testing the autovacuum feature. # -# $Id: autovacuum.test,v 1.29 2009/04/06 17:50:03 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl diff --git a/test/autovacuum2.test b/test/autovacuum2.test new file mode 100644 index 0000000000..a3c409839e --- /dev/null +++ b/test/autovacuum2.test @@ -0,0 +1,87 @@ +# 2021-10-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. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing the sqlite3_autovacuum_pages() interface +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# If this build of the library does not support auto-vacuum, omit this +# whole file. +ifcapable {!autovacuum || !pragma} { + finish_test + return +} + +# Demonstrate basic sqlite3_autovacuum_pages functionality +# +do_execsql_test autovacuum2-1.0 { + PRAGMA page_size=1024; + PRAGMA auto_vacuum=FULL; + CREATE TABLE t1(x); + VACUUM; + INSERT INTO t1(x) VALUES(zeroblob(10000)); + PRAGMA page_count; +} {12} +proc autovac_page_callback {schema filesize freesize pagesize} { + global autovac_callback_data + lappend autovac_callback_data $schema $filesize $freesize $pagesize + return [expr {$freesize/2}] +} +sqlite3_autovacuum_pages db autovac_page_callback +set autovac_callback_data {} +do_execsql_test autovacuum2-1.1 { + BEGIN; + DELETE FROM t1; + PRAGMA freelist_count; + PRAGMA page_count; +} {9 12} +do_execsql_test autovacuum2-1.2 { + COMMIT; +} {} +do_test autovacuum2-1.3 { + set autovac_callback_data +} {main 12 9 1024} +do_execsql_test autovacuum2-1.4 { + PRAGMA freelist_count; + PRAGMA page_count; +} {5 8} +do_execsql_test autovacuum2-1.5 { + PRAGMA integrity_check; +} {ok} + +# Disable the autovacuum-pages callback. Then do any transaction. +# The database should shrink to minimal size +# +sqlite3_autovacuum_pages db +do_execsql_test autovacuum2-1.10 { + CREATE TABLE t2(x); + PRAGMA freelist_count; +} {0} + +# Rig the autovacuum-pages callback to always return zero. No +# autovacuum will happen. +# +proc autovac_page_callback_off {schema filesize freesize pagesize} { + return 0 +} +sqlite3_autovacuum_pages db autovac_page_callback_off +do_execsql_test autovacuum2-1.20 { + BEGIN; + INSERT INTO t1(x) VALUES(zeroblob(10000)); + DELETE FROM t1; + PRAGMA freelist_count; + COMMIT; + PRAGMA freelist_count; +} {9 9} + +finish_test From 8ef0b84c37ff393924386f76a2274f930ec837b4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 21 Oct 2021 17:01:10 +0000 Subject: [PATCH 02/76] Fix the new "table_list" pragma so that it shows the correct number of columns for views and virtual tables even when the object has not been previously used. FossilOrigin-Name: fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pragma.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f4a1eebc38..2a61e942db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sJSON\sassert()\sthat\swas\sadded\s5\sdays\sago\sby\scheck-in\s[7b8ea2298927fd34]. -D 2021-10-20T20:22:37.259 +C Fix\sthe\snew\s"table_list"\spragma\sso\sthat\sit\sshows\sthe\scorrect\snumber\sof\ncolumns\sfor\sviews\sand\svirtual\stables\seven\swhen\sthe\sobject\shas\snot\sbeen\npreviously\sused. +D 2021-10-21T17:01:10.549 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c 12760c6ae92a350f5924896644a3e58d969c7c78e346b8cb542f2a8cef7c45d1 +F src/pragma.c e98bdbaf4bbe13e1085e6713b4bf022a8091e279162fec96e5ea30b53b1851a3 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1929,7 +1929,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 f52b84e69e5fcbe59ccc6163e7e78aa3822f2c354c88f8a76a2d1d4c90a99821 -R 670ebc316cf1a452957a2d11a7221cf2 +P e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 +R 5b3b99f69598abd3ff48cb7e9e2a37d6 U drh -Z 70867d1471ed7c4b89f3d005caea5399 +Z fe3fae615e6e48414d5d1a1ec7e33318 diff --git a/manifest.uuid b/manifest.uuid index 2057820b87..a4bb84a3a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 \ No newline at end of file +fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 42db7e5807..3392871d8a 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1242,6 +1242,17 @@ void sqlite3Pragma( }else{ zType = "table"; } + if( zType[0]=='v' && pTab->nCol==0 ){ + /* The number of columns is not known for views and virtual tables + ** until after the object is used at least once. */ + char *zSql = sqlite3MPrintf(db, "SELECT * FROM \"%w\"", pTab->zName); + if( zSql ){ + sqlite3_stmt *pDummy = 0; + (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); + (void)sqlite3_finalize(pDummy); + sqlite3DbFree(db, zSql); + } + } sqlite3VdbeMultiLoad(v, 1, "sssiii", db->aDb[ii].zDbSName, pTab->zName, From dc88b40285aba0eac225d17cf6eb4f6e31e0b5c4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 21 Oct 2021 19:48:14 +0000 Subject: [PATCH 03/76] Fix the previous check-in so that it works with virtual tables that add new shadow tables the first time they are referenced. FossilOrigin-Name: f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/hash.h | 2 +- src/pragma.c | 38 +++++++++++++++++++++++++++----------- test/fuzzdata8.db | Bin 2748416 -> 2798592 bytes 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 2a61e942db..fcae3aa996 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\snew\s"table_list"\spragma\sso\sthat\sit\sshows\sthe\scorrect\snumber\sof\ncolumns\sfor\sviews\sand\svirtual\stables\seven\swhen\sthe\sobject\shas\snot\sbeen\npreviously\sused. -D 2021-10-21T17:01:10.549 +C Fix\sthe\sprevious\scheck-in\sso\sthat\sit\sworks\swith\svirtual\stables\sthat\sadd\snew\nshadow\stables\sthe\sfirst\stime\sthey\sare\sreferenced. +D 2021-10-21T19:48:14.633 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b F src/global.c 59bfd5705a623f0b45e91622699953cfd1be2c176e78d8ff610463f2ea4ec51b F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 -F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 +F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c e98bdbaf4bbe13e1085e6713b4bf022a8091e279162fec96e5ea30b53b1851a3 +F src/pragma.c fc4c772d25766f7440dff6bf352e8c66981f92c80689d1a0fe229d39a38f69a5 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1063,7 +1063,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 62c5303ef5a570b1a302d7e495ecfaf007dd4752618ed6378913df671fd0cb2a +F test/fuzzdata8.db e12b57c30566b9511ed8760eeccfb23e6361db9c43092032252e922ed942d67c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1929,7 +1929,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 e162da3ab4c183b67872be004035c48fc8f20084bc5757aec27410ce23a36631 -R 5b3b99f69598abd3ff48cb7e9e2a37d6 +P fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e +R d9d7a435d8b8a1837f287c26685a733e U drh -Z fe3fae615e6e48414d5d1a1ec7e33318 +Z b3b900615c7f934236b8d70c4ffaa098 diff --git a/manifest.uuid b/manifest.uuid index a4bb84a3a7..b9fbb74cb6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e \ No newline at end of file +f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 \ No newline at end of file diff --git a/src/hash.h b/src/hash.h index 951cc06c90..3f491e45c0 100644 --- a/src/hash.h +++ b/src/hash.h @@ -91,6 +91,6 @@ void sqlite3HashClear(Hash*); /* ** Number of entries in a hash table */ -/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ +#define sqliteHashCount(H) ((H)->count) #endif /* SQLITE_HASH_H */ diff --git a/src/pragma.c b/src/pragma.c index 3392871d8a..d23457f845 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1227,8 +1227,35 @@ void sqlite3Pragma( for(ii=0; iinDb; ii++){ HashElem *k; Hash *pHash; + int initNCol; if( zDb && sqlite3_stricmp(zDb, db->aDb[ii].zDbSName)!=0 ) continue; + + /* Ensure that the Table.nCol field is initialized for all views + ** and virtual tables. Each time we initialize a Table.nCol value + ** for a table, that can potentially disrupt the hash table, so restart + ** the initialization scan. + */ pHash = &db->aDb[ii].pSchema->tblHash; + initNCol = sqliteHashCount(pHash); + while( initNCol-- ){ + for(k=sqliteHashFirst(pHash); 1; k=sqliteHashNext(k) ){ + Table *pTab; + if( k==0 ){ initNCol = 0; break; } + pTab = sqliteHashData(k); + if( pTab->nCol==0 ){ + char *zSql = sqlite3MPrintf(db, "SELECT*FROM\"%w\"", pTab->zName); + if( zSql ){ + sqlite3_stmt *pDummy = 0; + (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); + (void)sqlite3_finalize(pDummy); + sqlite3DbFree(db, zSql); + } + pHash = &db->aDb[ii].pSchema->tblHash; + break; + } + } + } + for(k=sqliteHashFirst(pHash); k; k=sqliteHashNext(k) ){ Table *pTab = sqliteHashData(k); const char *zType; @@ -1242,17 +1269,6 @@ void sqlite3Pragma( }else{ zType = "table"; } - if( zType[0]=='v' && pTab->nCol==0 ){ - /* The number of columns is not known for views and virtual tables - ** until after the object is used at least once. */ - char *zSql = sqlite3MPrintf(db, "SELECT * FROM \"%w\"", pTab->zName); - if( zSql ){ - sqlite3_stmt *pDummy = 0; - (void)sqlite3_prepare(db, zSql, -1, &pDummy, 0); - (void)sqlite3_finalize(pDummy); - sqlite3DbFree(db, zSql); - } - } sqlite3VdbeMultiLoad(v, 1, "sssiii", db->aDb[ii].zDbSName, pTab->zName, diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 808d8065f7deb0599532ab66d4f19e4cdb43ba8a..f3ee3fdc946aab631de3a903b039b64fca74bdea 100644 GIT binary patch delta 63616 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

qrLExYS+waZ2b`A=E@ zt+%-fXLITLLVE|J68hYrZ{3x91xG*RTxbt93OGM^;(yA%?O&D^&Mp#wFij-bBGOeZsq zUvgS0l`vOT%UBP3eZ3Sa!}~p45$uhru1KC)K<@u|Sv^XfpfnV~**OJ$mxG z`G5F7PQ%C$WG&;5IT`_{#2ldb{p9T|=jm@G`HD@5qpG z)!RKiGb1A_E2|vxn&=y1Mn?K%SXmG@SST%r)nB;dc>AkXg;hXFbl7lS+F;l>D(n%! z>9x0jfJNe$?#b{*cGzTyf5bIf#KoZu&(-Ka^u_hAbcEqxaDVMy0J$|dzwg^X2MgVN z@WTenb^-z*DK0EU$e042I@hCcGA?W>Y}rT=n-~{11cXg=2&}CR3=7ZfEzk5#n}yk} z^2Q9vN7Avv#7bE7tsE_trub5 z?&SJ);VXr{-*_S&<@3usQ!nh(%%lhuHIeUT)U;A+{T|mGu2onja*$-|Bx84^+CMkg{jkw?yli0#?)8y zodUj{Ww7(p3@Y&8X?X+_XBZedmJe43X<@K=ePkefKQ%A}KA0IUp_9LH%t=PEvz=qQ z;L@2AQ-h1@AEF|dm3|4@N}VP*h0*NnZLup(D(jr@`_CFG>%7>wK+t>E^G-|!o84fn z!@z7-wa4H&1(z8;1u_Oar(`iHv4K0kZjI{XgSG-m zE00w08`ah-lTc-FAl5P{|~^?)(; zBbc$oI8QJ|K}Uym+cZ{H(&;$y59qXw&H9_Mo(R)3S<*|LR@q==KPOKA0dfUYP3`oq zrBpzrhC<^>cOk2|V%+N_bJ@PnjeJ`Wp1#YodSqpIyY=h|xi1PDOaIE)CvyPyJ7c=N za*b9$4@UmOXtB@4JF8$-r6&eH`Z_R~_5GeVzM6?Y8Hgu7bU-xmR}B;Kw-eFf=NHQP zu=@!)luZdTTV3`A2xR4O17*V^%s&ct%&#HO$M+~R4oZ@V6DGwFC+iw*mb=7SF<>X( z&wAOhMDu-O|HInR^?zW^$!0OJ&%?)R;fZMTVYWau9||Imu|=%#`$93`iSgFu!8zuS4hMgwTsjsn=&Z88Nd!kj06rLk7fiNo zpgD<<#RmtOYw<=r4B0vdudDFd2(zEGWZ9esw2G$Lzg>!j`$n2C*&9%<$MGx@lL)ot zn_*6bXFE)Ze1H{?GZ8Fb&cq4k9G9a3!vtQx^Jrt0*^yN~7r8=MUl%UIr1Hpp_#!GV z#h;b_U&4MmIL(}b58!Fi?l@i-!v|&y_7(VjBQ$5&l9^s(zAiZ$oMOO>xG8WZg7m0a zBduLq-QW-dcJO6TWxF3Wi%9Tle5k2>a)m)_yc9fIco<8lGp}&~wswaL2VsMGJkajK zmOAmN7*^P5K5w(H$EP+xUMxn~rk;#FywkScM2MA%8+b==gh3UNqu}yC?Gl@`nRmI& zCT%zWAxN8>Jq;L9`6r4+g+cXBbEO@yq%ExZh=~!vwXc{N(6|ss&%JM9hjKf8iZvfK zzr#iU1*aQs4|fK#h`r`@LbkHzV`d3qWv%8`fox+}4#pZ*uI zRR3$h$H3k<%~1^NdfZN)fkn@B%tjB07~Ia`^&+zUKc%Rb9C(t~nAaT=KR5e9zC9$- zgJM0uE29B79%m}L-~Q#7U%=NS_kf2_nVo~4-8i%X-D(bW>b^^WvlpVqaxVIR^4`M$ zXn7|z7X^)Em%0VVVRnqOCSta`prDrxY3$FLd(an?Eh?uffvx>?H24eVIRVkyvyFl1 z?XL!(WR4F_cc9%Z1}wf04u5X0gfsokAXlllh%63n2w|^%Zn_ESz)pUFdbOit%;J&1 KyX|`v_WuDJTe;H! delta 50026 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 From 95888784efafb95aa993b9393d2ddb61ee6dd626 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 21 Oct 2021 20:08:00 +0000 Subject: [PATCH 04/76] Enable FTS5 for fuzzcheck. FossilOrigin-Name: 559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 --- Makefile.in | 2 +- Makefile.msc | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Makefile.in b/Makefile.in index 840b504f1d..b3ea4628b3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -624,7 +624,7 @@ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS3_PARENTHESIS -#FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB diff --git a/Makefile.msc b/Makefile.msc index cfa20c6245..1d934c47b6 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1699,6 +1699,7 @@ MPTESTER_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS5 FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_RTREE FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_GEOPOLY FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DBSTAT_VTAB diff --git a/manifest b/manifest index fcae3aa996..1b7c60b729 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sthe\sprevious\scheck-in\sso\sthat\sit\sworks\swith\svirtual\stables\sthat\sadd\snew\nshadow\stables\sthe\sfirst\stime\sthey\sare\sreferenced. -D 2021-10-21T19:48:14.633 +C Enable\sFTS5\sfor\sfuzzcheck. +D 2021-10-21T20:08:00.665 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 457a0f10540bd18a700c9d45add8dcc06e040bc9d1e948c9816b9b6eab1de384 +F Makefile.in 0e91c42a1dd13a569b1fa4f4dfb7d3632f3164a1c05c71341533d67db5b641dd F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc fef1e54f1a2138aa2de79ad8a928f1711106d082e6a35cdfbbfec9e8fd0c59c3 +F Makefile.msc 5904e640ee2f577bcd137b9b5393895be3a1602d1e2b8c99e356f569d96ad98b F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1929,7 +1929,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 fb0ed8c55f6362d2639687392a72cc3ed9dc318929e11893edd2a0f023929f7e -R d9d7a435d8b8a1837f287c26685a733e +P f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 +R c12908b5ad7e1daca726d21d0e808b76 U drh -Z b3b900615c7f934236b8d70c4ffaa098 +Z 8f7717d9b592fff6ee99b8fe013f83fa diff --git a/manifest.uuid b/manifest.uuid index b9fbb74cb6..dcf2d0a2f3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 \ No newline at end of file +559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 \ No newline at end of file From dcf10a1a4bb5c242e1ec87a2f83df637f1dfe9e9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 22 Oct 2021 11:17:29 +0000 Subject: [PATCH 05/76] Fix harmless compiler warnings. Improve the independence of some TCL tests. FossilOrigin-Name: 1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 --- ext/rtree/rtree9.test | 2 +- ext/rtree/rtreedoc.test | 3 ++- ext/rtree/test_rtreedoc.c | 15 +++++++-------- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/global.c | 6 ++++++ src/sqliteInt.h | 1 - 7 files changed, 27 insertions(+), 22 deletions(-) diff --git a/ext/rtree/rtree9.test b/ext/rtree/rtree9.test index a7cd344d76..f39a82e582 100644 --- a/ext/rtree/rtree9.test +++ b/ext/rtree/rtree9.test @@ -36,7 +36,7 @@ do_execsql_test rtree9-1.4 { DELETE FROM rt; } {} - +unset -nocomplain x for {set i 0} {$i < 1000} {incr i} { set x [expr $i%10] set y [expr ($i/10)%10] diff --git a/ext/rtree/rtreedoc.test b/ext/rtree/rtreedoc.test index d2b37428a9..b64faa2e99 100644 --- a/ext/rtree/rtreedoc.test +++ b/ext/rtree/rtreedoc.test @@ -39,6 +39,7 @@ proc column_name_list {db tbl} { } return $lCol } +unset -nocomplain res #------------------------------------------------------------------------- #------------------------------------------------------------------------- @@ -792,6 +793,7 @@ do_execsql_test 3.0 { INSERT INTO x1 VALUES(4, 4, 4); } do_test 3.1 { + unset -nocomplain res set res [list] db eval { SELECT * FROM x1 } { lappend res $a $b $c @@ -1579,4 +1581,3 @@ execsql ROLLBACK finish_test - diff --git a/ext/rtree/test_rtreedoc.c b/ext/rtree/test_rtreedoc.c index 752a7ac124..3272d89eca 100644 --- a/ext/rtree/test_rtreedoc.c +++ b/ext/rtree/test_rtreedoc.c @@ -105,15 +105,15 @@ static int invokeTclGeomCb( if( p->pUser || p->xDelUser ){ rc = SQLITE_ERROR; }else{ - BoxGeomCtx *pCtx = sqlite3_malloc(sizeof(BoxGeomCtx)); - if( pCtx==0 ){ + BoxGeomCtx *pBGCtx = sqlite3_malloc(sizeof(BoxGeomCtx)); + if( pBGCtx==0 ){ rc = SQLITE_NOMEM; }else{ - pCtx->interp = interp; - pCtx->pScript = Tcl_DuplicateObj(pRes); - Tcl_IncrRefCount(pCtx->pScript); - Tcl_ListObjReplace(interp, pCtx->pScript, 0, 1, 0, 0); - p->pUser = (void*)pCtx; + pBGCtx->interp = interp; + pBGCtx->pScript = Tcl_DuplicateObj(pRes); + Tcl_IncrRefCount(pBGCtx->pScript); + Tcl_ListObjReplace(interp, pBGCtx->pScript, 0, 1, 0, 0); + p->pUser = (void*)pBGCtx; p->xDelUser = testDelUser; } } @@ -346,4 +346,3 @@ int Sqlitetestrtreedoc_Init(Tcl_Interp *interp){ #endif /* SQLITE_ENABLE_RTREE */ return TCL_OK; } - diff --git a/manifest b/manifest index 1b7c60b729..5ea5f0607b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sFTS5\sfor\sfuzzcheck. -D 2021-10-21T20:08:00.665 +C Fix\sharmless\scompiler\swarnings.\s\sImprove\sthe\sindependence\sof\ssome\sTCL\stests. +D 2021-10-22T11:17:29.954 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -404,7 +404,7 @@ F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2 F ext/rtree/rtree6.test 9ce3691c1aac43070a9f194f0ebf54372db346c5a82241fd11b525ed53ce9f3f F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e -F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf +F ext/rtree/rtree9.test fd3c9384ef8aabbc127b3878764070398f136eebc551cd20484b570f2cc1956a F ext/rtree/rtreeA.test c0d8e91e25052d5f3fbda17632ca843b82ca13c4181fb6000a0d63bd2d7e70ce F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 F ext/rtree/rtreeC.test c4bfa9a61c6788c03e4a9ce40ab2cfc6100982559effd9842d1b658e1d47aa5f @@ -419,12 +419,12 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreedoc.test 903c5229758bcef1d5590892bf973d9f91dcd1d96b1c09b6761e2c0e398e78e1 +F ext/rtree/rtreedoc.test 27a5703cb1200f6f69051de68da546cef3dfdcf59be73afadfc50b9f9c9960d9 F ext/rtree/rtreedoc2.test 194ebb7d561452dcdc10bf03f44e30c082c2f0c14efeb07f5e02c7daf8284d93 F ext/rtree/rtreedoc3.test 555a878c4d79c4e37fa439a1c3b02ee65d3ebaf75d9e8d96a9c55d66db3efbf8 F ext/rtree/rtreefuzz001.test 0fc793f67897c250c5fde96cefee455a5e2fb92f4feeabde5b85ea02040790ee F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/test_rtreedoc.c e81d9bf69f7cbc8ba536458bbd8fc06a6f9ca93165f7d68832f588461e6a53cb +F ext/rtree/test_rtreedoc.c 0167f9243a56d08e79230f604f3979d6b7cde4816355acf7a7d436d9d788bf38 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 @@ -505,7 +505,7 @@ F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b -F src/global.c 59bfd5705a623f0b45e91622699953cfd1be2c176e78d8ff610463f2ea4ec51b +F src/global.c 1f56aead86e8a18c4415638f5e6c4d0a0550427f4b3f5d065ba5164cc09c22e8 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -554,7 +554,7 @@ F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa63 F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h df3bc11691f5977041efb0d16fcd2b5e10e97bc5f8231edd3fbc0ed24978be30 +F src/sqliteInt.h 317bbdf926ec7c391fb00bcaa1f82799836a1151568bd9d343f43c2cdf1a48b9 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1929,7 +1929,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 f73b499e539b9551a70deecec4fc10c3a4af3830324977861cd0558f9782a1d3 -R c12908b5ad7e1daca726d21d0e808b76 +P 559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 +R 332dd56b39999f59e5d9d9296b7da59d U drh -Z 8f7717d9b592fff6ee99b8fe013f83fa +Z 09926337278faa19265979e4ffc8ebe1 diff --git a/manifest.uuid b/manifest.uuid index dcf2d0a2f3..da82038d25 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 \ No newline at end of file +1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 \ No newline at end of file diff --git a/src/global.c b/src/global.c index 52ca5bab2e..34b7d9583b 100644 --- a/src/global.c +++ b/src/global.c @@ -298,11 +298,17 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { */ FuncDefHash sqlite3BuiltinFunctions; +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) /* ** Counter used for coverage testing. Does not come into play for ** release builds. +** +** Access to this global variable is not mutex protected. This might +** result in TSAN warnings. But as the variable does not exist in +** release builds, that should not be a concern. */ unsigned int sqlite3CoverageCounter; +#endif /* SQLITE_COVERAGE_TEST || SQLITE_DEBUG */ #ifdef VDBE_PROFILE /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 06264a258f..cb20a37f24 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -435,7 +435,6 @@ ** is significant and used at least once. On switch statements ** where multiple cases go to the same block of code, testcase() ** can insure that all cases are evaluated. -** */ #if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) # ifndef SQLITE_AMALGAMATION From be5365617143b4bb58ab8a105df1a5ba041b0bb6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 11:30:35 +0000 Subject: [PATCH 06/76] Update fuzzcheck so that it allows ATTACH statements with memdb filenames. FossilOrigin-Name: 31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5ea5f0607b..c6635feacc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings.\s\sImprove\sthe\sindependence\sof\ssome\sTCL\stests. -D 2021-10-22T11:17:29.954 +C Update\sfuzzcheck\sso\sthat\sit\sallows\sATTACH\sstatements\swith\smemdb\sfilenames. +D 2021-10-23T11:30:35.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 2295d04576264ef8d1aa5adf689fa0b774aede30c565cd6cb11772bf66361b69 +F test/fuzzcheck.c 7d9cf020fa4a1c52b09aa5f9daf5a0fa5a3edfd952e5933f0812735d138f7529 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,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 559ba38b8a0f7795d781838ec78969874fd678f749b26cd49cf6112afc838732 -R 332dd56b39999f59e5d9d9296b7da59d +P 1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 +R 34386e9b5caf945336fe068df17fa91d U drh -Z 09926337278faa19265979e4ffc8ebe1 +Z fe79b53e74aa12c3b50f43764f01d9e9 diff --git a/manifest.uuid b/manifest.uuid index da82038d25..a71d65e118 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 \ No newline at end of file +31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index dc5269481b..21a84d3325 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -762,7 +762,10 @@ static int block_troublesome_sql( oomCounter = atoi(zArg2); } }else if( eCode==SQLITE_ATTACH ){ - if( zArg1==0 || (zArg1[0]!=0 && strcmp(zArg1,":memory:")!=0) ){ + if( zArg1==0 ) return SQLITE_DENY; + if( strcmp(zArg1,":memory:")!=0 + && sqlite3_strglob("file:*[?]vfs=memdb", zArg1)!=0 + ){ return SQLITE_DENY; } } @@ -1503,6 +1506,7 @@ int main(int argc, char **argv){ int nV; /* How much to increase verbosity with -vvvv */ sqlite3_int64 tmStart; /* Start of each test */ + sqlite3_config(SQLITE_CONFIG_URI,1); registerOomSimulator(); sqlite3_initialize(); iBegin = timeOfDay(); From 88944e6f1035d98e8af36c57c9d29636d2d77ec9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 17:46:00 +0000 Subject: [PATCH 07/76] Fix the memdb VFS so that it does not allow mmap if it is resizable, and so that it never opens a disk file for any reason. FossilOrigin-Name: 5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/memdb.c | 13 ++++++------- src/vdbesort.c | 2 +- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index c6635feacc..b12b6068a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfuzzcheck\sso\sthat\sit\sallows\sATTACH\sstatements\swith\smemdb\sfilenames. -D 2021-10-23T11:30:35.169 +C Fix\sthe\smemdb\sVFS\sso\sthat\sit\sdoes\snot\sallow\smmap\sif\sit\sis\sresizable,\sand\sso\nthat\sit\snever\sopens\sa\sdisk\sfile\sfor\sany\sreason. +D 2021-10-23T17:46:00.160 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c cd8cf3ee965db4a4ab4b5423b49a4ef810490b8ba828911e523325f2cce3ed1a +F src/memdb.c ca36b36c497558abe8bf1fa6b6ad974db2275312ce30fc44e578e160688a7503 F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -628,7 +628,7 @@ F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac -F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 +F src/vdbesort.c 04292f8c569dc9ad2afc1d56d118f2cfab36ca65a3f02eef0b5b92bda01560be F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 @@ -1929,7 +1929,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 1a038242dc6c0cab97dd9375acfce62aa1c386debc36aaed388d366b87ddd931 -R 34386e9b5caf945336fe068df17fa91d +P 31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 +R 444deadb002e60bf5ed2135691fd7c7f U drh -Z fe79b53e74aa12c3b50f43764f01d9e9 +Z aa0780d26c17b9f3da4ad58aee5df686 diff --git a/manifest.uuid b/manifest.uuid index a71d65e118..d460d8ce6b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 \ No newline at end of file +5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 0d970b6ca3..321ef6ff7c 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -272,7 +272,7 @@ static int memdbRead( */ static int memdbEnlarge(MemStore *p, sqlite3_int64 newSz){ unsigned char *pNew; - if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ + if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || NEVER(p->nMmap>0) ){ return SQLITE_FULL; } if( newSz>p->szMax ){ @@ -471,7 +471,7 @@ static int memdbFetch( ){ MemStore *p = ((MemFile*)pFile)->pStore; memdbEnter(p); - if( iOfst+iAmt>p->sz ){ + if( iOfst+iAmt>p->sz || (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)!=0 ){ *pp = 0; }else{ p->nMmap++; @@ -505,9 +505,7 @@ static int memdbOpen( MemFile *pFile = (MemFile*)pFd; MemStore *p = 0; int szName; - if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ - return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFd, flags, pOutFlags); - } + memset(pFile, 0, sizeof(*pFile)); szName = sqlite3Strlen30(zName); if( szName>1 && zName[0]=='/' ){ @@ -567,8 +565,9 @@ static int memdbOpen( p->szMax = sqlite3GlobalConfig.mxMemdbSize; } pFile->pStore = p; - assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ - *pOutFlags = flags | SQLITE_OPEN_MEMORY; + if( pOutFlags!=0 ){ + *pOutFlags = flags | SQLITE_OPEN_MEMORY; + } pFd->pMethods = &memdb_io_methods; memdbLeave(p); return SQLITE_OK; diff --git a/src/vdbesort.c b/src/vdbesort.c index 397935aa8c..6cb4f87269 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -1289,7 +1289,7 @@ static void vdbeSorterExtendFile(sqlite3 *db, sqlite3_file *pFd, i64 nByte){ sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_CHUNK_SIZE, &chunksize); sqlite3OsFileControlHint(pFd, SQLITE_FCNTL_SIZE_HINT, &nByte); sqlite3OsFetch(pFd, 0, (int)nByte, &p); - sqlite3OsUnfetch(pFd, 0, p); + if( p ) sqlite3OsUnfetch(pFd, 0, p); } } #else From 021e228ec0344920decc9baa2da4f09f63d95433 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 20:32:27 +0000 Subject: [PATCH 08/76] The pager now remembers when a VFS reports that a database file is SQLITE_OPEN_MEMORY and treats that database as an in-memory database. FossilOrigin-Name: 967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b12b6068a2..9ca05fe881 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\smemdb\sVFS\sso\sthat\sit\sdoes\snot\sallow\smmap\sif\sit\sis\sresizable,\sand\sso\nthat\sit\snever\sopens\sa\sdisk\sfile\sfor\sany\sreason. -D 2021-10-23T17:46:00.160 +C The\spager\snow\sremembers\swhen\sa\sVFS\sreports\sthat\sa\sdatabase\sfile\sis\nSQLITE_OPEN_MEMORY\sand\streats\sthat\sdatabase\sas\san\sin-memory\sdatabase. +D 2021-10-23T20:32:27.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -536,7 +536,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 71e3102150ae1b5567043ccda932aa81fb7de9848f501dafe491087c940e34dc +F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b @@ -1929,7 +1929,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 31671237e560b52dc27f707309269069a6bdcd017df9844908e77b57dc11f180 -R 444deadb002e60bf5ed2135691fd7c7f +P 5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f +R d561d8148c02fd21a733d83483d3f438 U drh -Z aa0780d26c17b9f3da4ad58aee5df686 +Z 751678e6ce28d48782acb94cc1b3fb72 diff --git a/manifest.uuid b/manifest.uuid index d460d8ce6b..86786e4483 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f \ No newline at end of file +967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 20c39abb1b..0ed5848343 100644 --- a/src/pager.c +++ b/src/pager.c @@ -630,6 +630,7 @@ struct Pager { u8 noLock; /* Do not lock (except in WAL mode) */ u8 readOnly; /* True for a read-only database */ u8 memDb; /* True to inhibit all file I/O */ + u8 memVfs; /* VFS-implemented memory database */ /************************************************************************** ** The following block contains those class members that change during @@ -4872,7 +4873,7 @@ int sqlite3PagerOpen( rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); assert( !memDb ); #ifndef SQLITE_OMIT_DESERIALIZE - memJM = (fout&SQLITE_OPEN_MEMORY)!=0; + pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; #endif readOnly = (fout&SQLITE_OPEN_READONLY)!=0; @@ -6809,7 +6810,7 @@ void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ ** Return true if this is an in-memory or temp-file backed pager. */ int sqlite3PagerIsMemdb(Pager *pPager){ - return pPager->tempFile; + return pPager->tempFile || pPager->memVfs; } /* From f81b40a52d94b619be842c1758358dd886d7a8a0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 22:11:18 +0000 Subject: [PATCH 09/76] Provide an assert() to fire for applications that should never open or create a disk-based database file. FossilOrigin-Name: 5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 9ca05fe881..04feaa7df9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\spager\snow\sremembers\swhen\sa\sVFS\sreports\sthat\sa\sdatabase\sfile\sis\nSQLITE_OPEN_MEMORY\sand\streats\sthat\sdatabase\sas\san\sin-memory\sdatabase. -D 2021-10-23T20:32:27.236 +C Provide\san\sassert()\sto\sfire\sfor\sapplications\sthat\sshould\snever\sopen\sor\screate\na\sdisk-based\sdatabase\sfile. +D 2021-10-23T22:11:18.414 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/os.c 91fc69f95ef0528368174dca20f01e1d8f82934f719e1cb50fd0260b18c028a6 F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b +F src/os_unix.c f445ad0597184e27f225bfc3d327dee32b49f7918d6eda9c921369b5060d96ef F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 @@ -1929,7 +1929,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 5ee14715a561d7522e9c6fd35a2ad3e6de526450025a99d2a523c2b27151be4f -R d561d8148c02fd21a733d83483d3f438 +P 967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d +R a9ff94845a8cffbce47542363f26ab35 U drh -Z 751678e6ce28d48782acb94cc1b3fb72 +Z 2501f234de757bdac4c4fa55bb7c36cf diff --git a/manifest.uuid b/manifest.uuid index 86786e4483..f3919a049f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d \ No newline at end of file +5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index d45fdabab2..bc6063dae8 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6125,6 +6125,11 @@ static int unixOpen( } memset(p, 0, sizeof(unixFile)); +#ifdef SQLITE_ASSERT_NO_FILES + /* Applications that never read or write a persistent disk files */ + assert( zName==0 ); +#endif + if( eType==SQLITE_OPEN_MAIN_DB ){ UnixUnusedFd *pUnused; pUnused = findReusableFd(zName, flags); From c8f7211d8fe18068cd28632e7b2e4e7420f1b282 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 23 Oct 2021 22:14:11 +0000 Subject: [PATCH 10/76] Improve the authorizer filter for ATTACH on fuzzcheck. FossilOrigin-Name: 87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 10 +++++++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 04feaa7df9..8ad190687f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\san\sassert()\sto\sfire\sfor\sapplications\sthat\sshould\snever\sopen\sor\screate\na\sdisk-based\sdatabase\sfile. -D 2021-10-23T22:11:18.414 +C Improve\sthe\sauthorizer\sfilter\sfor\sATTACH\son\sfuzzcheck. +D 2021-10-23T22:14:11.249 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 7d9cf020fa4a1c52b09aa5f9daf5a0fa5a3edfd952e5933f0812735d138f7529 +F test/fuzzcheck.c a86cc34bcc91c4a882cbac0ccc7c903d27c2a520bd6006510b3371e7befdd09b F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,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 967b65623807ff992869da0a7d9b0105701939c4658a7aee37a30fb267869c6d -R a9ff94845a8cffbce47542363f26ab35 +P 5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 +R 17548d134303a4e483245fa3f87d916c U drh -Z 2501f234de757bdac4c4fa55bb7c36cf +Z 9ccb24f9c373f9b4367082008057e6de diff --git a/manifest.uuid b/manifest.uuid index f3919a049f..28fbef41bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 \ No newline at end of file +87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 21a84d3325..ee709d3e4e 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -762,12 +762,16 @@ static int block_troublesome_sql( oomCounter = atoi(zArg2); } }else if( eCode==SQLITE_ATTACH ){ + /* Deny the ATTACH if it is attaching anything other than an in-memory + ** database. */ if( zArg1==0 ) return SQLITE_DENY; - if( strcmp(zArg1,":memory:")!=0 - && sqlite3_strglob("file:*[?]vfs=memdb", zArg1)!=0 + if( strcmp(zArg1,":memory:")==0 ) return SQLITE_OK; + if( sqlite3_strglob("file:*[?]vfs=memdb", zArg1)==0 + && sqlite3_strglob("file:*[^/a-zA-Z0-9_.]*[?]vfs=memdb", zArg1)!=0 ){ - return SQLITE_DENY; + return SQLITE_OK; } + return SQLITE_DENY; } return SQLITE_OK; } From 63e8f03c783eb746a21d2481349335c40e96f4bb Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Oct 2021 12:54:23 +0000 Subject: [PATCH 11/76] Do not allow large busy_timeout pragmas in fuzzcheck, as they accomplish nothing other than making the tests unnecessarily slow. FossilOrigin-Name: fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8ad190687f..a581a6ff99 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\sauthorizer\sfilter\sfor\sATTACH\son\sfuzzcheck. -D 2021-10-23T22:14:11.249 +C Do\snot\sallow\slarge\sbusy_timeout\spragmas\sin\sfuzzcheck,\sas\sthey\saccomplish\nnothing\sother\sthan\smaking\sthe\stests\sunnecessarily\sslow. +D 2021-10-25T12:54:23.541 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c a86cc34bcc91c4a882cbac0ccc7c903d27c2a520bd6006510b3371e7befdd09b +F test/fuzzcheck.c 0bb10903f3059b2cf006dd9db081159661360e9abcc8bc5ea61d2adcf9ec4c3e F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,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 5218ac788ca35fdd7f98117758f0bef9d55fe7517098e7bf62fda3fed2af3d51 -R 17548d134303a4e483245fa3f87d916c +P 87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb +R bc4bb1c85a5699919f19901db43f7f5f U drh -Z 9ccb24f9c373f9b4367082008057e6de +Z 82f19ae953cfc65c5ff84d970cd775e3 diff --git a/manifest.uuid b/manifest.uuid index 28fbef41bc..488b1da4a1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb \ No newline at end of file +fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index ee709d3e4e..922095cb33 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -750,7 +750,11 @@ static int block_troublesome_sql( (void)zArg3; (void)zArg4; if( eCode==SQLITE_PRAGMA ){ - if( eVerbosity==0 ){ + if( sqlite3_stricmp("busy_timeout",zArg1)==0 + && (zArg2==0 || atoi(zArg2)>100) + ){ + return SQLITE_DENY; + }else if( eVerbosity==0 ){ if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 || sqlite3_stricmp("parser_trace", zArg1)==0 || sqlite3_stricmp("temp_store_directory", zArg1)==0 From 9b35c679a9c534631cb002b6850f72f26a5d45f2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 25 Oct 2021 18:51:56 +0000 Subject: [PATCH 12/76] Remove a NEVER() in rebuildPage that is reachable, as is demonstrated by dbsqlfuzz case beac09b2756b5d285aa68f9737fdb06c972f159a. FossilOrigin-Name: ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a581a6ff99..545b6fa316 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\slarge\sbusy_timeout\spragmas\sin\sfuzzcheck,\sas\sthey\saccomplish\nnothing\sother\sthan\smaking\sthe\stests\sunnecessarily\sslow. -D 2021-10-25T12:54:23.541 +C Remove\sa\sNEVER()\sin\srebuildPage\sthat\sis\sreachable,\sas\sis\sdemonstrated\sby\ndbsqlfuzz\scase\sbeac09b2756b5d285aa68f9737fdb06c972f159a. +D 2021-10-25T18:51:56.300 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 0604f4af97624ffbe2f0757c559c51f57760c6ad3d8ee3ee94fa6ec5795f2832 +F src/btree.c 004c647dfb5332ee4b56385f3ac264ebea781cb00f7a1561a48f4a45b78fed61 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h ee9348c4cb9077243b049edc93a82c1f32ca48baeabf2140d41362b9f9139ff7 F src/build.c 8bdda90f9b1189c7b0813575171b3c6b2d74b3ade57c11cb4383776781ea9335 @@ -1929,7 +1929,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 87d49e80878674470d280de79c8ade222dd006e65c90e79616c4f72c7c32dabb -R bc4bb1c85a5699919f19901db43f7f5f +P fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c +R b046afa0c3d079723fde3f7c27c80f0b U drh -Z 82f19ae953cfc65c5ff84d970cd775e3 +Z 7cee34f3c763c52a086ac43f9a7fefb9 diff --git a/manifest.uuid b/manifest.uuid index 488b1da4a1..9772a0f585 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c \ No newline at end of file +ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index ccb7eac1a7..0d220a3b93 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7084,7 +7084,7 @@ static int rebuildPage( assert( i(u32)usableSize) ){ j = 0; } + if( j>(u32)usableSize ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k Date: Tue, 26 Oct 2021 09:53:51 +0000 Subject: [PATCH 13/76] Fix the busy_timeout restriction on fuzzcheck so that it can deal with hexadecimal integer literals. FossilOrigin-Name: 4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 545b6fa316..aa67b05119 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sin\srebuildPage\sthat\sis\sreachable,\sas\sis\sdemonstrated\sby\ndbsqlfuzz\scase\sbeac09b2756b5d285aa68f9737fdb06c972f159a. -D 2021-10-25T18:51:56.300 +C Fix\sthe\sbusy_timeout\srestriction\son\sfuzzcheck\sso\sthat\sit\scan\sdeal\swith\nhexadecimal\sinteger\sliterals. +D 2021-10-26T09:53:51.938 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 0bb10903f3059b2cf006dd9db081159661360e9abcc8bc5ea61d2adcf9ec4c3e +F test/fuzzcheck.c 5773a888c10080da4a3174b19136631a787735a0ee44aa1bc0078384b2caeb13 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,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 fba441bf9f6ed729a66ccd4e42b5a8859bf3952d70a66bc9a2496ec49d90a60c -R b046afa0c3d079723fde3f7c27c80f0b +P ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 +R aaa4122ff484e5344bdfc79be4d2bdda U drh -Z 7cee34f3c763c52a086ac43f9a7fefb9 +Z 44dd105d0edba620f6048dd47ca2265d diff --git a/manifest.uuid b/manifest.uuid index 9772a0f585..06a6268c02 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 \ No newline at end of file +4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 922095cb33..66e64c4c83 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -751,7 +751,7 @@ static int block_troublesome_sql( (void)zArg4; if( eCode==SQLITE_PRAGMA ){ if( sqlite3_stricmp("busy_timeout",zArg1)==0 - && (zArg2==0 || atoi(zArg2)>100) + && (zArg2==0 || strtoll(zArg2,0,0)>100) ){ return SQLITE_DENY; }else if( eVerbosity==0 ){ From f9a49b0cad3eeda68ed1751a42f7af91c742bc18 Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 26 Oct 2021 16:57:09 +0000 Subject: [PATCH 14/76] Add phase and error number to CLI error messages. FossilOrigin-Name: 7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/shell.c.in | 19 +++++++++---------- test/shell1.test | 4 ++-- test/shell2.test | 2 +- test/shell3.test | 4 ++-- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index aa67b05119..37433885c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbusy_timeout\srestriction\son\sfuzzcheck\sso\sthat\sit\scan\sdeal\swith\nhexadecimal\sinteger\sliterals. -D 2021-10-26T09:53:51.938 +C Add\sphase\sand\serror\snumber\sto\sCLI\serror\smessages. +D 2021-10-26T16:57:09.903 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in e80fe5118fc3b942c1becc67ebfca6a887dbab9295e0bd5b6da61c4375baa637 +F src/shell.c.in 6aefb37d9c87da9e33ae7d3541d07a24c8b74a4bc7b805a2a367d92fe5709108 F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1376,9 +1376,9 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test d014dc15876233d06df1eaf5a22275653a1d391abf1ca28df5ef3ac688df72e9 -F test/shell2.test a03b835a9e7dcc1f79b471e4d62e0c85bdc4cb954a00820702603f1409553caf -F test/shell3.test 1586a163e7918775d3c25530bf84200453f30a77cc338490389114a67352f4d9 +F test/shell1.test c354008b27c904f0166c2138abd7382013ea070b41114114ecbdfb32c726a807 +F test/shell2.test f00a0501c00583cbc46f7510e1d713366326b2b3e63d06d15937284171a8787c +F test/shell3.test cb4b835a901742c9719437a89171172ecc4a8823ad97349af8e4e841e6f82566 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 @@ -1929,7 +1929,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ac3f617827e06800d26ef688c5f5480b9621676f141d2eac134f877e0c454149 -R aaa4122ff484e5344bdfc79be4d2bdda -U drh -Z 44dd105d0edba620f6048dd47ca2265d +P 4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a +R 0e943f95c783da0ea080484e06b0d01a +T *branch * detail_cli_errors +T *sym-detail_cli_errors * +T -sym-trunk * +U larrybr +Z 75e901f51a636f4c844fe34247eb3a80 diff --git a/manifest.uuid b/manifest.uuid index 06a6268c02..b56cf872d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a \ No newline at end of file +7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 27dbe98957..cc4fb593e2 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2606,17 +2606,16 @@ static int run_table_dump_query( } /* -** Allocate space and save off current error string. +** Allocate space and save off string indicating current error. */ static char *save_err_msg( - sqlite3 *db /* Database to query */ + sqlite3 *db, /* Database to query */ + const char *zWhen, /* Qualifier (format) wrapper */ + int rc /* Error code returned from API */ ){ - int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); - char *zErrMsg = sqlite3_malloc64(nErrMsg); - if( zErrMsg ){ - memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); - } - return zErrMsg; + if( zWhen==0 ) + zWhen = "%s (%d)"; + return sqlite3_mprintf(zWhen, sqlite3_errmsg(db), rc); } #ifdef __linux__ @@ -3538,7 +3537,7 @@ static int shell_exec( rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); if( SQLITE_OK != rc ){ if( pzErrMsg ){ - *pzErrMsg = save_err_msg(db); + *pzErrMsg = save_err_msg(db, "in prepare, %s (%d)", rc); } }else{ if( !pStmt ){ @@ -3652,7 +3651,7 @@ static int shell_exec( zSql = zLeftover; while( IsSpace(zSql[0]) ) zSql++; }else if( pzErrMsg ){ - *pzErrMsg = save_err_msg(db); + *pzErrMsg = save_err_msg(db, "stepping, %s (%d)", rc); } /* clear saved stmt handle */ diff --git a/test/shell1.test b/test/shell1.test index d54964fd81..c4e2ceb88b 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -53,7 +53,7 @@ do_test shell1-1.1.2 { # error on extra options do_test shell1-1.1.3 { catchcmd "test.db FOO test.db BAD" ".quit" -} {1 {Error: near "FOO": syntax error}} +} {1 {Error: in prepare, near "FOO": syntax error (1)}} # -help do_test shell1-1.2.1 { @@ -78,7 +78,7 @@ do_test shell1-1.3.2 { } {0 {}} do_test shell1-1.3.3 { catchcmd "-init FOO test.db BAD .quit" "" -} {1 {Error: near "BAD": syntax error}} +} {1 {Error: in prepare, near "BAD": syntax error (1)}} # -echo print commands before execution do_test shell1-1.4.1 { diff --git a/test/shell2.test b/test/shell2.test index 4f2f4f3f63..6b4dff515e 100644 --- a/test/shell2.test +++ b/test/shell2.test @@ -63,7 +63,7 @@ do_test shell2-1.3 { UPDATE OR REPLACE t5 SET a = 4 WHERE a = 1; } -} {1 {Error: near line 9: too many levels of trigger recursion}} +} {1 {Error: near line 9: stepping, too many levels of trigger recursion (1)}} diff --git a/test/shell3.test b/test/shell3.test index 714a4781ea..243da976fa 100644 --- a/test/shell3.test +++ b/test/shell3.test @@ -68,7 +68,7 @@ do_test shell3-1.6 { } {0 {}} do_test shell3-1.7 { catchcmd "foo.db \"CREATE TABLE\"" -} {1 {Error: incomplete input}} +} {1 {Error: in prepare, incomplete input (1)}} #---------------------------------------------------------------------------- # shell3-2.*: Basic tests for running SQL file from command line. @@ -98,7 +98,7 @@ do_test shell3-2.6 { } {0 {}} do_test shell3-2.7 { catchcmd "foo.db" "CREATE TABLE" -} {1 {Error: near line 1: incomplete input}} +} {1 {Error: near line 1: in prepare, incomplete input (1)}} #---------------------------------------------------------------------------- From 48b4bf269c915afec9b5ee4add4e6561b0061b72 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 26 Oct 2021 22:36:41 +0000 Subject: [PATCH 15/76] Enhance fuzzcheck so that if an argument is an ordinary disk file (not a database) it is read in and processed as a script. FossilOrigin-Name: 978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 --- manifest | 13 ++++----- manifest.uuid | 2 +- test/fuzzcheck.c | 76 ++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index b970e4d506..7547c349f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sCLI\serror\smessages. -D 2021-10-26T17:36:26.684 +C Enhance\sfuzzcheck\sso\sthat\sif\san\sargument\sis\san\sordinary\sdisk\sfile\s(not\na\sdatabase)\sit\sis\sread\sin\sand\sprocessed\sas\sa\sscript. +D 2021-10-26T22:36:41.583 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 5773a888c10080da4a3174b19136631a787735a0ee44aa1bc0078384b2caeb13 +F test/fuzzcheck.c b19baffbde9f6b8b3084b8ac3d73bf51a6918078eced6df36d8e0138c91bc4f8 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,8 +1929,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 4b41535b096dec4b15a85e657102a72d4288728da6103f3fdcbe0e6f244c673a 7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b -R 0e943f95c783da0ea080484e06b0d01a -T +closed 7f87a298688c37bbad8fd2e1cf0e8fbcc36f0c211dcfa3685298525648dbe21b +P 8443a2724f463bd2e14ea3aa337e8987104f63365767ca2b0993f3f3196cff95 +R da5eebcdd2e37607fde1f372cc816cab U drh -Z 2ef74f1ee23e599e6910e8c7178d34e6 +Z ca83264146ee66b96c9f2eb230ec2598 diff --git a/manifest.uuid b/manifest.uuid index ca8daeca25..346f4c92fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8443a2724f463bd2e14ea3aa337e8987104f63365767ca2b0993f3f3196cff95 \ No newline at end of file +978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 66e64c4c83..da90d3d4e2 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -302,6 +302,37 @@ static VFile *createVFile(const char *zName, int sz, unsigned char *pData){ return pNew; } +/* +** Read the complete content of a file into memory. Add a 0x00 terminator +** and return a pointer to the result. +** +** The file content is held in memory obtained from sqlite_malloc64() which +** should be freed by the caller. +*/ +static char *readFile(const char *zFilename, long *sz){ + FILE *in; + long nIn; + unsigned char *pBuf; + + *sz = 0; + if( zFilename==0 ) return 0; + in = fopen(zFilename, "rb"); + if( in==0 ) return 0; + fseek(in, 0, SEEK_END); + *sz = nIn = ftell(in); + rewind(in); + pBuf = sqlite3_malloc64( nIn+1 ); + if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ + pBuf[nIn] = 0; + fclose(in); + return pBuf; + } + sqlite3_free(pBuf); + *sz = 0; + fclose(in); + return 0; +} + /* ** Implementation of the "readfile(X)" SQL function. The entire content @@ -313,25 +344,15 @@ static void readfileFunc( int argc, sqlite3_value **argv ){ - const char *zName; - FILE *in; long nIn; void *pBuf; + const char *zName = (const char*)sqlite3_value_text(argv[0]); - zName = (const char*)sqlite3_value_text(argv[0]); if( zName==0 ) return; - in = fopen(zName, "rb"); - if( in==0 ) return; - fseek(in, 0, SEEK_END); - nIn = ftell(in); - rewind(in); - pBuf = sqlite3_malloc64( nIn ); - if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ + pBuf = readFile(zName, &nIn); + if( pBuf ){ sqlite3_result_blob(context, pBuf, nIn, sqlite3_free); - }else{ - sqlite3_free(pBuf); } - fclose(in); } /* @@ -1690,12 +1711,21 @@ int main(int argc, char **argv){ /* Process each source database separately */ for(iSrcDb=0; iSrcDbzName); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(db, "SELECT count(*) FROM sqlite_schema", 0, 0, 0); + } if( rc ){ - fatalError("cannot open source database %s - %s", - azSrcDb[iSrcDb], sqlite3_errmsg(db)); + sqlite3_close(db); + zRawData = readFile(azSrcDb[iSrcDb], &nRawData); + if( zRawData==0 ){ + fatalError("input file \"%s\" is not recognized\n", azSrcDb[iSrcDb]); + } + sqlite3_open(":memory:", &db); } /* Print the description, if there is one */ @@ -1730,6 +1760,7 @@ int main(int argc, char **argv){ sqlite3_finalize(pStmt); printf("\n"); sqlite3_close(db); + sqlite3_free(zRawData); continue; } @@ -1754,6 +1785,21 @@ int main(int argc, char **argv){ sqlite3_free(zSql); if( rc ) fatalError("cannot change description: %s", sqlite3_errmsg(db)); } + if( zRawData ){ + zInsSql = "INSERT INTO xsql(sqltext) VALUES(?1)"; + rc = sqlite3_prepare_v2(db, zInsSql, -1, &pStmt, 0); + if( rc ) fatalError("cannot prepare statement [%s]: %s", + zInsSql, sqlite3_errmsg(db)); + sqlite3_bind_text(pStmt, 1, zRawData, nRawData, SQLITE_STATIC); + sqlite3_step(pStmt); + rc = sqlite3_reset(pStmt); + if( rc ) fatalError("insert failed for %s", argv[i]); + sqlite3_finalize(pStmt); + rebuild_database(db, dbSqlOnly); + zInsSql = 0; + sqlite3_free(zRawData); + zRawData = 0; + } ossFuzzThisDb = ossFuzz; /* If the CONFIG(name,value) table exists, read db-specific settings From 075201e50f3fb3f854a321e800b6311f23435b01 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 12:05:28 +0000 Subject: [PATCH 16/76] Add the --script option to fuzzcheck. FossilOrigin-Name: 5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb --- manifest | 12 ++--- manifest.uuid | 2 +- test/fuzzcheck.c | 128 +++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 124 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 7547c349f3..8b0d1ffd37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sfuzzcheck\sso\sthat\sif\san\sargument\sis\san\sordinary\sdisk\sfile\s(not\na\sdatabase)\sit\sis\sread\sin\sand\sprocessed\sas\sa\sscript. -D 2021-10-26T22:36:41.583 +C Add\sthe\s--script\soption\sto\sfuzzcheck. +D 2021-10-27T12:05:28.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c b19baffbde9f6b8b3084b8ac3d73bf51a6918078eced6df36d8e0138c91bc4f8 +F test/fuzzcheck.c c466c078af4476a4f9c6193a9bad5b16966e55bc3c5717b6aa638dea8308c08a F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,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 8443a2724f463bd2e14ea3aa337e8987104f63365767ca2b0993f3f3196cff95 -R da5eebcdd2e37607fde1f372cc816cab +P 978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 +R 8173569b9fa9f89185b2af54915c96dd U drh -Z ca83264146ee66b96c9f2eb230ec2598 +Z 551daae1722bbf6ff67f95bde9dbd7dc diff --git a/manifest.uuid b/manifest.uuid index 346f4c92fe..90e6732e9e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 \ No newline at end of file +5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index da90d3d4e2..2b9266a06a 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -302,6 +302,77 @@ static VFile *createVFile(const char *zName, int sz, unsigned char *pData){ return pNew; } +/* Return true if the line is all zeros */ +static int allZero(unsigned char *aLine){ + int i; + for(i=0; i<16 && aLine[i]==0; i++){} + return i==16; +} + +/* +** Render a database and query as text that can be input into +** the CLI. +*/ +static void renderDbSqlForCLI( + FILE *out, /* Write to this file */ + const char *zFile, /* Name of the database file */ + unsigned char *aDb, /* Database content */ + int nDb, /* Number of bytes in aDb[] */ + unsigned char *zSql, /* SQL content */ + int nSql /* Bytes of SQL */ +){ + fprintf(out, ".print ******* %s *******\n", zFile); + if( nDb>100 ){ + int i, j; /* Loop counters */ + int pgsz; /* Size of each page */ + int lastPage = 0; /* Last page number shown */ + int iPage; /* Current page number */ + unsigned char *aLine; /* Single line to display */ + unsigned char buf[16]; /* Fake line */ + unsigned char bShow[256]; /* Characters ok to display */ + + memset(bShow, '.', sizeof(bShow)); + for(i=' '; i<='~'; i++){ + if( i!='{' && i!='}' && i!='"' && i!='\\' ) bShow[i] = i; + } + pgsz = (aDb[16]<<8) | aDb[17]; + if( pgsz==0 ) pgsz = 65536; + if( pgsz<512 || (pgsz&(pgsz-1))!=0 ) pgsz = 4096; + fprintf(out,".open --hexdb\n"); + fprintf(out,"| size %d pagesize %d filename %s\n",nDb,pgsz,zFile); + for(i=0; inDb ){ + memset(buf, 0, sizeof(buf)); + memcpy(buf, aDb+i, nDb-i); + aLine = buf; + }else{ + aLine = aDb + i; + } + if( allZero(aLine) ) continue; + iPage = i/pgsz + 1; + if( lastPage!=iPage ){ + fprintf(out,"| page %d offset %d\n", iPage, (iPage-1)*pgsz); + lastPage = iPage; + } + fprintf(out,"| %5d:", i-(iPage-1)*pgsz); + for(j=0; j<16; j++) fprintf(out," %02x", aLine[j]); + fprintf(out," "); + for(j=0; j<16; j++){ + unsigned char c = (unsigned char)aLine[j]; + fputc( bShow[c], stdout); + } + fputc('\n', stdout); + } + fprintf(out,"| end %s\n", zFile); + }else{ + fprintf(out,".open :memory:\n"); + } + fprintf(out,".testctrl prng_seed 1 db\n"); + fprintf(out,".testctrl internal_functions\n"); + fprintf(out,"%.*s", nSql, zSql); + if( nSql>0 && zSql[nSql-1]!='\n' ) fprintf(out, "\n"); +} + /* ** Read the complete content of a file into memory. Add a 0x00 terminator ** and return a pointer to the result. @@ -325,7 +396,7 @@ static char *readFile(const char *zFilename, long *sz){ if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ pBuf[nIn] = 0; fclose(in); - return pBuf; + return (char*)pBuf; } sqlite3_free(pBuf); *sz = 0; @@ -876,7 +947,13 @@ static int runDbSql(sqlite3 *db, const char *zSql){ } /* Invoke this routine to run a single test case */ -int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte, int iTimeout){ +int runCombinedDbSqlInput( + const uint8_t *aData, /* Combined DB+SQL content */ + size_t nByte, /* Size of aData in bytes */ + int iTimeout, /* Use this timeout */ + int bScript, /* If true, just render CLI output */ + int iSqlId /* SQL identifier */ +){ int rc; /* SQLite API return value */ int iSql; /* Index in aData[] of start of SQL */ unsigned char *aDb = 0; /* Decoded database content */ @@ -902,6 +979,14 @@ int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte, int iTimeout){ iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); if( iSql<0 ) return 0; nSql = (int)(nByte - iSql); + if( bScript ){ + char zName[100]; + sqlite3_snprintf(sizeof(zName),zName,"dbsql%06d.db",iSqlId); + renderDbSqlForCLI(stdout, zName, aDb, nDb, + (unsigned char*)(aData+iSql), nSql); + sqlite3_free(aDb); + return 0; + } if( eVerbosity>=3 ){ printf( "****** %d-byte input, %d-byte database, %d-byte script " @@ -1005,7 +1090,7 @@ testrun_finished: if( rc!=SQLITE_OK ){ fprintf(stdout, "sqlite3_close() returns %d\n", rc); } - if( eVerbosity>=2 ){ + if( eVerbosity>=2 && !bScript ){ fprintf(stdout, "Peak memory usages: %f MB\n", sqlite3_memory_highwater(1) / 1000000.0); } @@ -1479,6 +1564,7 @@ static void showHelp(void){ " -q|--quiet Reduced output\n" " --rebuild Rebuild and vacuum the database file\n" " --result-trace Show the results of each SQL command\n" +" --script Output CLI script instead of running tests\n" " --skip N Skip the first N test cases\n" " --spinner Use a spinner to show progress\n" " --sqlid N Use only SQL where sqlid=N\n" @@ -1508,6 +1594,7 @@ int main(int argc, char **argv){ int vdbeLimitFlag = 0; /* --limit-vdbe */ int infoFlag = 0; /* --info */ int nSkip = 0; /* --skip */ + int bScript = 0; /* --script */ int bSpinner = 0; /* True for --spinner */ int timeoutTest = 0; /* undocumented --timeout-test flag */ int runFlags = 0; /* Flags sent to runSql() */ @@ -1642,6 +1729,9 @@ int main(int argc, char **argv){ if( strcmp(z,"result-trace")==0 ){ runFlags |= SQL_OUTPUT; }else + if( strcmp(z,"script")==0 ){ + bScript = 1; + }else if( strcmp(z,"skip")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); nSkip = atoi(argv[++i]); @@ -1930,7 +2020,7 @@ int main(int argc, char **argv){ } /* Print the description, if there is one */ - if( !quietFlag ){ + if( !quietFlag && !bScript ){ zDbName = azSrcDb[iSrcDb]; i = (int)strlen(zDbName) - 1; while( i>0 && zDbName[i-1]!='/' && zDbName[i-1]!='\\' ){ i--; } @@ -1987,12 +2077,16 @@ int main(int argc, char **argv){ /* Run a test using each SQL script against each database. */ - if( !verboseFlag && !quietFlag && !bSpinner ) printf("%s:", zDbName); + if( !verboseFlag && !quietFlag && !bSpinner && !bScript ){ + printf("%s:", zDbName); + } for(pSql=g.pFirstSql; pSql; pSql=pSql->pNext){ tmStart = timeOfDay(); if( isDbSql(pSql->a, pSql->sz) ){ sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d",pSql->id); - if( bSpinner ){ + if( bScript ){ + /* No progress output */ + }else if( bSpinner ){ int nTotal =g.nSql; int idx = pSql->seq; printf("\r%s: %d/%d ", zDbName, idx, nTotal); @@ -2013,10 +2107,10 @@ int main(int argc, char **argv){ if( nSkip>0 ){ nSkip--; }else{ - runCombinedDbSqlInput(pSql->a, pSql->sz, iTimeout); + runCombinedDbSqlInput(pSql->a, pSql->sz, iTimeout, bScript, pSql->id); } nTest++; - if( bTimer ){ + if( bTimer && !bScript ){ sqlite3_int64 tmEnd = timeOfDay(); printf("%lld %s\n", tmEnd - tmStart, g.zTestName); } @@ -2029,7 +2123,9 @@ int main(int argc, char **argv){ const char *zVfs = "inmem"; sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d,dbid=%d", pSql->id, pDb->id); - if( bSpinner ){ + if( bScript ){ + /* No progress output */ + }else if( bSpinner ){ int nTotal = g.nDb*g.nSql; int idx = pSql->seq*g.nDb + pDb->id - 1; printf("\r%s: %d/%d ", zDbName, idx, nTotal); @@ -2051,6 +2147,14 @@ int main(int argc, char **argv){ nSkip--; continue; } + if( bScript ){ + char zName[100]; + sqlite3_snprintf(sizeof(zName), zName, "db%06d.db", + pDb->id>1 ? pDb->id : pSql->id); + renderDbSqlForCLI(stdout, zName, + pDb->a, pDb->sz, pSql->a, pSql->sz); + continue; + } createVFile("main.db", pDb->sz, pDb->a); sqlite3_randomness(0,0); if( ossFuzzThisDb ){ @@ -2123,7 +2227,9 @@ int main(int argc, char **argv){ } } } - if( bSpinner ){ + if( bScript ){ + /* No progress output */ + }else if( bSpinner ){ int nTotal = g.nDb*g.nSql; printf("\r%s: %d/%d \n", zDbName, nTotal, nTotal); }else if( !quietFlag && !verboseFlag ){ @@ -2139,7 +2245,7 @@ int main(int argc, char **argv){ } /* End loop over all source databases */ - if( !quietFlag ){ + if( !quietFlag && !bScript ){ sqlite3_int64 iElapse = timeOfDay() - iBegin; printf("fuzzcheck: 0 errors out of %d tests in %d.%03d seconds\n" "SQLite %s %s\n", From 662bebb6bde0edac65645d0ccd5f06beb905b23d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 13:16:33 +0000 Subject: [PATCH 17/76] Change fuzzcheck so that it accepts binary dbsql files. FossilOrigin-Name: c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 12 +++++++++++- test/fuzzdata8.db | Bin 2798592 -> 2973696 bytes 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8b0d1ffd37..d72c3d5a27 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--script\soption\sto\sfuzzcheck. -D 2021-10-27T12:05:28.928 +C Change\sfuzzcheck\sso\sthat\sit\saccepts\sbinary\sdbsql\sfiles. +D 2021-10-27T13:16:33.148 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c c466c078af4476a4f9c6193a9bad5b16966e55bc3c5717b6aa638dea8308c08a +F test/fuzzcheck.c 523173cb3a6888b65799f8dc64f141ab1da49bac0f1e32c3aef303a25ec63c04 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1063,7 +1063,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db e12b57c30566b9511ed8760eeccfb23e6361db9c43092032252e922ed942d67c +F test/fuzzdata8.db ea80e98f115387b052effb7194899cc9780a81f15606bc4641051342352020cc F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1929,7 +1929,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 978dc89df521f5855678128b3c0eb503c67c1b97ddb297076e5f2c03d6297605 -R 8173569b9fa9f89185b2af54915c96dd +P 5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb +R a3ce3bdce9f1afa70675a07ac543d9e2 U drh -Z 551daae1722bbf6ff67f95bde9dbd7dc +Z 7628dc954bdefd8530bd18c257ba3ac6 diff --git a/manifest.uuid b/manifest.uuid index 90e6732e9e..7d0a6e254d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb \ No newline at end of file +c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 2b9266a06a..c179aaf19f 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1693,7 +1693,7 @@ int main(int argc, char **argv){ }else if( strcmp(z,"load-dbsql")==0 ){ zInsSql = "INSERT INTO xsql(sqltext)" - "VALUES(CAST(readtextfile(?1) AS text))"; + "VALUES(readfile(?1))"; iFirstInsArg = i+1; openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; dbSqlOnly = 1; @@ -1780,6 +1780,16 @@ int main(int argc, char **argv){ } return 0; }else + if( strcmp(z,"is-dbsql")==0 ){ + i++; + for(i++; ivcQ+(fZDaMrj?Qb{x-sk<_yEtd&o_p@8-}CL? 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 From be2d6fdd7178ccca28ba0e7fe26d96fcba29c72a Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 15:16:30 +0000 Subject: [PATCH 18/76] Fix a harmless compiler warning in fuzzcheck. FossilOrigin-Name: 1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d72c3d5a27..8244dbed6c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sfuzzcheck\sso\sthat\sit\saccepts\sbinary\sdbsql\sfiles. -D 2021-10-27T13:16:33.148 +C Fix\sa\sharmless\scompiler\swarning\sin\sfuzzcheck. +D 2021-10-27T15:16:30.612 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1055,7 +1055,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 523173cb3a6888b65799f8dc64f141ab1da49bac0f1e32c3aef303a25ec63c04 +F test/fuzzcheck.c 7a07718e3c017f31e88b56a891bb79a3eb42a413a811fd65b89a7b09fdd1adbd F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1929,7 +1929,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 5a9676bd4945ca098652780515e94d04859e73588d9db5558ab42f8b068a9ddb -R a3ce3bdce9f1afa70675a07ac543d9e2 +P c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 +R 03053c57e10c09eb198ca9ed884c519a U drh -Z 7628dc954bdefd8530bd18c257ba3ac6 +Z 65fd4279cd2fff966b4135294c4a57dc diff --git a/manifest.uuid b/manifest.uuid index 7d0a6e254d..bd5179e946 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 \ No newline at end of file +1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index c179aaf19f..b8b0fee460 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1785,7 +1785,7 @@ int main(int argc, char **argv){ for(i++; i Date: Wed, 27 Oct 2021 15:19:01 +0000 Subject: [PATCH 19/76] Fix a harmless compiler warning in memdb.c. FossilOrigin-Name: 22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/memdb.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 8244dbed6c..a978fdd743 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\sfuzzcheck. -D 2021-10-27T15:16:30.612 +C Fix\sa\sharmless\scompiler\swarning\sin\smemdb.c. +D 2021-10-27T15:19:01.315 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c ca36b36c497558abe8bf1fa6b6ad974db2275312ce30fc44e578e160688a7503 +F src/memdb.c a6c2bb1257c3398b4dd058f81888d647472b140bb1d262d47be50606eed75d55 F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -1929,7 +1929,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 c87a2426b81f22bd21543aa2408625ae472d8fe6cbe6b04145937066e61123c9 -R 03053c57e10c09eb198ca9ed884c519a +P 1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c +R b45ae9ac354d606f769be528b5f7b109 U drh -Z 65fd4279cd2fff966b4135294c4a57dc +Z 52325743b236752bc1fb158c9a88c470 diff --git a/manifest.uuid b/manifest.uuid index bd5179e946..748add109a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c \ No newline at end of file +22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 321ef6ff7c..1cc9fc2e68 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -505,6 +505,7 @@ static int memdbOpen( MemFile *pFile = (MemFile*)pFd; MemStore *p = 0; int szName; + UNUSED_PARAMETER(pVfs); memset(pFile, 0, sizeof(*pFile)); szName = sqlite3Strlen30(zName); From f76d28774244072344d0d7c263b7873725632770 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 17:15:08 +0000 Subject: [PATCH 20/76] Fix the build for various the OMIT-everything compile-time option. No impact on regular builds. FossilOrigin-Name: 947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a978fdd743..a03ceb5dff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\smemdb.c. -D 2021-10-27T15:19:01.315 +C Fix\sthe\sbuild\sfor\svarious\sthe\sOMIT-everything\scompile-time\soption.\s\sNo\simpact\non\sregular\sbuilds. +D 2021-10-27T17:15:08.514 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -501,7 +501,7 @@ F src/date.c fa928630fecf1d436cdc7a7a5c950c781709023ca782c21b7a43cc7361a9451e F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c 0c151975fa99560767d7747f9b60543d0093d9f8b89f13d2d6058e9c83ad19e7 -F src/expr.c 529f7eca2821e874a375b1b318e697d62cb28f56069677c93f587f2de5dceb54 +F src/expr.c b882787df249b7de2f62c5c240ca8af2111839c761f1a5e9b8f501f940a9d92e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 187b67af20c5795953a592832c5d985e4313fe503ebd8f95e3e9e9ad5a730bb5 F src/func.c 1cfb09d7ffca81238eccefdb0293e1f5b7cfebbd1816dfad5ec6024742a7496b @@ -1929,7 +1929,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 1cfb7e8a095e1e24df5117aa7be97470d8ce91837ff83dabebac53fafee0b09c -R b45ae9ac354d606f769be528b5f7b109 +P 22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 +R 443ce04155b2c98d2803e4679dccac9d U drh -Z 52325743b236752bc1fb158c9a88c470 +Z ee620333c98e156ed73754087d493167 diff --git a/manifest.uuid b/manifest.uuid index 748add109a..5b0add7737 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 \ No newline at end of file +947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 12c2ad636e..7a957fe025 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1748,7 +1748,7 @@ Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int flags){ return pRet; } #else -Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ +Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags){ assert( p==0 ); return 0; } From 9b2adcc3d19410b17156593052d7554728a26064 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 19:05:04 +0000 Subject: [PATCH 21/76] New assert()s to help prove correctness in sqlite3VdbeMemExpandBlob(). FossilOrigin-Name: 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a03ceb5dff..154c787ff5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuild\sfor\svarious\sthe\sOMIT-everything\scompile-time\soption.\s\sNo\simpact\non\sregular\sbuilds. -D 2021-10-27T17:15:08.514 +C New\sassert()s\sto\shelp\sprove\scorrectness\sin\ssqlite3VdbeMemExpandBlob(). +D 2021-10-27T19:05:04.804 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -627,7 +627,7 @@ F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 -F src/vdbemem.c 8be0af1060012520381d3296fcb1718e80cd5b99ce04f51f7e1c4dba4072caac +F src/vdbemem.c 71a449c57be10a66a8a5620e5c5a67ebb9ca70121556dc631ffd4c4458708d8c F src/vdbesort.c 04292f8c569dc9ad2afc1d56d118f2cfab36ca65a3f02eef0b5b92bda01560be F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@ -1929,7 +1929,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 22fdc658a7cc6d2c50957f92c19de74c9ac7d7d3498731d73e035b99a82bc406 -R 443ce04155b2c98d2803e4679dccac9d +P 947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 +R 25804e35f2af1022a83cf075d76b7647 U drh -Z ee620333c98e156ed73754087d493167 +Z 847be2825d463962a46d3dd1feb437b1 diff --git a/manifest.uuid b/manifest.uuid index 5b0add7737..ed4a5f7126 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 \ No newline at end of file +7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index d381d4fc5c..f659e55659 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -374,6 +374,8 @@ int sqlite3VdbeMemExpandBlob(Mem *pMem){ if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ return SQLITE_NOMEM_BKPT; } + assert( pMem->z!=0 ); + assert( sqlite3DbMallocSize(pMem->db,pMem->z) >= nByte ); memset(&pMem->z[pMem->n], 0, pMem->u.nZero); pMem->n += pMem->u.nZero; From 5f25627a1c7c151b04a5710427c9da4284d0a090 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 19:57:59 +0000 Subject: [PATCH 22/76] Improve the comment on walIndexPage() to more accurately describe the post-conditions. FossilOrigin-Name: b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/wal.c | 14 ++++++++++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 154c787ff5..4eb388a925 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()s\sto\shelp\sprove\scorrectness\sin\ssqlite3VdbeMemExpandBlob(). -D 2021-10-27T19:05:04.804 +C Improve\sthe\scomment\son\swalIndexPage()\sto\smore\saccurately\sdescribe\sthe\npost-conditions. +D 2021-10-27T19:57:59.451 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c +F src/wal.c 2bf6d846140a3ef6ac4dae85e993e98dd304e03641ccef65904744eb85e65e2e F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 @@ -1929,7 +1929,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 947805719bc8629619af5358ad50a6365c01f8d9ceabfe8e4df947696d3819b3 -R 25804e35f2af1022a83cf075d76b7647 +P 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe +R d7b0bf6adaa4481b0cdf4adead947bd2 +T *branch * wal-tuneup +T *sym-wal-tuneup * +T -sym-trunk * U drh -Z 847be2825d463962a46d3dd1feb437b1 +Z 903a3bc4a6ff5101d13b9fbd42b22ae8 diff --git a/manifest.uuid b/manifest.uuid index ed4a5f7126..724e8d66ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe \ No newline at end of file +b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 83929ea467..0b01c30f22 100644 --- a/src/wal.c +++ b/src/wal.c @@ -620,9 +620,13 @@ struct WalIterator { ** so. It is safe to enlarge the wal-index if pWal->writeLock is true ** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE. ** -** If this call is successful, *ppPage is set to point to the wal-index -** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs, -** then an SQLite error code is returned and *ppPage is set to 0. +** Three possible result scenarios: +** +** (1) rc==SQLITE_OK and *ppPage==Requested-Wal-Index-Page +** (2) rc>=SQLITE_ERROR and *ppPage==NULL +** (3) rc==SQLITE_OK and *ppPage==NULL // only if iPage==0 +** +** Scenario (3) can only occur when pWal->writeLock is false and iPage==0 */ static SQLITE_NOINLINE int walIndexPageRealloc( Wal *pWal, /* The WAL context */ @@ -655,7 +659,9 @@ static SQLITE_NOINLINE int walIndexPageRealloc( rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] ); - assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 ); + assert( pWal->apWiData[iPage]!=0 + || rc!=SQLITE_OK + || (pWal->writeLock==0 && iPage==0) ); testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK ); if( rc==SQLITE_OK ){ if( iPage>0 && sqlite3FaultSim(600) ) rc = SQLITE_NOMEM; From 71c3ea7523498f127da538b0f7cc9709adc7c381 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 20:23:59 +0000 Subject: [PATCH 23/76] Avoid the 1-based indexing on the WalHashLoc.aPgno[] array. Make it 0-indexed instead. FossilOrigin-Name: 28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/wal.c | 41 ++++++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 4eb388a925..2c0303812e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\scomment\son\swalIndexPage()\sto\smore\saccurately\sdescribe\sthe\npost-conditions. -D 2021-10-27T19:57:59.451 +C Avoid\sthe\s1-based\sindexing\son\sthe\sWalHashLoc.aPgno[]\sarray.\s\sMake\sit\s0-indexed\ninstead. +D 2021-10-27T20:23:59.854 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2bf6d846140a3ef6ac4dae85e993e98dd304e03641ccef65904744eb85e65e2e +F src/wal.c 2fd68f0a2e12486a543016ee47828874863c486b8a090989e70627f556ccde32 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 @@ -1929,10 +1929,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 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe -R d7b0bf6adaa4481b0cdf4adead947bd2 -T *branch * wal-tuneup -T *sym-wal-tuneup * -T -sym-trunk * +P b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 +R 0450e5bea2ea312618d6c5cbc7e1928c U drh -Z 903a3bc4a6ff5101d13b9fbd42b22ae8 +Z 2a7a0238c8886bf3fdd3adf1dc184586 diff --git a/manifest.uuid b/manifest.uuid index 724e8d66ee..957b241b44 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 \ No newline at end of file +28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 0b01c30f22..2b53bdc067 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1000,8 +1000,8 @@ struct WalHashLoc { ** slot in the hash table is set to N, it refers to frame number ** (pLoc->iZero+N) in the log. ** -** Finally, set pLoc->aPgno so that pLoc->aPgno[1] is the page number of the -** first frame indexed by the hash table, frame (pLoc->iZero+1). +** Finally, set pLoc->aPgno so that pLoc->aPgno[0] is the page number of the +** first frame indexed by the hash table, frame (pLoc->iZero). */ static int walHashGet( Wal *pWal, /* WAL handle */ @@ -1021,7 +1021,6 @@ static int walHashGet( }else{ pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; } - pLoc->aPgno = &pLoc->aPgno[-1]; } return rc; } @@ -1103,8 +1102,9 @@ static void walCleanupHash(Wal *pWal){ /* Zero the entries in the aPgno array that correspond to frames with ** frame numbers greater than pWal->hdr.mxFrame. */ - nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit+1]); - memset((void *)&sLoc.aPgno[iLimit+1], 0, nByte); + nByte = (int)((char *)sLoc.aHash - (char *)&sLoc.aPgno[iLimit]); + assert( nByte>=0 ); + memset((void *)&sLoc.aPgno[iLimit], 0, nByte); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* Verify that the every entry in the mapping region is still reachable @@ -1113,11 +1113,11 @@ static void walCleanupHash(Wal *pWal){ if( iLimit ){ int j; /* Loop counter */ int iKey; /* Hash key */ - for(j=1; j<=iLimit; j++){ + for(j=0; j=0 ); + memset((void*)sLoc.aPgno, 0, nByte); } /* If the entry in aPgno[] is already set, then the previous writer @@ -1160,9 +1160,9 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ ** Remove the remnants of that writers uncommitted transaction from ** the hash-table before writing any new entries. */ - if( sLoc.aPgno[idx] ){ + if( sLoc.aPgno[idx-1] ){ walCleanupHash(pWal); - assert( !sLoc.aPgno[idx] ); + assert( !sLoc.aPgno[idx-1] ); } /* Write the aPgno[] array entry and the hash-table slot. */ @@ -1170,7 +1170,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ for(iKey=walHash(iPage); sLoc.aHash[iKey]; iKey=walNextHash(iKey)){ if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; } - sLoc.aPgno[idx] = iPage; + sLoc.aPgno[idx-1] = iPage; AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT @@ -1191,19 +1191,18 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ */ if( (idx&0x3ff)==0 ){ int i; /* Loop counter */ - for(i=1; i<=idx; i++){ + for(i=0; i=0 ); + pgno = sLoc.aPgno[i-sLoc.iZero-1]; iDbOff = (i64)(pgno-1) * szPage; if( iDbOff+szPage<=szDb ){ @@ -3193,7 +3192,7 @@ int sqlite3WalFindFrame( iKey = walHash(pgno); while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ u32 iFrame = iH + sLoc.iZero; - if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH]==pgno ){ + if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH-1]==pgno ){ assert( iFrame>iRead || CORRUPT_DB ); iRead = iFrame; } From eaad533e54083d4e06b1668e20023a27f620728d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 27 Oct 2021 23:55:30 +0000 Subject: [PATCH 24/76] Ensure that all possible outcomes for walIndexPage() are accounted for by callers. FossilOrigin-Name: 12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wal.c | 7 +++++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2c0303812e..863ea96277 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sthe\s1-based\sindexing\son\sthe\sWalHashLoc.aPgno[]\sarray.\s\sMake\sit\s0-indexed\ninstead. -D 2021-10-27T20:23:59.854 +C Ensure\sthat\sall\spossible\soutcomes\sfor\swalIndexPage()\sare\saccounted\sfor\sby\ncallers. +D 2021-10-27T23:55:30.606 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -633,7 +633,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 2fd68f0a2e12486a543016ee47828874863c486b8a090989e70627f556ccde32 +F src/wal.c 6ae14d4797f31c67fc2be659d24fbc6e1a6f5f423bdfb5ef831ea171bce42320 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 @@ -1929,7 +1929,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 b619e936455f4001b543a9a58dea2ac9ebd598327d6be01130ca6e7e9764ffe6 -R 0450e5bea2ea312618d6c5cbc7e1928c +P 28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d +R fe9d125153f206ef4cb83374e184623d U drh -Z 2a7a0238c8886bf3fdd3adf1dc184586 +Z 4e7264e2dc788c50ad6f39937abcf192 diff --git a/manifest.uuid b/manifest.uuid index 957b241b44..baec424603 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28f5f709b4b28ba7f6f56bdd4a9e8c04d0d2df90d13d6df1a589fa4a65163f4d \ No newline at end of file +12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 2b53bdc067..4c37560798 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1013,7 +1013,7 @@ static int walHashGet( rc = walIndexPage(pWal, iHash, &pLoc->aPgno); assert( rc==SQLITE_OK || iHash>0 ); - if( rc==SQLITE_OK ){ + if( pLoc->aPgno ){ pLoc->aHash = (volatile ht_slot *)&pLoc->aPgno[HASHTABLE_NPAGE]; if( iHash==0 ){ pLoc->aPgno = &pLoc->aPgno[WALINDEX_HDR_SIZE/sizeof(u32)]; @@ -1021,6 +1021,8 @@ static int walHashGet( }else{ pLoc->iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE; } + }else if( NEVER(rc==SQLITE_OK) ){ + rc = SQLITE_ERROR; } return rc; } @@ -1323,7 +1325,8 @@ static int walIndexRecover(Wal *pWal){ u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE); u32 nHdr, nHdr32; rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare); - if( rc ) break; + assert( aShare!=0 || rc!=SQLITE_OK ); + if( aShare==0 ) break; pWal->apWiData[iPg] = aPrivate; for(iFrame=iFirst; iFrame<=iLast; iFrame++){ From 33d28ab4cf151707a0c45e59fb5586f9c7815f4b Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 28 Oct 2021 12:07:43 +0000 Subject: [PATCH 25/76] Minor changes to make it easier for static analyzers to reason about the code. FossilOrigin-Name: ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/insert.c | 5 +++-- src/os.c | 3 +++ src/vdbesort.c | 1 + 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7abb13825f..eaf766ec29 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sWAL\scode\scorrectly\shandles\sall\spossible\soutcomes\sfrom\sthe\nwalIndexPage()\sroutine. -D 2021-10-28T00:09:31.896 +C Minor\schanges\sto\smake\sit\seasier\sfor\sstatic\sanalyzers\sto\sreason\sabout\sthe\scode. +D 2021-10-28T12:07:43.062 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -510,7 +510,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c b32e2dcbca838cb8acd4777a59243db4bcea53089e3181b0ea3e4dc75b43aeff +F src/insert.c 137038155adad9f00ba4e2c2602eec0335d6ef5ff0c3958c02f778657006dc59 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c bfe067d61ebbd0e6eb023f1fb6b353021e621cf1657e061d629064a740bfbf6f @@ -529,7 +529,7 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c dd2b3f1cc1863079bc1349ac0fec395a500090c4fe4e11ab775310a49f2f956d F src/mutex_w32.c caa50e1c0258ac4443f52e00fe8aaea73b6d0728bd8856bedfff822cae418541 F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 -F src/os.c 91fc69f95ef0528368174dca20f01e1d8f82934f719e1cb50fd0260b18c028a6 +F src/os.c b1c4f2d485961e9a5b6b648c36687d25047c252222e9660b7cc25a6e1ea436ab F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 @@ -628,7 +628,7 @@ F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 F src/vdbeaux.c a57c760d1897f1b72f6fae26983df363db7a2c42d88721187e907f2c84862b42 F src/vdbeblob.c 292e96c01c4219fca71d74e1002906d43eb232af4bd83f7552a3faec741f3eb8 F src/vdbemem.c 71a449c57be10a66a8a5620e5c5a67ebb9ca70121556dc631ffd4c4458708d8c -F src/vdbesort.c 04292f8c569dc9ad2afc1d56d118f2cfab36ca65a3f02eef0b5b92bda01560be +F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c d07cc24dd84b0b51bf05adb187b0d2e6b0cac56cfbc0197995a26d4f8fa5c7e2 @@ -1929,8 +1929,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 7238d58051bfdcea8f7a4aeab89145849d0659c987df9063aacafe97be6657fe 12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 -R fe9d125153f206ef4cb83374e184623d -T +closed 12715c6b234a04627ca27e94bfa8bd456998360a9f0117480e0038f4747818d6 +P 6979efbf07d93e7afad508165df684dcc6fe33b91ca772397c8afa00d16d1a0d +R eda5d70b72df4d58dd65fea5053b20ca U drh -Z b79ac0d17a59f6e7c71e03a206543e27 +Z dda87f03214a3375b663846ecba879a7 diff --git a/manifest.uuid b/manifest.uuid index 11f72edd9c..94e1887cf1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6979efbf07d93e7afad508165df684dcc6fe33b91ca772397c8afa00d16d1a0d \ No newline at end of file +ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d8948e6056..9b3b195f6a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2613,8 +2613,9 @@ int sqlite3OpenTableAndIndices( assert( op==OP_OpenWrite || p5==0 ); if( IsVirtual(pTab) ){ /* This routine is a no-op for virtual tables. Leave the output - ** variables *piDataCur and *piIdxCur uninitialized so that valgrind - ** can detect if they are used by mistake in the caller. */ + ** variables *piDataCur and *piIdxCur set to illegal cursor numbers + ** for improved error detection. */ + *piDataCur = *piIdxCur = -999; return 0; } iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); diff --git a/src/os.c b/src/os.c index cf26b8ae5d..0c3c9d898d 100644 --- a/src/os.c +++ b/src/os.c @@ -316,12 +316,15 @@ int sqlite3OsOpenMalloc( rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); if( rc!=SQLITE_OK ){ sqlite3_free(pFile); + *ppFile = 0; }else{ *ppFile = pFile; } }else{ + *ppFile = 0; rc = SQLITE_NOMEM_BKPT; } + assert( *ppFile!=0 || rc!=SQLITE_OK ); return rc; } void sqlite3OsCloseFree(sqlite3_file *pFile){ diff --git a/src/vdbesort.c b/src/vdbesort.c index 6cb4f87269..8bf7b57173 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -2007,6 +2007,7 @@ static int vdbeIncrMergerNew( vdbeMergeEngineFree(pMerger); rc = SQLITE_NOMEM_BKPT; } + assert( *ppOut!=0 || rc!=SQLITE_OK ); return rc; } From 6ac9a5cf5a9102bd3e22cf1bf072770a8c43ed87 Mon Sep 17 00:00:00 2001 From: larrybr Date: Thu, 28 Oct 2021 19:49:23 +0000 Subject: [PATCH 26/76] Fix .import -skip issue reported at https://sqlite.org/forum/forumpost/4c0816c24fc9d16f?t=h FossilOrigin-Name: 3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 5 +++++ test/shell5.test | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index eaf766ec29..72ee7b58ba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schanges\sto\smake\sit\seasier\sfor\sstatic\sanalyzers\sto\sreason\sabout\sthe\scode. -D 2021-10-28T12:07:43.062 +C Fix\s.import\s-skip\sissue\sreported\sat\shttps://sqlite.org/forum/forumpost/4c0816c24fc9d16f?t=h +D 2021-10-28T19:49:23.955 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in 6aefb37d9c87da9e33ae7d3541d07a24c8b74a4bc7b805a2a367d92fe5709108 +F src/shell.c.in 185e4b905c3a399e9376597a04cf668f6f992513290978ac978cf4991954d89f F src/sqlite.h.in f0c1ecb5af508aa8e970cd8bc0ec851e6c380b81825038d458846c2fcdfcef50 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1380,7 +1380,7 @@ F test/shell1.test c354008b27c904f0166c2138abd7382013ea070b41114114ecbdfb32c726a F test/shell2.test f00a0501c00583cbc46f7510e1d713366326b2b3e63d06d15937284171a8787c F test/shell3.test cb4b835a901742c9719437a89171172ecc4a8823ad97349af8e4e841e6f82566 F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f48be -F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe +F test/shell5.test 6e4aa0e531dcb8dcf74b7920a2a7442c6712d4dff8422bbc81f768f9dee8a0e3 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 @@ -1929,7 +1929,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 6979efbf07d93e7afad508165df684dcc6fe33b91ca772397c8afa00d16d1a0d -R eda5d70b72df4d58dd65fea5053b20ca -U drh -Z dda87f03214a3375b663846ecba879a7 +P ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 +R 94b406dcc0f783386fbc1fd7aca47850 +U larrybr +Z a41ac8d69ba1283362a2564021d5a0c2 diff --git a/manifest.uuid b/manifest.uuid index 94e1887cf1..397c3755ea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 \ No newline at end of file +3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index cc4fb593e2..375c75124f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8282,6 +8282,11 @@ static int do_meta_command(char *zLine, ShellState *p){ failIfSafeMode(p, "cannot run .import in safe mode"); memset(&sCtx, 0, sizeof(sCtx)); + sCtx.z = sqlite3_malloc64(120); + if( sCtx.z==0 ){ + import_cleanup(&sCtx); + shell_out_of_memory(); + } if( p->mode==MODE_Ascii ){ xRead = ascii_read_one_field; }else{ diff --git a/test/shell5.test b/test/shell5.test index 8ec9a632bf..dc99a7acea 100644 --- a/test/shell5.test +++ b/test/shell5.test @@ -456,4 +456,19 @@ CREATE TABLE t7(a, b, c); db eval { SELECT * FROM t7 ORDER BY a } } {1 2 3 4 5 {} 6 7 8} +do_test shell5-4.3 { + forcedelete shell5.csv + set fd [open shell5.csv w] + puts $fd ",," + puts $fd "1,2,3" + close $fd + catchcmd test.db [string trim { +.mode csv +CREATE TABLE t8(a, b, c); +.import -skip 1 shell5.csv t8 +.nullvalue # + }] + db eval { SELECT * FROM t8 } +} {1 2 3} + finish_test From 8cb63f5a5e4aba5658a0115f9e019f4238cd7455 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 09:59:06 +0000 Subject: [PATCH 27/76] Fix the OP_Transaction opcode so that if an error other than SQLITE_SCHEMA occurs first, the original error is not overwritten by SQLITE_SCHEMA. dbsqlfuzz 85bf7e262017c6c7bddb03ff6d8541511985d36c. FossilOrigin-Name: 5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 72ee7b58ba..29be098b99 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\s.import\s-skip\sissue\sreported\sat\shttps://sqlite.org/forum/forumpost/4c0816c24fc9d16f?t=h -D 2021-10-28T19:49:23.955 +C Fix\sthe\sOP_Transaction\sopcode\sso\sthat\sif\san\serror\sother\sthan\sSQLITE_SCHEMA\noccurs\sfirst,\sthe\soriginal\serror\sis\snot\soverwritten\sby\sSQLITE_SCHEMA.\ndbsqlfuzz\s85bf7e262017c6c7bddb03ff6d8541511985d36c. +D 2021-10-29T09:59:06.437 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c a80943ed189ed5f4215636bde0aa7901319b051baffc0706f93a786bdf49ffcf +F src/vdbe.c daa876fbf9331a8b776696903877353bc352c9e30f5260c465386f2b29dfc4cf F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 @@ -1929,7 +1929,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 ba4104aa02625b51113978c1bb540b75bd88cb1959c7e9bfb4113db4159df5d4 -R 94b406dcc0f783386fbc1fd7aca47850 -U larrybr -Z a41ac8d69ba1283362a2564021d5a0c2 +P 3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f +R 8b39a8898084dde2064094959fc37e70 +U drh +Z 822067d590d9e99496c15dedcdb68543 diff --git a/manifest.uuid b/manifest.uuid index 397c3755ea..9b3967c672 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f \ No newline at end of file +5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index a129e3a45b..e1f3fe4c63 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3656,6 +3656,7 @@ case OP_Transaction: { assert( pOp->p2>=0 && pOp->p2<=2 ); assert( pOp->p1>=0 && pOp->p1nDb ); assert( DbMaskTest(p->btreeMask, pOp->p1) ); + assert( rc==SQLITE_OK ); if( pOp->p2 && (db->flags & SQLITE_QueryOnly)!=0 ){ rc = SQLITE_READONLY; goto abort_due_to_error; @@ -3702,6 +3703,7 @@ case OP_Transaction: { if( pOp->p5 && (iMeta!=pOp->p3 || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) + && rc==SQLITE_OK ){ /* ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema From 37bbcb48a92b2aed80daf1d2e8ed8428eedc371f Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 12:29:22 +0000 Subject: [PATCH 28/76] Add pragmas "multiplex_enabled", "multiplex_chunksize", and "multiplex_filecount" to the multiplexer implementation. FossilOrigin-Name: 39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 --- manifest | 14 +++---- manifest.uuid | 2 +- src/test_multiplex.c | 91 +++++++++++++++++++++++++++++++++++--------- test/multiplex.test | 17 +++++++++ 4 files changed, 97 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index 29be098b99..132a8fe675 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Transaction\sopcode\sso\sthat\sif\san\serror\sother\sthan\sSQLITE_SCHEMA\noccurs\sfirst,\sthe\soriginal\serror\sis\snot\soverwritten\sby\sSQLITE_SCHEMA.\ndbsqlfuzz\s85bf7e262017c6c7bddb03ff6d8541511985d36c. -D 2021-10-29T09:59:06.437 +C Add\spragmas\s"multiplex_enabled",\s"multiplex_chunksize",\sand\s"multiplex_filecount"\sto\sthe\smultiplexer\simplementation. +D 2021-10-29T12:29:22.568 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -588,7 +588,7 @@ F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c 21121ea85b49ec0bdb69995847cef9036ef9beca3ce63bbb776e4ea2ecc44b97 F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c -F src/test_multiplex.c 2ccf35551c094e353af20b0cdfac053a37bf3e96e10e7cf9f4abd1d279890a78 +F src/test_multiplex.c 1b23782212a01349fac382913ef82b8de4ae8a4cb46556602c2ee733edabbbc9 F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 F src/test_mutex.c abf486e91bd65e2448027d4bb505e7cce6ba110e1afb9bd348d1996961cadf0d F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 @@ -1222,7 +1222,7 @@ F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93 F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3 -F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd +F test/multiplex.test d74c034e52805f6de8cc5432cef8c9eb774bb64ec29b83a22effc8ca4dac1f08 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 @@ -1929,7 +1929,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 3aadbe17edc1efc7fa6c9600de84e23242ba7866d2dcef2189afd7ba4c97979f -R 8b39a8898084dde2064094959fc37e70 +P 5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e +R db79de1638e0749eebe4d5bf88ced051 U drh -Z 822067d590d9e99496c15dedcdb68543 +Z ec23d72770cad137c5e9586cf56e39f9 diff --git a/manifest.uuid b/manifest.uuid index 9b3967c672..58c45a9c0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e \ No newline at end of file +39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 \ No newline at end of file diff --git a/src/test_multiplex.c b/src/test_multiplex.c index 5ef1ec1839..ff12817158 100644 --- a/src/test_multiplex.c +++ b/src/test_multiplex.c @@ -962,26 +962,79 @@ static int multiplexFileControl(sqlite3_file *pConn, int op, void *pArg){ ** element is the argument to the pragma or NULL if the pragma has no ** argument. */ - if( aFcntl[1] && sqlite3_stricmp(aFcntl[1],"multiplex_truncate")==0 ){ - if( aFcntl[2] && aFcntl[2][0] ){ - if( sqlite3_stricmp(aFcntl[2], "on")==0 - || sqlite3_stricmp(aFcntl[2], "1")==0 ){ - pGroup->bTruncate = 1; - }else - if( sqlite3_stricmp(aFcntl[2], "off")==0 - || sqlite3_stricmp(aFcntl[2], "0")==0 ){ - pGroup->bTruncate = 0; - } - } - /* EVIDENCE-OF: R-27806-26076 The handler for an SQLITE_FCNTL_PRAGMA - ** file control can optionally make the first element of the char** - ** argument point to a string obtained from sqlite3_mprintf() or the - ** equivalent and that string will become the result of the pragma - ** or the error message if the pragma fails. + if( aFcntl[1] && sqlite3_strnicmp(aFcntl[1],"multiplex_",10)==0 ){ + sqlite3_int64 sz = 0; + (void)multiplexFileSize(pConn, &sz); + /* + ** PRAGMA multiplex_truncate=BOOLEAN; + ** PRAGMA multiplex_truncate; + ** + ** Turn the multiplexor truncate feature on or off. Return either + ** "on" or "off" to indicate the new setting. If the BOOLEAN argument + ** is omitted, just return the current value for the truncate setting. */ - aFcntl[0] = sqlite3_mprintf(pGroup->bTruncate ? "on" : "off"); - rc = SQLITE_OK; - break; + if( sqlite3_stricmp(aFcntl[1],"multiplex_truncate")==0 ){ + if( aFcntl[2] && aFcntl[2][0] ){ + if( sqlite3_stricmp(aFcntl[2], "on")==0 + || sqlite3_stricmp(aFcntl[2], "1")==0 ){ + pGroup->bTruncate = 1; + }else + if( sqlite3_stricmp(aFcntl[2], "off")==0 + || sqlite3_stricmp(aFcntl[2], "0")==0 ){ + pGroup->bTruncate = 0; + } + } + /* EVIDENCE-OF: R-27806-26076 The handler for an SQLITE_FCNTL_PRAGMA + ** file control can optionally make the first element of the char** + ** argument point to a string obtained from sqlite3_mprintf() or the + ** equivalent and that string will become the result of the pragma + ** or the error message if the pragma fails. + */ + aFcntl[0] = sqlite3_mprintf(pGroup->bTruncate ? "on" : "off"); + rc = SQLITE_OK; + break; + } + /* + ** PRAGMA multiplex_enabled; + ** + ** Return 0 or 1 depending on whether the multiplexor is enabled or + ** disabled, respectively. + */ + if( sqlite3_stricmp(aFcntl[1],"multiplex_enabled")==0 ){ + aFcntl[0] = sqlite3_mprintf("%d", pGroup->bEnabled!=0); + rc = SQLITE_OK; + break; + } + /* + ** PRAGMA multiplex_chunksize; + ** + ** Return the chunksize for the multiplexor, or no-op if the + ** multiplexor is not active. + */ + if( sqlite3_stricmp(aFcntl[1],"multiplex_chunksize")==0 + && pGroup->bEnabled + ){ + aFcntl[0] = sqlite3_mprintf("%u", pGroup->szChunk); + rc = SQLITE_OK; + break; + } + /* + ** PRAGMA multiplex_filecount; + ** + ** Return the number of disk files currently in use by the + ** multiplexor. This should be the total database size size + ** divided by the chunksize and rounded up. + */ + if( sqlite3_stricmp(aFcntl[1],"multiplex_filecount")==0 ){ + int n = 0; + int ii; + for(ii=0; iinReal; ii++){ + if( pGroup->aReal[ii].p!=0 ) n++; + } + aFcntl[0] = sqlite3_mprintf("%d", n); + rc = SQLITE_OK; + break; + } } /* If the multiplexor does not handle the pragma, pass it through ** into the default case. */ diff --git a/test/multiplex.test b/test/multiplex.test index 6ea328906e..2f1a02fb87 100644 --- a/test/multiplex.test +++ b/test/multiplex.test @@ -182,6 +182,11 @@ do_test multiplex-2.1.3 { file size [multiplex_name test.x 0] } {4096} do_test multiplex-2.1.4 { execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) } } {} +do_execsql_test multiplex-2.1.5 { + PRAGMA multiplex_enabled; + PRAGMA multiplex_filecount; + PRAGMA multiplex_chunksize; +} {1 1 2147418112} do_test multiplex-2.2.1 { execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) } @@ -267,6 +272,18 @@ do_test multiplex-2.5.8 { do_test multiplex-2.5.9 { file size [multiplex_name test.x 0] } [list $g_chunk_size] do_test multiplex-2.5.10 { file size [multiplex_name test.x 1] } [list $g_chunk_size] +do_execsql_test multiplex-2.5.11 { + PRAGMA multiplex_enabled; + PRAGMA multiplex_filecount; + PRAGMA multiplex_chunksize; +} {1 3 65536} +sqlite3 db test.x +do_execsql_test multiplex-2.5.12 { + PRAGMA multiplex_filecount; + PRAGMA multiplex_chunksize; +} {3 65536} + + do_test multiplex-2.5.99 { db close From cfb52496224be43bcb96e0c829a57a9480745005 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 13:10:02 +0000 Subject: [PATCH 29/76] Allow "VACUUM INTO" to change the page_size of a database even if the original database is in WAL mode. Enhancement suggested by [forum:/forumpost/033f2c9d1f|forum post 033f2c9d1f]. FossilOrigin-Name: efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vacuum.c | 4 +++- test/vacuum-into.test | 31 +++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 132a8fe675..db89ae7616 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\spragmas\s"multiplex_enabled",\s"multiplex_chunksize",\sand\s"multiplex_filecount"\sto\sthe\smultiplexer\simplementation. -D 2021-10-29T12:29:22.568 +C Allow\s"VACUUM\sINTO"\sto\schange\sthe\spage_size\sof\sa\sdatabase\seven\sif\sthe\noriginal\sdatabase\sis\sin\sWAL\smode.\s\sEnhancement\ssuggested\sby\n[forum:/forumpost/033f2c9d1f|forum\spost\s033f2c9d1f]. +D 2021-10-29T13:10:02.528 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -620,7 +620,7 @@ F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 -F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 +F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 F src/vdbe.c daa876fbf9331a8b776696903877353bc352c9e30f5260c465386f2b29dfc4cf F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b @@ -1681,7 +1681,7 @@ F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae -F test/vacuum-into.test 48f4cec354fb6f27c98ef58d2fe49a11b71ff131af0cd9140efacc9858b9f670 +F test/vacuum-into.test c4c25dcf8ca909e33c1f5f0bb0f54b990c2c1dcbee7a4995843e79e40681a894 F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d F test/vacuum2.test 9fd45ce6ce29f5614c249e03938d3567c06a9e772d4f155949f8eafe2d8af520 F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d @@ -1929,7 +1929,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 5374226df4a2c1b59258839532b67a399c447ac8ec1408fdf2dffb9c41e1349e -R db79de1638e0749eebe4d5bf88ced051 +P 39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 +R d68f81b39f86cb06b4a36b68798fdf37 U drh -Z ec23d72770cad137c5e9586cf56e39f9 +Z df8c8b91d90a62fffcb8772ebdcbd4b6 diff --git a/manifest.uuid b/manifest.uuid index 58c45a9c0c..2db762f867 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 \ No newline at end of file +efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 \ No newline at end of file diff --git a/src/vacuum.c b/src/vacuum.c index be0e17535d..bcab1de142 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -250,7 +250,9 @@ SQLITE_NOINLINE int sqlite3RunVacuum( /* Do not attempt to change the page size for a WAL database */ if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain)) - ==PAGER_JOURNALMODE_WAL ){ + ==PAGER_JOURNALMODE_WAL + && pOut==0 + ){ db->nextPagesize = 0; } diff --git a/test/vacuum-into.test b/test/vacuum-into.test index cd1c57a26b..1207105e05 100644 --- a/test/vacuum-into.test +++ b/test/vacuum-into.test @@ -100,4 +100,35 @@ do_test vacuum-into-510 { db2 close db close +# Change the page-size on a VACUUM INTO even if the original +# database is in WAL mode. +# +forcedelete test.db +forcedelete test.db2 +do_test vacuum-into-600 { + sqlite3 db test.db + db eval { + PRAGMA page_size=4096; + PRAGMA journal_mode=WAL; + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(19); + CREATE INDEX t1a ON t1(a); + PRAGMA integrity_check; + } +} {wal ok} +do_execsql_test vacuum-into-610 { + PRAGMA page_size; +} {4096} +do_execsql_test vacuum-into-620 { + PRAGMA page_size=1024; + VACUUM INTO 'test.db2'; +} {} +do_test vacuum-into-630 { + sqlite3 db test.db2 + db eval { + PRAGMA page_size; + PRAGMA integrity_check; + } +} {1024 ok} + finish_test From e4e1af5efb91767192cd440ebd7ec7999f6751f4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 29 Oct 2021 16:19:03 +0000 Subject: [PATCH 30/76] Reorder a test add earlier today to OP_Transaction for easier testing. FossilOrigin-Name: 8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index db89ae7616..c36252731a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\s"VACUUM\sINTO"\sto\schange\sthe\spage_size\sof\sa\sdatabase\seven\sif\sthe\noriginal\sdatabase\sis\sin\sWAL\smode.\s\sEnhancement\ssuggested\sby\n[forum:/forumpost/033f2c9d1f|forum\spost\s033f2c9d1f]. -D 2021-10-29T13:10:02.528 +C Reorder\sa\stest\sadd\searlier\stoday\sto\sOP_Transaction\sfor\seasier\stesting. +D 2021-10-29T16:19:03.333 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c daa876fbf9331a8b776696903877353bc352c9e30f5260c465386f2b29dfc4cf +F src/vdbe.c 54089e5ebb02d35e52d6b3d51061b79b8923c70e839df4ca4ff7bd9bcb9b9708 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 @@ -1929,7 +1929,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 39c5e80dbf94ac3079b3e0c2c3e6608ac366e3f3de3cea4f4947addc3f52bc36 -R d68f81b39f86cb06b4a36b68798fdf37 +P efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 +R 946767be3c5aa505f601226a0027015d U drh -Z df8c8b91d90a62fffcb8772ebdcbd4b6 +Z 818395ff90b7bf4ecce02cad13dcc7aa diff --git a/manifest.uuid b/manifest.uuid index 2db762f867..d2580d16cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 \ No newline at end of file +8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index e1f3fe4c63..2b06eea91e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3700,10 +3700,10 @@ case OP_Transaction: { } } assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); - if( pOp->p5 + if( rc==SQLITE_OK + && pOp->p5 && (iMeta!=pOp->p3 || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) - && rc==SQLITE_OK ){ /* ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema From 21b1c6ddaca2de314f18d0a6756bd443f9bb2f8c Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 30 Oct 2021 17:58:25 +0000 Subject: [PATCH 31/76] Fix a memory leak in test code on this branch. FossilOrigin-Name: 60cd9da9258e0b701d4bb3f9c91c5d0a12e925b9b937df619b09f33a287b4a33 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/test1.c | 16 +++++++--------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index a2da3a9145..676998f5d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\schanges\sinto\sthis\sbranch. -D 2021-10-30T17:30:48.966 +C Fix\sa\smemory\sleak\sin\stest\scode\son\sthis\sbranch. +D 2021-10-30T17:58:25.337 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -559,7 +559,7 @@ F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a3 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 428e813dabf82804bc13196af35a0c3c6ef4347fe557fa6717c5c66bba6e8520 -F src/test1.c f69bb12219d440b3f6ed382136d9aabe82a146532143afcb3b583d810bd9a57b +F src/test1.c bd1c3c2637db35c0a69513e008c0e6a177b360ccae7689e0bf69f15b55e24bae F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 7c4420e01c577b5c4add2cb03119743b1a357543d347773b9e717195ea967159 @@ -1930,7 +1930,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 e00a44ac10d68b7bdaff1d9c237b598696eddc2d7392574aee1a95d94b4f165a 8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 -R 3e81ca5107c3ba7e39985ab60d26f57d +P 638c1b0c50229800067eb1ba29d829b4d6e008256c21a1f67b4ce4d19ea307b3 +R b67db243b6924a0dd8b6ad442b112d32 U dan -Z 1828748f66ed3db5a90f61fed859b997 +Z acc4c348ad53723d2b572854bf9ea0ca diff --git a/manifest.uuid b/manifest.uuid index b1dbe3d8a1..ca2c021ff0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -638c1b0c50229800067eb1ba29d829b4d6e008256c21a1f67b4ce4d19ea307b3 \ No newline at end of file +60cd9da9258e0b701d4bb3f9c91c5d0a12e925b9b937df619b09f33a287b4a33 \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index 6bf7b17d3f..db14a607da 100644 --- a/src/test1.c +++ b/src/test1.c @@ -8292,27 +8292,25 @@ static int SQLITE_TCLAPI test_autovacuum_pages( sqlite3 *db; int rc; const char *zScript; - size_t nScript; if( objc!=2 && objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "DB ?SCRIPT?"); return TCL_ERROR; } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; zScript = objc==3 ? Tcl_GetString(objv[2]) : 0; - nScript = zScript ? strlen(zScript) : 0; - pData = sqlite3_malloc64( sizeof(*pData) + nScript + 1 ); - if( pData==0 ){ - Tcl_AppendResult(interp, "out of memory", (void*)0); - return TCL_ERROR; - } - pData->interp = interp; if( zScript ){ + size_t nScript = strlen(zScript); + pData = sqlite3_malloc64( sizeof(*pData) + nScript + 1 ); + if( pData==0 ){ + Tcl_AppendResult(interp, "out of memory", (void*)0); + return TCL_ERROR; + } + pData->interp = interp; pData->zScript = (char*)&pData[1]; memcpy(pData->zScript, zScript, nScript+1); rc = sqlite3_autovacuum_pages(db,test_autovacuum_pages_callback, pData, sqlite3_free); }else{ - pData->zScript = 0; rc = sqlite3_autovacuum_pages(db, 0, 0, 0); } if( rc ){ From 362c181913a419ceda8f69a3fc12d829c2be2e9c Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 30 Oct 2021 18:17:59 +0000 Subject: [PATCH 32/76] Fix an incorrect assert() statement in sqlite3GenerateConstraintChecks(). dbsqlfuzz 4190cff310aeab359a55f354e560db95d3a6f47d FossilOrigin-Name: 623c0d086bda135c49bfc238c31498facdcbe8ecc7659cc1af61594df0c6e899 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c36252731a..f320f73030 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reorder\sa\stest\sadd\searlier\stoday\sto\sOP_Transaction\sfor\seasier\stesting. -D 2021-10-29T16:19:03.333 +C Fix\san\sincorrect\sassert()\sstatement\sin\ssqlite3GenerateConstraintChecks().\ndbsqlfuzz\s4190cff310aeab359a55f354e560db95d3a6f47d +D 2021-10-30T18:17:59.636 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -510,7 +510,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 137038155adad9f00ba4e2c2602eec0335d6ef5ff0c3958c02f778657006dc59 +F src/insert.c 3f2892de7820d8e0b34a90bff8a3e2f879bc528683fa2ebb9e779ae56b64b741 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c bfe067d61ebbd0e6eb023f1fb6b353021e621cf1657e061d629064a740bfbf6f @@ -1929,7 +1929,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 efc7e8c99a86e9d9eb81655ce96353847bd2cca64eb8f8d10e297f6f4d38e563 -R 946767be3c5aa505f601226a0027015d +P 8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 +R b527768918a8e4077efc0dd96c45874f U drh -Z 818395ff90b7bf4ecce02cad13dcc7aa +Z ea8a849e6713aaef4d0e7842051d5f8f diff --git a/manifest.uuid b/manifest.uuid index d2580d16cd..e54f60e5fa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8ba73b3cadb72ffcf176d19f9f946c1b90b224e5ab9a0e9eb9a83affa7476d23 \ No newline at end of file +623c0d086bda135c49bfc238c31498facdcbe8ecc7659cc1af61594df0c6e899 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 9b3b195f6a..400f2caafd 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2327,7 +2327,8 @@ void sqlite3GenerateConstraintChecks( assert( onError==OE_Replace ); nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; - assert( nConflictCk>0 ); + assert( nConflictCk>0 || db->mallocFailed ); + testcase( nConflictCk<=0 ); testcase( nConflictCk>1 ); if( regTrigCnt ){ sqlite3MultiWrite(pParse); From 16fc5e67a02ce25236584a76987755cef0c01424 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 1 Nov 2021 12:53:01 +0000 Subject: [PATCH 33/76] The VVA() macro in json1.c must be active during SQLITE_COVERAGE_TEST because it affects the outcome of testcase() macros. FossilOrigin-Name: 92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 --- ext/misc/json1.c | 2 +- manifest | 13 ++++++------- manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 70f344ea01..0adf710ef0 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -111,7 +111,7 @@ static const char jsonIsSpace[] = { # endif # define testcase(X) #endif -#if defined(NDEBUG) +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST) # define VVA(X) #else # define VVA(X) X diff --git a/manifest b/manifest index 989f928c10..ee410fa872 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_autovacuum_pages()\sinterface. -D 2021-10-30T20:22:32.855 +C The\sVVA()\smacro\sin\sjson1.c\smust\sbe\sactive\sduring\sSQLITE_COVERAGE_TEST\sbecause\nit\saffects\sthe\soutcome\sof\stestcase()\smacros. +D 2021-11-01T12:53:01.613 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -306,7 +306,7 @@ F ext/misc/fileio.c 57fefd0efc535e62bb8b07fa146875171481da81a759bbfbe2fc91bab900 F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c 91a5594071143a4ab79c638fe9f059af1db09932faf2e704c3e29216a7d4f511 -F ext/misc/json1.c 2ff65a8f97c9b8ae03124fe89a1b74197e68958882cb533daac8a694d1b81c57 +F ext/misc/json1.c 1ad9d8f04f60f7a7c99e6a22ecf84d8f9bc0881782bed6c3d3a7bc6bf0213e2d F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c 7dffa8cc89c7f2d73da4bd4ccea1bcbd2bd283e3bb4cea398df7c372a197291b @@ -1930,8 +1930,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 623c0d086bda135c49bfc238c31498facdcbe8ecc7659cc1af61594df0c6e899 60cd9da9258e0b701d4bb3f9c91c5d0a12e925b9b937df619b09f33a287b4a33 -R c2365c0f257a6e1be84889548b719edd -T +closed 60cd9da9258e0b701d4bb3f9c91c5d0a12e925b9b937df619b09f33a287b4a33 +P ca2703c339f76101f25051a2ed380398b018782883bfee68b5f2d69a1de9091a +R 588c2ceaec3a392d5b7d700177ec9bbe U drh -Z 46db034af6d2112bb92acfe1ff1351cf +Z 9b594d25e284ecd39d9843606ef5aab4 diff --git a/manifest.uuid b/manifest.uuid index 0e9b7b2571..80d5910be8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca2703c339f76101f25051a2ed380398b018782883bfee68b5f2d69a1de9091a \ No newline at end of file +92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 \ No newline at end of file From 47061b9d572ded73ac60bae38b750bd8b3be0de0 Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 1 Nov 2021 17:22:52 +0000 Subject: [PATCH 34/76] Add --remove subcommand to shell's .archive command FossilOrigin-Name: 23525449b883ae6e1d62100bdbc9ff2ca788f67e8ae7d7e4b1a770413a70a7f0 --- manifest | 17 +++++++----- manifest.uuid | 2 +- src/shell.c.in | 71 ++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 71 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index ee410fa872..59dadcd16e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sVVA()\smacro\sin\sjson1.c\smust\sbe\sactive\sduring\sSQLITE_COVERAGE_TEST\sbecause\nit\saffects\sthe\soutcome\sof\stestcase()\smacros. -D 2021-11-01T12:53:01.613 +C Add\s--remove\ssubcommand\sto\sshell's\s.archive\scommand +D 2021-11-01T17:22:52.884 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in 185e4b905c3a399e9376597a04cf668f6f992513290978ac978cf4991954d89f +F src/shell.c.in a91cf2a1e3987e769e2286c4835d3f18b3c2d21cc9405699d2e4a2b06dc65c20 F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a @@ -1930,7 +1930,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ca2703c339f76101f25051a2ed380398b018782883bfee68b5f2d69a1de9091a -R 588c2ceaec3a392d5b7d700177ec9bbe -U drh -Z 9b594d25e284ecd39d9843606ef5aab4 +P 92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 +R b00d6d0ab1960f3d74e9a78eaa3a2c49 +T *branch * archive_remove +T *sym-archive_remove * +T -sym-trunk * +U larrybr +Z 7d1554c5ac914a1993ecf6506b6cbae4 diff --git a/manifest.uuid b/manifest.uuid index 80d5910be8..1dd447f54a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 \ No newline at end of file +23525449b883ae6e1d62100bdbc9ff2ca788f67e8ae7d7e4b1a770413a70a7f0 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 375c75124f..f186423eac 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3965,6 +3965,7 @@ static const char *(azHelp[]) = { " -c, --create Create a new archive", " -u, --update Add or update files with changed mtime", " -i, --insert Like -u but always add even if unchanged", + " -r, --remove Remove files from archive", " -t, --list List contents of archive", " -x, --extract Extract files from archive", " Optional arguments:", @@ -6179,21 +6180,23 @@ static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ #define AR_CMD_EXTRACT 4 #define AR_CMD_LIST 5 #define AR_CMD_HELP 6 +#define AR_CMD_REMOVE 7 /* ** Other (non-command) switches. */ -#define AR_SWITCH_VERBOSE 7 -#define AR_SWITCH_FILE 8 -#define AR_SWITCH_DIRECTORY 9 -#define AR_SWITCH_APPEND 10 -#define AR_SWITCH_DRYRUN 11 +#define AR_SWITCH_VERBOSE 8 +#define AR_SWITCH_FILE 9 +#define AR_SWITCH_DIRECTORY 10 +#define AR_SWITCH_APPEND 11 +#define AR_SWITCH_DRYRUN 12 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ switch( eSwitch ){ case AR_CMD_CREATE: case AR_CMD_EXTRACT: case AR_CMD_LIST: + case AR_CMD_REMOVE: case AR_CMD_UPDATE: case AR_CMD_INSERT: case AR_CMD_HELP: @@ -6244,6 +6247,7 @@ static int arParseCommand( { "extract", 'x', AR_CMD_EXTRACT, 0 }, { "insert", 'i', AR_CMD_INSERT, 0 }, { "list", 't', AR_CMD_LIST, 0 }, + { "remove", 'r', AR_CMD_REMOVE, 0 }, { "update", 'u', AR_CMD_UPDATE, 0 }, { "help", 'h', AR_CMD_HELP, 0 }, { "verbose", 'v', AR_SWITCH_VERBOSE, 0 }, @@ -6367,11 +6371,11 @@ static int arParseCommand( /* ** This function assumes that all arguments within the ArCommand.azArg[] -** array refer to archive members, as for the --extract or --list commands. -** It checks that each of them are present. If any specified file is not -** present in the archive, an error is printed to stderr and an error -** code returned. Otherwise, if all specified arguments are present in -** the archive, SQLITE_OK is returned. +** array refer to archive members, as for the --extract, --list or --remove +** commands. It checks that each of them are present. If any specified file +** is not present in the archive, an error is printed to stderr and an +** error code returned. Otherwise, if all specified arguments are present +** in the archive, SQLITE_OK is returned. ** ** This function strips any trailing '/' characters from each argument. ** This is consistent with the way the [tar] command seems to work on @@ -6486,6 +6490,47 @@ static int arListCommand(ArCommand *pAr){ } +/* +** Implementation of .ar "Remove" command. +*/ +static int arRemoveCommand(ArCommand *pAr){ + int rc; + char *zSql = 0; + char *zWhere = 0; + + if( pAr->nArg ){ + /* Verify that args actually exist within the archive before proceeding. + ** And formulate a WHERE clause to match them. */ + rc = arCheckEntries(pAr); + arWhereClause(&rc, pAr, &zWhere); + } + if( rc==SQLITE_OK ){ + zSql = sqlite3_mprintf("DELETE FROM %s WHERE %s;", + pAr->zSrcTable, zWhere); + if( pAr->bDryRun ){ + utf8_printf(pAr->p->out, "%s\n", zSql); + }else{ + char *zErr = 0; + rc = sqlite3_exec(pAr->db, "SAVEPOINT ar;", 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(pAr->db, zSql, 0, 0, &zErr); + if( rc!=SQLITE_OK ){ + sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); + }else{ + rc = sqlite3_exec(pAr->db, "RELEASE ar;", 0, 0, 0); + } + } + if( zErr ){ + utf8_printf(stdout, "ERROR: %s\n", zErr); + sqlite3_free(zErr); + } + } + } + sqlite3_free(zWhere); + sqlite3_free(zSql); + return rc; +} + /* ** Implementation of .ar "eXtract" command. */ @@ -6738,7 +6783,7 @@ static int arDotCommand( int flags; if( cmd.bAppend ) eDbType = SHELL_OPEN_APPENDVFS; if( cmd.eCmd==AR_CMD_CREATE || cmd.eCmd==AR_CMD_INSERT - || cmd.eCmd==AR_CMD_UPDATE ){ + || cmd.eCmd==AR_CMD_REMOVE || cmd.eCmd==AR_CMD_UPDATE ){ flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; }else{ flags = SQLITE_OPEN_READONLY; @@ -6794,6 +6839,10 @@ static int arDotCommand( rc = arCreateOrUpdateCommand(&cmd, 1, 0); break; + case AR_CMD_REMOVE: + rc = arRemoveCommand(&cmd); + break; + default: assert( cmd.eCmd==AR_CMD_UPDATE ); rc = arCreateOrUpdateCommand(&cmd, 1, 1); From 7774fc010a152fd1558816ce2a9b974a19c35795 Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 1 Nov 2021 22:30:24 +0000 Subject: [PATCH 35/76] Add a test for .ar -r and fix a use-of-uninitialized-variable bug FossilOrigin-Name: 978d5ed4379b631a79cd46a75d9b5b403f3ec4ce7d9d52ed36a5678cdf04f7f2 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/shell.c.in | 4 ++-- test/shell8.test | 22 +++++++++++++++++++--- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 59dadcd16e..f1ed071641 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s--remove\ssubcommand\sto\sshell's\s.archive\scommand -D 2021-11-01T17:22:52.884 +C Add\sa\stest\sfor\s.ar\s-r\sand\sfix\sa\suse-of-uninitialized-variable\sbug +D 2021-11-01T22:30:24.815 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in a91cf2a1e3987e769e2286c4835d3f18b3c2d21cc9405699d2e4a2b06dc65c20 +F src/shell.c.in f2360d089ec7f5cca14a76f3a6f3f26fc349d97b8570edcc81522e7db9454262 F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a @@ -1384,7 +1384,7 @@ F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f4 F test/shell5.test 6e4aa0e531dcb8dcf74b7920a2a7442c6712d4dff8422bbc81f768f9dee8a0e3 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f -F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 +F test/shell8.test b109236471b68749b0dd23d075626373397e609562a3f4c49548a4c971ef105b F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 @@ -1930,10 +1930,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 92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 -R b00d6d0ab1960f3d74e9a78eaa3a2c49 -T *branch * archive_remove -T *sym-archive_remove * -T -sym-trunk * +P 23525449b883ae6e1d62100bdbc9ff2ca788f67e8ae7d7e4b1a770413a70a7f0 +R 4c2f7fc16891edd4989a0a95daa18865 U larrybr -Z 7d1554c5ac914a1993ecf6506b6cbae4 +Z 406c0509493a4f18fbe952af95b3e75b diff --git a/manifest.uuid b/manifest.uuid index 1dd447f54a..3f3dbe94d8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23525449b883ae6e1d62100bdbc9ff2ca788f67e8ae7d7e4b1a770413a70a7f0 \ No newline at end of file +978d5ed4379b631a79cd46a75d9b5b403f3ec4ce7d9d52ed36a5678cdf04f7f2 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f186423eac..8265a5b729 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6189,7 +6189,7 @@ static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ #define AR_SWITCH_FILE 9 #define AR_SWITCH_DIRECTORY 10 #define AR_SWITCH_APPEND 11 -#define AR_SWITCH_DRYRUN 12 +#define AR_SWITCH_DRYRUN 12 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ switch( eSwitch ){ @@ -6494,7 +6494,7 @@ static int arListCommand(ArCommand *pAr){ ** Implementation of .ar "Remove" command. */ static int arRemoveCommand(ArCommand *pAr){ - int rc; + int rc = 0; char *zSql = 0; char *zWhere = 0; diff --git a/test/shell8.test b/test/shell8.test index 3658a8ac5d..8d9fa0f6b9 100644 --- a/test/shell8.test +++ b/test/shell8.test @@ -44,6 +44,10 @@ proc populate_dir {dirname spec} { } } +proc dir_content {dirname} { + lsort [glob -nocomplain $dirname/*] +} + proc dir_to_list {dirname {n -1}} { if {$n<0} {set n [llength [file split $dirname]]} @@ -170,8 +174,20 @@ foreach {tn tcl} { } } -finish_test - - +do_test 2.1.1 { + populate_dir ar2 { + file1 "abcd" + file2 "efgh" + dir1/file3 "ijkl" + } + populate_dir ar4 { + file2 "efgh" + } + catchcmd shell8.db {.ar -c} + catchcmd shell8.db {.ar -C ar2 -i .} + catchcmd shell8.db {.ar -r ./file2 ./dir1} + catchcmd shell8.db {.ar -C ar4 -x .} + regsub -all {ar4} [dir_content ar4] ar2 +} {ar2/file1 ar2/file2} finish_test From 719506f9af807b04398f2c3e32a4abdbbe508585 Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 1 Nov 2021 22:33:20 +0000 Subject: [PATCH 36/76] zap trailing whitespace FossilOrigin-Name: f2a908e9c86efb11bb179ce7121f0d510f952284891abfa69517b773fd88324c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f1ed071641..8a34c1b356 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\stest\sfor\s.ar\s-r\sand\sfix\sa\suse-of-uninitialized-variable\sbug -D 2021-11-01T22:30:24.815 +C zap\strailing\swhitespace +D 2021-11-01T22:33:20.802 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in f2360d089ec7f5cca14a76f3a6f3f26fc349d97b8570edcc81522e7db9454262 +F src/shell.c.in 74dc1a088b1840b89615e99da33c3419f2808ce213f809006accce890c1ed99b F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a @@ -1930,7 +1930,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 23525449b883ae6e1d62100bdbc9ff2ca788f67e8ae7d7e4b1a770413a70a7f0 -R 4c2f7fc16891edd4989a0a95daa18865 +P 978d5ed4379b631a79cd46a75d9b5b403f3ec4ce7d9d52ed36a5678cdf04f7f2 +R aa5d515bd539d5a906c526319f66022b U larrybr -Z 406c0509493a4f18fbe952af95b3e75b +Z 19de7df3053f6a11c3c0364e259c1387 diff --git a/manifest.uuid b/manifest.uuid index 3f3dbe94d8..e1377c55ac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -978d5ed4379b631a79cd46a75d9b5b403f3ec4ce7d9d52ed36a5678cdf04f7f2 \ No newline at end of file +f2a908e9c86efb11bb179ce7121f0d510f952284891abfa69517b773fd88324c \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 8265a5b729..ee601b846c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6189,7 +6189,7 @@ static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ #define AR_SWITCH_FILE 9 #define AR_SWITCH_DIRECTORY 10 #define AR_SWITCH_APPEND 11 -#define AR_SWITCH_DRYRUN 12 +#define AR_SWITCH_DRYRUN 12 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ switch( eSwitch ){ From 8f09f4b264c68573cd5773b679fcf954b3142513 Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 2 Nov 2021 00:18:11 +0000 Subject: [PATCH 37/76] Add globbing option to shell's .archive command. FossilOrigin-Name: 13fb74ac5e7578ab612af2ccc8147569d60dc35af84f496bcc5d648d223d6d6e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 33 ++++++++++++++++++++++----------- test/shell8.test | 5 ++++- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 8a34c1b356..3b473a0943 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C zap\strailing\swhitespace -D 2021-11-01T22:33:20.802 +C Add\sglobbing\soption\sto\sshell's\s.archive\scommand. +D 2021-11-02T00:18:11.885 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in 74dc1a088b1840b89615e99da33c3419f2808ce213f809006accce890c1ed99b +F src/shell.c.in 9e3b9543d26a0c3eef9ad0408d4cd78bff5e2af57820d11617a5c1e8c8ab984d F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a @@ -1384,7 +1384,7 @@ F test/shell4.test 3ed6c4b42fd695efcbc25d69ef759dbb15855ca8e52ba6c5ee076f8b435f4 F test/shell5.test 6e4aa0e531dcb8dcf74b7920a2a7442c6712d4dff8422bbc81f768f9dee8a0e3 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f -F test/shell8.test b109236471b68749b0dd23d075626373397e609562a3f4c49548a4c971ef105b +F test/shell8.test 388471d16e4de767333107e30653983f186232c0e863f4490bb230419e830aae F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 @@ -1930,7 +1930,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 978d5ed4379b631a79cd46a75d9b5b403f3ec4ce7d9d52ed36a5678cdf04f7f2 -R aa5d515bd539d5a906c526319f66022b +P f2a908e9c86efb11bb179ce7121f0d510f952284891abfa69517b773fd88324c +R eecc379f0265e2d49eed240d5e55a92c U larrybr -Z 19de7df3053f6a11c3c0364e259c1387 +Z d62c3b222b587fc248ac413fb1d62a07 diff --git a/manifest.uuid b/manifest.uuid index e1377c55ac..999bb1d766 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f2a908e9c86efb11bb179ce7121f0d510f952284891abfa69517b773fd88324c \ No newline at end of file +13fb74ac5e7578ab612af2ccc8147569d60dc35af84f496bcc5d648d223d6d6e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index ee601b846c..67c46981fa 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3973,6 +3973,7 @@ static const char *(azHelp[]) = { " -f FILE, --file FILE Use archive FILE (default is current db)", " -a FILE, --append FILE Open FILE using the apndvfs VFS", " -C DIR, --directory DIR Read/extract files from directory DIR", + " -g, --glob Use glob matching for names in archive", " -n, --dryrun Show the SQL that would have occurred", " Examples:", " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", @@ -6133,6 +6134,7 @@ struct ArCommand { u8 bZip; /* True if the archive is a ZIP */ u8 bDryRun; /* True if --dry-run */ u8 bAppend; /* True if --append */ + u8 bGlob; /* True if --glob */ u8 fromCmdLine; /* Run from -A instead of .archive */ int nArg; /* Number of command arguments */ char *zSrcTable; /* "sqlar", "zipfile($file)" or "zip" */ @@ -6190,6 +6192,7 @@ static int arErrorMsg(ArCommand *pAr, const char *zFmt, ...){ #define AR_SWITCH_DIRECTORY 10 #define AR_SWITCH_APPEND 11 #define AR_SWITCH_DRYRUN 12 +#define AR_SWITCH_GLOB 13 static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ switch( eSwitch ){ @@ -6209,6 +6212,9 @@ static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ case AR_SWITCH_DRYRUN: pAr->bDryRun = 1; break; + case AR_SWITCH_GLOB: + pAr->bGlob = 1; + break; case AR_SWITCH_VERBOSE: pAr->bVerbose = 1; break; @@ -6255,6 +6261,7 @@ static int arParseCommand( { "append", 'a', AR_SWITCH_APPEND, 1 }, { "directory", 'C', AR_SWITCH_DIRECTORY, 1 }, { "dryrun", 'n', AR_SWITCH_DRYRUN, 0 }, + { "glob", 'g', AR_SWITCH_GLOB, 0 }, }; int nSwitch = sizeof(aSwitch) / sizeof(struct ArSwitch); struct ArSwitch *pEnd = &aSwitch[nSwitch]; @@ -6372,10 +6379,12 @@ static int arParseCommand( /* ** This function assumes that all arguments within the ArCommand.azArg[] ** array refer to archive members, as for the --extract, --list or --remove -** commands. It checks that each of them are present. If any specified file -** is not present in the archive, an error is printed to stderr and an +** commands. It checks that each of them are "present". If any specified +** file is not present in the archive, an error is printed to stderr and an ** error code returned. Otherwise, if all specified arguments are present -** in the archive, SQLITE_OK is returned. +** in the archive, SQLITE_OK is returned. Here, "present" means either an +** exact equality when pAr->bGlob is false or a "name GLOB pattern" match +* when pAr->bGlob is true. ** ** This function strips any trailing '/' characters from each argument. ** This is consistent with the way the [tar] command seems to work on @@ -6386,11 +6395,11 @@ static int arCheckEntries(ArCommand *pAr){ if( pAr->nArg ){ int i, j; sqlite3_stmt *pTest = 0; + const char *zSel = (pAr->bGlob) + ? "SELECT name FROM %s WHERE glob($name,name)" + : "SELECT name FROM %s WHERE name=$name"; - shellPreparePrintf(pAr->db, &rc, &pTest, - "SELECT name FROM %s WHERE name=$name", - pAr->zSrcTable - ); + shellPreparePrintf(pAr->db, &rc, &pTest, zSel, pAr->zSrcTable); j = sqlite3_bind_parameter_index(pTest, "$name"); for(i=0; inArg && rc==SQLITE_OK; i++){ char *z = pAr->azArg[i]; @@ -6418,14 +6427,16 @@ static int arCheckEntries(ArCommand *pAr){ ** identify all archive members that match the command arguments held ** in (*pAr). Leave this WHERE clause in (*pzWhere) before returning. ** The caller is responsible for eventually calling sqlite3_free() on -** any non-NULL (*pzWhere) value. +** any non-NULL (*pzWhere) value. Here, "match" means strict equality +** when pAr->bGlob is false and GLOB match when pAr->bGlob is true. */ static void arWhereClause( int *pRc, - ArCommand *pAr, + ArCommand *pAr, char **pzWhere /* OUT: New WHERE clause */ ){ char *zWhere = 0; + const char *zSameOp = (pAr->bGlob)? "GLOB" : "="; if( *pRc==SQLITE_OK ){ if( pAr->nArg==0 ){ zWhere = sqlite3_mprintf("1"); @@ -6435,8 +6446,8 @@ static void arWhereClause( for(i=0; inArg; i++){ const char *z = pAr->azArg[i]; zWhere = sqlite3_mprintf( - "%z%s name = '%q' OR substr(name,1,%d) = '%q/'", - zWhere, zSep, z, strlen30(z)+1, z + "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'", + zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z ); if( zWhere==0 ){ *pRc = SQLITE_NOMEM; diff --git a/test/shell8.test b/test/shell8.test index 8d9fa0f6b9..ddb4a47b82 100644 --- a/test/shell8.test +++ b/test/shell8.test @@ -178,6 +178,8 @@ do_test 2.1.1 { populate_dir ar2 { file1 "abcd" file2 "efgh" + junk1 "j1" + junk2 "j2" dir1/file3 "ijkl" } populate_dir ar4 { @@ -186,8 +188,9 @@ do_test 2.1.1 { catchcmd shell8.db {.ar -c} catchcmd shell8.db {.ar -C ar2 -i .} catchcmd shell8.db {.ar -r ./file2 ./dir1} + catchcmd shell8.db {.ar -g -r ./ju*2} catchcmd shell8.db {.ar -C ar4 -x .} regsub -all {ar4} [dir_content ar4] ar2 -} {ar2/file1 ar2/file2} +} {ar2/file1 ar2/file2 ar2/junk1} finish_test From 76c3ae68484aa7989f3f1aa2b7e70a1f8ccce765 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 2 Nov 2021 07:32:13 +0000 Subject: [PATCH 38/76] Fix a broken assert() in fts5 that could fail if the snippet() function were used with a query phrase containing 0 tokens on a detail=none or detail=col table. FossilOrigin-Name: 0a5b94b99cf45df759a59cb5fc62da111ca33f8c2614769a81930d72b51f093a --- ext/fts5/fts5_expr.c | 11 ++++++++++- ext/fts5/test/fts5af.test | 8 +++++++- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 2d8b6144f2..d9c1dd0fd9 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -2856,6 +2856,15 @@ struct Fts5PoslistPopulator { int bMiss; }; +/* +** Clear the position lists associated with all phrases in the expression +** passed as the first argument. Argument bLive is true if the expression +** might be pointing to a real entry, otherwise it has just been reset. +** +** At present this function is only used for detail=col and detail=none +** fts5 tables. This implies that all phrases must be at most 1 token +** in size, as phrase matches are not supported without detail=full. +*/ Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ Fts5PoslistPopulator *pRet; pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); @@ -2865,7 +2874,7 @@ Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ for(i=0; inPhrase; i++){ Fts5Buffer *pBuf = &pExpr->apExprPhrase[i]->poslist; Fts5ExprNode *pNode = pExpr->apExprPhrase[i]->pNode; - assert( pExpr->apExprPhrase[i]->nTerm==1 ); + assert( pExpr->apExprPhrase[i]->nTerm<=1 ); if( bLive && (pBuf->n==0 || pNode->iRowid!=pExpr->pRoot->iRowid || pNode->bEof) ){ diff --git a/ext/fts5/test/fts5af.test b/ext/fts5/test/fts5af.test index 86c8f753fa..a3ff330ef3 100644 --- a/ext/fts5/test/fts5af.test +++ b/ext/fts5/test/fts5af.test @@ -165,7 +165,7 @@ do_execsql_test 4.0 { } do_execsql_test 5.0 { - CREATE VIRTUAL TABLE p1 USING fts5(a, b); + CREATE VIRTUAL TABLE p1 USING fts5(a, b, detail=%DETAIL%); INSERT INTO p1 VALUES( 'x a a a a a a a a a a', 'a a a a a a a a a a a a a a a a a a a x' @@ -184,6 +184,12 @@ do_execsql_test 5.3 { do_execsql_test 5.4 { SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x'); } {{[x a a a a a...}} +do_execsql_test 5.5 { + SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ""'); +} {{[x a a a a a...}} +do_execsql_test 5.6 { + SELECT snippet(p1, 0, '[', NULL, '...', 6) FROM p1('x OR ' || x'DB'); +} {{[x a a a a a...}} } ;# foreach_detail_mode diff --git a/manifest b/manifest index ee410fa872..7fffa45203 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sVVA()\smacro\sin\sjson1.c\smust\sbe\sactive\sduring\sSQLITE_COVERAGE_TEST\sbecause\nit\saffects\sthe\soutcome\sof\stestcase()\smacros. -D 2021-11-01T12:53:01.613 +C Fix\sa\sbroken\sassert()\sin\sfts5\sthat\scould\sfail\sif\sthe\ssnippet()\sfunction\swere\sused\swith\sa\squery\sphrase\scontaining\s0\stokens\son\sa\sdetail=none\sor\sdetail=col\stable. +D 2021-11-02T07:32:13.819 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5Int.h 36fd4a05e6e6307e3bac359a589d5f090b903afe0e7ae15db84f0ff90c7 F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b729225eeaf6a5 F ext/fts5/fts5_config.c 501e7d3566bc92766b0e11c0109a7c5a6146bc41144195459af5422f6c2078aa -F ext/fts5/fts5_expr.c cd2058668122c316c8bd24ccbdbc91da7d34862b180508f3cf1de02abf0d9c6f +F ext/fts5/fts5_expr.c fcd0770d53028c2b53a15d0f53bf6d0e01b1bf3dd97630b9fedf0801f03aa3ec F ext/fts5/fts5_hash.c d4fb70940359f2120ccd1de7ffe64cc3efe65de9e8995b822cd536ff64c96982 F ext/fts5/fts5_index.c 037b12ca0a29761b3308f2b8e3505edec8c2b8e178577d96ee88b6a1e27e2a00 F ext/fts5/fts5_main.c 7c6092a53e6802962fa07b0fad3e61cb077b6c98b74b727d8d44ac2cf63bd914 @@ -137,7 +137,7 @@ F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18 F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514df6f9f0d7bb7 -F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b +F ext/fts5/test/fts5af.test bea75184c0e63631b552c20ebe4a631699f357e00a2059c92538f7aeece8291e F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 @@ -1930,7 +1930,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 ca2703c339f76101f25051a2ed380398b018782883bfee68b5f2d69a1de9091a -R 588c2ceaec3a392d5b7d700177ec9bbe -U drh -Z 9b594d25e284ecd39d9843606ef5aab4 +P 92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 +R bf1660072efb92aa6eb005c639375be1 +U dan +Z e944f98af4819fffaf931c5043cb32c3 diff --git a/manifest.uuid b/manifest.uuid index 80d5910be8..8e0e597cc0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 \ No newline at end of file +0a5b94b99cf45df759a59cb5fc62da111ca33f8c2614769a81930d72b51f093a \ No newline at end of file From 1cd6042f90f8d54edb1ea11b23c28a11d83c3ac3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 2 Nov 2021 10:47:20 +0000 Subject: [PATCH 39/76] Add recent dbsqlfuzz cases to test/fuzzdata8.db. FossilOrigin-Name: 8c3f2536d2853acef05c4e8c07f301abb0687402c56ded5ff8614e79fb049423 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2973696 -> 2993152 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7fffa45203..0e2c3721e1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbroken\sassert()\sin\sfts5\sthat\scould\sfail\sif\sthe\ssnippet()\sfunction\swere\sused\swith\sa\squery\sphrase\scontaining\s0\stokens\son\sa\sdetail=none\sor\sdetail=col\stable. -D 2021-11-02T07:32:13.819 +C Add\srecent\sdbsqlfuzz\scases\sto\stest/fuzzdata8.db. +D 2021-11-02T10:47:20.363 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1064,7 +1064,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db ea80e98f115387b052effb7194899cc9780a81f15606bc4641051342352020cc +F test/fuzzdata8.db b0e8db9e34a52e97e6df2101e445e0d9780a1dbd772137de71c5c9def63e3ee0 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1930,7 +1930,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 92c3d253797f9bde4670984d60bbd50b7b28540d2b5f503f318843580bab8765 -R bf1660072efb92aa6eb005c639375be1 -U dan -Z e944f98af4819fffaf931c5043cb32c3 +P 0a5b94b99cf45df759a59cb5fc62da111ca33f8c2614769a81930d72b51f093a +R 62fd224b940dabced520e214f563bdab +U drh +Z ba8f00524c3aa0304d043d5aeeb07d3d diff --git a/manifest.uuid b/manifest.uuid index 8e0e597cc0..c54b920fb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0a5b94b99cf45df759a59cb5fc62da111ca33f8c2614769a81930d72b51f093a \ No newline at end of file +8c3f2536d2853acef05c4e8c07f301abb0687402c56ded5ff8614e79fb049423 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index d4994e1e2489bb9b104ed39ea1b3953efc33170e..514bffd0855061a0ee90210f137a0c860938fe60 100644 GIT binary patch delta 47029 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 E0mkxh+W-In From 0c0fb9cf80f2b5f9a9214d24390504017c557753 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 2 Nov 2021 10:54:39 +0000 Subject: [PATCH 40/76] Fix a minor typo in a comment. FossilOrigin-Name: 06a5bf4348d3125bb5407fe9b7d451800b113a91fd1a9dff7d840e2317a7284d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3b473a0943..7c20653504 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sglobbing\soption\sto\sshell's\s.archive\scommand. -D 2021-11-02T00:18:11.885 +C Fix\sa\sminor\stypo\sin\sa\scomment. +D 2021-11-02T10:54:39.370 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in 9e3b9543d26a0c3eef9ad0408d4cd78bff5e2af57820d11617a5c1e8c8ab984d +F src/shell.c.in de92da03b04734618508a968d719e30e4c4bcc53ec7f341cdbf6a3d68ce9721c F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a @@ -1930,7 +1930,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 f2a908e9c86efb11bb179ce7121f0d510f952284891abfa69517b773fd88324c -R eecc379f0265e2d49eed240d5e55a92c -U larrybr -Z d62c3b222b587fc248ac413fb1d62a07 +P 13fb74ac5e7578ab612af2ccc8147569d60dc35af84f496bcc5d648d223d6d6e +R 4ce534086d91ce8438a18251677b33c8 +U drh +Z fc893d2685db3ae6f19a712413bc458d diff --git a/manifest.uuid b/manifest.uuid index 999bb1d766..af47117625 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13fb74ac5e7578ab612af2ccc8147569d60dc35af84f496bcc5d648d223d6d6e \ No newline at end of file +06a5bf4348d3125bb5407fe9b7d451800b113a91fd1a9dff7d840e2317a7284d \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 67c46981fa..69b1c141de 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6384,7 +6384,7 @@ static int arParseCommand( ** error code returned. Otherwise, if all specified arguments are present ** in the archive, SQLITE_OK is returned. Here, "present" means either an ** exact equality when pAr->bGlob is false or a "name GLOB pattern" match -* when pAr->bGlob is true. +** when pAr->bGlob is true. ** ** This function strips any trailing '/' characters from each argument. ** This is consistent with the way the [tar] command seems to work on From a12a40c3f00c40c3da412beff15828ff2d2e0aef Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 2 Nov 2021 11:09:24 +0000 Subject: [PATCH 41/76] Add #ifdef logic to os_unix.c so that it builds with SQLITE_OMIT_WAL defined. FossilOrigin-Name: 948c2cb2a2f44ba069cfbf5e9a57e56964f3a40db57459bb439bea9c3bd9f211 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 9 ++++++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0e2c3721e1..a0e0e79f62 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\srecent\sdbsqlfuzz\scases\sto\stest/fuzzdata8.db. -D 2021-11-02T10:47:20.363 +C Add\s#ifdef\slogic\sto\sos_unix.c\sso\sthat\sit\sbuilds\swith\sSQLITE_OMIT_WAL\sdefined. +D 2021-11-02T11:09:24.625 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/os.c b1c4f2d485961e9a5b6b648c36687d25047c252222e9660b7cc25a6e1ea436ab F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c f445ad0597184e27f225bfc3d327dee32b49f7918d6eda9c921369b5060d96ef +F src/os_unix.c 8e14b40fd02f70e234030c2bee45215ff8835293adc13a08e9718c29bff61401 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c bc10c191d18bffd3d76eda5f162799e43a9f875ecfe7c4869f752e2ddef87ea2 @@ -1930,7 +1930,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 0a5b94b99cf45df759a59cb5fc62da111ca33f8c2614769a81930d72b51f093a -R 62fd224b940dabced520e214f563bdab -U drh -Z ba8f00524c3aa0304d043d5aeeb07d3d +P 8c3f2536d2853acef05c4e8c07f301abb0687402c56ded5ff8614e79fb049423 +R 8b376094a1e25df4570f2864eb07a1ac +U dan +Z 94bd6fda7f782c0744099483ca9f3618 diff --git a/manifest.uuid b/manifest.uuid index c54b920fb3..c18f0de842 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c3f2536d2853acef05c4e8c07f301abb0687402c56ded5ff8614e79fb049423 \ No newline at end of file +948c2cb2a2f44ba069cfbf5e9a57e56964f3a40db57459bb439bea9c3bd9f211 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index bc6063dae8..0e184af3c1 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3951,7 +3951,9 @@ static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ /* Forward declaration */ static int unixGetTempname(int nBuf, char *zBuf); -static int unixFcntlExternalReader(unixFile*, int*); +#ifndef SQLITE_OMIT_WAL + static int unixFcntlExternalReader(unixFile*, int*); +#endif /* ** Information and control of an open file handle. @@ -4070,7 +4072,12 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ case SQLITE_FCNTL_EXTERNAL_READER: { +#ifndef SQLITE_OMIT_WAL return unixFcntlExternalReader((unixFile*)id, (int*)pArg); +#else + *(int*)pArg = 0; + return SQLITE_OK; +#endif } } return SQLITE_NOTFOUND; From 07ed9c1100b63e6f5adedd902dcaeb42e66808c8 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 2 Nov 2021 14:01:41 +0000 Subject: [PATCH 42/76] Fix a minor memory leak in the shell tool. Omit running fuzztest as part of the Device-One release test configuration, as it is now incompatible with SQLITE_OMIT_VIRTUALTABLE. FossilOrigin-Name: 4d70f27b7b5681cfdf1c44ac654e565ccff089e74d3edf6660578e04e4b0c9b9 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 1 + test/releasetest_data.tcl | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 2b508325cc..b001a33bd4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--remove\sand\s--glob\soptions\sto\sthe\s.archive\scommand\sin\sthe\sCLI. -D 2021-11-02T11:24:37.707 +C Fix\sa\sminor\smemory\sleak\sin\sthe\sshell\stool.\sOmit\srunning\sfuzztest\sas\spart\sof\sthe\sDevice-One\srelease\stest\sconfiguration,\sas\sit\sis\snow\sincompatible\swith\sSQLITE_OMIT_VIRTUALTABLE. +D 2021-11-02T14:01:41.022 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -550,7 +550,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ae65c88f5d0d4bc0052b203773d407efa2387c2bd6b202f87178006c7bb8632c F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 32d25b5af6c708aa63373c78c2e59681910387a7a78c08ec3086cadc77d41627 -F src/shell.c.in de92da03b04734618508a968d719e30e4c4bcc53ec7f341cdbf6a3d68ce9721c +F src/shell.c.in f8854bcb0d14707d661732698d5210d7f01694000c46e8014b323ad18f575be6 F src/sqlite.h.in 99786216caf1c57aa3d70f95a7f84566dff6a9eeb50174799ea3b387eafd2a22 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h d8f6f67ae9ad990a70dd03c093bcdc8883e159ff4bfd16a496f8fb80c6840b5a @@ -1303,7 +1303,7 @@ F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79 F test/regexp1.test 0c3ff80f66b0eff80e623eb5db7a3dad512095c573d78ac23009785f6d8f51ce F test/regexp2.test 55ed41da802b0e284ac7e2fe944be3948f93ff25abbca0361a609acfed1368b5 F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest_data.tcl 0f844b4884df67619768400eb8e4dd55708397d1728b52a2d41a8b76fb62ca7e +F test/releasetest_data.tcl b65eabbc8d267f8b5e3a428c9c0622eba553b15f130c1f836636b4f4f752df85 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/returning1.test f96c7245f6ac16038e802760cd90b93479369939a8a7a44e2329ee5aed28239c @@ -1930,8 +1930,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 948c2cb2a2f44ba069cfbf5e9a57e56964f3a40db57459bb439bea9c3bd9f211 06a5bf4348d3125bb5407fe9b7d451800b113a91fd1a9dff7d840e2317a7284d -R f46c66c5f5478852cd34fd93fbf63860 -T +closed 06a5bf4348d3125bb5407fe9b7d451800b113a91fd1a9dff7d840e2317a7284d -U drh -Z 771f78dc461a27a09496c36528b0ec04 +P ea7b12cdf868fdfebc0a20bdcba97aea863284b563d478b0e4cb3d2a8612afee +R 3d1a7f83cfea378cf032a2dcbfc8d068 +U dan +Z 5939626746911ed0a46ebf821b25baad diff --git a/manifest.uuid b/manifest.uuid index 044d5f9314..f982609237 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea7b12cdf868fdfebc0a20bdcba97aea863284b563d478b0e4cb3d2a8612afee \ No newline at end of file +4d70f27b7b5681cfdf1c44ac654e565ccff089e74d3edf6660578e04e4b0c9b9 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 69b1c141de..f136103b34 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8456,6 +8456,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( sCtx.in==0 ){ utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); rc = 1; + import_cleanup(&sCtx); goto meta_command_exit; } if( eVerbose>=2 || (eVerbose>=1 && useOutputMode) ){ diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index 878b546db2..b838498639 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -304,7 +304,7 @@ array set ::Platforms [strip_comments { "Devkit" "" test "Apple" "" test "Sanitize*" "" test - "Device-One" "" "fuzztest alltest" + "Device-One" "" alltest "Default" "" "threadtest fuzztest alltest" "Valgrind*" "" valgrindtest } From 61a8ad7cf952bc65b76b0a3a035ce5708459c853 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 2 Nov 2021 17:55:01 +0000 Subject: [PATCH 43/76] Ensure that ALTER TABLE RENAME recognizes OOM errors while parsing dependent triggers and handles them appropriately. dbsqlfuzz 53e245eee15d3f19639d773048aa955c30708785. FossilOrigin-Name: 1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 3 +++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b001a33bd4..369230c588 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\smemory\sleak\sin\sthe\sshell\stool.\sOmit\srunning\sfuzztest\sas\spart\sof\sthe\sDevice-One\srelease\stest\sconfiguration,\sas\sit\sis\snow\sincompatible\swith\sSQLITE_OMIT_VIRTUALTABLE. -D 2021-11-02T14:01:41.022 +C Ensure\sthat\sALTER\sTABLE\sRENAME\srecognizes\sOOM\serrors\swhile\sparsing\ndependent\striggers\sand\shandles\sthem\sappropriately.\ndbsqlfuzz\s53e245eee15d3f19639d773048aa955c30708785. +D 2021-11-02T17:55:01.854 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c d6b32481211fd5628b31d86329df6434bfc92e3372b53215339dc8cb47408644 +F src/alter.c d8dac98aa3b63b36660ab581c854660e511e1cef02702473d6c29d8655f4c013 F src/analyze.c 7518b99e07c5494111fe3bd867f28f804b6c5c1ad0703ec3d116de9bab3fa516 F src/attach.c e3f9d9a2a4a844750f3f348f37afb244535f21382cbfcd840152cb21cb41cfaf F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf @@ -1930,7 +1930,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 ea7b12cdf868fdfebc0a20bdcba97aea863284b563d478b0e4cb3d2a8612afee -R 3d1a7f83cfea378cf032a2dcbfc8d068 -U dan -Z 5939626746911ed0a46ebf821b25baad +P 4d70f27b7b5681cfdf1c44ac654e565ccff089e74d3edf6660578e04e4b0c9b9 +R 020065121bfbc86728d941bc72e402a9 +U drh +Z e8c092d55961c0a6fa1569dc7a482ee4 diff --git a/manifest.uuid b/manifest.uuid index f982609237..ed9c4a7438 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d70f27b7b5681cfdf1c44ac654e565ccff089e74d3edf6660578e04e4b0c9b9 \ No newline at end of file +1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 92be915ef7..817ea64999 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1333,6 +1333,9 @@ static int renameResolveTrigger(Parse *pParse){ } } } + if( rc==SQLITE_OK && db->mallocFailed ){ + rc = SQLITE_NOMEM; + } sNC.pSrcList = pSrc; if( rc==SQLITE_OK && pStep->pWhere ){ rc = sqlite3ResolveExprNames(&sNC, pStep->pWhere); From 5d742e39d98d8553cb321005431ece612979b635 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 2 Nov 2021 20:52:20 +0000 Subject: [PATCH 44/76] Proposed fix for a problem associated with OP_SeekScan that results in an incorrect answer. See ticket [5981a8c041a3c2f3]. FossilOrigin-Name: 266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/wherecode.c | 13 ++++++++++++- test/in4.test | 21 +++++++++++++++++++++ 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 369230c588..fd01919a89 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sALTER\sTABLE\sRENAME\srecognizes\sOOM\serrors\swhile\sparsing\ndependent\striggers\sand\shandles\sthem\sappropriately.\ndbsqlfuzz\s53e245eee15d3f19639d773048aa955c30708785. -D 2021-11-02T17:55:01.854 +C Proposed\sfix\sfor\sa\sproblem\sassociated\swith\sOP_SeekScan\sthat\sresults\sin\san\nincorrect\sanswer.\s\sSee\sticket\s[5981a8c041a3c2f3]. +D 2021-11-02T20:52:20.405 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -638,7 +638,7 @@ F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c ecabef93b0f14442a73eca205fc960428984d75fbdc7d60226b7fc9cac127187 F src/whereInt.h 83877a75a1bce056ea44aff02f1dfa958ad1d6038c213ddadb8652003b45151d -F src/wherecode.c a1d79cc5a11f44b079bf2352e542ddb265f84cfa6c835d40a9f195dbe5fff83e +F src/wherecode.c 1f5b62f46d284c8886945eb7438415bc27e23e87bb60b9ee468fa6bd31268f33 F src/whereexpr.c 17bdbf4f5b490e70a18635498f0b910a558f953a9bf80af7f19cbde6e60e6825 F src/window.c 0dff6fedf61493490d21ced5d7a7b4321d4c0db6c8123f0179c46080a860850a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1082,7 +1082,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test e09987d4f2213f9e32a558c5dee4cfa945e2ce7ec0980aae42c2ca453a8ce01a +F test/in4.test fdd1d8134da8376985c2edba6035a2de1f6c731524d2ffa651419e8fe2cd1c5a F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1930,7 +1930,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4d70f27b7b5681cfdf1c44ac654e565ccff089e74d3edf6660578e04e4b0c9b9 -R 020065121bfbc86728d941bc72e402a9 +P 1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590 +R c61e36c2c71ed29e0021479206aa1f46 +T *branch * seekscan-fix-20211102 +T *sym-seekscan-fix-20211102 * +T -sym-trunk * U drh -Z e8c092d55961c0a6fa1569dc7a482ee4 +Z e64ad9687c89edc17b6580d2562f23a1 diff --git a/manifest.uuid b/manifest.uuid index ed9c4a7438..a58ff01aed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590 \ No newline at end of file +266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4dc94f7fa0..460ac4fe30 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1884,8 +1884,19 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** range (if any). */ nConstraint = nEq; + assert( pLevel->p2==0 ); if( pRangeEnd ){ Expr *pRight = pRangeEnd->pExpr->pRight; + if( addrSeekScan ){ + /* For a seek-scan that has a range on the lowest term of the index, + ** we have to make the top of the loop be code that sets the end + ** condition of the range. Otherwise, the OP_SeekScan might jump + ** over that initialization, leaving the range-end value set to the + ** range-start value, resulting in a wrong answer. + ** See ticket 5981a8c041a3c2f3 (2021-11-02). + */ + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + } codeExprOrVector(pParse, pRight, regBase+nEq, nTop); whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); if( (pRangeEnd->wtFlags & TERM_VNULL)==0 @@ -1919,7 +1930,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3DbFree(db, zEndAff); /* Top of the loop body */ - pLevel->p2 = sqlite3VdbeCurrentAddr(v); + if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(v); /* Check if the index cursor is past the end of the range. */ if( nConstraint ){ diff --git a/test/in4.test b/test/in4.test index 45ffa71fc5..a3fe22e787 100644 --- a/test/in4.test +++ b/test/in4.test @@ -496,4 +496,25 @@ do_execsql_test 12.1 { OR (b = 1119 AND c IN (1115, 1023)); } {56 1119 1115} +# 2021-11-02 ticket 5981a8c041a3c2f3 +# Another OP_SeekScan problem. +# +reset_db +do_execsql_test 13.0 { + CREATE TABLE t1(id INTEGER PRIMARY KEY, a INT, b INT, c INT); + INSERT INTO t1 VALUES(10,1,2,5); + INSERT INTO t1 VALUES(20,1,3,5); + INSERT INTO t1 VALUES(30,1,2,4); + INSERT INTO t1 VALUES(40,1,3,4); + ANALYZE sqlite_master; + INSERT INTO sqlite_stat1 VALUES('t1','t1x','84000 3 2 1'); + CREATE INDEX t1x ON t1(a,b,c); + PRAGMA writable_schema=RESET; + SELECT * FROM t1 + WHERE a=1 + AND b IN (2,3) + AND c BETWEEN 4 AND 5 + ORDER BY +id; +} {10 1 2 5 20 1 3 5 30 1 2 4 40 1 3 4} + finish_test From 5c9290423db8ffaacd94078e857fe86e96084df5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 3 Nov 2021 11:43:09 +0000 Subject: [PATCH 45/76] Fix an issue in PRAGMA integrity_check associated reporting NULL values in a NOT NULL column of type ANY in a STRICT table. FossilOrigin-Name: 5dff1f66731ae35daf9633f8bb3ea942a7c29f4240e57bd2023ee7fc116e7c92 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/pragma.c | 2 +- test/strict2.test | 10 ++++++++++ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index e3dc07bd99..50aa5dc576 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correctly\shandle\sSeekScan\son\san\sIN\soperator\sof\sthe\smiddle\sterm\sof\san\sindex\nwhen\sthe\sright-most\sterm\sis\sa\srange\sconstraint.\nFix\sfor\sticket\s[5981a8c041a3c2f3]. -D 2021-11-02T22:24:19.545 +C Fix\san\sissue\sin\sPRAGMA\sintegrity_check\sassociated\sreporting\sNULL\svalues\sin\na\sNOT\sNULL\scolumn\sof\stype\sANY\sin\sa\sSTRICT\stable. +D 2021-11-03T11:43:09.793 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/parse.y 0bd7971a7489bbf6c3726f1b50da6e508bdff8fa493e9cc3f5a96b12cbb2361e F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 -F src/pragma.c fc4c772d25766f7440dff6bf352e8c66981f92c80689d1a0fe229d39a38f69a5 +F src/pragma.c c5fc9c849baa32e716c5ed1ae55237913461fffd886dba4380e31132ca960ed6 F src/pragma.h 87330ed2fbfa2a1274de93ca0ab850fba336189228cb256089202c3b52766fad F src/prepare.c 8f07616db04337057b8498b72d051ee90f73c54615c2e908c05404cef1e060b7 F src/printf.c 5901672228f305f7d493cbc4e7d76a61a5caecdbc1cd06b1f9ec42ea4265cf8d @@ -1432,7 +1432,7 @@ F test/statfault.test 55f86055f9cd7b2d962a621b8a04215c1cebd4eaaecde92d279442327f F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 F test/strict1.test 2e590641b1f26f9ff0db5b785df07f932988af1ab6ccab792b792ebb8405d657 -F test/strict2.test e78cedd56eb1c3e0b09b16c594dbfcb7e95bc6d85f68f0fd6501c243be28e219 +F test/strict2.test b22c7a98b5000aef937f1990776497f0e979b1a23bc4f63e2d53b00e59b20070 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 @@ -1930,8 +1930,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 1d9004cd015073853ce0ca811a68ea5411733eedee993b97a38a42ba139d7590 266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea -R c61e36c2c71ed29e0021479206aa1f46 -T +closed 266e9cbada531716c908c21d60a6038109722e3dd040237679ac0240fb5020ea +P aa24660e76681d164b1948621d3dbd0f620c72c6bca636d35a9eed73ab7593fa +R ed1f910913097204dd97cf8ac0d8fefb U drh -Z 49ea952deb1273256cba2a3e904b3452 +Z 54927dfeb8aafb58d9448f3796b194b8 diff --git a/manifest.uuid b/manifest.uuid index 1acdce8d97..fb23b9b448 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa24660e76681d164b1948621d3dbd0f620c72c6bca636d35a9eed73ab7593fa \ No newline at end of file +5dff1f66731ae35daf9633f8bb3ea942a7c29f4240e57bd2023ee7fc116e7c92 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index d23457f845..80cc77bde1 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1786,7 +1786,7 @@ void sqlite3Pragma( zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, pCol->zCnName); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); - if( bStrict ){ + if( bStrict && pCol->eCType!=COLTYPE_ANY ){ sqlite3VdbeGoto(v, doError); }else{ integrityCheckResultRow(v); diff --git a/test/strict2.test b/test/strict2.test index 0a6d3a2965..be5952284d 100644 --- a/test/strict2.test +++ b/test/strict2.test @@ -145,4 +145,14 @@ do_execsql_test strict2-2.0 { PRAGMA integrity_check(t2); } {ok} +do_execsql_test strict2-3.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(id ANY PRIMARY KEY, x TEXT); + INSERT INTO t1 VALUES(1,2),('three','four'),(x'5555','six'),(NULL,'eight'); + PRAGMA writable_schema=ON; + UPDATE sqlite_schema SET sql=(sql||'STRICT') WHERE name='t1'; + PRAGMA writable_schema=RESET; + PRAGMA integrity_check(t1); +} {{NULL value in t1.id}} + finish_test From 80b957b753edf7975858da50429811582a9d1468 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 3 Nov 2021 12:50:28 +0000 Subject: [PATCH 46/76] Add the --strict option to speedtest1.c FossilOrigin-Name: a247b5d88c12b1952b656e4f069c9229e0886ba16d7018ddf600e74592224792 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/speedtest1.c | 19 +++++++++++++++++-- tool/speed-check.sh | 3 +++ 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 50aa5dc576..c73273e7a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\sin\sPRAGMA\sintegrity_check\sassociated\sreporting\sNULL\svalues\sin\na\sNOT\sNULL\scolumn\sof\stype\sANY\sin\sa\sSTRICT\stable. -D 2021-11-03T11:43:09.793 +C Add\sthe\s--strict\soption\sto\sspeedtest1.c +D 2021-11-03T12:50:28.461 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1418,7 +1418,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c 5e5b805f24cc939656058f6a498f5a2160f9142e4815c54faf758ec798d4cdad +F test/speedtest1.c 61f8a72bbcc80edb0b95e957f108feb4013ff3d08721cc87ae1865fd4d20652d F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -1888,7 +1888,7 @@ F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c F tool/showwal.c 0253c187ae16fdae9cde89e63e1dfcd3bb35e5416d066415f99e2f8cac6ab03d F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe F tool/spaceanal.tcl 1b5be34c6223cb1af06da2a10fb77863eb869b1962d055820b0a11cf2336ab45 -F tool/speed-check.sh 8ba7c7c0dba37e664679974f5954f2282275271a5b92f890756e282df0bfc458 +F tool/speed-check.sh ff74a68bb95a0341275f4d3c9a7d8a3800bd278aceecf1913295a1f0175bc3e6 F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff @@ -1930,7 +1930,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 aa24660e76681d164b1948621d3dbd0f620c72c6bca636d35a9eed73ab7593fa -R ed1f910913097204dd97cf8ac0d8fefb +P 5dff1f66731ae35daf9633f8bb3ea942a7c29f4240e57bd2023ee7fc116e7c92 +R cb631ce21ad6ea6f60782b792abdd52f U drh -Z 54927dfeb8aafb58d9448f3796b194b8 +Z cc83978627ba4f463162248482a485ff diff --git a/manifest.uuid b/manifest.uuid index fb23b9b448..2d7f826fa5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5dff1f66731ae35daf9633f8bb3ea942a7c29f4240e57bd2023ee7fc116e7c92 \ No newline at end of file +a247b5d88c12b1952b656e4f069c9229e0886ba16d7018ddf600e74592224792 \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index 9e8c396085..83c503c8c7 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -34,6 +34,7 @@ static const char zHelp[] = " --sqlonly No-op. Only show the SQL that would have been run.\n" " --shrink-memory Invoke sqlite3_db_release_memory() frequently.\n" " --size N Relative test size. Default=100\n" + " --strict Use STRICT table where appropriate\n" " --stats Show statistics at the end\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" " --testset T Run test-set T (main, cte, rtree, orm, fp, debug)\n" @@ -947,7 +948,7 @@ void testset_main(void){ speedtest1_begin_test(210, "ALTER TABLE ADD COLUMN, and query"); - speedtest1_exec("ALTER TABLE z2 ADD COLUMN d DEFAULT 123"); + speedtest1_exec("ALTER TABLE z2 ADD COLUMN d INT DEFAULT 123"); speedtest1_exec("SELECT sum(d) FROM z2"); speedtest1_end_test(); @@ -2317,8 +2318,22 @@ int main(int argc, char **argv){ if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]); g.nReserve = atoi(argv[++i]); }else if( strcmp(z,"without-rowid")==0 ){ - g.zWR = "WITHOUT ROWID"; + if( strstr(g.zWR,"WITHOUT")!=0 ){ + /* no-op */ + }else if( strstr(g.zWR,"STRICT")!=0 ){ + g.zWR = "WITHOUT ROWID,STRICT"; + }else{ + g.zWR = "WITHOUT ROWID"; + } g.zPK = "PRIMARY KEY"; + }else if( strcmp(z,"strict")==0 ){ + if( strstr(g.zWR,"STRICT")!=0 ){ + /* no-op */ + }else if( strstr(g.zWR,"WITHOUT")!=0 ){ + g.zWR = "WITHOUT ROWID,STRICT"; + }else{ + g.zWR = "STRICT"; + } }else if( strcmp(z, "help")==0 || strcmp(z,"?")==0 ){ printf(zHelp, argv[0]); exit(0); diff --git a/tool/speed-check.sh b/tool/speed-check.sh index b77660eb71..6b0fbeb43a 100644 --- a/tool/speed-check.sh +++ b/tool/speed-check.sh @@ -62,6 +62,9 @@ while test "$1" != ""; do --without-rowid) SPEEDTEST_OPTS="$SPEEDTEST_OPTS $1" ;; + --strict) + SPEEDTEST_OPTS="$SPEEDTEST_OPTS $1" + ;; --nomemstat) SPEEDTEST_OPTS="$SPEEDTEST_OPTS $1" ;; From 926aac51babbcc5e2cecb14597a753b52d15ae29 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 3 Nov 2021 14:02:48 +0000 Subject: [PATCH 47/76] Fix INSERT into STRICT table with STATIC generated columns. FossilOrigin-Name: 24285d913678853213532d61aba077d576e3cd7629159e0a75dc3c16e54e2662 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/insert.c | 42 +++++++++++++++++++++++++----------------- src/vdbe.c | 12 ++++++++++-- test/strict1.test | 11 +++++++++++ 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index c73273e7a1..22964ef734 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--strict\soption\sto\sspeedtest1.c -D 2021-11-03T12:50:28.461 +C Fix\sINSERT\sinto\sSTRICT\stable\swith\sSTATIC\sgenerated\scolumns. +D 2021-11-03T14:02:48.852 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -510,7 +510,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 3f2892de7820d8e0b34a90bff8a3e2f879bc528683fa2ebb9e779ae56b64b741 +F src/insert.c 3ed9d945e4773483c7a1e60719b8fffa214bd6833421d0b89a644de146b3e50e F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e1dcff1c916bf6834e150b492eddda5d9792453182d2ad64294d2266b6e93c4c F src/main.c 546dd2418c4f5d59aced76c68e55290735feb420ee305051fbd55ab8fff0d255 @@ -621,7 +621,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 30df8356e231dad33be10bb27897655002668343280004ba28c734489414a167 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 -F src/vdbe.c 54089e5ebb02d35e52d6b3d51061b79b8923c70e839df4ca4ff7bd9bcb9b9708 +F src/vdbe.c 460bed0a86aeee2269c8d8ae06fa26ac71302e0c36acaffddfc3ffd0b2bb489d F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c 7b83468feb1d42a09d4c2e5241a3eaa3d1f138e289a843cba9fd3f1dad95ca67 @@ -1431,7 +1431,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c F test/statfault.test 55f86055f9cd7b2d962a621b8a04215c1cebd4eaaecde92d279442327fe648a0 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/strict1.test 2e590641b1f26f9ff0db5b785df07f932988af1ab6ccab792b792ebb8405d657 +F test/strict1.test e010d546fbe8a6427ae93179c631bea9a462315b442f6d27b815a150a2393713 F test/strict2.test b22c7a98b5000aef937f1990776497f0e979b1a23bc4f63e2d53b00e59b20070 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f @@ -1930,7 +1930,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 5dff1f66731ae35daf9633f8bb3ea942a7c29f4240e57bd2023ee7fc116e7c92 -R cb631ce21ad6ea6f60782b792abdd52f +P a247b5d88c12b1952b656e4f069c9229e0886ba16d7018ddf600e74592224792 +R d7bb2ae8b0f1e80db6e056f5f83d3b71 U drh -Z cc83978627ba4f463162248482a485ff +Z 143c1e571d41c429c49647e6acfdd03c diff --git a/manifest.uuid b/manifest.uuid index 2d7f826fa5..c803df41e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a247b5d88c12b1952b656e4f069c9229e0886ba16d7018ddf600e74592224792 \ No newline at end of file +24285d913678853213532d61aba077d576e3cd7629159e0a75dc3c16e54e2662 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 400f2caafd..538a33dae1 100644 --- a/src/insert.c +++ b/src/insert.c @@ -282,24 +282,32 @@ void sqlite3ComputeGeneratedColumns( ** that appropriate affinity has been applied to the regular columns */ sqlite3TableAffinity(pParse->pVdbe, pTab, iRegStore); - if( (pTab->tabFlags & TF_HasStored)!=0 - && (pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1))->opcode==OP_Affinity - ){ - /* Change the OP_Affinity argument to '@' (NONE) for all stored - ** columns. '@' is the no-op affinity and those columns have not - ** yet been computed. */ - int ii, jj; - char *zP4 = pOp->p4.z; - assert( zP4!=0 ); - assert( pOp->p4type==P4_DYNAMIC ); - for(ii=jj=0; zP4[jj]; ii++){ - if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){ - continue; + if( (pTab->tabFlags & TF_HasStored)!=0 ){ + pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1); + if( pOp->opcode==OP_Affinity ){ + /* Change the OP_Affinity argument to '@' (NONE) for all stored + ** columns. '@' is the no-op affinity and those columns have not + ** yet been computed. */ + int ii, jj; + char *zP4 = pOp->p4.z; + assert( zP4!=0 ); + assert( pOp->p4type==P4_DYNAMIC ); + assert( (pTab->tabFlags & TF_Strict)==0 ); + for(ii=jj=0; zP4[jj]; ii++){ + if( pTab->aCol[ii].colFlags & COLFLAG_VIRTUAL ){ + continue; + } + if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){ + zP4[jj] = SQLITE_AFF_NONE; + } + jj++; } - if( pTab->aCol[ii].colFlags & COLFLAG_STORED ){ - zP4[jj] = SQLITE_AFF_NONE; - } - jj++; + }else if( pOp->opcode==OP_TypeCheck ){ + /* If an OP_TypeCheck was generated because the table is STRICT, + ** then set the P3 operand to indicate that generated columns should + ** not be checked */ + assert( pTab->tabFlags & TF_Strict ); + pOp->p3 = 1; } } diff --git a/src/vdbe.c b/src/vdbe.c index 2b06eea91e..0798db5efe 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2899,7 +2899,7 @@ op_column_corrupt: } } -/* Opcode: TypeCheck P1 P2 * P4 * +/* Opcode: TypeCheck P1 P2 P3 P4 * ** Synopsis: typecheck(r[P1@P2]) ** ** Apply affinities to the range of P2 registers beginning with P1. @@ -2910,6 +2910,11 @@ op_column_corrupt: ** forces the register type to the Table column type. This is used ** to implement "strict affinity". ** +** GENERATED ALWAYS AS ... STATIC columns are only checked if P3 +** is zero. When P3 is non-zero, no type checking occurs for +** static generated columns. Virtual columns are computed at query time +** and so they are never checked. +** ** Preconditions: ** **