Have the OP_ReleaseReg opcode also invalidate the registers if P5 is non-zero.
FossilOrigin-Name: 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e
This commit is contained in:
parent
9f3e6fadde
commit
3aef2fb1b4
22
manifest
22
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
|
||||
|
@ -1 +1 @@
|
||||
e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a
|
||||
937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e
|
@ -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->nTempReg<ArraySize(pParse->aTempReg) ){
|
||||
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;
|
||||
|
@ -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
|
||||
|
12
src/vdbe.c
12
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; i<pOp->p2; 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;
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user