Fossil SCM
Update the built-in SQLite to include the "PRAGMA integrity_check" fix.
Commit
567ab1937e1a15bee3ee566f78ee2678666982d1
Parent
da4a3b4ffb6447e…
2 files changed
+34
-4
+1
-1
+34
-4
| --- src/sqlite3.c | ||
| +++ src/sqlite3.c | ||
| @@ -336,11 +336,11 @@ | ||
| 336 | 336 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 337 | 337 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 338 | 338 | */ |
| 339 | 339 | #define SQLITE_VERSION "3.12.0" |
| 340 | 340 | #define SQLITE_VERSION_NUMBER 3012000 |
| 341 | -#define SQLITE_SOURCE_ID "2016-03-18 00:39:40 b199637d81d7e2a767131ac03c7679b101fd459c" | |
| 341 | +#define SQLITE_SOURCE_ID "2016-03-19 00:35:02 88439a866b3b16ad7c308ebe59198662a05e7eeb" | |
| 342 | 342 | |
| 343 | 343 | /* |
| 344 | 344 | ** CAPI3REF: Run-Time Library Version Numbers |
| 345 | 345 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 346 | 346 | ** |
| @@ -14340,10 +14340,13 @@ | ||
| 14340 | 14340 | SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); |
| 14341 | 14341 | SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); |
| 14342 | 14342 | SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); |
| 14343 | 14343 | SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); |
| 14344 | 14344 | SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); |
| 14345 | +#ifdef SQLITE_DEBUG | |
| 14346 | +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); | |
| 14347 | +#endif | |
| 14345 | 14348 | SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); |
| 14346 | 14349 | SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); |
| 14347 | 14350 | SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); |
| 14348 | 14351 | SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); |
| 14349 | 14352 | SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); |
| @@ -90826,10 +90829,33 @@ | ||
| 90826 | 90829 | SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ |
| 90827 | 90830 | pParse->nTempReg = 0; |
| 90828 | 90831 | pParse->nRangeReg = 0; |
| 90829 | 90832 | } |
| 90830 | 90833 | |
| 90834 | +/* | |
| 90835 | +** Validate that no temporary register falls within the range of | |
| 90836 | +** iFirst..iLast, inclusive. This routine is only call from within assert() | |
| 90837 | +** statements. | |
| 90838 | +*/ | |
| 90839 | +#ifdef SQLITE_DEBUG | |
| 90840 | +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ | |
| 90841 | + int i; | |
| 90842 | + if( pParse->nRangeReg>0 | |
| 90843 | + && pParse->iRangeReg+pParse->nRangeReg<iLast | |
| 90844 | + && pParse->iRangeReg>=iFirst | |
| 90845 | + ){ | |
| 90846 | + return 0; | |
| 90847 | + } | |
| 90848 | + for(i=0; i<pParse->nTempReg; i++){ | |
| 90849 | + if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){ | |
| 90850 | + return 0; | |
| 90851 | + } | |
| 90852 | + } | |
| 90853 | + return 1; | |
| 90854 | +} | |
| 90855 | +#endif /* SQLITE_DEBUG */ | |
| 90856 | + | |
| 90831 | 90857 | /************** End of expr.c ************************************************/ |
| 90832 | 90858 | /************** Begin file alter.c *******************************************/ |
| 90833 | 90859 | /* |
| 90834 | 90860 | ** 2005 February 15 |
| 90835 | 90861 | ** |
| @@ -108967,10 +108993,12 @@ | ||
| 108967 | 108993 | for(i=0; i<db->nDb; i++){ |
| 108968 | 108994 | HashElem *x; |
| 108969 | 108995 | Hash *pTbls; |
| 108970 | 108996 | int *aRoot; |
| 108971 | 108997 | int cnt = 0; |
| 108998 | + int mxIdx = 0; | |
| 108999 | + int nIdx; | |
| 108972 | 109000 | |
| 108973 | 109001 | if( OMIT_TEMPDB && i==1 ) continue; |
| 108974 | 109002 | if( iDb>=0 && i!=iDb ) continue; |
| 108975 | 109003 | |
| 108976 | 109004 | sqlite3CodeVerifySchema(pParse, i); |
| @@ -108988,11 +109016,12 @@ | ||
| 108988 | 109016 | pTbls = &db->aDb[i].pSchema->tblHash; |
| 108989 | 109017 | for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 108990 | 109018 | Table *pTab = sqliteHashData(x); |
| 108991 | 109019 | Index *pIdx; |
| 108992 | 109020 | if( HasRowid(pTab) ) cnt++; |
| 108993 | - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ cnt++; } | |
| 109021 | + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } | |
| 109022 | + if( nIdx>mxIdx ) mxIdx = nIdx; | |
| 108994 | 109023 | } |
| 108995 | 109024 | aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); |
| 108996 | 109025 | if( aRoot==0 ) break; |
| 108997 | 109026 | for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 108998 | 109027 | Table *pTab = sqliteHashData(x); |
| @@ -109003,11 +109032,11 @@ | ||
| 109003 | 109032 | } |
| 109004 | 109033 | } |
| 109005 | 109034 | aRoot[cnt] = 0; |
| 109006 | 109035 | |
| 109007 | 109036 | /* Make sure sufficient number of registers have been allocated */ |
| 109008 | - pParse->nMem = MAX( pParse->nMem, 14 ); | |
| 109037 | + pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); | |
| 109009 | 109038 | |
| 109010 | 109039 | /* Do the b-tree integrity checks */ |
| 109011 | 109040 | sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); |
| 109012 | 109041 | sqlite3VdbeChangeP5(v, (u8)i); |
| 109013 | 109042 | addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); |
| @@ -109040,11 +109069,12 @@ | ||
| 109040 | 109069 | 1, 0, &iDataCur, &iIdxCur); |
| 109041 | 109070 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); |
| 109042 | 109071 | for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 109043 | 109072 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ |
| 109044 | 109073 | } |
| 109045 | - pParse->nMem = MAX(pParse->nMem, 8+j); | |
| 109074 | + assert( pParse->nMem>=8+j ); | |
| 109075 | + assert( sqlite3NoTempsInRange(pParse,1,7+j) ); | |
| 109046 | 109076 | sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); |
| 109047 | 109077 | loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); |
| 109048 | 109078 | /* Verify that all NOT NULL columns really are NOT NULL */ |
| 109049 | 109079 | for(j=0; j<pTab->nCol; j++){ |
| 109050 | 109080 | char *zErr; |
| 109051 | 109081 |
| --- src/sqlite3.c | |
| +++ src/sqlite3.c | |
| @@ -336,11 +336,11 @@ | |
| 336 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 337 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 338 | */ |
| 339 | #define SQLITE_VERSION "3.12.0" |
| 340 | #define SQLITE_VERSION_NUMBER 3012000 |
| 341 | #define SQLITE_SOURCE_ID "2016-03-18 00:39:40 b199637d81d7e2a767131ac03c7679b101fd459c" |
| 342 | |
| 343 | /* |
| 344 | ** CAPI3REF: Run-Time Library Version Numbers |
| 345 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 346 | ** |
| @@ -14340,10 +14340,13 @@ | |
| 14340 | SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); |
| 14341 | SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); |
| 14342 | SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); |
| 14343 | SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); |
| 14344 | SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); |
| 14345 | SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); |
| 14346 | SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); |
| 14347 | SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); |
| 14348 | SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); |
| 14349 | SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); |
| @@ -90826,10 +90829,33 @@ | |
| 90826 | SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ |
| 90827 | pParse->nTempReg = 0; |
| 90828 | pParse->nRangeReg = 0; |
| 90829 | } |
| 90830 | |
| 90831 | /************** End of expr.c ************************************************/ |
| 90832 | /************** Begin file alter.c *******************************************/ |
| 90833 | /* |
| 90834 | ** 2005 February 15 |
| 90835 | ** |
| @@ -108967,10 +108993,12 @@ | |
| 108967 | for(i=0; i<db->nDb; i++){ |
| 108968 | HashElem *x; |
| 108969 | Hash *pTbls; |
| 108970 | int *aRoot; |
| 108971 | int cnt = 0; |
| 108972 | |
| 108973 | if( OMIT_TEMPDB && i==1 ) continue; |
| 108974 | if( iDb>=0 && i!=iDb ) continue; |
| 108975 | |
| 108976 | sqlite3CodeVerifySchema(pParse, i); |
| @@ -108988,11 +109016,12 @@ | |
| 108988 | pTbls = &db->aDb[i].pSchema->tblHash; |
| 108989 | for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 108990 | Table *pTab = sqliteHashData(x); |
| 108991 | Index *pIdx; |
| 108992 | if( HasRowid(pTab) ) cnt++; |
| 108993 | for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ cnt++; } |
| 108994 | } |
| 108995 | aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); |
| 108996 | if( aRoot==0 ) break; |
| 108997 | for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 108998 | Table *pTab = sqliteHashData(x); |
| @@ -109003,11 +109032,11 @@ | |
| 109003 | } |
| 109004 | } |
| 109005 | aRoot[cnt] = 0; |
| 109006 | |
| 109007 | /* Make sure sufficient number of registers have been allocated */ |
| 109008 | pParse->nMem = MAX( pParse->nMem, 14 ); |
| 109009 | |
| 109010 | /* Do the b-tree integrity checks */ |
| 109011 | sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); |
| 109012 | sqlite3VdbeChangeP5(v, (u8)i); |
| 109013 | addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); |
| @@ -109040,11 +109069,12 @@ | |
| 109040 | 1, 0, &iDataCur, &iIdxCur); |
| 109041 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); |
| 109042 | for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 109043 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ |
| 109044 | } |
| 109045 | pParse->nMem = MAX(pParse->nMem, 8+j); |
| 109046 | sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); |
| 109047 | loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); |
| 109048 | /* Verify that all NOT NULL columns really are NOT NULL */ |
| 109049 | for(j=0; j<pTab->nCol; j++){ |
| 109050 | char *zErr; |
| 109051 |
| --- src/sqlite3.c | |
| +++ src/sqlite3.c | |
| @@ -336,11 +336,11 @@ | |
| 336 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 337 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 338 | */ |
| 339 | #define SQLITE_VERSION "3.12.0" |
| 340 | #define SQLITE_VERSION_NUMBER 3012000 |
| 341 | #define SQLITE_SOURCE_ID "2016-03-19 00:35:02 88439a866b3b16ad7c308ebe59198662a05e7eeb" |
| 342 | |
| 343 | /* |
| 344 | ** CAPI3REF: Run-Time Library Version Numbers |
| 345 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 346 | ** |
| @@ -14340,10 +14340,13 @@ | |
| 14340 | SQLITE_PRIVATE int sqlite3GetTempReg(Parse*); |
| 14341 | SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); |
| 14342 | SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); |
| 14343 | SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); |
| 14344 | SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); |
| 14345 | #ifdef SQLITE_DEBUG |
| 14346 | SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); |
| 14347 | #endif |
| 14348 | SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); |
| 14349 | SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); |
| 14350 | SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); |
| 14351 | SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); |
| 14352 | SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); |
| @@ -90826,10 +90829,33 @@ | |
| 90829 | SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ |
| 90830 | pParse->nTempReg = 0; |
| 90831 | pParse->nRangeReg = 0; |
| 90832 | } |
| 90833 | |
| 90834 | /* |
| 90835 | ** Validate that no temporary register falls within the range of |
| 90836 | ** iFirst..iLast, inclusive. This routine is only call from within assert() |
| 90837 | ** statements. |
| 90838 | */ |
| 90839 | #ifdef SQLITE_DEBUG |
| 90840 | SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ |
| 90841 | int i; |
| 90842 | if( pParse->nRangeReg>0 |
| 90843 | && pParse->iRangeReg+pParse->nRangeReg<iLast |
| 90844 | && pParse->iRangeReg>=iFirst |
| 90845 | ){ |
| 90846 | return 0; |
| 90847 | } |
| 90848 | for(i=0; i<pParse->nTempReg; i++){ |
| 90849 | if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){ |
| 90850 | return 0; |
| 90851 | } |
| 90852 | } |
| 90853 | return 1; |
| 90854 | } |
| 90855 | #endif /* SQLITE_DEBUG */ |
| 90856 | |
| 90857 | /************** End of expr.c ************************************************/ |
| 90858 | /************** Begin file alter.c *******************************************/ |
| 90859 | /* |
| 90860 | ** 2005 February 15 |
| 90861 | ** |
| @@ -108967,10 +108993,12 @@ | |
| 108993 | for(i=0; i<db->nDb; i++){ |
| 108994 | HashElem *x; |
| 108995 | Hash *pTbls; |
| 108996 | int *aRoot; |
| 108997 | int cnt = 0; |
| 108998 | int mxIdx = 0; |
| 108999 | int nIdx; |
| 109000 | |
| 109001 | if( OMIT_TEMPDB && i==1 ) continue; |
| 109002 | if( iDb>=0 && i!=iDb ) continue; |
| 109003 | |
| 109004 | sqlite3CodeVerifySchema(pParse, i); |
| @@ -108988,11 +109016,12 @@ | |
| 109016 | pTbls = &db->aDb[i].pSchema->tblHash; |
| 109017 | for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 109018 | Table *pTab = sqliteHashData(x); |
| 109019 | Index *pIdx; |
| 109020 | if( HasRowid(pTab) ) cnt++; |
| 109021 | for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } |
| 109022 | if( nIdx>mxIdx ) mxIdx = nIdx; |
| 109023 | } |
| 109024 | aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); |
| 109025 | if( aRoot==0 ) break; |
| 109026 | for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ |
| 109027 | Table *pTab = sqliteHashData(x); |
| @@ -109003,11 +109032,11 @@ | |
| 109032 | } |
| 109033 | } |
| 109034 | aRoot[cnt] = 0; |
| 109035 | |
| 109036 | /* Make sure sufficient number of registers have been allocated */ |
| 109037 | pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); |
| 109038 | |
| 109039 | /* Do the b-tree integrity checks */ |
| 109040 | sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); |
| 109041 | sqlite3VdbeChangeP5(v, (u8)i); |
| 109042 | addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); |
| @@ -109040,11 +109069,12 @@ | |
| 109069 | 1, 0, &iDataCur, &iIdxCur); |
| 109070 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); |
| 109071 | for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
| 109072 | sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ |
| 109073 | } |
| 109074 | assert( pParse->nMem>=8+j ); |
| 109075 | assert( sqlite3NoTempsInRange(pParse,1,7+j) ); |
| 109076 | sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); |
| 109077 | loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); |
| 109078 | /* Verify that all NOT NULL columns really are NOT NULL */ |
| 109079 | for(j=0; j<pTab->nCol; j++){ |
| 109080 | char *zErr; |
| 109081 |
+1
-1
| --- src/sqlite3.h | ||
| +++ src/sqlite3.h | ||
| @@ -111,11 +111,11 @@ | ||
| 111 | 111 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 112 | 112 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 113 | 113 | */ |
| 114 | 114 | #define SQLITE_VERSION "3.12.0" |
| 115 | 115 | #define SQLITE_VERSION_NUMBER 3012000 |
| 116 | -#define SQLITE_SOURCE_ID "2016-03-18 00:39:40 b199637d81d7e2a767131ac03c7679b101fd459c" | |
| 116 | +#define SQLITE_SOURCE_ID "2016-03-19 00:35:02 88439a866b3b16ad7c308ebe59198662a05e7eeb" | |
| 117 | 117 | |
| 118 | 118 | /* |
| 119 | 119 | ** CAPI3REF: Run-Time Library Version Numbers |
| 120 | 120 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 121 | 121 | ** |
| 122 | 122 |
| --- src/sqlite3.h | |
| +++ src/sqlite3.h | |
| @@ -111,11 +111,11 @@ | |
| 111 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 112 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 113 | */ |
| 114 | #define SQLITE_VERSION "3.12.0" |
| 115 | #define SQLITE_VERSION_NUMBER 3012000 |
| 116 | #define SQLITE_SOURCE_ID "2016-03-18 00:39:40 b199637d81d7e2a767131ac03c7679b101fd459c" |
| 117 | |
| 118 | /* |
| 119 | ** CAPI3REF: Run-Time Library Version Numbers |
| 120 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 121 | ** |
| 122 |
| --- src/sqlite3.h | |
| +++ src/sqlite3.h | |
| @@ -111,11 +111,11 @@ | |
| 111 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 112 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 113 | */ |
| 114 | #define SQLITE_VERSION "3.12.0" |
| 115 | #define SQLITE_VERSION_NUMBER 3012000 |
| 116 | #define SQLITE_SOURCE_ID "2016-03-19 00:35:02 88439a866b3b16ad7c308ebe59198662a05e7eeb" |
| 117 | |
| 118 | /* |
| 119 | ** CAPI3REF: Run-Time Library Version Numbers |
| 120 | ** KEYWORDS: sqlite3_version, sqlite3_sourceid |
| 121 | ** |
| 122 |