From: drh <> Date: Wed, 6 Sep 2023 14:00:01 +0000 (+0000) Subject: Change the xIntegrity virtual table method signature so that it returns X-Git-Tag: version-3.44.0~227^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5ab4dd9e4022a2ea3155506498c1b10e3e84aa5;p=thirdparty%2Fsqlite.git Change the xIntegrity virtual table method signature so that it returns an integer error code and writes the error message into a parameter. FossilOrigin-Name: f1d4024a8ca06cf954aaf1f612684d1a5d28492bde757695db3f22c50c649709 --- diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 03013b0bf4..8aa824bce4 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3984,22 +3984,22 @@ static int fts3ShadowName(const char *zName){ ** Implementation of the xIntegrity() method on the FTS3/FTS4 virtual ** table. */ -static char *fts3Integrity(sqlite3_vtab *pVtab){ +static int fts3Integrity(sqlite3_vtab *pVtab, char **pzErr){ Fts3Table *p = (Fts3Table*)pVtab; char *zSql; int rc; - char *zErr = 0; zSql = sqlite3_mprintf( "INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');", p->zDb, p->zName, p->zName); rc = sqlite3_exec(p->db, zSql, 0, 0, 0); sqlite3_free(zSql); - if( rc ){ - zErr = sqlite3_mprintf("malformed inverted index for FTS%d table %s.%s", - p->bFts4 ? 4 : 3, p->zDb, p->zName); + if( (rc&0xff)==SQLITE_CORRUPT ){ + *pzErr = sqlite3_mprintf("malformed inverted index for FTS%d table %s.%s", + p->bFts4 ? 4 : 3, p->zDb, p->zName); + rc = SQLITE_OK; } - return zErr; + return rc; } diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index fac4dd06bc..1f5b0326fb 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2855,23 +2855,22 @@ static int fts5ShadowName(const char *zName){ ** if anything is found amiss. Return a NULL pointer if everything is ** OK. */ -static char *fts5Integrity(sqlite3_vtab *pVtab){ +static int fts5Integrity(sqlite3_vtab *pVtab, char **pzErr){ Fts5FullTable *pTab = (Fts5FullTable*)pVtab; Fts5Config *pConfig = pTab->p.pConfig; char *zSql; int rc; - char *zErr = 0; - zSql = sqlite3_mprintf( "INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');", pConfig->zDb, pConfig->zName, pConfig->zName); rc = sqlite3_exec(pConfig->db, zSql, 0, 0, 0); sqlite3_free(zSql); - if( rc ){ - zErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s", - pConfig->zDb, pConfig->zName); + if( (rc&0xff)==SQLITE_CORRUPT ){ + *pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s", + pConfig->zDb, pConfig->zName); + rc = SQLITE_OK; } - return zErr; + return rc; } diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 5fb0deca3e..c665951f37 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -3503,7 +3503,7 @@ static int rtreeShadowName(const char *zName){ } /* Forward declaration */ -static char *rtreeIntegrity(sqlite3_vtab*); +static int rtreeIntegrity(sqlite3_vtab*, char**); static sqlite3_module rtreeModule = { 4, /* iVersion */ @@ -4367,21 +4367,15 @@ static int rtreeCheckTable( /* ** Implementation of the xIntegrity method for Rtree. */ -static char *rtreeIntegrity(sqlite3_vtab *pVtab){ +static int rtreeIntegrity(sqlite3_vtab *pVtab, char **pzErr){ Rtree *pRtree = (Rtree*)pVtab; - char *zErr = 0; int rc; - - rc = rtreeCheckTable(pRtree->db, pRtree->zDb, pRtree->zName, &zErr); - if( rc ){ - sqlite3_free(zErr); - zErr = sqlite3_mprintf("error code %d while checking RTree %s.%s", - rc, pRtree->zDb, pRtree->zName); - }else if( zErr ){ - zErr = sqlite3_mprintf("In RTree %s.%s:\n%z", - pRtree->zDb, pRtree->zName, zErr); - } - return zErr; + rc = rtreeCheckTable(pRtree->db, pRtree->zDb, pRtree->zName, pzErr); + if( rc==SQLITE_OK && *pzErr ){ + *pzErr = sqlite3_mprintf("In RTree %s.%s:\n%z", + pRtree->zDb, pRtree->zName, *pzErr); + } + return rc; } /* diff --git a/manifest b/manifest index 15141baad7..11b0325502 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sxIntegrity\smethod\sto\sthe\ssqlite3_module\sobject.\s\sImplement\sthis\nmethod\sin\sRTREE,\sFTS3/4,\sand\sFTS5\sso\sthat\s"PRAGMA\sintegrity_check"\salso\nverifies\sthe\scorrectness\sof\sshadow\stables\sassociated\swith\sthose\svirtual\ntables. -D 2023-09-06T12:52:00.208 +C Change\sthe\sxIntegrity\svirtual\stable\smethod\ssignature\sso\sthat\sit\sreturns\nan\sinteger\serror\scode\sand\swrites\sthe\serror\smessage\sinto\sa\sparameter. +D 2023-09-06T14:00:01.110 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -60,7 +60,7 @@ F ext/fts3/README.content b9078d0843a094d86af0d48dffbff13c906702b4c3558012e67b9c F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 3393dcffc28bcef63d13f3d3cdcc71c3e23d2a9017687d701b9b4b1272ff2d51 +F ext/fts3/fts3.c 4095c97f2960f508bd34fc06d40f61d54e2ad09e7fbab75dc0114f57ebb6040d F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h e573c6d881f7238d77cc3fd2396cbb9b2fe13efef7d2ad295a155151c4e7efbd F ext/fts3/fts3_aux.c f0dc9bd98582615b7750218899bd0c729879b6bbf94d1be57ca1833ff49afc6f @@ -95,7 +95,7 @@ F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6 F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d F ext/fts5/fts5_index.c 47c290589fa38f6a1860b4fc26716ed30d79ddc283b38813d1c8c1d702108ab8 -F ext/fts5/fts5_main.c a2169916037e3d77014d8a18d3ff9f81a2bec8a334ea8905f0e27dbc513fcec3 +F ext/fts5/fts5_main.c 5a0ba13131a5d0ce9ab07aaae96d1780fe63400a237ee8625cfac9499bfcfbc7 F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -469,7 +469,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 971e0b5bd9adaf0811feb8c0842a310811159da10319eb0e74fdb42bf26b99ca -F ext/rtree/rtree.c 31323122691113f085da3836b81a4e9548a21bbfdd86d8becbff1a1bc2617877 +F ext/rtree/rtree.c 2da7e570a4782c6e9a306d7d1cebdfc3c3a1b690725ce90fdbe09650b86db79c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 877d40b8b61b1f88cec9d4dc0ff8334f5b05299fac12a35141532e2881860e9d F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d @@ -708,7 +708,7 @@ F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c e9fb48546ab1882639a3a960383f6342dddb776c0227615f8e19de51f0102f68 F src/shell.c.in 2f9be25294b68b07e7e81f0adcec4475aba6011b64f160e414efe226910c4d7b -F src/sqlite.h.in f04f498f763b9fe36dadd62ac14553a1db60eaf0d5fa5da223d6ff50e660ca69 +F src/sqlite.h.in 1b9be583d9011b9fe09fbdcc33cce19a1d2b40d84ebd164836420a6d256f2fb1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac F src/sqliteInt.h 304deb0cb33993a19545809d245a2bfd34afb77ae701087597f64c463de596cc @@ -776,7 +776,7 @@ F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 81f6d47ecda50b87e87f86d0bf87aac213698b3eec0d95d4cbaea971794e2e25 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 -F src/vdbe.c d1ae563f382d31ced33122b6162160b42928c1ebd3f41425ce28c68ecc2dab56 +F src/vdbe.c 697f4a443357709703baf1d018aac6f81a3f7b838ac711c3d2d59f2b7ab8dd8a F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0 F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c 4184402246172220418c0ef49ff4cf1a19ced9a4ac6c843c2f0773fb5c543f37 @@ -2116,11 +2116,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 93f74490faf8cc07e107afdab6737c6e5141ae1f01a05142bfcede2dd1b2ba4e -R d97552325661633b153eed717efa1718 -T *branch * vtab-integrity-check -T *sym-vtab-integrity-check * -T -sym-trunk * +P 17bede8cdefd968210dd8a5a2617acbe12ba2c99fdd5e88c5def8665e7bec2d7 +R ddcb270798e6e92d1bc2da645d75bf74 U drh -Z a0732a36eef9f82a0ff5fe63847cfd5b +Z 9853bb1092c1661903c7bd49e9ef85a5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 652d256588..b3a60c7402 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17bede8cdefd968210dd8a5a2617acbe12ba2c99fdd5e88c5def8665e7bec2d7 \ No newline at end of file +f1d4024a8ca06cf954aaf1f612684d1a5d28492bde757695db3f22c50c649709 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index e2afe5b669..9ffbb63b23 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -7219,7 +7219,7 @@ struct sqlite3_module { int (*xShadowName)(const char*); /* The methods above are in versions 1 through 3 of the sqlite_module object. ** Those below are for version 4 and greater. */ - char *(*xIntegrity)(sqlite3_vtab *pVTab); + int (*xIntegrity)(sqlite3_vtab *pVTab, char**); }; /* diff --git a/src/vdbe.c b/src/vdbe.c index 73682be85f..eccd5291ed 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -8141,7 +8141,7 @@ case OP_VCheck: { /* out2 */ Table *pTab; sqlite3_vtab *pVtab; const sqlite3_module *pModule; - char *zErr; + char *zErr = 0; pOut = &aMem[pOp->p2]; sqlite3VdbeMemSetNull(pOut); /* Innocent until proven guilty */ @@ -8156,7 +8156,11 @@ case OP_VCheck: { /* out2 */ assert( pModule!=0 ); assert( pModule->iVersion>=4 ); assert( pModule->xIntegrity!=0 ); - zErr = pModule->xIntegrity(pVtab); + rc = pModule->xIntegrity(pVtab, &zErr); + if( rc ){ + sqlite3_free(zErr); + goto abort_due_to_error; + } if( zErr ){ sqlite3VdbeMemSetStr(pOut, zErr, -1, SQLITE_UTF8, sqlite3_free); }