mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Improvements to the way PRAGMA integrity_check works. More likely to output
userful information when given a corrupt database. (CVS 1132) FossilOrigin-Name: b92c31d6c138f9462730cecfe14f7dde19778e79
This commit is contained in:
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
|||||||
C Updates\sto\sthe\shomepage\s-\sfix\sthe\sCVS\saccess\sinstructions.\s(CVS\s1131)
|
C Improvements\sto\sthe\sway\sPRAGMA\sintegrity_check\sworks.\s\sMore\slikely\sto\soutput\nuserful\sinformation\swhen\sgiven\sa\scorrupt\sdatabase.\s(CVS\s1132)
|
||||||
D 2003-12-15T17:51:19
|
D 2003-12-16T03:44:48
|
||||||
F Makefile.in 5cb273b7d0e945d47ee8b9ad1c2a04ce79927d2d
|
F Makefile.in 5cb273b7d0e945d47ee8b9ad1c2a04ce79927d2d
|
||||||
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@ -23,7 +23,7 @@ F sqlite.1 83f4a9d37bdf2b7ef079a82d54eaf2e3509ee6ea
|
|||||||
F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2
|
F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2
|
||||||
F src/attach.c 9a3764bbccb1c8b39321630006fbaa0fb8bd1822
|
F src/attach.c 9a3764bbccb1c8b39321630006fbaa0fb8bd1822
|
||||||
F src/auth.c c59ad0dab501888f8b1fccc25e2f5965d2265116
|
F src/auth.c c59ad0dab501888f8b1fccc25e2f5965d2265116
|
||||||
F src/btree.c bcb466c2939582a3a62f577cd8a9e5d637f3698d
|
F src/btree.c 89a77be5ca8bb229f9e230de534098ea5b06c2c1
|
||||||
F src/btree.h 9b7c09f1e64274d7bb74a57bbfc63778f67b1048
|
F src/btree.h 9b7c09f1e64274d7bb74a57bbfc63778f67b1048
|
||||||
F src/btree_rb.c e4084b6a12270674b0cd7034655f55e6a2639c78
|
F src/btree_rb.c e4084b6a12270674b0cd7034655f55e6a2639c78
|
||||||
F src/build.c a7493c433de5b552f9535d8fa7ed80aaf135491e
|
F src/build.c a7493c433de5b552f9535d8fa7ed80aaf135491e
|
||||||
@ -43,7 +43,7 @@ F src/os.h 729395fefcca4b81ae056aa9ff67b72bb40dd9e0
|
|||||||
F src/pager.c 62702dff51d50694d039bc210f31990d1fbba2dd
|
F src/pager.c 62702dff51d50694d039bc210f31990d1fbba2dd
|
||||||
F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31
|
F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31
|
||||||
F src/parse.y c65aa6c5508763806ac9734b0589b93480ec7e7a
|
F src/parse.y c65aa6c5508763806ac9734b0589b93480ec7e7a
|
||||||
F src/pragma.c cee60f17679210e8acd30d5bdee855716d0c898c
|
F src/pragma.c deec7342741e371f3042adaee53fcc324c5dd1d4
|
||||||
F src/printf.c 12e45d482ac8abcc6f786fc99e5bed7dd9a51af0
|
F src/printf.c 12e45d482ac8abcc6f786fc99e5bed7dd9a51af0
|
||||||
F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
|
F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe
|
||||||
F src/select.c d79ac60ba1595ff3c94b12892e87098329776482
|
F src/select.c d79ac60ba1595ff3c94b12892e87098329776482
|
||||||
@ -109,7 +109,7 @@ F test/misuse.test a3aa2b18a97e4c409a1fcaff5151a4dd804a0162
|
|||||||
F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
|
F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0
|
||||||
F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721
|
F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721
|
||||||
F test/pager.test dd31da9bee94a82e2e87e58cf286cfe809f8fc5f
|
F test/pager.test dd31da9bee94a82e2e87e58cf286cfe809f8fc5f
|
||||||
F test/pragma.test e7cb7ffd765c9158868b0b7a3771d54a0d5f5072
|
F test/pragma.test 17ff54f4abe187fa1e9dd20afef63d14c650d737
|
||||||
F test/printf.test 3ed02f1361402c0767492cd5cef4650e61df8308
|
F test/printf.test 3ed02f1361402c0767492cd5cef4650e61df8308
|
||||||
F test/progress.test 701b6115c2613128ececdfe1398a1bd0e1a4cfb3 x
|
F test/progress.test 701b6115c2613128ececdfe1398a1bd0e1a4cfb3 x
|
||||||
F test/quick.test c527bdb899b12a8cd8ceecce45f72922099f4095
|
F test/quick.test c527bdb899b12a8cd8ceecce45f72922099f4095
|
||||||
@ -176,7 +176,7 @@ F www/speed.tcl 2f6b1155b99d39adb185f900456d1d592c4832b3
|
|||||||
F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
|
F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
|
||||||
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
||||||
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
||||||
P d6549954408b01e5eaf865b9100739c94de28f16
|
P 653a7dd97ed95e66bd2973169735ee73ee348576
|
||||||
R edcd3752c4dbf2f82999564759ef2959
|
R 435a13e877cf1f013db1660aef5f3d2f
|
||||||
U drh
|
U drh
|
||||||
Z ee4c4b73919cef5782114fea0f6ce2ec
|
Z b27d1bd5a7237f952a32b8adb3b13abd
|
||||||
|
@ -1 +1 @@
|
|||||||
653a7dd97ed95e66bd2973169735ee73ee348576
|
b92c31d6c138f9462730cecfe14f7dde19778e79
|
@ -9,7 +9,7 @@
|
|||||||
** May you share freely, never taking more than you give.
|
** May you share freely, never taking more than you give.
|
||||||
**
|
**
|
||||||
*************************************************************************
|
*************************************************************************
|
||||||
** $Id: btree.c,v 1.96 2003/12/06 21:43:56 drh Exp $
|
** $Id: btree.c,v 1.97 2003/12/16 03:44:48 drh Exp $
|
||||||
**
|
**
|
||||||
** This file implements a external (disk-based) database using BTrees.
|
** This file implements a external (disk-based) database using BTrees.
|
||||||
** For a detailed discussion of BTrees, refer to
|
** For a detailed discussion of BTrees, refer to
|
||||||
@ -1402,7 +1402,9 @@ static int moveToChild(BtCursor *pCur, int newPgno){
|
|||||||
sqlitepager_unref(pCur->pPage);
|
sqlitepager_unref(pCur->pPage);
|
||||||
pCur->pPage = pNewPage;
|
pCur->pPage = pNewPage;
|
||||||
pCur->idx = 0;
|
pCur->idx = 0;
|
||||||
if( pNewPage->nCell<1 ) return SQLITE_CORRUPT;
|
if( pNewPage->nCell<1 ){
|
||||||
|
return SQLITE_CORRUPT;
|
||||||
|
}
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
41
src/pragma.c
41
src/pragma.c
@ -11,7 +11,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** This file contains code used to implement the PRAGMA command.
|
** This file contains code used to implement the PRAGMA command.
|
||||||
**
|
**
|
||||||
** $Id: pragma.c,v 1.11 2003/08/23 22:40:54 drh Exp $
|
** $Id: pragma.c,v 1.12 2003/12/16 03:44:48 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -555,11 +555,10 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
int i, j, addr;
|
int i, j, addr;
|
||||||
|
|
||||||
/* Code that initializes the integrity check program. Set the
|
/* Code that initializes the integrity check program. Set the
|
||||||
** error message to an empty string and register the callback
|
** error count 0
|
||||||
** column name.
|
|
||||||
*/
|
*/
|
||||||
static VdbeOp initCode[] = {
|
static VdbeOp initCode[] = {
|
||||||
{ OP_String, 0, 0, ""},
|
{ OP_Integer, 0, 0, 0},
|
||||||
{ OP_MemStore, 0, 1, 0},
|
{ OP_MemStore, 0, 1, 0},
|
||||||
{ OP_ColumnName, 0, 0, "integrity_check"},
|
{ OP_ColumnName, 0, 0, "integrity_check"},
|
||||||
};
|
};
|
||||||
@ -578,15 +577,13 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
{ OP_Dup, 0, 1, 0},
|
{ OP_Dup, 0, 1, 0},
|
||||||
{ OP_String, 0, 0, "ok"},
|
{ OP_String, 0, 0, "ok"},
|
||||||
{ OP_StrEq, 0, 12, 0}, /* 10 */
|
{ OP_StrEq, 0, 12, 0}, /* 10 */
|
||||||
{ OP_MemLoad, 0, 0, 0},
|
{ OP_MemIncr, 0, 0, 0},
|
||||||
{ OP_String, 0, 0, "*** in database "},
|
{ OP_String, 0, 0, "*** in database "},
|
||||||
{ OP_String, 0, 0, 0}, /* 13 */
|
{ OP_String, 0, 0, 0}, /* 13 */
|
||||||
{ OP_String, 0, 0, " ***\n"},
|
{ OP_String, 0, 0, " ***\n"},
|
||||||
{ OP_Pull, 4, 0, 0},
|
{ OP_Pull, 3, 0, 0},
|
||||||
{ OP_Concat, 5, 1, 0},
|
{ OP_Concat, 4, 1, 0},
|
||||||
{ OP_MemStore, 0, 1, 0},
|
{ OP_Callback, 1, 0, 0},
|
||||||
{ OP_Integer, 0, 0, 0},
|
|
||||||
{ OP_Pop, 1, 0, 0},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Code that appears at the end of the integrity check. If no error
|
/* Code that appears at the end of the integrity check. If no error
|
||||||
@ -595,10 +592,8 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
*/
|
*/
|
||||||
static VdbeOp endCode[] = {
|
static VdbeOp endCode[] = {
|
||||||
{ OP_MemLoad, 0, 0, 0},
|
{ OP_MemLoad, 0, 0, 0},
|
||||||
{ OP_Dup, 0, 1, 0},
|
{ OP_Integer, 0, 0, 0},
|
||||||
{ OP_String, 0, 0, ""},
|
{ OP_Ne, 0, 0, 0}, /* 2 */
|
||||||
{ OP_StrNe, 0, 0, 0}, /* 3 */
|
|
||||||
{ OP_Pop, 1, 0, 0},
|
|
||||||
{ OP_String, 0, 0, "ok"},
|
{ OP_String, 0, 0, "ok"},
|
||||||
{ OP_Callback, 1, 0, 0},
|
{ OP_Callback, 1, 0, 0},
|
||||||
};
|
};
|
||||||
@ -617,7 +612,7 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
sqliteVdbeChangeP2(v, addr+3, addr+7);
|
sqliteVdbeChangeP2(v, addr+3, addr+7);
|
||||||
sqliteVdbeChangeP2(v, addr+6, addr+4);
|
sqliteVdbeChangeP2(v, addr+6, addr+4);
|
||||||
sqliteVdbeChangeP2(v, addr+7, i);
|
sqliteVdbeChangeP2(v, addr+7, i);
|
||||||
sqliteVdbeChangeP2(v, addr+10, addr+ArraySize(checkDb)-1);
|
sqliteVdbeChangeP2(v, addr+10, addr+ArraySize(checkDb));
|
||||||
sqliteVdbeChangeP3(v, addr+13, db->aDb[i].zName, P3_STATIC);
|
sqliteVdbeChangeP3(v, addr+13, db->aDb[i].zName, P3_STATIC);
|
||||||
|
|
||||||
/* Make sure all the indices are constructed correctly.
|
/* Make sure all the indices are constructed correctly.
|
||||||
@ -645,14 +640,13 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
|
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
|
||||||
int k, jmp2;
|
int k, jmp2;
|
||||||
static VdbeOp idxErr[] = {
|
static VdbeOp idxErr[] = {
|
||||||
{ OP_MemLoad, 0, 0, 0},
|
{ OP_MemIncr, 0, 0, 0},
|
||||||
{ OP_String, 0, 0, "rowid "},
|
{ OP_String, 0, 0, "rowid "},
|
||||||
{ OP_Recno, 1, 0, 0},
|
{ OP_Recno, 1, 0, 0},
|
||||||
{ OP_String, 0, 0, " missing from index "},
|
{ OP_String, 0, 0, " missing from index "},
|
||||||
{ OP_String, 0, 0, 0}, /* 4 */
|
{ OP_String, 0, 0, 0}, /* 4 */
|
||||||
{ OP_String, 0, 0, "\n"},
|
{ OP_Concat, 4, 0, 0},
|
||||||
{ OP_Concat, 6, 0, 0},
|
{ OP_Callback, 1, 0, 0},
|
||||||
{ OP_MemStore, 0, 1, 0},
|
|
||||||
};
|
};
|
||||||
sqliteVdbeAddOp(v, OP_Recno, 1, 0);
|
sqliteVdbeAddOp(v, OP_Recno, 1, 0);
|
||||||
for(k=0; k<pIdx->nColumn; k++){
|
for(k=0; k<pIdx->nColumn; k++){
|
||||||
@ -682,12 +676,11 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
{ OP_MemLoad, 1, 0, 0},
|
{ OP_MemLoad, 1, 0, 0},
|
||||||
{ OP_MemLoad, 2, 0, 0},
|
{ OP_MemLoad, 2, 0, 0},
|
||||||
{ OP_Eq, 0, 0, 0}, /* 7 */
|
{ OP_Eq, 0, 0, 0}, /* 7 */
|
||||||
{ OP_MemLoad, 0, 0, 0},
|
{ OP_MemIncr, 0, 0, 0},
|
||||||
{ OP_String, 0, 0, "wrong # of entries in index "},
|
{ OP_String, 0, 0, "wrong # of entries in index "},
|
||||||
{ OP_String, 0, 0, 0}, /* 10 */
|
{ OP_String, 0, 0, 0}, /* 10 */
|
||||||
{ OP_String, 0, 0, "\n"},
|
{ OP_Concat, 2, 0, 0},
|
||||||
{ OP_Concat, 4, 0, 0},
|
{ OP_Callback, 1, 0, 0},
|
||||||
{ OP_MemStore, 0, 1, 0},
|
|
||||||
};
|
};
|
||||||
if( pIdx->tnum==0 ) continue;
|
if( pIdx->tnum==0 ) continue;
|
||||||
addr = sqliteVdbeAddOpList(v, ArraySize(cntIdx), cntIdx);
|
addr = sqliteVdbeAddOpList(v, ArraySize(cntIdx), cntIdx);
|
||||||
@ -701,7 +694,7 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
addr = sqliteVdbeAddOpList(v, ArraySize(endCode), endCode);
|
addr = sqliteVdbeAddOpList(v, ArraySize(endCode), endCode);
|
||||||
sqliteVdbeChangeP2(v, addr+3, addr+ArraySize(endCode)-1);
|
sqliteVdbeChangeP2(v, addr+2, addr+ArraySize(endCode));
|
||||||
}else
|
}else
|
||||||
|
|
||||||
{}
|
{}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#
|
#
|
||||||
# This file implements tests for the PRAGMA command.
|
# This file implements tests for the PRAGMA command.
|
||||||
#
|
#
|
||||||
# $Id: pragma.test,v 1.6 2003/07/27 17:26:23 drh Exp $
|
# $Id: pragma.test,v 1.7 2003/12/16 03:44:48 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -264,8 +264,6 @@ do_test pragma-3.2 {
|
|||||||
btree_commit $db
|
btree_commit $db
|
||||||
btree_close $db
|
btree_close $db
|
||||||
execsql {PRAGMA integrity_check}
|
execsql {PRAGMA integrity_check}
|
||||||
} {{rowid 1 missing from index i2
|
} {{rowid 1 missing from index i2} {wrong # of entries in index i2}}
|
||||||
wrong # of entries in index i2
|
|
||||||
}}
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user