aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-02-20 13:55:45 +0000
committerdrh <drh@noemail.net>2019-02-20 13:55:45 +0000
commitb1af9c603c70535a61b5785a4b29ce9cecc8f78d (patch)
treebfe5f9156e631fd29ff5a3a668315198ac900cff /src
parent042666e4fa379ddd29eb049d77319e32dc94126f (diff)
downloadsqlite-b1af9c603c70535a61b5785a4b29ce9cecc8f78d.tar.gz
sqlite-b1af9c603c70535a61b5785a4b29ce9cecc8f78d.zip
Progress handler improvements:
(1) Invoke the callback after OP_Program opcodes (2) Invoke the callback multiple times in a row to catch up after a long run of no progress checks. FossilOrigin-Name: 0c5db18d79366d9c23925ce3ed835500311f32a10aa7dbfdd09148b1e8a2507b
Diffstat (limited to 'src')
-rw-r--r--src/vdbe.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/vdbe.c b/src/vdbe.c
index 880d16adf..e53623852 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -819,9 +819,9 @@ check_for_interrupt:
** If the progress callback returns non-zero, exit the virtual machine with
** a return code SQLITE_ABORT.
*/
- if( nVmStep>=nProgressLimit && db->xProgress!=0 ){
+ while( nVmStep>=nProgressLimit && db->xProgress!=0 ){
assert( db->nProgressOps!=0 );
- nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps);
+ nProgressLimit += db->nProgressOps;
if( db->xProgress(db->pProgressArg) ){
nProgressLimit = 0xffffffff;
rc = SQLITE_INTERRUPT;
@@ -6174,8 +6174,7 @@ case OP_Program: { /* jump */
}
#endif
pOp = &aOp[-1];
-
- break;
+ goto check_for_interrupt;
}
/* Opcode: Param P1 P2 * * *
@@ -7585,7 +7584,8 @@ abort_due_to_error:
** top. */
vdbe_return:
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
- if( nVmStep>=nProgressLimit && db->xProgress!=0 ){
+ while( nVmStep>=nProgressLimit && db->xProgress!=0 ){
+ nProgressLimit += db->nProgressOps;
if( db->xProgress(db->pProgressArg) ){
nProgressLimit = 0xffffffff;
rc = SQLITE_INTERRUPT;