From be0b237e6a547544d9bb34382b231b385278acfb Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Jul 2010 18:40:55 +0000 Subject: [PATCH] If a database becomes corrupted such that an index is out of sync with its table, make sure the corruption is detected and reported back. Do not assume that indices always contain rowids for valid table rows. FossilOrigin-Name: 83395a3d24f18170fc068d9e644291678694c3f0 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbeaux.c | 7 ++----- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index f4c1e82410..049f9f5b2a 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Fix\stypos\sin\scomments.\s\sNo\scode\sor\slogic\schanges. -D 2010-07-30T16:54:25 +C If\sa\sdatabase\sbecomes\scorrupted\ssuch\sthat\san\sindex\sis\sout\sof\ssync\swith\sits\ntable,\smake\ssure\sthe\scorruption\sis\sdetected\sand\sreported\sback.\s\sDo\snot\sassume\nthat\sindices\salways\scontain\srowids\sfor\svalid\stable\srows. +D 2010-07-30T18:40:55 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in ec08dc838fd8110fe24c92e5130bcd91cbb1ff2e F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -225,7 +225,7 @@ F src/vdbe.c cefff41564b68a412e65e6a1013ec1b1c1ece6c4 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbeInt.h ffd68c4d4229227a5089bec53a1c635146177abc F src/vdbeapi.c d0f4407e465f261780ad725c1caece7d66a6aa35 -F src/vdbeaux.c 8a443e73760ca65ffdfda3e26df4c8c90eeefa11 +F src/vdbeaux.c e18a42d0bdac405565f2d258a82457fd10db133d F src/vdbeblob.c 258a6010ba7a82b72b327fb24c55790655689256 F src/vdbemem.c e5673f81a2381b35c60e73ef0a8502be2ab1041e F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2 @@ -843,14 +843,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 6758f6a8ec97941e09847b309812b3194eb57f19 -R ac740eb62d9494600aa4fed42f2a1b74 +P 15c294ca051ed8b5078e7ac9a969b0f9358d9184 +R da192c1b3eb6d24627da3d8e846fd5c4 U drh -Z 84adaeb91a66675447d0e577f5b22205 +Z 0f8b248fb2e8c5c8333c7907bb68e233 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFMUwPEoxKgR168RlERApBcAJ0QiVUigby9jkqMoirXpeoWGfBM9gCbBiAk -y6uzCEydAktZnuJxiYQi1OU= -=wXzG +iD8DBQFMUxy6oxKgR168RlERAmAgAJ9doS44VIifgo0Uhs0eLiDf12dnMgCeOBB1 +2ly4IN6mhS73wXbwSCh2iW0= +=HByC -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index a80f1251bc..cfecd4a143 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -15c294ca051ed8b5078e7ac9a969b0f9358d9184 \ No newline at end of file +83395a3d24f18170fc068d9e644291678694c3f0 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 295a8c3a8d..7729a85d45 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2400,11 +2400,8 @@ int sqlite3VdbeCursorMoveto(VdbeCursor *p){ rc = sqlite3BtreeMovetoUnpacked(p->pCursor, 0, p->movetoTarget, 0, &res); if( rc ) return rc; p->lastRowid = p->movetoTarget; - p->rowidIsValid = ALWAYS(res==0) ?1:0; - if( NEVER(res<0) ){ - rc = sqlite3BtreeNext(p->pCursor, &res); - if( rc ) return rc; - } + if( res!=0 ) return SQLITE_CORRUPT_BKPT; + p->rowidIsValid = 1; #ifdef SQLITE_TEST sqlite3_search_count++; #endif