diff options
author | drh <drh@noemail.net> | 2019-02-20 13:55:45 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-02-20 13:55:45 +0000 |
commit | b1af9c603c70535a61b5785a4b29ce9cecc8f78d (patch) | |
tree | bfe5f9156e631fd29ff5a3a668315198ac900cff /src | |
parent | 042666e4fa379ddd29eb049d77319e32dc94126f (diff) | |
download | sqlite-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.c | 10 |
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; |