mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Add fault-injection tests for the code in test_stat.c.
FossilOrigin-Name: ea5e0b74c997492025225cd86e65e8a8c86ca4a0
This commit is contained in:
17
manifest
17
manifest
@ -1,5 +1,5 @@
|
|||||||
C Update\sthe\sfuzzer\stest\sdata\safter\shaving\srun\sit\sthrough\safl-cmin\sto\sremove\nredundant\stest\scases.
|
C Add\sfault-injection\stests\sfor\sthe\scode\sin\stest_stat.c.
|
||||||
D 2015-04-27T15:08:53.886
|
D 2015-04-27T19:53:55.422
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in e3268d234210842b4be0a6e2e1c5990999f1d9f4
|
F Makefile.in e3268d234210842b4be0a6e2e1c5990999f1d9f4
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@ -278,7 +278,7 @@ F src/test_rtree.c bfe6f4386517f70054311109f3528adffec34485
|
|||||||
F src/test_schema.c 2bdba21b82f601da69793e1f1d11bf481a79b091
|
F src/test_schema.c 2bdba21b82f601da69793e1f1d11bf481a79b091
|
||||||
F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe
|
F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe
|
||||||
F src/test_sqllog.c b690c12933f50ff46491e0d56a251f84ae16e914
|
F src/test_sqllog.c b690c12933f50ff46491e0d56a251f84ae16e914
|
||||||
F src/test_stat.c ffc8177f6e69de32a8a89fa6bca73facb6c5face
|
F src/test_stat.c e1fc9eae28f8e338446bb3033ec80de143e032ce
|
||||||
F src/test_superlock.c 06797157176eb7085027d9dd278c0d7a105e3ec9
|
F src/test_superlock.c 06797157176eb7085027d9dd278c0d7a105e3ec9
|
||||||
F src/test_syscall.c 2e21ca7f7dc54a028f1967b63f1e76155c356f9b
|
F src/test_syscall.c 2e21ca7f7dc54a028f1967b63f1e76155c356f9b
|
||||||
F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
|
F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
|
||||||
@ -293,7 +293,7 @@ F src/update.c 3c4ecc282accf12d39edb8d524cf089645e55a13
|
|||||||
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
|
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
|
||||||
F src/util.c a6431c92803b975b7322724a7b433e538d243539
|
F src/util.c a6431c92803b975b7322724a7b433e538d243539
|
||||||
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
|
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
|
||||||
F src/vdbe.c f0cf3cf527d5a40b8d5d2324fdbb31da6c90cd8b
|
F src/vdbe.c 519bff8aa3cddbe013de3f01f1cd4a18d582a197
|
||||||
F src/vdbe.h 7e538ecf47dccb307ea2d087c3ddc2dd8d70e79d
|
F src/vdbe.h 7e538ecf47dccb307ea2d087c3ddc2dd8d70e79d
|
||||||
F src/vdbeInt.h 9cbaa84f53ddd2d09a0cf61a94337a3a035d08a0
|
F src/vdbeInt.h 9cbaa84f53ddd2d09a0cf61a94337a3a035d08a0
|
||||||
F src/vdbeapi.c 583d56b129dd27f12bed518270de9ebe521e6a75
|
F src/vdbeapi.c 583d56b129dd27f12bed518270de9ebe521e6a75
|
||||||
@ -901,6 +901,7 @@ F test/speedtest1.c 2b416dca3a155fcaa849540b2e7fc1df12896c23
|
|||||||
F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49
|
F test/spellfix.test 24f676831acddd2f4056a598fd731a72c6311f49
|
||||||
F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68
|
F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68
|
||||||
F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de
|
F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de
|
||||||
|
F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1
|
||||||
F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9
|
F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9
|
||||||
F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f
|
F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f
|
||||||
F test/subquery2.test 438f8a7da1457277b22e4176510f7659b286995f
|
F test/subquery2.test 438f8a7da1457277b22e4176510f7659b286995f
|
||||||
@ -1253,7 +1254,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 5f48d6f6c0a573ecc5bd42cb6c019288e22d295f
|
P 8134d41b964428b3af022735bce9d07c6ad28b21
|
||||||
R 74f0ab9434eee90494f1b0736ca97119
|
R 92d658e0b96ed36e187e832049d255ac
|
||||||
U drh
|
U dan
|
||||||
Z 298974568c9689c0e702b5673772346c
|
Z 90302e8af97f1cb8a317f09e966de90f
|
||||||
|
@ -1 +1 @@
|
|||||||
8134d41b964428b3af022735bce9d07c6ad28b21
|
ea5e0b74c997492025225cd86e65e8a8c86ca4a0
|
110
src/test_stat.c
110
src/test_stat.c
@ -140,15 +140,23 @@ static int statConnect(
|
|||||||
sqlite3_vtab **ppVtab,
|
sqlite3_vtab **ppVtab,
|
||||||
char **pzErr
|
char **pzErr
|
||||||
){
|
){
|
||||||
StatTable *pTab;
|
StatTable *pTab = 0;
|
||||||
|
int rc = SQLITE_OK;
|
||||||
|
|
||||||
pTab = (StatTable *)sqlite3_malloc(sizeof(StatTable));
|
rc = sqlite3_declare_vtab(db, VTAB_SCHEMA);
|
||||||
memset(pTab, 0, sizeof(StatTable));
|
if( rc==SQLITE_OK ){
|
||||||
pTab->db = db;
|
pTab = (StatTable *)sqlite3_malloc(sizeof(StatTable));
|
||||||
|
if( pTab==0 ) rc = SQLITE_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
sqlite3_declare_vtab(db, VTAB_SCHEMA);
|
assert( rc==SQLITE_OK || pTab==0 );
|
||||||
*ppVtab = &pTab->base;
|
if( rc==SQLITE_OK ){
|
||||||
return SQLITE_OK;
|
memset(pTab, 0, sizeof(StatTable));
|
||||||
|
pTab->db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppVtab = (sqlite3_vtab*)pTab;
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -196,32 +204,38 @@ static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
pCsr = (StatCursor *)sqlite3_malloc(sizeof(StatCursor));
|
pCsr = (StatCursor *)sqlite3_malloc(sizeof(StatCursor));
|
||||||
memset(pCsr, 0, sizeof(StatCursor));
|
if( pCsr==0 ){
|
||||||
pCsr->base.pVtab = pVTab;
|
rc = SQLITE_NOMEM;
|
||||||
|
}else{
|
||||||
|
memset(pCsr, 0, sizeof(StatCursor));
|
||||||
|
pCsr->base.pVtab = pVTab;
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(pTab->db,
|
rc = sqlite3_prepare_v2(pTab->db,
|
||||||
"SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type"
|
"SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type"
|
||||||
" UNION ALL "
|
" UNION ALL "
|
||||||
"SELECT name, rootpage, type FROM sqlite_master WHERE rootpage!=0"
|
"SELECT name, rootpage, type FROM sqlite_master WHERE rootpage!=0"
|
||||||
" ORDER BY name", -1,
|
" ORDER BY name", -1,
|
||||||
&pCsr->pStmt, 0
|
&pCsr->pStmt, 0
|
||||||
);
|
);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
sqlite3_free(pCsr);
|
sqlite3_free(pCsr);
|
||||||
return rc;
|
pCsr = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppCursor = (sqlite3_vtab_cursor *)pCsr;
|
*ppCursor = (sqlite3_vtab_cursor *)pCsr;
|
||||||
return SQLITE_OK;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void statClearPage(StatPage *p){
|
static void statClearPage(StatPage *p){
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<p->nCell; i++){
|
if( p->aCell ){
|
||||||
sqlite3_free(p->aCell[i].aOvfl);
|
for(i=0; i<p->nCell; i++){
|
||||||
|
sqlite3_free(p->aCell[i].aOvfl);
|
||||||
|
}
|
||||||
|
sqlite3_free(p->aCell);
|
||||||
}
|
}
|
||||||
sqlite3PagerUnref(p->pPg);
|
sqlite3PagerUnref(p->pPg);
|
||||||
sqlite3_free(p->aCell);
|
|
||||||
sqlite3_free(p->zPath);
|
sqlite3_free(p->zPath);
|
||||||
memset(p, 0, sizeof(StatPage));
|
memset(p, 0, sizeof(StatPage));
|
||||||
}
|
}
|
||||||
@ -307,6 +321,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
|
|||||||
nUsable = szPage - sqlite3BtreeGetReserveNoMutex(pBt);
|
nUsable = szPage - sqlite3BtreeGetReserveNoMutex(pBt);
|
||||||
sqlite3BtreeLeave(pBt);
|
sqlite3BtreeLeave(pBt);
|
||||||
p->aCell = sqlite3_malloc((p->nCell+1) * sizeof(StatCell));
|
p->aCell = sqlite3_malloc((p->nCell+1) * sizeof(StatCell));
|
||||||
|
if( p->aCell==0 ) return SQLITE_NOMEM;
|
||||||
memset(p->aCell, 0, (p->nCell+1) * sizeof(StatCell));
|
memset(p->aCell, 0, (p->nCell+1) * sizeof(StatCell));
|
||||||
|
|
||||||
for(i=0; i<p->nCell; i++){
|
for(i=0; i<p->nCell; i++){
|
||||||
@ -339,6 +354,7 @@ static int statDecodePage(Btree *pBt, StatPage *p){
|
|||||||
pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4);
|
pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4);
|
||||||
pCell->nOvfl = nOvfl;
|
pCell->nOvfl = nOvfl;
|
||||||
pCell->aOvfl = sqlite3_malloc(sizeof(u32)*nOvfl);
|
pCell->aOvfl = sqlite3_malloc(sizeof(u32)*nOvfl);
|
||||||
|
if( pCell->aOvfl==0 ) return SQLITE_NOMEM;
|
||||||
pCell->aOvfl[0] = sqlite3Get4byte(&aData[iOff+nLocal]);
|
pCell->aOvfl[0] = sqlite3Get4byte(&aData[iOff+nLocal]);
|
||||||
for(j=1; j<nOvfl; j++){
|
for(j=1; j<nOvfl; j++){
|
||||||
int rc;
|
int rc;
|
||||||
@ -486,31 +502,33 @@ statNextRestart:
|
|||||||
pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0);
|
pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0);
|
||||||
pCsr->iPageno = p->iPgno;
|
pCsr->iPageno = p->iPgno;
|
||||||
|
|
||||||
statDecodePage(pBt, p);
|
rc = statDecodePage(pBt, p);
|
||||||
statSizeAndOffset(pCsr);
|
if( rc==SQLITE_OK ){
|
||||||
|
statSizeAndOffset(pCsr);
|
||||||
|
|
||||||
switch( p->flags ){
|
switch( p->flags ){
|
||||||
case 0x05: /* table internal */
|
case 0x05: /* table internal */
|
||||||
case 0x02: /* index internal */
|
case 0x02: /* index internal */
|
||||||
pCsr->zPagetype = "internal";
|
pCsr->zPagetype = "internal";
|
||||||
break;
|
break;
|
||||||
case 0x0D: /* table leaf */
|
case 0x0D: /* table leaf */
|
||||||
case 0x0A: /* index leaf */
|
case 0x0A: /* index leaf */
|
||||||
pCsr->zPagetype = "leaf";
|
pCsr->zPagetype = "leaf";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pCsr->zPagetype = "corrupted";
|
pCsr->zPagetype = "corrupted";
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
pCsr->nCell = p->nCell;
|
||||||
|
pCsr->nUnused = p->nUnused;
|
||||||
|
pCsr->nMxPayload = p->nMxPayload;
|
||||||
|
pCsr->zPath = sqlite3_mprintf("%s", p->zPath);
|
||||||
|
nPayload = 0;
|
||||||
|
for(i=0; i<p->nCell; i++){
|
||||||
|
nPayload += p->aCell[i].nLocal;
|
||||||
|
}
|
||||||
|
pCsr->nPayload = nPayload;
|
||||||
}
|
}
|
||||||
pCsr->nCell = p->nCell;
|
|
||||||
pCsr->nUnused = p->nUnused;
|
|
||||||
pCsr->nMxPayload = p->nMxPayload;
|
|
||||||
pCsr->zPath = sqlite3_mprintf("%s", p->zPath);
|
|
||||||
nPayload = 0;
|
|
||||||
for(i=0; i<p->nCell; i++){
|
|
||||||
nPayload += p->aCell[i].nLocal;
|
|
||||||
}
|
|
||||||
pCsr->nPayload = nPayload;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -6107,8 +6107,9 @@ case OP_VOpen: {
|
|||||||
pCur->pVtabCursor = pVtabCursor;
|
pCur->pVtabCursor = pVtabCursor;
|
||||||
pVtab->nRef++;
|
pVtab->nRef++;
|
||||||
}else{
|
}else{
|
||||||
db->mallocFailed = 1;
|
assert( db->mallocFailed );
|
||||||
pModule->xClose(pVtabCursor);
|
pModule->xClose(pVtabCursor);
|
||||||
|
goto no_mem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
45
test/statfault.test
Normal file
45
test/statfault.test
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# 2015 April 28
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
#***********************************************************************
|
||||||
|
#
|
||||||
|
|
||||||
|
set testdir [file dirname $argv0]
|
||||||
|
source $testdir/tester.tcl
|
||||||
|
source $testdir/malloc_common.tcl
|
||||||
|
set testprefix statfault
|
||||||
|
|
||||||
|
ifcapable !vtab||!compound {
|
||||||
|
finish_test
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
register_dbstat_vtab db
|
||||||
|
do_execsql_test statfault-1 {
|
||||||
|
CREATE TABLE t1(a, b UNIQUE);
|
||||||
|
INSERT INTO t1 VALUES(1, randomblob(500));
|
||||||
|
INSERT INTO t1 VALUES(randomblob(500), 1);
|
||||||
|
INSERT INTO t1 VALUES(2, randomblob(250));
|
||||||
|
INSERT INTO t1 VALUES(randomblob(250), 2);
|
||||||
|
CREATE VIRTUAL TABLE sss USING dbstat;
|
||||||
|
} {}
|
||||||
|
faultsim_save_and_close
|
||||||
|
|
||||||
|
do_faultsim_test 1 -faults * -prep {
|
||||||
|
faultsim_restore_and_reopen
|
||||||
|
register_dbstat_vtab db
|
||||||
|
execsql { SELECT 1 FROM sqlite_master LIMIT 1 }
|
||||||
|
} -body {
|
||||||
|
execsql { SELECT count(*) FROM sss }
|
||||||
|
} -test {
|
||||||
|
faultsim_test_result {0 8}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
finish_test
|
Reference in New Issue
Block a user