From: drh <> Date: Fri, 1 Apr 2022 17:01:57 +0000 (+0000) Subject: Refactor the Vdbe.iVdbeMagic field into Vdbe.eVdbeState. Split the RUNNING X-Git-Tag: version-3.39.0~267 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=17c4865b838d222314fa6256e7584a5fe164281b;p=thirdparty%2Fsqlite.git Refactor the Vdbe.iVdbeMagic field into Vdbe.eVdbeState. Split the RUNNING state into separate RUNNING and READY. This gives a size reduction and performance increase. FossilOrigin-Name: 5a50a42fde9477868fad31099f5fe976437825fac44f8b3a4cf6c739c7667bbb --- 17c4865b838d222314fa6256e7584a5fe164281b diff --cc manifest index 662771b0da,ac0d69c54e..e9f33763f3 --- a/manifest +++ b/manifest @@@ -1,5 -1,5 +1,5 @@@ - C Avoid\sa\sharmless\suninitialized\svariable\swarning\sin\sPRAGMA\sincremental_vacuum. - D 2022-04-01T16:22:41.680 -C Split\sout\sthe\sRUN\sstate\sinto\sseparate\sREADY\sand\sRUN\sstates. -D 2022-03-31T21:15:09.341 ++C Refactor\sthe\sVdbe.iVdbeMagic\sfield\sinto\sVdbe.eVdbeState.\s\sSplit\sthe\sRUNNING\nstate\sinto\sseparate\sRUNNING\sand\sREADY.\s\sThis\sgives\sa\ssize\sreduction\sand\nperformance\sincrease. ++D 2022-04-01T17:01:57.201 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@@ -624,13 -624,13 +624,13 @@@ F src/upsert.c 8789047a8f0a601ea42fa025 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 602fe229f32a96ceccae4f40824129669582096f7c355f53dbac156c9fecef23 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 - F src/vdbe.c 0245de62bdf0fb22605b8d093738890b3fa788604ee37b6cde3c36312c982dd5 -F src/vdbe.c c7982c468cf39e3ad690da427aa72d43744debc32cea943849b688c17dfe2bff ++F src/vdbe.c aa8751fbca2aae36ea0a4753636d4e257363a39c67af6b52ebdaecea83de2859 F src/vdbe.h a1d0e3b934e835e73edd146f2e7c4eadb711b5c9875c18159a57483fd78e550e - F src/vdbeInt.h 75421e3c0f139b008c95f1e9c36815aa40f4d07d2bdd1e0499c2c5a1bcf43fd3 - F src/vdbeapi.c fe789d29ce9edab0f5413836ab535d4a1518aca3a6a75e2f8ff6cd1af8092384 - F src/vdbeaux.c 45a94316496a200a1d3a29b014fbbc7fc44860c026f768b2d0fcc108e92536d4 -F src/vdbeInt.h fe6987d90048eee26bf0e9a2498ff3f2c5d4149b0d6e78b9fcc6bce13274faae -F src/vdbeapi.c bdc977e721fbadb9b075f8f4eb5f4ac5289eb2bffc0786ffae303e915580484a -F src/vdbeaux.c 6c76956b969cdb65b52fe120e1e5424868ec4473f454dd81039e5b07a2b44ee4 ++F src/vdbeInt.h a2f535ae607e441104d22617a30cb6290264fa1820702a7956a10c6f795b1344 ++F src/vdbeapi.c 17474f2122c1f54c93dcdb7b845e68e207bbebab6a040c65ed374c4aec049d34 ++F src/vdbeaux.c 12fd47127081042706c318590f4dbc90233e22ca12742462f85703f4f4fc6658 F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd -F src/vdbemem.c 512499e51eb7cbe1d886031f19ab6f3e05655a0b25655991af01b61a631a78f7 +F src/vdbemem.c 062cd58c54f887dc2eeb865686251c17237f791f0e6394e9c6f7a6f3c1a7e206 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c @@@ -1945,8 -1945,8 +1945,9 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 - P d4e19314f564126e180e091f9135c7bc55a10442edb46fbd3a4cfad21201dfa6 - R 0ec367734a93a75663b3abea5e03bf19 -P ff91191d232305d44ae6c0fbca2542a749422dc716fa1fd5d54f58c7d6052c14 -R ec623ff49fd7a3945e7e6cf4e06ba68c ++P 6d976f90dfe4886c3f4c062151af5c5ca7454d34b71172401b8c67acd2d663a0 d698826b08b88e227eb83f84b3cdb19f17306b532eccfa162090abccdf3c63d8 ++R 97a4d2d9fb07a14d2a76d85d2d1743dd ++T +closed d698826b08b88e227eb83f84b3cdb19f17306b532eccfa162090abccdf3c63d8 U drh - Z 9dcfea7aa3dabdeb03cfb5d58440b56a -Z 2cbaf76e3cc43bc83d2f6fc2647ea3ec ++Z b98f2a477a3e4e8aef60cc1790477902 # Remove this line to create a well-formed Fossil manifest. diff --cc manifest.uuid index d0b89733cc,06fb3a929c..b55eb61a13 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - 6d976f90dfe4886c3f4c062151af5c5ca7454d34b71172401b8c67acd2d663a0 -d698826b08b88e227eb83f84b3cdb19f17306b532eccfa162090abccdf3c63d8 ++5a50a42fde9477868fad31099f5fe976437825fac44f8b3a4cf6c739c7667bbb diff --cc src/vdbeapi.c index c23dd0e0c8,4c8078be3f..40821c1145 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@@ -678,45 -649,83 +649,83 @@@ static int sqlite3Step(Vdbe *p) return SQLITE_NOMEM_BKPT; } - if( p->pc<0 && p->expired ){ - p->rc = SQLITE_SCHEMA; - rc = SQLITE_ERROR; - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ - /* If this statement was prepared using saved SQL and an - ** error has occurred, then return the error code in p->rc to the - ** caller. Set the error code in the database handle to the same value. - */ - rc = sqlite3VdbeTransferError(p); - } - goto end_of_step; - } - if( p->pc<0 ){ - /* If there are no other statements currently running, then - ** reset the interrupt flag. This prevents a call to sqlite3_interrupt - ** from interrupting a statement that has not yet started. - */ - if( db->nVdbeActive==0 ){ - AtomicStore(&db->u1.isInterrupted, 0); - } + assert(p); + if( p->eVdbeState!=VDBE_RUN_STATE ){ + restart_step: + if( p->eVdbeState==VDBE_READY_STATE ){ + if( p->expired ){ + p->rc = SQLITE_SCHEMA; + rc = SQLITE_ERROR; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ + /* If this statement was prepared using saved SQL and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same + ** value. + */ + rc = sqlite3VdbeTransferError(p); + } + goto end_of_step; + } - assert( db->nVdbeWrite>0 || db->autoCommit==0 - || (db->nDeferredCons==0 && db->nDeferredImmCons==0) - ); + /* If there are no other statements currently running, then + ** reset the interrupt flag. This prevents a call to sqlite3_interrupt + ** from interrupting a statement that has not yet started. + */ + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } + + assert( db->nVdbeWrite>0 || db->autoCommit==0 + || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + ); #ifndef SQLITE_OMIT_TRACE - if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 - && !db->init.busy && p->zSql ){ - sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); - }else{ - assert( p->startTime==0 ); - } + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 + && !db->init.busy && p->zSql ){ + sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); + } #endif - db->nVdbeActive++; - if( p->readOnly==0 ) db->nVdbeWrite++; - if( p->bIsReader ) db->nVdbeRead++; - p->pc = 0; + db->nVdbeActive++; + if( p->readOnly==0 ) db->nVdbeWrite++; + if( p->bIsReader ) db->nVdbeRead++; + p->pc = 0; + p->eVdbeState = VDBE_RUN_STATE; + }else + - if( p->eVdbeState==VDBE_HALT_STATE ){ ++ if( ALWAYS(p->eVdbeState==VDBE_HALT_STATE) ){ + /* We used to require that sqlite3_reset() be called before retrying + ** sqlite3_step() after any error or after SQLITE_DONE. But beginning + ** with version 3.7.0, we changed this so that sqlite3_reset() would + ** be called automatically instead of throwing the SQLITE_MISUSE error. + ** This "automatic-reset" change is not technically an incompatibility, + ** since any application that receives an SQLITE_MISUSE is broken by + ** definition. + ** + ** Nevertheless, some published applications that were originally written + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** returns, and those were broken by the automatic-reset change. As a + ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the + ** legacy behavior of returning SQLITE_MISUSE for cases where the + ** previous sqlite3_step() returned something other than a SQLITE_LOCKED + ** or SQLITE_BUSY error. + */ + #ifdef SQLITE_OMIT_AUTORESET + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + sqlite3_reset((sqlite3_stmt*)p); + }else{ + return SQLITE_MISUSE_BKPT; + } + #else + sqlite3_reset((sqlite3_stmt*)p); + #endif + assert( p->eVdbeState==VDBE_READY_STATE ); + goto restart_step; + } } + #ifdef SQLITE_DEBUG p->rcApp = SQLITE_OK; #endif diff --cc src/vdbeaux.c index c5024efb13,ce92999cdf..6573efcf2e --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@@ -2503,14 -2504,14 +2504,12 @@@ void sqlite3VdbeFreeCursor(Vdbe *p, Vdb ** Close all cursors in the current frame. */ static void closeCursorsInFrame(Vdbe *p){ -- if( p->apCsr ){ -- int i; -- for(i=0; inCursor; i++){ -- VdbeCursor *pC = p->apCsr[i]; -- if( pC ){ -- sqlite3VdbeFreeCursor(p, pC); -- p->apCsr[i] = 0; -- } ++ int i; ++ for(i=0; inCursor; i++){ ++ VdbeCursor *pC = p->apCsr[i]; ++ if( pC ){ ++ sqlite3VdbeFreeCursor(p, pC); ++ p->apCsr[i] = 0; } } }