Fix a register allocation bug in the VDBE code generator for

PRAGMA integrity_check;

FossilOrigin-Name: 88439a866b3b16ad7c308ebe59198662a05e7eeb
This commit is contained in:
drh 2016-03-19 00:35:02 +00:00
parent 860443da10
commit bb9b5f2608
5 changed files with 42 additions and 12 deletions

View File

@ -1,5 +1,5 @@
C Fix\sFTS5\sso\sthat\sit\sworks\swith\sSQLITE_OMIT_AUTORESET. C Fix\sa\sregister\sallocation\sbug\sin\sthe\sVDBE\scode\sgenerator\sfor\nPRAGMA\sintegrity_check;
D 2016-03-18T00:39:40.456 D 2016-03-19T00:35:02.035
F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66
@ -304,7 +304,7 @@ F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198
F src/date.c 0b73e681c11fca867fec554750c07fe0d4e417c1 F src/date.c 0b73e681c11fca867fec554750c07fe0d4e417c1
F src/dbstat.c c845548d4346e606e2f2b7d2e714ace2b8a7dd1b F src/dbstat.c c845548d4346e606e2f2b7d2e714ace2b8a7dd1b
F src/delete.c 48802aa3ee6339f576d074336d3ae1b5f40e240f F src/delete.c 48802aa3ee6339f576d074336d3ae1b5f40e240f
F src/expr.c f8137b7d3d3f2a991f9622e41d170e0adf0abc71 F src/expr.c 289ffac5240b60fee0a824d3d5ab2d7bd2630c94
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c 5cb42d9a59e2a590776fd3fc8ff6f61d40df3c6e F src/fkey.c 5cb42d9a59e2a590776fd3fc8ff6f61d40df3c6e
F src/func.c 552d300265aed09eea21f68ac742a440550c0062 F src/func.c 552d300265aed09eea21f68ac742a440550c0062
@ -343,7 +343,7 @@ F src/parse.y 5ea8c81c5c41b27887f41b4a7e1c58470d7d3821
F src/pcache.c 647bb53a86b7bbcf55ad88089b3ea5a9170b90df F src/pcache.c 647bb53a86b7bbcf55ad88089b3ea5a9170b90df
F src/pcache.h 4d0ccaad264d360981ec5e6a2b596d6e85242545 F src/pcache.h 4d0ccaad264d360981ec5e6a2b596d6e85242545
F src/pcache1.c c40cdb93586e21b5dd826b5e671240bd91c26b05 F src/pcache1.c c40cdb93586e21b5dd826b5e671240bd91c26b05
F src/pragma.c f0670909e915179fec47e17f72f14660995b8022 F src/pragma.c e7e8f380efec6075a722822306435afc1eeca88a
F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c
F src/prepare.c 22df6171aec1d86904ed2ad30c2348a5748aa04e F src/prepare.c 22df6171aec1d86904ed2ad30c2348a5748aa04e
F src/printf.c 63e6fb12bbe702dd664dc3703776c090383a5a26 F src/printf.c 63e6fb12bbe702dd664dc3703776c090383a5a26
@ -355,7 +355,7 @@ F src/shell.c 5e0ab1e708dc294330ccd8230536e1801f60822e
F src/sqlite.h.in 0235586b3fb639e85998d495c90f007657fd82af F src/sqlite.h.in 0235586b3fb639e85998d495c90f007657fd82af
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h dfbe62ffd95b99afe2140d8c35b180d11924072d F src/sqlite3ext.h dfbe62ffd95b99afe2140d8c35b180d11924072d
F src/sqliteInt.h 84c673f27b77dfbd367cb3ed1de8b6f3b73102dc F src/sqliteInt.h 751ced73be8c449a75e075e0545cdd832ed3591e
F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24 F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24
F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba
F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9
@ -1456,7 +1456,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 6631e1e655604a7d1fb45b4d151938d4a13b47f3 P b199637d81d7e2a767131ac03c7679b101fd459c
R 472ca36ca6048890d22e3e80bb68c577 R aa6d8166f4985600b2fe26e199ff3347
U drh U drh
Z 94c5a688910df424330581238168e35b Z 34d82988bd3c2eee6ead07b5f4503f1c

View File

@ -1 +1 @@
b199637d81d7e2a767131ac03c7679b101fd459c 88439a866b3b16ad7c308ebe59198662a05e7eeb

View File

@ -4251,3 +4251,26 @@ void sqlite3ClearTempRegCache(Parse *pParse){
pParse->nTempReg = 0; pParse->nTempReg = 0;
pParse->nRangeReg = 0; pParse->nRangeReg = 0;
} }
/*
** Validate that no temporary register falls within the range of
** iFirst..iLast, inclusive. This routine is only call from within assert()
** statements.
*/
#ifdef SQLITE_DEBUG
int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){
int i;
if( pParse->nRangeReg>0
&& pParse->iRangeReg+pParse->nRangeReg<iLast
&& pParse->iRangeReg>=iFirst
){
return 0;
}
for(i=0; i<pParse->nTempReg; i++){
if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){
return 0;
}
}
return 1;
}
#endif /* SQLITE_DEBUG */

View File

@ -1441,6 +1441,8 @@ void sqlite3Pragma(
Hash *pTbls; Hash *pTbls;
int *aRoot; int *aRoot;
int cnt = 0; int cnt = 0;
int mxIdx = 0;
int nIdx;
if( OMIT_TEMPDB && i==1 ) continue; if( OMIT_TEMPDB && i==1 ) continue;
if( iDb>=0 && i!=iDb ) continue; if( iDb>=0 && i!=iDb ) continue;
@ -1462,7 +1464,8 @@ void sqlite3Pragma(
Table *pTab = sqliteHashData(x); Table *pTab = sqliteHashData(x);
Index *pIdx; Index *pIdx;
if( HasRowid(pTab) ) cnt++; if( HasRowid(pTab) ) cnt++;
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ cnt++; } for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; }
if( nIdx>mxIdx ) mxIdx = nIdx;
} }
aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1));
if( aRoot==0 ) break; if( aRoot==0 ) break;
@ -1477,7 +1480,7 @@ void sqlite3Pragma(
aRoot[cnt] = 0; aRoot[cnt] = 0;
/* Make sure sufficient number of registers have been allocated */ /* Make sure sufficient number of registers have been allocated */
pParse->nMem = MAX( pParse->nMem, 14 ); pParse->nMem = MAX( pParse->nMem, 8+mxIdx );
/* Do the b-tree integrity checks */ /* Do the b-tree integrity checks */
sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY);
@ -1514,7 +1517,8 @@ void sqlite3Pragma(
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */
} }
pParse->nMem = MAX(pParse->nMem, 8+j); assert( pParse->nMem>=8+j );
assert( sqlite3NoTempsInRange(pParse,1,7+j) );
sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v);
loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1);
/* Verify that all NOT NULL columns really are NOT NULL */ /* Verify that all NOT NULL columns really are NOT NULL */

View File

@ -3419,6 +3419,9 @@ void sqlite3ReleaseTempReg(Parse*,int);
int sqlite3GetTempRange(Parse*,int); int sqlite3GetTempRange(Parse*,int);
void sqlite3ReleaseTempRange(Parse*,int,int); void sqlite3ReleaseTempRange(Parse*,int,int);
void sqlite3ClearTempRegCache(Parse*); void sqlite3ClearTempRegCache(Parse*);
#ifdef SQLITE_DEBUG
int sqlite3NoTempsInRange(Parse*,int,int);
#endif
Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int);
Expr *sqlite3Expr(sqlite3*,int,const char*); Expr *sqlite3Expr(sqlite3*,int,const char*);
void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*);