mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Add the ability to do a PRAGMA integrity_check (or quick_check) on a single
table by specifying the table name as the argument. FossilOrigin-Name: 65dd321432e8f80bc1cb11be8ca06656b41ac997a74a5eb271c797cf0fbb764e
This commit is contained in:
15
manifest
15
manifest
@ -1,6 +1,6 @@
|
|||||||
B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
|
B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
|
||||||
C Work-around\sfor\s[https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270|GCC\sbug\s96270].
|
C Add\sthe\sability\sto\sdo\sa\sPRAGMA\sintegrity_check\s(or\squick_check)\son\sa\ssingle\ntable\sby\sspecifying\sthe\stable\sname\sas\sthe\sargument.
|
||||||
D 2020-07-21T18:36:06.197
|
D 2020-07-23T00:45:06.021
|
||||||
F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
|
F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
|
||||||
F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
|
F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
|
||||||
F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
|
F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
|
||||||
@ -17,7 +17,7 @@ F ext/misc/ieee754.c 5c7ca326361c7368f95f5743972eade3b8b24f60359ed7cba4706668a56
|
|||||||
F main.mk b1cd0bc6aedad7ebb667b7f74f835f932f60ee33be2a5c3051fd93eb465f5c75
|
F main.mk b1cd0bc6aedad7ebb667b7f74f835f932f60ee33be2a5c3051fd93eb465f5c75
|
||||||
F src/alter.c 4bc16666a0df99d49658ec66f00ca36e541ec6cb39673ccc51be6a981fb9b2ce
|
F src/alter.c 4bc16666a0df99d49658ec66f00ca36e541ec6cb39673ccc51be6a981fb9b2ce
|
||||||
F src/attach.c 0b11e00c166b622c84ec176773b1d691c61ad07d247809e3e1635d4e99e71d30
|
F src/attach.c 0b11e00c166b622c84ec176773b1d691c61ad07d247809e3e1635d4e99e71d30
|
||||||
F src/btree.c b8b0e80c8bbe4e1fb35ae559e9e9aa009799c20cf12f159ebb503b05be1fab9b
|
F src/btree.c 4bb684b2aa11ff252d7f75e019a0fb2eae462c14c818b415dff8e912632bfd54
|
||||||
F src/btreeInt.h 19267385aa3bc00067d48e0e4ba83ae82dc08b0c15a3b3df20ea653cb462b5bf
|
F src/btreeInt.h 19267385aa3bc00067d48e0e4ba83ae82dc08b0c15a3b3df20ea653cb462b5bf
|
||||||
F src/build.c 45d912640987426442eb9eeec695c4dd45dd440b4cd27e8c13a42eed2fa87dcd
|
F src/build.c 45d912640987426442eb9eeec695c4dd45dd440b4cd27e8c13a42eed2fa87dcd
|
||||||
F src/date.c dace306a10d9b02ee553d454c8e1cf8d3c9b932e137738a6b15b90253a9bfc10
|
F src/date.c dace306a10d9b02ee553d454c8e1cf8d3c9b932e137738a6b15b90253a9bfc10
|
||||||
@ -26,7 +26,7 @@ F src/expr.c 90039a043658ce78c3237ba5064c0934b7294120f6adc387f8d0fba306028154
|
|||||||
F src/malloc.c 22d5bdd9fe88ae4fad1b91a1b9735104b82853ffef868f1f05517d60dc1875f5
|
F src/malloc.c 22d5bdd9fe88ae4fad1b91a1b9735104b82853ffef868f1f05517d60dc1875f5
|
||||||
F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb
|
F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb
|
||||||
F src/parse.y 5bdb760a29c0b25caf7e80e82210b81cd2ea3066d5199ca29e6eac40b34bc184
|
F src/parse.y 5bdb760a29c0b25caf7e80e82210b81cd2ea3066d5199ca29e6eac40b34bc184
|
||||||
F src/pragma.c ae499b5ab8f4e833f67e28bf2322500e9aa612aadf12581d1324333f848d8b51
|
F src/pragma.c d96ce48697d6a1d9b4fe9b1d624a62745488ecceaab702941d1c7b9f85ced8d5
|
||||||
F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf
|
F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf
|
||||||
F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e
|
F src/resolve.c 2dd6821aac2cd27de9fcf6aa6d1f8c41b4b5841c9bc58bf1c9109008009a3a2e
|
||||||
F src/select.c 39c6b63d996f9a24b34d2ccf38f67a7283355056011c2bb1b135daed7a715cf5
|
F src/select.c 39c6b63d996f9a24b34d2ccf38f67a7283355056011c2bb1b135daed7a715cf5
|
||||||
@ -55,6 +55,7 @@ F test/fuzzdata8.db 281cbc8166a8bc5843f4a913e803ba76e27905eb02fb9d5cfd581c2429f2
|
|||||||
F test/gencol1.test b05e6c5edb9b10d48efb634ed07342441bddc89d225043e17095c36e567521a0
|
F test/gencol1.test b05e6c5edb9b10d48efb634ed07342441bddc89d225043e17095c36e567521a0
|
||||||
F test/ieee754.test b0945d12be7d255f3dfa18e2511b17ca37e0edd2b803231c52d05b86c04ab26e
|
F test/ieee754.test b0945d12be7d255f3dfa18e2511b17ca37e0edd2b803231c52d05b86c04ab26e
|
||||||
F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f
|
F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f
|
||||||
|
F test/pragma.test 50b91bedea9324d3ab48e793f908ee7d2c7dcf84bfa2281e792838be59641ec8
|
||||||
F test/speedtest1.c a8b5afe72d78ff365012aba48d3f0c579e957facb7630f765f58a6ae4656d20d
|
F test/speedtest1.c a8b5afe72d78ff365012aba48d3f0c579e957facb7630f765f58a6ae4656d20d
|
||||||
F test/tester.tcl 174f668fcb4569a775bf24534ac8e59ce47d3a56d37c3465d1857f027e7ec136
|
F test/tester.tcl 174f668fcb4569a775bf24534ac8e59ce47d3a56d37c3465d1857f027e7ec136
|
||||||
F test/triggerupfrom.test d25961fa70a99b6736193da7b49a36d8c1d28d56188f0be6406d4366315cd6e4
|
F test/triggerupfrom.test d25961fa70a99b6736193da7b49a36d8c1d28d56188f0be6406d4366315cd6e4
|
||||||
@ -72,7 +73,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa
|
|||||||
F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
|
F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
|
||||||
F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564
|
F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564
|
||||||
F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58
|
F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58
|
||||||
P 14eed318aa9e6e16d1aa13a9f34e3822aa135c39ba06c77df7743509fed6c95e
|
P 9679c0c61131f0e986551701a64191da0ee0f50880eaa57fe4bf520e3fecf634
|
||||||
R 7d68dfef8f54ff612340b00b3b6644f1
|
R 1540b60a9ff01915fb590422e39c4150
|
||||||
U drh
|
U drh
|
||||||
Z a26de3a893be447e4c173c68496f3e02
|
Z 065b95df3af5715cbd2d0f08f8a7d1a3
|
||||||
|
@ -1 +1 @@
|
|||||||
9679c0c61131f0e986551701a64191da0ee0f50880eaa57fe4bf520e3fecf634
|
65dd321432e8f80bc1cb11be8ca06656b41ac997a74a5eb271c797cf0fbb764e
|
87
src/btree.c
87
src/btree.c
@ -10120,6 +10120,15 @@ end_of_check:
|
|||||||
** allocation errors, an error message held in memory obtained from
|
** allocation errors, an error message held in memory obtained from
|
||||||
** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is
|
** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is
|
||||||
** returned. If a memory allocation error occurs, NULL is returned.
|
** returned. If a memory allocation error occurs, NULL is returned.
|
||||||
|
**
|
||||||
|
** If the first entry in aRoot[] is 0, that indicates that the list of
|
||||||
|
** root pages is incomplete. This is a "partial integrity-check". This
|
||||||
|
** happens when performing an integrity check on a single table. The
|
||||||
|
** zero is skipped, of course. But in addition, the freelist checks
|
||||||
|
** and the checks to make sure every page is referenced are also skipped,
|
||||||
|
** since obviously it is not possible to know which pages are covered by
|
||||||
|
** the unverified btrees. Except, if aRoot[1] is 1, then the freelist
|
||||||
|
** checks are still performed.
|
||||||
*/
|
*/
|
||||||
char *sqlite3BtreeIntegrityCheck(
|
char *sqlite3BtreeIntegrityCheck(
|
||||||
sqlite3 *db, /* Database connection that is running the check */
|
sqlite3 *db, /* Database connection that is running the check */
|
||||||
@ -10135,6 +10144,16 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
u64 savedDbFlags = pBt->db->flags;
|
u64 savedDbFlags = pBt->db->flags;
|
||||||
char zErr[100];
|
char zErr[100];
|
||||||
VVA_ONLY( int nRef );
|
VVA_ONLY( int nRef );
|
||||||
|
int bPartial = 0; /* True if not checking all btrees */
|
||||||
|
int bCkFreelist = 1; /* True to scan the freelist */
|
||||||
|
assert( nRoot>0 );
|
||||||
|
|
||||||
|
/* aRoot[0]==0 means this is a partial check */
|
||||||
|
if( aRoot[0]==0 ){
|
||||||
|
assert( nRoot>1 );
|
||||||
|
bPartial = 1;
|
||||||
|
if( aRoot[1]!=1 ) bCkFreelist = 0;
|
||||||
|
}
|
||||||
|
|
||||||
sqlite3BtreeEnter(p);
|
sqlite3BtreeEnter(p);
|
||||||
assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
|
assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
|
||||||
@ -10174,29 +10193,33 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
|
|
||||||
/* Check the integrity of the freelist
|
/* Check the integrity of the freelist
|
||||||
*/
|
*/
|
||||||
sCheck.zPfx = "Main freelist: ";
|
if( bCkFreelist ){
|
||||||
checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]),
|
sCheck.zPfx = "Main freelist: ";
|
||||||
get4byte(&pBt->pPage1->aData[36]));
|
checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]),
|
||||||
sCheck.zPfx = 0;
|
get4byte(&pBt->pPage1->aData[36]));
|
||||||
|
sCheck.zPfx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check all the tables.
|
/* Check all the tables.
|
||||||
*/
|
*/
|
||||||
#ifndef SQLITE_OMIT_AUTOVACUUM
|
#ifndef SQLITE_OMIT_AUTOVACUUM
|
||||||
if( pBt->autoVacuum ){
|
if( !bPartial ){
|
||||||
int mx = 0;
|
if( pBt->autoVacuum ){
|
||||||
int mxInHdr;
|
int mx = 0;
|
||||||
for(i=0; (int)i<nRoot; i++) if( mx<aRoot[i] ) mx = aRoot[i];
|
int mxInHdr;
|
||||||
mxInHdr = get4byte(&pBt->pPage1->aData[52]);
|
for(i=0; (int)i<nRoot; i++) if( mx<aRoot[i] ) mx = aRoot[i];
|
||||||
if( mx!=mxInHdr ){
|
mxInHdr = get4byte(&pBt->pPage1->aData[52]);
|
||||||
|
if( mx!=mxInHdr ){
|
||||||
|
checkAppendMsg(&sCheck,
|
||||||
|
"max rootpage (%d) disagrees with header (%d)",
|
||||||
|
mx, mxInHdr
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}else if( get4byte(&pBt->pPage1->aData[64])!=0 ){
|
||||||
checkAppendMsg(&sCheck,
|
checkAppendMsg(&sCheck,
|
||||||
"max rootpage (%d) disagrees with header (%d)",
|
"incremental_vacuum enabled with a max rootpage of zero"
|
||||||
mx, mxInHdr
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}else if( get4byte(&pBt->pPage1->aData[64])!=0 ){
|
|
||||||
checkAppendMsg(&sCheck,
|
|
||||||
"incremental_vacuum enabled with a max rootpage of zero"
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
testcase( pBt->db->flags & SQLITE_CellSizeCk );
|
testcase( pBt->db->flags & SQLITE_CellSizeCk );
|
||||||
@ -10205,7 +10228,7 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
i64 notUsed;
|
i64 notUsed;
|
||||||
if( aRoot[i]==0 ) continue;
|
if( aRoot[i]==0 ) continue;
|
||||||
#ifndef SQLITE_OMIT_AUTOVACUUM
|
#ifndef SQLITE_OMIT_AUTOVACUUM
|
||||||
if( pBt->autoVacuum && aRoot[i]>1 ){
|
if( pBt->autoVacuum && aRoot[i]>1 && !bPartial ){
|
||||||
checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0);
|
checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -10215,22 +10238,24 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
|
|
||||||
/* Make sure every page in the file is referenced
|
/* Make sure every page in the file is referenced
|
||||||
*/
|
*/
|
||||||
for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
|
if( !bPartial ){
|
||||||
|
for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
|
||||||
#ifdef SQLITE_OMIT_AUTOVACUUM
|
#ifdef SQLITE_OMIT_AUTOVACUUM
|
||||||
if( getPageReferenced(&sCheck, i)==0 ){
|
if( getPageReferenced(&sCheck, i)==0 ){
|
||||||
checkAppendMsg(&sCheck, "Page %d is never used", i);
|
checkAppendMsg(&sCheck, "Page %d is never used", i);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* If the database supports auto-vacuum, make sure no tables contain
|
/* If the database supports auto-vacuum, make sure no tables contain
|
||||||
** references to pointer-map pages.
|
** references to pointer-map pages.
|
||||||
*/
|
*/
|
||||||
if( getPageReferenced(&sCheck, i)==0 &&
|
if( getPageReferenced(&sCheck, i)==0 &&
|
||||||
(PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){
|
(PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){
|
||||||
checkAppendMsg(&sCheck, "Page %d is never used", i);
|
checkAppendMsg(&sCheck, "Page %d is never used", i);
|
||||||
}
|
}
|
||||||
if( getPageReferenced(&sCheck, i)!=0 &&
|
if( getPageReferenced(&sCheck, i)!=0 &&
|
||||||
(PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){
|
(PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){
|
||||||
checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i);
|
checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
32
src/pragma.c
32
src/pragma.c
@ -1520,9 +1520,22 @@ void sqlite3Pragma(
|
|||||||
** integrity_check designed to detect most database corruption
|
** integrity_check designed to detect most database corruption
|
||||||
** without the overhead of cross-checking indexes. Quick_check
|
** without the overhead of cross-checking indexes. Quick_check
|
||||||
** is linear time wherease integrity_check is O(NlogN).
|
** is linear time wherease integrity_check is O(NlogN).
|
||||||
|
**
|
||||||
|
** The maximum nubmer of errors is 100 by default. A different default
|
||||||
|
** can be specified using a numeric parameter N.
|
||||||
|
**
|
||||||
|
** Or, the parameter N can be the name of a table. In that case, only
|
||||||
|
** the one table named is verified. The freelist is only verified if
|
||||||
|
** the named table is "sqlite_schema" (or one of its aliases).
|
||||||
|
**
|
||||||
|
** All schemas are checked by default. To check just a single
|
||||||
|
** schema, use the form:
|
||||||
|
**
|
||||||
|
** PRAGMA schema.integrity_check;
|
||||||
*/
|
*/
|
||||||
case PragTyp_INTEGRITY_CHECK: {
|
case PragTyp_INTEGRITY_CHECK: {
|
||||||
int i, j, addr, mxErr;
|
int i, j, addr, mxErr;
|
||||||
|
Table *pObjTab = 0; /* Check only this one table, if not NULL */
|
||||||
|
|
||||||
int isQuick = (sqlite3Tolower(zLeft[0])=='q');
|
int isQuick = (sqlite3Tolower(zLeft[0])=='q');
|
||||||
|
|
||||||
@ -1545,9 +1558,13 @@ void sqlite3Pragma(
|
|||||||
/* Set the maximum error count */
|
/* Set the maximum error count */
|
||||||
mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
|
mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
|
||||||
if( zRight ){
|
if( zRight ){
|
||||||
sqlite3GetInt32(zRight, &mxErr);
|
if( sqlite3GetInt32(zRight, &mxErr) ){
|
||||||
if( mxErr<=0 ){
|
if( mxErr<=0 ){
|
||||||
mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
|
mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
pObjTab = sqlite3LocateTable(pParse, 0, zRight,
|
||||||
|
iDb>=0 ? db->aDb[iDb].zDbSName : 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3VdbeAddOp2(v, OP_Integer, mxErr-1, 1); /* reg[1] holds errors left */
|
sqlite3VdbeAddOp2(v, OP_Integer, mxErr-1, 1); /* reg[1] holds errors left */
|
||||||
@ -1576,15 +1593,21 @@ void sqlite3Pragma(
|
|||||||
Table *pTab = sqliteHashData(x); /* Current table */
|
Table *pTab = sqliteHashData(x); /* Current table */
|
||||||
Index *pIdx; /* An index on pTab */
|
Index *pIdx; /* An index on pTab */
|
||||||
int nIdx; /* Number of indexes on pTab */
|
int nIdx; /* Number of indexes on pTab */
|
||||||
|
if( pObjTab && pObjTab!=pTab ) continue;
|
||||||
if( HasRowid(pTab) ) cnt++;
|
if( HasRowid(pTab) ) cnt++;
|
||||||
for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; }
|
for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; }
|
||||||
if( nIdx>mxIdx ) mxIdx = nIdx;
|
if( nIdx>mxIdx ) mxIdx = nIdx;
|
||||||
}
|
}
|
||||||
|
if( cnt==0 ) continue;
|
||||||
|
if( pObjTab ) cnt++;
|
||||||
aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1));
|
aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1));
|
||||||
if( aRoot==0 ) break;
|
if( aRoot==0 ) break;
|
||||||
for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){
|
cnt = 0;
|
||||||
|
if( pObjTab ) aRoot[++cnt] = 0;
|
||||||
|
for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){
|
||||||
Table *pTab = sqliteHashData(x);
|
Table *pTab = sqliteHashData(x);
|
||||||
Index *pIdx;
|
Index *pIdx;
|
||||||
|
if( pObjTab && pObjTab!=pTab ) continue;
|
||||||
if( HasRowid(pTab) ) aRoot[++cnt] = pTab->tnum;
|
if( HasRowid(pTab) ) aRoot[++cnt] = pTab->tnum;
|
||||||
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
|
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
|
||||||
aRoot[++cnt] = pIdx->tnum;
|
aRoot[++cnt] = pIdx->tnum;
|
||||||
@ -1618,6 +1641,7 @@ void sqlite3Pragma(
|
|||||||
int r1 = -1;
|
int r1 = -1;
|
||||||
|
|
||||||
if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */
|
if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */
|
||||||
|
if( pObjTab && pObjTab!=pTab ) continue;
|
||||||
pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
|
pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab);
|
||||||
sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0,
|
sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0,
|
||||||
1, 0, &iDataCur, &iIdxCur);
|
1, 0, &iDataCur, &iIdxCur);
|
||||||
|
@ -387,11 +387,15 @@ ifcapable attach {
|
|||||||
PRAGMA integrity_check=4
|
PRAGMA integrity_check=4
|
||||||
}
|
}
|
||||||
} {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2}}
|
} {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2}}
|
||||||
do_test pragma-3.6 {
|
do_catchsql_test pragma-3.6 {
|
||||||
execsql {
|
PRAGMA integrity_check=xyz
|
||||||
PRAGMA integrity_check=xyz
|
} {1 {no such table: xyz}}
|
||||||
}
|
do_catchsql_test pragma-3.6b {
|
||||||
} {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}}
|
PRAGMA integrity_check=t2
|
||||||
|
} {0 {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}}}
|
||||||
|
do_catchsql_test pragma-3.6c {
|
||||||
|
PRAGMA integrity_check=sqlite_schema
|
||||||
|
} {0 ok}
|
||||||
do_test pragma-3.7 {
|
do_test pragma-3.7 {
|
||||||
execsql {
|
execsql {
|
||||||
PRAGMA integrity_check=0
|
PRAGMA integrity_check=0
|
||||||
@ -423,7 +427,7 @@ ifcapable attach {
|
|||||||
do_test pragma-3.8.2 {
|
do_test pragma-3.8.2 {
|
||||||
execsql {PRAGMA QUICK_CHECK}
|
execsql {PRAGMA QUICK_CHECK}
|
||||||
} {ok}
|
} {ok}
|
||||||
do_test pragma-3.9 {
|
do_test pragma-3.9a {
|
||||||
execsql {
|
execsql {
|
||||||
ATTACH 'testerr.db' AS t2;
|
ATTACH 'testerr.db' AS t2;
|
||||||
PRAGMA integrity_check
|
PRAGMA integrity_check
|
||||||
@ -432,6 +436,12 @@ ifcapable attach {
|
|||||||
Page 4 is never used
|
Page 4 is never used
|
||||||
Page 5 is never used
|
Page 5 is never used
|
||||||
Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}}
|
Page 6 is never used} {row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}}
|
||||||
|
do_execsql_test pragma-3.9b {
|
||||||
|
PRAGMA t2.integrity_check=t2;
|
||||||
|
} {{row 1 missing from index i2} {row 2 missing from index i2} {wrong # of entries in index i2}}
|
||||||
|
do_execsql_test pragma-3.9c {
|
||||||
|
PRAGMA t2.integrity_check=sqlite_schema;
|
||||||
|
} {ok}
|
||||||
do_test pragma-3.10 {
|
do_test pragma-3.10 {
|
||||||
execsql {
|
execsql {
|
||||||
PRAGMA integrity_check=1
|
PRAGMA integrity_check=1
|
||||||
|
Reference in New Issue
Block a user