1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Add extended return code SQLITE_CORRUPT_VTAB. Returned when the tcontents of the sqlite tables used internally by a virtual table module are invalid or inconsistent.

FossilOrigin-Name: 8844e8bfb87314fb40ecb92705e8fff88f72bb38
This commit is contained in:
dan
2011-05-17 15:56:16 +00:00
parent fc24373999
commit 133d7dab17
9 changed files with 41 additions and 31 deletions

View File

@ -1195,7 +1195,7 @@ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){
** table is missing a row that is present in the full-text index. ** table is missing a row that is present in the full-text index.
** The data structures are corrupt. ** The data structures are corrupt.
*/ */
rc = SQLITE_CORRUPT; rc = SQLITE_CORRUPT_VTAB;
} }
pCsr->isEof = 1; pCsr->isEof = 1;
if( pContext ){ if( pContext ){
@ -1255,7 +1255,7 @@ static int fts3ScanInteriorNode(
zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
if( zCsr>zEnd ){ if( zCsr>zEnd ){
return SQLITE_CORRUPT; return SQLITE_CORRUPT_VTAB;
} }
while( zCsr<zEnd && (piFirst || piLast) ){ while( zCsr<zEnd && (piFirst || piLast) ){
@ -1273,7 +1273,7 @@ static int fts3ScanInteriorNode(
zCsr += sqlite3Fts3GetVarint32(zCsr, &nSuffix); zCsr += sqlite3Fts3GetVarint32(zCsr, &nSuffix);
if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){ if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){
rc = SQLITE_CORRUPT; rc = SQLITE_CORRUPT_VTAB;
goto finish_scan; goto finish_scan;
} }
if( nPrefix+nSuffix>nAlloc ){ if( nPrefix+nSuffix>nAlloc ){

View File

@ -960,7 +960,7 @@ static int fts3MatchinfoSelectDoctotal(
a = sqlite3_column_blob(pStmt, 0); a = sqlite3_column_blob(pStmt, 0);
a += sqlite3Fts3GetVarint(a, &nDoc); a += sqlite3Fts3GetVarint(a, &nDoc);
if( nDoc==0 ) return SQLITE_CORRUPT; if( nDoc==0 ) return SQLITE_CORRUPT_VTAB;
*pnDoc = (u32)nDoc; *pnDoc = (u32)nDoc;
if( paLen ) *paLen = a; if( paLen ) *paLen = a;
@ -1555,7 +1555,7 @@ void sqlite3Fts3Offsets(
); );
rc = fts3StringAppend(&res, aBuffer, -1); rc = fts3StringAppend(&res, aBuffer, -1);
}else if( rc==SQLITE_DONE ){ }else if( rc==SQLITE_DONE ){
rc = SQLITE_CORRUPT; rc = SQLITE_CORRUPT_VTAB;
} }
} }
} }

View File

@ -291,7 +291,7 @@ static int fts3SelectDocsize(
rc = sqlite3_step(pStmt); rc = sqlite3_step(pStmt);
if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){ if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){
rc = sqlite3_reset(pStmt); rc = sqlite3_reset(pStmt);
if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT; if( rc==SQLITE_OK ) rc = SQLITE_CORRUPT_VTAB;
pStmt = 0; pStmt = 0;
}else{ }else{
rc = SQLITE_OK; rc = SQLITE_OK;
@ -972,7 +972,7 @@ static int fts3SegReaderNext(Fts3Table *p, Fts3SegReader *pReader){
if( nPrefix<0 || nSuffix<=0 if( nPrefix<0 || nSuffix<=0
|| &pNext[nSuffix]>&pReader->aNode[pReader->nNode] || &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
){ ){
return SQLITE_CORRUPT; return SQLITE_CORRUPT_VTAB;
} }
if( nPrefix+nSuffix>pReader->nTermAlloc ){ if( nPrefix+nSuffix>pReader->nTermAlloc ){
@ -998,7 +998,7 @@ static int fts3SegReaderNext(Fts3Table *p, Fts3SegReader *pReader){
if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode] if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
|| pReader->aDoclist[pReader->nDoclist-1] || pReader->aDoclist[pReader->nDoclist-1]
){ ){
return SQLITE_CORRUPT; return SQLITE_CORRUPT_VTAB;
} }
return SQLITE_OK; return SQLITE_OK;
} }
@ -1123,7 +1123,7 @@ int sqlite3Fts3SegReaderCost(
} }
if( nDoc==0 || nByte==0 ){ if( nDoc==0 || nByte==0 ){
sqlite3_reset(pStmt); sqlite3_reset(pStmt);
return SQLITE_CORRUPT; return SQLITE_CORRUPT_VTAB;
} }
pCsr->nRowAvg = (int)(((nByte / nDoc) + pgsz) / pgsz); pCsr->nRowAvg = (int)(((nByte / nDoc) + pgsz) / pgsz);
@ -2762,7 +2762,7 @@ int sqlite3Fts3UpdateMethod(
if( nArg>1 && rc==SQLITE_OK ){ if( nArg>1 && rc==SQLITE_OK ){
if( bInsertDone==0 ){ if( bInsertDone==0 ){
rc = fts3InsertData(p, apVal, pRowid); rc = fts3InsertData(p, apVal, pRowid);
if( rc==SQLITE_CONSTRAINT ) rc = SQLITE_CORRUPT; if( rc==SQLITE_CONSTRAINT ) rc = SQLITE_CORRUPT_VTAB;
} }
if( rc==SQLITE_OK && (!isRemove || *pRowid!=iRemove) ){ if( rc==SQLITE_OK && (!isRemove || *pRowid!=iRemove) ){
rc = fts3PendingTermsDocid(p, *pRowid); rc = fts3PendingTermsDocid(p, *pRowid);

View File

@ -517,17 +517,17 @@ nodeAcquire(
if( pNode && iNode==1 ){ if( pNode && iNode==1 ){
pRtree->iDepth = readInt16(pNode->zData); pRtree->iDepth = readInt16(pNode->zData);
if( pRtree->iDepth>RTREE_MAX_DEPTH ){ if( pRtree->iDepth>RTREE_MAX_DEPTH ){
rc = SQLITE_CORRUPT; rc = SQLITE_CORRUPT_VTAB;
} }
} }
/* If no error has occurred so far, check if the "number of entries" /* If no error has occurred so far, check if the "number of entries"
** field on the node is too large. If so, set the return code to ** field on the node is too large. If so, set the return code to
** SQLITE_CORRUPT. ** SQLITE_CORRUPT_VTAB.
*/ */
if( pNode && rc==SQLITE_OK ){ if( pNode && rc==SQLITE_OK ){
if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){
rc = SQLITE_CORRUPT; rc = SQLITE_CORRUPT_VTAB;
} }
} }
@ -535,7 +535,7 @@ nodeAcquire(
if( pNode!=0 ){ if( pNode!=0 ){
nodeHashInsert(pRtree, pNode); nodeHashInsert(pRtree, pNode);
}else{ }else{
rc = SQLITE_CORRUPT; rc = SQLITE_CORRUPT_VTAB;
} }
*ppNode = pNode; *ppNode = pNode;
}else{ }else{
@ -1062,7 +1062,7 @@ static int nodeRowidIndex(
return SQLITE_OK; return SQLITE_OK;
} }
} }
return SQLITE_CORRUPT; return SQLITE_CORRUPT_VTAB;
} }
/* /*
@ -1657,7 +1657,7 @@ static int AdjustTree(
int iCell; int iCell;
if( nodeParentIndex(pRtree, p, &iCell) ){ if( nodeParentIndex(pRtree, p, &iCell) ){
return SQLITE_CORRUPT; return SQLITE_CORRUPT_VTAB;
} }
nodeGetCell(pRtree, pParent, iCell, &cell); nodeGetCell(pRtree, pParent, iCell, &cell);
@ -2329,7 +2329,7 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
} }
rc = sqlite3_reset(pRtree->pReadParent); rc = sqlite3_reset(pRtree->pReadParent);
if( rc==SQLITE_OK ) rc = rc2; if( rc==SQLITE_OK ) rc = rc2;
if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT; if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB;
pChild = pChild->pParent; pChild = pChild->pParent;
} }
return rc; return rc;

View File

@ -1,5 +1,5 @@
C Avoid\sexceeding\sarray\sbounds\swhen\sreading\sa\scorrupt\sdatabase\sfile\sin\nautovacuum\smode.\s\sFixes\sa\sproblem\sdiscovered\sby\sJohn\sRegehr\sand\sPeng\sLi\nusing\sa\scustomized\sclang\scompiler. C Add\sextended\sreturn\scode\sSQLITE_CORRUPT_VTAB.\sReturned\swhen\sthe\stcontents\sof\sthe\ssqlite\stables\sused\sinternally\sby\sa\svirtual\stable\smodule\sare\sinvalid\sor\sinconsistent.
D 2011-05-17T15:21:56.657 D 2011-05-17T15:56:16.473
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d F Makefile.in 11dcc00a8d0e5202def00e81732784fb0cc4fe1d
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -61,7 +61,7 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0
F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
F ext/fts3/fts3.c 0077bd07395d2aabafa1ed1b104552619ecad34a F ext/fts3/fts3.c 18c2a079ba2b9154b7485fd39d1a6d12b5872a76
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
F ext/fts3/fts3Int.h 05d145152620e7849c452bd919f2cc3e2d75309f F ext/fts3/fts3Int.h 05d145152620e7849c452bd919f2cc3e2d75309f
F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf F ext/fts3/fts3_aux.c 9e931f55eed8498dafe7bc1160f10cbb1a652fdf
@ -70,19 +70,19 @@ F ext/fts3/fts3_hash.c 3c8f6387a4a7f5305588b203fa7c887d753e1f1c
F ext/fts3/fts3_hash.h 8331fb2206c609f9fc4c4735b9ab5ad6137c88ec F ext/fts3/fts3_hash.h 8331fb2206c609f9fc4c4735b9ab5ad6137c88ec
F ext/fts3/fts3_icu.c ac494aed69835008185299315403044664bda295 F ext/fts3/fts3_icu.c ac494aed69835008185299315403044664bda295
F ext/fts3/fts3_porter.c d61cfd81fb0fd8fbcb25adcaee0ba671aefaa5c2 F ext/fts3/fts3_porter.c d61cfd81fb0fd8fbcb25adcaee0ba671aefaa5c2
F ext/fts3/fts3_snippet.c a4a3c7d2ab15ca9188e2d9b51a5e3927bf76580d F ext/fts3/fts3_snippet.c 92b40397b28422c35c4127492d7ac6da34d1966a
F ext/fts3/fts3_term.c f115f5a5f4298303d3b22fc6c524b8d565c7b950 F ext/fts3/fts3_term.c f115f5a5f4298303d3b22fc6c524b8d565c7b950
F ext/fts3/fts3_tokenizer.c 055f3dc7369585350b28db1ee0f3b214dca6724d F ext/fts3/fts3_tokenizer.c 055f3dc7369585350b28db1ee0f3b214dca6724d
F ext/fts3/fts3_tokenizer.h 13ffd9fcb397fec32a05ef5cd9e0fa659bf3dbd3 F ext/fts3/fts3_tokenizer.h 13ffd9fcb397fec32a05ef5cd9e0fa659bf3dbd3
F ext/fts3/fts3_tokenizer1.c 6e5cbaa588924ac578263a598e4fb9f5c9bb179d F ext/fts3/fts3_tokenizer1.c 6e5cbaa588924ac578263a598e4fb9f5c9bb179d
F ext/fts3/fts3_write.c 7d6d904b89333448eb968fc82470a74985d0b61e F ext/fts3/fts3_write.c b50181e5ecf484c2f56e98d651424e4b69f96c89
F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9
F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100
F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9 F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9
F ext/icu/icu.c eb9ae1d79046bd7871aa97ee6da51eb770134b5a F ext/icu/icu.c eb9ae1d79046bd7871aa97ee6da51eb770134b5a
F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
F ext/rtree/rtree.c 829c6901a2b065ff93a68d431f9eaba8de7128e0 F ext/rtree/rtree.c 2445bec932f58f8f4fe9de49a63bd6bf24db82d6
F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e
F ext/rtree/rtree1.test 28e1b8da4da98093ce3210187434dd760a8d89d8 F ext/rtree/rtree1.test 28e1b8da4da98093ce3210187434dd760a8d89d8
F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba
@ -179,14 +179,14 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff
F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79 F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79
F src/sqlite.h.in d7cc9050446a5ed9eb896362dd264e6e10e0cc03 F src/sqlite.h.in ee13c23409219c0a5fd3f0c0cd761a5073564a0b
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6 F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
F src/tclsqlite.c 501c9a200fd998a268be475be5858febc90b725b F src/tclsqlite.c 501c9a200fd998a268be475be5858febc90b725b
F src/test1.c f506164085bc4cbbb4b5c14b9c6de153f1aeafc5 F src/test1.c 4a1171af201be90c21d64a872e686b1333d9a2cf
F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31 F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31
F src/test3.c 124ff9735fb6bb7d41de180d6bac90e7b1509432 F src/test3.c 124ff9735fb6bb7d41de180d6bac90e7b1509432
F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7 F src/test4.c d1e5a5e904d4b444cf572391fdcb017638e36ff7
@ -458,7 +458,7 @@ F test/fts3b.test e93bbb653e52afde110ad53bbd793f14fe7a8984
F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958
F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c
F test/fts3conf.test 8e65ea56f88ced6cdd2252bdddb1a8327ae5af7e F test/fts3conf.test 8e65ea56f88ced6cdd2252bdddb1a8327ae5af7e
F test/fts3corrupt.test 7890cc202406858386ddf390a879dcf80bc10abf F test/fts3corrupt.test 7b0f91780ca36118d73324ec803187208ad33b32
F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba
F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7
F test/fts3d.test 95fb3c862cbc4297c93fceb9a635543744e9ef52 F test/fts3d.test 95fb3c862cbc4297c93fceb9a635543744e9ef52
@ -936,7 +936,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P f392b7ae0266b4c694836583cb91b10f2b6c0752 P f7c525f5fc31e909721df2b1e66fc62dfb105718
R cf53219bce3a7dbccc0e0612301125fc R 8174cc733f5a883825d78ae2804a3f2d
U drh U dan
Z 6f0c0bbdb12e972d7467056dbeea9264 Z 5f2d01dc50656b115009ed665e1773e1

View File

@ -1 +1 @@
f7c525f5fc31e909721df2b1e66fc62dfb105718 8844e8bfb87314fb40ecb92705e8fff88f72bb38

View File

@ -453,6 +453,7 @@ int sqlite3_exec(
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
/* /*
** CAPI3REF: Flags For File Open Operations ** CAPI3REF: Flags For File Open Operations

View File

@ -163,6 +163,8 @@ const char *sqlite3TestErrorName(int rc){
case SQLITE_IOERR_CHECKRESERVEDLOCK: case SQLITE_IOERR_CHECKRESERVEDLOCK:
zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break; zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break;
case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break; case SQLITE_IOERR_LOCK: zName = "SQLITE_IOERR_LOCK"; break;
case SQLITE_CORRUPT_VTAB: zName = "SQLITE_CORRUPT_VTAB"; break;
zName = "SQLITE_IOERR_CHECKRESERVEDLOCK"; break;
default: zName = "SQLITE_Unknown"; break; default: zName = "SQLITE_Unknown"; break;
} }
return zName; return zName;

View File

@ -40,6 +40,7 @@ do_test fts3corrupt-1.2 {
do_catchsql_test 1.3 { do_catchsql_test 1.3 {
INSERT INTO t1 VALUES('world'); INSERT INTO t1 VALUES('world');
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 1.3.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
do_execsql_test 1.4 { do_execsql_test 1.4 {
DROP TABLE t1; DROP TABLE t1;
} }
@ -69,6 +70,7 @@ do_test fts3corrupt-2.1 {
do_catchsql_test 2.2 { do_catchsql_test 2.2 {
SELECT rowid FROM t1 WHERE t1 MATCH 'hello' SELECT rowid FROM t1 WHERE t1 MATCH 'hello'
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 2.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
do_execsql_test 3.0 { do_execsql_test 3.0 {
DROP TABLE t1; DROP TABLE t1;
@ -86,6 +88,7 @@ do_test fts3corrupt-3.1 {
do_catchsql_test 3.2 { do_catchsql_test 3.2 {
SELECT rowid FROM t1 WHERE t1 MATCH 'world' SELECT rowid FROM t1 WHERE t1 MATCH 'world'
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 3.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
do_execsql_test 4.0 { do_execsql_test 4.0 {
@ -111,6 +114,7 @@ do_catchsql_test 4.2 {
UPDATE t1_segdir SET root = X'FFFFFFFFFFFFFFFF'; UPDATE t1_segdir SET root = X'FFFFFFFFFFFFFFFF';
SELECT rowid FROM t1 WHERE t1 MATCH 'world'; SELECT rowid FROM t1 WHERE t1 MATCH 'world';
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 4.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
set blob [binary format cca*cca*cca*cca*cca*cca*cca*cca*cca*cca*a* \ set blob [binary format cca*cca*cca*cca*cca*cca*cca*cca*cca*cca*a* \
22 120 [string repeat a 120] \ 22 120 [string repeat a 120] \
@ -130,6 +134,7 @@ do_catchsql_test 4.3 {
UPDATE t1_segdir SET root = $blob; UPDATE t1_segdir SET root = $blob;
SELECT rowid FROM t1 WHERE t1 MATCH 'world'; SELECT rowid FROM t1 WHERE t1 MATCH 'world';
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 4.3.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
# Test a special kind of corruption, where the %_stat table contains # Test a special kind of corruption, where the %_stat table contains
# an invalid entry. At one point this could lead to a division-by-zero # an invalid entry. At one point this could lead to a division-by-zero
@ -152,10 +157,12 @@ do_catchsql_test 5.2 {
UPDATE t1_stat SET value = X'0000'; UPDATE t1_stat SET value = X'0000';
SELECT matchinfo(t1, 'nxa') FROM t1 WHERE t1 MATCH 't*'; SELECT matchinfo(t1, 'nxa') FROM t1 WHERE t1 MATCH 't*';
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 5.2.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
do_catchsql_test 5.3 { do_catchsql_test 5.3 {
UPDATE t1_stat SET value = NULL; UPDATE t1_stat SET value = NULL;
SELECT matchinfo(t1, 'nxa') FROM t1 WHERE t1 MATCH 't*'; SELECT matchinfo(t1, 'nxa') FROM t1 WHERE t1 MATCH 't*';
} {1 {database disk image is malformed}} } {1 {database disk image is malformed}}
do_test 5.3.1 { sqlite3_extended_errcode db } SQLITE_CORRUPT_VTAB
finish_test finish_test