mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Improved progress-handler and interrupt detection during PRAGMA integrity_check.
FossilOrigin-Name: 6db42780a9e530bcc94490cc6080536309666dc13523272d1799d6661137e908
This commit is contained in:
18
manifest
18
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Add\sa\snew\ssqlite3_is_interrupted()\sinterface\sthat\scan\sbe\sused\sby\slong-running\napp-defined\sfunctions\sand\ssimilar\sto\ssee\sif\sthey\sneed\sto\sexit\searly\sdue\sto\nan\ssqlite3_interrupt()\scall.
|
C Improved\sprogress-handler\sand\sinterrupt\sdetection\sduring\sPRAGMA\sintegrity_check.
|
||||||
D 2023-01-11T00:27:06.320
|
D 2023-01-11T16:17:31.352
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -584,9 +584,9 @@ F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
|
|||||||
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
|
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
|
||||||
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
|
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
|
||||||
F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
|
F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
|
||||||
F src/btree.c cc4d9e293a22d08b27f12f04a325f798b60093943d8929de702f533c18c54a4e
|
F src/btree.c 8b776a47d1e791ca78b539b8356cf32e449a613201cf64b87e7f01c62f79bd1b
|
||||||
F src/btree.h 49da925329574798be3cbb745a49d069a9e67c99900d8a0d04b1e934d60394ea
|
F src/btree.h aa354b9bad4120af71e214666b35132712b8f2ec11869cb2315c52c81fad45cc
|
||||||
F src/btreeInt.h 88ad499c92b489afedbfefc3f067c4d15023ec021afe622db240dc9d2277cfa5
|
F src/btreeInt.h e02e97fc20937a1b25b3e705e7ac349d7267e8df3c47427b89dd69328703a235
|
||||||
F src/build.c c55ab6d1b089ceef57160e840f05f692955ac90944c3d04fcf01d97fd7bfd08d
|
F src/build.c c55ab6d1b089ceef57160e840f05f692955ac90944c3d04fcf01d97fd7bfd08d
|
||||||
F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
|
F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
|
||||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||||
@@ -717,7 +717,7 @@ F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
|
|||||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||||
F src/util.c 0e5cf9062a796f0f1b6b3228b121b2344932c05425f7c8b5a7cb245812473bbd
|
F src/util.c 0e5cf9062a796f0f1b6b3228b121b2344932c05425f7c8b5a7cb245812473bbd
|
||||||
F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
|
F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
|
||||||
F src/vdbe.c d05e97e6845f2d29a9e6d08b143946513d48449408e11b1d2465787d25713080
|
F src/vdbe.c 6b11efa707f92a1f32d31c749609ab5a6acf31c1d95e277f9199ce1901831b1a
|
||||||
F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
|
F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
|
||||||
F src/vdbeInt.h fc15815b7bdafbb27e7f027faba2b0112e87d382c0d72241672528806ebc0db5
|
F src/vdbeInt.h fc15815b7bdafbb27e7f027faba2b0112e87d382c0d72241672528806ebc0db5
|
||||||
F src/vdbeapi.c 4ee67890913c1d2469c68e3ad2e7ddeab57ac5924a64bbfd0906a8ea0d542c7f
|
F src/vdbeapi.c 4ee67890913c1d2469c68e3ad2e7ddeab57ac5924a64bbfd0906a8ea0d542c7f
|
||||||
@@ -2068,8 +2068,8 @@ 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 497a98363fd1ed079544620ec5d0883f987ed03013131542741c93d7568e8568
|
P d030f341369b7f32789cbcf3d0ad9a2ac5cad99a56dac7dfe68b7f06dc339b17
|
||||||
R e84e9815577445777c418ec27de1611c
|
R 7b76cd997666c81e2de9a02fcc1dc055
|
||||||
U drh
|
U drh
|
||||||
Z e942c6a2be2eab85b4349c82956d7559
|
Z 15c60f893bce5ca2030105c4cbb8f7ce
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
d030f341369b7f32789cbcf3d0ad9a2ac5cad99a56dac7dfe68b7f06dc339b17
|
6db42780a9e530bcc94490cc6080536309666dc13523272d1799d6661137e908
|
73
src/btree.c
73
src/btree.c
@@ -10181,6 +10181,41 @@ Pager *sqlite3BtreePager(Btree *p){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SQLITE_OMIT_INTEGRITY_CHECK
|
#ifndef SQLITE_OMIT_INTEGRITY_CHECK
|
||||||
|
/*
|
||||||
|
** Record an OOM error during integrity_check
|
||||||
|
*/
|
||||||
|
static void checkOom(IntegrityCk *pCheck){
|
||||||
|
pCheck->rc = SQLITE_NOMEM;
|
||||||
|
pCheck->mxErr = 0; /* Causes integrity_check processing to stop */
|
||||||
|
if( pCheck->nErr==0 ) pCheck->nErr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Invoke the progress handler, if appropriate. Also check for an
|
||||||
|
** interrupt.
|
||||||
|
*/
|
||||||
|
static void checkProgress(IntegrityCk *pCheck){
|
||||||
|
sqlite3 *db = pCheck->db;
|
||||||
|
if( AtomicLoad(&db->u1.isInterrupted) ){
|
||||||
|
pCheck->rc = SQLITE_INTERRUPT;
|
||||||
|
pCheck->nErr++;
|
||||||
|
pCheck->mxErr = 0;
|
||||||
|
}
|
||||||
|
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
|
||||||
|
if( db->xProgress ){
|
||||||
|
assert( db->nProgressOps>0 );
|
||||||
|
pCheck->nStep++;
|
||||||
|
if( (pCheck->nStep % db->nProgressOps)==0
|
||||||
|
&& db->xProgress(db->pProgressArg)
|
||||||
|
){
|
||||||
|
pCheck->rc = SQLITE_INTERRUPT;
|
||||||
|
pCheck->nErr++;
|
||||||
|
pCheck->mxErr = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Append a message to the error message string.
|
** Append a message to the error message string.
|
||||||
*/
|
*/
|
||||||
@@ -10190,6 +10225,7 @@ static void checkAppendMsg(
|
|||||||
...
|
...
|
||||||
){
|
){
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
checkProgress(pCheck);
|
||||||
if( !pCheck->mxErr ) return;
|
if( !pCheck->mxErr ) return;
|
||||||
pCheck->mxErr--;
|
pCheck->mxErr--;
|
||||||
pCheck->nErr++;
|
pCheck->nErr++;
|
||||||
@@ -10203,7 +10239,7 @@ static void checkAppendMsg(
|
|||||||
sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap);
|
sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
if( pCheck->errMsg.accError==SQLITE_NOMEM ){
|
if( pCheck->errMsg.accError==SQLITE_NOMEM ){
|
||||||
pCheck->bOomFault = 1;
|
checkOom(pCheck);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
|
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
|
||||||
@@ -10245,7 +10281,6 @@ static int checkRef(IntegrityCk *pCheck, Pgno iPage){
|
|||||||
checkAppendMsg(pCheck, "2nd reference to page %d", iPage);
|
checkAppendMsg(pCheck, "2nd reference to page %d", iPage);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if( AtomicLoad(&pCheck->db->u1.isInterrupted) ) return 1;
|
|
||||||
setPageReferenced(pCheck, iPage);
|
setPageReferenced(pCheck, iPage);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -10268,7 +10303,7 @@ static void checkPtrmap(
|
|||||||
|
|
||||||
rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent);
|
rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->bOomFault = 1;
|
if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) checkOom(pCheck);
|
||||||
checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild);
|
checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -10452,6 +10487,8 @@ static int checkTreePage(
|
|||||||
|
|
||||||
/* Check that the page exists
|
/* Check that the page exists
|
||||||
*/
|
*/
|
||||||
|
checkProgress(pCheck);
|
||||||
|
if( pCheck->mxErr==0 ) goto end_of_check;
|
||||||
pBt = pCheck->pBt;
|
pBt = pCheck->pBt;
|
||||||
usableSize = pBt->usableSize;
|
usableSize = pBt->usableSize;
|
||||||
if( iPage==0 ) return 0;
|
if( iPage==0 ) return 0;
|
||||||
@@ -10697,13 +10734,14 @@ end_of_check:
|
|||||||
** the unverified btrees. Except, if aRoot[1] is 1, then the freelist
|
** the unverified btrees. Except, if aRoot[1] is 1, then the freelist
|
||||||
** checks are still performed.
|
** checks are still performed.
|
||||||
*/
|
*/
|
||||||
char *sqlite3BtreeIntegrityCheck(
|
int sqlite3BtreeIntegrityCheck(
|
||||||
sqlite3 *db, /* Database connection that is running the check */
|
sqlite3 *db, /* Database connection that is running the check */
|
||||||
Btree *p, /* The btree to be checked */
|
Btree *p, /* The btree to be checked */
|
||||||
Pgno *aRoot, /* An array of root pages numbers for individual trees */
|
Pgno *aRoot, /* An array of root pages numbers for individual trees */
|
||||||
int nRoot, /* Number of entries in aRoot[] */
|
int nRoot, /* Number of entries in aRoot[] */
|
||||||
int mxErr, /* Stop reporting errors after this many */
|
int mxErr, /* Stop reporting errors after this many */
|
||||||
int *pnErr /* Write number of errors seen to this variable */
|
int *pnErr, /* OUT: Write number of errors seen to this variable */
|
||||||
|
char **pzOut /* OUT: Write the error message string here */
|
||||||
){
|
){
|
||||||
Pgno i;
|
Pgno i;
|
||||||
IntegrityCk sCheck;
|
IntegrityCk sCheck;
|
||||||
@@ -10726,18 +10764,12 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
|
assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
|
||||||
VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) );
|
VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) );
|
||||||
assert( nRef>=0 );
|
assert( nRef>=0 );
|
||||||
|
memset(&sCheck, 0, sizeof(sCheck));
|
||||||
sCheck.db = db;
|
sCheck.db = db;
|
||||||
sCheck.pBt = pBt;
|
sCheck.pBt = pBt;
|
||||||
sCheck.pPager = pBt->pPager;
|
sCheck.pPager = pBt->pPager;
|
||||||
sCheck.nPage = btreePagecount(sCheck.pBt);
|
sCheck.nPage = btreePagecount(sCheck.pBt);
|
||||||
sCheck.mxErr = mxErr;
|
sCheck.mxErr = mxErr;
|
||||||
sCheck.nErr = 0;
|
|
||||||
sCheck.bOomFault = 0;
|
|
||||||
sCheck.zPfx = 0;
|
|
||||||
sCheck.v1 = 0;
|
|
||||||
sCheck.v2 = 0;
|
|
||||||
sCheck.aPgRef = 0;
|
|
||||||
sCheck.heap = 0;
|
|
||||||
sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH);
|
sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH);
|
||||||
sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL;
|
sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL;
|
||||||
if( sCheck.nPage==0 ){
|
if( sCheck.nPage==0 ){
|
||||||
@@ -10746,12 +10778,12 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
|
|
||||||
sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1);
|
sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1);
|
||||||
if( !sCheck.aPgRef ){
|
if( !sCheck.aPgRef ){
|
||||||
sCheck.bOomFault = 1;
|
checkOom(&sCheck);
|
||||||
goto integrity_ck_cleanup;
|
goto integrity_ck_cleanup;
|
||||||
}
|
}
|
||||||
sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize );
|
sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize );
|
||||||
if( sCheck.heap==0 ){
|
if( sCheck.heap==0 ){
|
||||||
sCheck.bOomFault = 1;
|
checkOom(&sCheck);
|
||||||
goto integrity_ck_cleanup;
|
goto integrity_ck_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10832,16 +10864,17 @@ char *sqlite3BtreeIntegrityCheck(
|
|||||||
integrity_ck_cleanup:
|
integrity_ck_cleanup:
|
||||||
sqlite3PageFree(sCheck.heap);
|
sqlite3PageFree(sCheck.heap);
|
||||||
sqlite3_free(sCheck.aPgRef);
|
sqlite3_free(sCheck.aPgRef);
|
||||||
if( sCheck.bOomFault ){
|
|
||||||
sqlite3_str_reset(&sCheck.errMsg);
|
|
||||||
sCheck.nErr++;
|
|
||||||
}
|
|
||||||
*pnErr = sCheck.nErr;
|
*pnErr = sCheck.nErr;
|
||||||
if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg);
|
if( sCheck.nErr==0 ){
|
||||||
|
sqlite3_str_reset(&sCheck.errMsg);
|
||||||
|
*pzOut = 0;
|
||||||
|
}else{
|
||||||
|
*pzOut = sqlite3StrAccumFinish(&sCheck.errMsg);
|
||||||
|
}
|
||||||
/* Make sure this analysis did not leave any unref() pages. */
|
/* Make sure this analysis did not leave any unref() pages. */
|
||||||
assert( nRef==sqlite3PagerRefcount(pBt->pPager) );
|
assert( nRef==sqlite3PagerRefcount(pBt->pPager) );
|
||||||
sqlite3BtreeLeave(p);
|
sqlite3BtreeLeave(p);
|
||||||
return sqlite3StrAccumFinish(&sCheck.errMsg);
|
return sCheck.rc;
|
||||||
}
|
}
|
||||||
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
|
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
|
||||||
|
|
||||||
|
10
src/btree.h
10
src/btree.h
@@ -329,7 +329,15 @@ const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt);
|
|||||||
u32 sqlite3BtreePayloadSize(BtCursor*);
|
u32 sqlite3BtreePayloadSize(BtCursor*);
|
||||||
sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*);
|
sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*);
|
||||||
|
|
||||||
char *sqlite3BtreeIntegrityCheck(sqlite3*,Btree*,Pgno*aRoot,int nRoot,int,int*);
|
int sqlite3BtreeIntegrityCheck(
|
||||||
|
sqlite3 *db, /* Database connection that is running the check */
|
||||||
|
Btree *p, /* The btree to be checked */
|
||||||
|
Pgno *aRoot, /* An array of root pages numbers for individual trees */
|
||||||
|
int nRoot, /* Number of entries in aRoot[] */
|
||||||
|
int mxErr, /* Stop reporting errors after this many */
|
||||||
|
int *pnErr, /* OUT: Write number of errors seen to this variable */
|
||||||
|
char **pzOut /* OUT: Write the error message string here */
|
||||||
|
);
|
||||||
struct Pager *sqlite3BtreePager(Btree*);
|
struct Pager *sqlite3BtreePager(Btree*);
|
||||||
i64 sqlite3BtreeRowCountEst(BtCursor*);
|
i64 sqlite3BtreeRowCountEst(BtCursor*);
|
||||||
|
|
||||||
|
@@ -681,8 +681,8 @@ struct BtCursor {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** This structure is passed around through all the sanity checking routines
|
** This structure is passed around through all the PRAGMA integrity_check
|
||||||
** in order to keep track of some global state information.
|
** checking routines in order to keep track of some global state information.
|
||||||
**
|
**
|
||||||
** The aRef[] array is allocated so that there is 1 bit for each page in
|
** The aRef[] array is allocated so that there is 1 bit for each page in
|
||||||
** the database. As the integrity-check proceeds, for each page used in
|
** the database. As the integrity-check proceeds, for each page used in
|
||||||
@@ -698,7 +698,8 @@ struct IntegrityCk {
|
|||||||
Pgno nPage; /* Number of pages in the database */
|
Pgno nPage; /* Number of pages in the database */
|
||||||
int mxErr; /* Stop accumulating errors when this reaches zero */
|
int mxErr; /* Stop accumulating errors when this reaches zero */
|
||||||
int nErr; /* Number of messages written to zErrMsg so far */
|
int nErr; /* Number of messages written to zErrMsg so far */
|
||||||
int bOomFault; /* A memory allocation error has occurred */
|
int rc;; /* SQLITE_OK, SQLITE_NOMEM, or SQLITE_INTERRUPT */
|
||||||
|
u32 nStep; /* Number of steps into the integrity_check process */
|
||||||
const char *zPfx; /* Error message prefix */
|
const char *zPfx; /* Error message prefix */
|
||||||
Pgno v1; /* Value for first %u substitution in zPfx */
|
Pgno v1; /* Value for first %u substitution in zPfx */
|
||||||
int v2; /* Value for second %d substitution in zPfx */
|
int v2; /* Value for second %d substitution in zPfx */
|
||||||
|
@@ -6958,13 +6958,14 @@ case OP_IntegrityCk: {
|
|||||||
pIn1 = &aMem[pOp->p1];
|
pIn1 = &aMem[pOp->p1];
|
||||||
assert( pOp->p5<db->nDb );
|
assert( pOp->p5<db->nDb );
|
||||||
assert( DbMaskTest(p->btreeMask, pOp->p5) );
|
assert( DbMaskTest(p->btreeMask, pOp->p5) );
|
||||||
z = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot,
|
rc = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot,
|
||||||
(int)pnErr->u.i+1, &nErr);
|
(int)pnErr->u.i+1, &nErr, &z);
|
||||||
sqlite3VdbeMemSetNull(pIn1);
|
sqlite3VdbeMemSetNull(pIn1);
|
||||||
if( nErr==0 ){
|
if( nErr==0 ){
|
||||||
assert( z==0 );
|
assert( z==0 );
|
||||||
}else if( z==0 ){
|
}else if( rc ){
|
||||||
goto no_mem;
|
sqlite3_free(z);
|
||||||
|
goto abort_due_to_error;
|
||||||
}else{
|
}else{
|
||||||
pnErr->u.i -= nErr-1;
|
pnErr->u.i -= nErr-1;
|
||||||
sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
|
sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
|
||||||
|
Reference in New Issue
Block a user