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
This commit is contained in:
drh 2023-09-06 14:00:01 +00:00
parent 961c2a9f36
commit d5ab4dd9e4
7 changed files with 37 additions and 43 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
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 zErr;
return rc;
}
/*

View File

@ -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.

View File

@ -1 +1 @@
17bede8cdefd968210dd8a5a2617acbe12ba2c99fdd5e88c5def8665e7bec2d7
f1d4024a8ca06cf954aaf1f612684d1a5d28492bde757695db3f22c50c649709

View File

@ -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**);
};
/*

View File

@ -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);
}