From 3278315768197ab40a94fc56ddc1d21942ef3d63 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Nov 2009 15:02:34 +0000 Subject: [PATCH 1/2] If the root pages numbers of the internal schema are adjusted due to autovacuum on a DROP TABLE statement and that statement later aborts (for example, due to an OOM error) then reset the internal schema at the conclusion of the statement. Partial fix for ticket [564d412f15a]. FossilOrigin-Name: e493b093f8ca722c3160b32a16fb615023978dc9 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbe.c | 3 +++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2b90089a2e..dd42d07acf 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C Avoid\sunnecessary\spage\scache\sallocations\swhen\smove\sa\spage\swhile\sautovacuuming\s\nan\sin-memory\sdatabase,\ssince\sthe\sallocation\smight\sfail\smaking\sit\simpossible\sto\nrollback\sthe\stransaction. -D 2009-11-20T13:18:14 +C If\sthe\sroot\spages\snumbers\sof\sthe\sinternal\sschema\sare\sadjusted\sdue\sto\s\nautovacuum\son\sa\sDROP\sTABLE\sstatement\sand\sthat\sstatement\slater\saborts\s(for\nexample,\sdue\sto\san\sOOM\serror)\sthen\sreset\sthe\sinternal\sschema\sat\sthe\nconclusion\sof\sthe\sstatement.\nPartial\sfix\sfor\sticket\s[564d412f15a]. +D 2009-11-20T15:02:34 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 7f6c6aa7feeeb5e26e01b344161d9aa1b5d64177 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -212,7 +212,7 @@ F src/update.c 8efeb09822886e33c265dd96d29a3d865ea6dcf2 F src/utf.c dad16adcc0c35ef2437dca125a4b07419d361052 F src/util.c ad4f03079ba0fe83590d1cc9197e8e4844e38592 F src/vacuum.c 03309a08d549f9389cc3a3589afd4fadbdaf0679 -F src/vdbe.c 95fa2b51a4e602f74594bd9a0f679b7eaf44f9c0 +F src/vdbe.c 89d618dd0b4544e319dfab84db7356e7ee5aa430 F src/vdbe.h 5f35750615163d1064052785b4a9f0eb004a720d F src/vdbeInt.h d7ea821ac7813c9bea0fe87558c35e07b2c7c44d F src/vdbeapi.c 17680ab7a75ec938c5ba039a6c87489d01faf2cb @@ -775,14 +775,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 1cf0e3cc14bad22867e740736c2886dc1c4a48dc -R 9f96df8d77aacbbe5a229c0e4825c7d0 +P 9a429349ccc2fa9acd28365a86578f602e87dafb +R 98fcdb3bebf5cd6b5539291ec5159fa2 U drh -Z a83b32939b8fe43907602c37e80ee0e1 +Z d921d0e136eadcd906a3ecc76e7083b9 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFLBpcaoxKgR168RlERAjs+AJ9hMDoeCFoEOCx4N9Df2gvUGnw6XgCffKZD -ZrQJ/Xtolyd5+f1xqb7zDs0= -=mb8x +iD8DBQFLBq+NoxKgR168RlERAuHoAJ4xcaWqbV9st4vnlQ8SbWQTMKFcKACgiAlE +s6FOzlbJpHpo7yi7MLuMesw= +=HELf -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index 5f8c380521..48d0393e3e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a429349ccc2fa9acd28365a86578f602e87dafb \ No newline at end of file +e493b093f8ca722c3160b32a16fb615023978dc9 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 90dd90e67b..17afa4e583 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -543,6 +543,7 @@ int sqlite3VdbeExec( Op *pOp; /* Current operation */ int rc = SQLITE_OK; /* Value to return */ sqlite3 *db = p->db; /* The database */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if true */ u8 encoding = ENC(db); /* The database encoding */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK u8 checkProgress; /* True if progress callbacks are enabled */ @@ -4430,6 +4431,7 @@ case OP_Destroy: { /* out2-prerelease */ #ifndef SQLITE_OMIT_AUTOVACUUM if( rc==SQLITE_OK && iMoved!=0 ){ sqlite3RootPageMoved(&db->aDb[iDb], iMoved, pOp->p1); + resetSchemaOnFault = 1; } #endif } @@ -5709,6 +5711,7 @@ vdbe_error_halt: sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; rc = SQLITE_ERROR; + if( resetSchemaOnFault ) sqlite3ResetInternalSchema(db, 0); /* This is the only way out of this procedure. We have to ** release the mutexes on btrees that were acquired at the From 456e4e4fba61b8bf520baa5b5f07c44da2747256 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Nov 2009 16:13:15 +0000 Subject: [PATCH 2/2] Fix a bug in LIMIT 0 for compound SELECT statement. The problem was introduced by recent enhancements and has not appeared in any release. FossilOrigin-Name: c6ed7e2a73a7a65cfa914ffcad4f603b6b7a22a8 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/select.c | 5 ++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index dd42d07acf..99158e45a6 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 -C If\sthe\sroot\spages\snumbers\sof\sthe\sinternal\sschema\sare\sadjusted\sdue\sto\s\nautovacuum\son\sa\sDROP\sTABLE\sstatement\sand\sthat\sstatement\slater\saborts\s(for\nexample,\sdue\sto\san\sOOM\serror)\sthen\sreset\sthe\sinternal\sschema\sat\sthe\nconclusion\sof\sthe\sstatement.\nPartial\sfix\sfor\sticket\s[564d412f15a]. -D 2009-11-20T15:02:34 +C Fix\sa\sbug\sin\sLIMIT\s0\sfor\scompound\sSELECT\sstatement.\nThe\sproblem\swas\sintroduced\sby\srecent\senhancements\sand\shas\snot\sappeared\nin\sany\srelease. +D 2009-11-20T16:13:15 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 7f6c6aa7feeeb5e26e01b344161d9aa1b5d64177 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -165,7 +165,7 @@ F src/printf.c 03fabdd6112a0e23f78f8ac9a1396947ade0273b F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c aa3cb21e1ecd905c071fce8fb64d1a166cefc239 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 -F src/select.c a727f61f3267bfa20ce1c3e85d38dc2132db1060 +F src/select.c 2f9ed7482e7a25b0b127fc41693bbdbe1caf5647 F src/shell.c f4948cb6d30665d755a6b5e0ec313d1094aab828 F src/sqlite.h.in 4464e9772122f0447305d425e04d122b6f1bffec F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89 @@ -775,14 +775,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 9a429349ccc2fa9acd28365a86578f602e87dafb -R 98fcdb3bebf5cd6b5539291ec5159fa2 +P e493b093f8ca722c3160b32a16fb615023978dc9 +R 5ec1b2582562a57f9f564d3489d61dc3 U drh -Z d921d0e136eadcd906a3ecc76e7083b9 +Z 1a324a1c90a5bbddcb009087c1541226 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) -iD8DBQFLBq+NoxKgR168RlERAuHoAJ4xcaWqbV9st4vnlQ8SbWQTMKFcKACgiAlE -s6FOzlbJpHpo7yi7MLuMesw= -=HELf +iD8DBQFLBsAeoxKgR168RlERAjHuAJ9QJtWD6T56mccvLQ1ITcoNvvNpMwCfZr52 +Jqb5eUds3ueWwA0ZJsx59YQ= +=bz6Y -----END PGP SIGNATURE----- diff --git a/manifest.uuid b/manifest.uuid index 48d0393e3e..85c9ff8d57 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e493b093f8ca722c3160b32a16fb615023978dc9 \ No newline at end of file +c6ed7e2a73a7a65cfa914ffcad4f603b6b7a22a8 \ No newline at end of file diff --git a/src/select.c b/src/select.c index d6b7c0bdb9..7555a391c2 100644 --- a/src/select.c +++ b/src/select.c @@ -1323,11 +1323,10 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ v = sqlite3GetVdbe(pParse); if( NEVER(v==0) ) return; /* VDBE should have already been allocated */ if( sqlite3ExprIsInteger(p->pLimit, &n) ){ + sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); + VdbeComment((v, "LIMIT counter")); if( n==0 ){ sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak); - }else{ - sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); - VdbeComment((v, "LIMIT counter")); } }else{ sqlite3ExprCode(pParse, p->pLimit, iLimit);