From: drh Date: Thu, 2 Jan 2020 17:46:02 +0000 (+0000) Subject: Have the OP_ReleaseReg opcode also invalidate the registers if P5 is non-zero. X-Git-Tag: version-3.31.0~91 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3aef2fb1b43eb391472b74174cdbae69241ecf8d;p=thirdparty%2Fsqlite.git Have the OP_ReleaseReg opcode also invalidate the registers if P5 is non-zero. FossilOrigin-Name: 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e --- diff --git a/manifest b/manifest index 6cfd7bc1a8..cf25a77c8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\sblobs\sthat\sare\sthe\sreturn\svalues\sof\sfunctions\sbeing\scast\sto\stext\sin\sutf16\sdatabases\sin\sthe\ssame\sway\sas\sblobs\sread\sdirectly\sfrom\sthe\sdatabase.\sFix\sfor\s[771fe617]. -D 2020-01-02T16:24:22.013 +C Have\sthe\sOP_ReleaseReg\sopcode\salso\sinvalidate\sthe\sregisters\sif\sP5\sis\snon-zero. +D 2020-01-02T17:46:02.719 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 75985a13af1b1d629f5f3c206a2af6250a971dd058d30fce0c0e0ba8d7c899a6 +F src/expr.c d74209d6abec71609a64329726df5d003b6fb2897f5bbde77c35882e5d482e7c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 +F src/insert.c 7bbb7dec1d69f961f21d75bd83ed00ceee48d5aa71c794b1cce3205470c8a48f F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 7b06af0c38abf9720d9a5c49660bff8b7137427bbd513fa069baf8afa15da4d7 @@ -600,11 +600,11 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c af35d7adef9dcb23fb7b379453eadcf5c5840037a540924c3cac9b4328e09c9a -F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 +F src/vdbe.c a8c88ee06d3510d8dc9a5cee594ec46f2ef476bd0c9be834e7e664b76ca2c179 +F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 +F src/vdbeaux.c 3b2076c59217f964ff5fca348fa3f69c3157cbd5cafc549e9ea3252d8613c6a9 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 -R 240c23e2f5654f0233016450faf6070c -U dan -Z 4d0f2df52a6bba7041a9460fa8e92429 +P e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a +R 03e3fe8bf73f136f9929ea1e989495c3 +U drh +Z a92746a6d0d3821fb326cef80fc59b0c diff --git a/manifest.uuid b/manifest.uuid index e4fe5ccca1..cf9c08cbe6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a \ No newline at end of file +937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 298843a8ab..88500b066b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4140,7 +4140,7 @@ expr_code_doover: if( constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); }else{ - sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask); + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); } } return target; @@ -5799,7 +5799,7 @@ int sqlite3GetTempReg(Parse *pParse){ */ void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ if( iReg ){ - sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0); + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); if( pParse->nTempRegaTempReg) ){ pParse->aTempReg[pParse->nTempReg++] = iReg; } @@ -5828,7 +5828,7 @@ void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ sqlite3ReleaseTempReg(pParse, iReg); return; } - sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0); + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0, 0); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; diff --git a/src/insert.c b/src/insert.c index 3b4ad56403..87e9c7ead3 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1020,7 +1020,7 @@ void sqlite3Insert( ** goto C ** D: ... */ - sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0); + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); if( ipkColumn>=0 ){ @@ -1976,7 +1976,7 @@ void sqlite3GenerateConstraintChecks( sqlite3SetMakeRecordP5(v, pIdx->pTable); } #endif - sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0); + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0, 0); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the diff --git a/src/vdbe.c b/src/vdbe.c index e11564b17c..971b37d5d0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7811,7 +7811,7 @@ case OP_Abortable: { #endif #ifdef SQLITE_DEBUG -/* Opcode: ReleaseReg P1 P2 P3 * * +/* Opcode: ReleaseReg P1 P2 P3 * P5 ** Synopsis: release r[P1@P2] mask P3 ** ** Release registers from service. Any content that was in the @@ -7826,10 +7826,12 @@ case OP_Abortable: { ** a change to the value of the source register for the OP_SCopy will no longer ** generate an assertion fault in sqlite3VdbeMemAboutToChange(). ** -** TODO: Released registers ought to also have their datatype set to -** MEM_Undefined so that any subsequent attempt to read the released +** If P5 is set, then all released registers have their type set +** to MEM_Undefined so that any subsequent attempt to read the released ** register (before it is reinitialized) will generate an assertion fault. -** However, there are places in the code generator which release registers +** +** P5 ought to be set on every call to this opcode. +** However, there are places in the code generator will release registers ** before their are used, under the (valid) assumption that the registers ** will not be reallocated for some other purpose before they are used and ** hence are safe to release. @@ -7850,7 +7852,7 @@ case OP_ReleaseReg: { for(i=0; ip2; i++, pMem++){ if( i>=32 || (constMask & MASKBIT32(i))==0 ){ pMem->pScopyFrom = 0; - /* MemSetTypeFlag(pMem, MEM_Undefined); // See the TODO */ + if( i<32 && pOp->p5 ) MemSetTypeFlag(pMem, MEM_Undefined); } } break; diff --git a/src/vdbe.h b/src/vdbe.h index 9b25452e2f..bfde25873f 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -233,9 +233,9 @@ void sqlite3VdbeJumpHere(Vdbe*, int addr); int sqlite3VdbeChangeToNoop(Vdbe*, int addr); int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); #ifdef SQLITE_DEBUG - void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask); + void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); #else -# define sqlite3VdbeReleaseRegisters(P,A,N,M) +# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) #endif void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ced3ec24c4..8b01fdec60 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1198,8 +1198,17 @@ int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ ** Generate an OP_ReleaseReg opcode to indicate that a range of ** registers, except any identified by mask, are no longer in use. */ -void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ +void sqlite3VdbeReleaseRegisters( + Parse *pParse, /* Parsing context */ + int iFirst, /* Index of first register to be released */ + int N, /* Number of registers to release */ + u32 mask, /* Mask of registers to NOT release */ + int bUndefine /* If true, mark registers as undefined */ +){ + if( N==0 ) return; assert( pParse->pVdbe ); + assert( iFirst>=1 ); + assert( iFirst+N-1<=pParse->nMem ); while( N>0 && (mask&1)!=0 ){ mask >>= 1; iFirst++; @@ -1211,6 +1220,7 @@ void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ } if( N>0 ){ sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); } } #endif /* SQLITE_DEBUG */