]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Refactor the Vdbe.iVdbeMagic field into Vdbe.eVdbeState. Split the RUNNING
authordrh <>
Fri, 1 Apr 2022 17:01:57 +0000 (17:01 +0000)
committerdrh <>
Fri, 1 Apr 2022 17:01:57 +0000 (17:01 +0000)
state into separate RUNNING and READY.  This gives a size reduction and
performance increase.

FossilOrigin-Name: 5a50a42fde9477868fad31099f5fe976437825fac44f8b3a4cf6c739c7667bbb

1  2 
manifest
manifest.uuid
src/vdbe.c
src/vdbeInt.h
src/vdbeapi.c
src/vdbeaux.c

diff --cc manifest
index 662771b0da3c21e36bc5aa9c1d4edca34261ff6f,ac0d69c54e95b1f406e5caf1a2106895776eb5f5..e9f33763f31118700595ef6044aae64cfcd446c7
+++ 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 d0b89733cc8b2471e78eab6f55916c59fe530026,06fb3a929ca739db4a91e727ee28c40f8e4d8680..b55eb61a13b91f24af04efe863defe14722660fb
@@@ -1,1 -1,1 +1,1 @@@
- 6d976f90dfe4886c3f4c062151af5c5ca7454d34b71172401b8c67acd2d663a0
 -d698826b08b88e227eb83f84b3cdb19f17306b532eccfa162090abccdf3c63d8
++5a50a42fde9477868fad31099f5fe976437825fac44f8b3a4cf6c739c7667bbb
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeInt.h
Simple merge
diff --cc src/vdbeapi.c
index c23dd0e0c801bd659c8e5dbc8fd46df69b65cba4,4c8078be3f1f7e73d5311190f0c99406850eb711..40821c11458a0c388719765271bf3ce272bb1cf1
@@@ -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 c5024efb13f5ff1a275667a67f4c4f42c8670114,ce92999cdf0355d70dcbf530ce3036ac5a6c7c94..6573efcf2ed7de53c9d077eff5a632296930c876
@@@ -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; i<p->nCursor; i++){
--      VdbeCursor *pC = p->apCsr[i];
--      if( pC ){
--        sqlite3VdbeFreeCursor(p, pC);
--        p->apCsr[i] = 0;
--      }
++  int i;
++  for(i=0; i<p->nCursor; i++){
++    VdbeCursor *pC = p->apCsr[i];
++    if( pC ){
++      sqlite3VdbeFreeCursor(p, pC);
++      p->apCsr[i] = 0;
      }
    }
  }