diff options
author | dan <Dan Kennedy> | 2023-08-10 17:07:34 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2023-08-10 17:07:34 +0000 |
commit | 6de6121e36e33d214c5f19e9197f7cee0fb60d7f (patch) | |
tree | 165e77da459e2813194b6b46c96be7d2e47f62c3 /src/vdbeapi.c | |
parent | 9a897cb0dea3fe2aa17e2b1d1155fe016447fa76 (diff) | |
parent | 80c438613a687d41ce820f113a2b20e1aade93a6 (diff) | |
download | sqlite-6de6121e36e33d214c5f19e9197f7cee0fb60d7f.tar.gz sqlite-6de6121e36e33d214c5f19e9197f7cee0fb60d7f.zip |
Merge latest trunk changes into this branch.
FossilOrigin-Name: 3ed89c344fcb3b7ee8b764d95144643e42e053e1116150d6eda8355fbd6669df
Diffstat (limited to 'src/vdbeapi.c')
-rw-r--r-- | src/vdbeapi.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/vdbeapi.c b/src/vdbeapi.c index cb631413c..cc58e7a87 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1863,19 +1863,23 @@ int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){ Vdbe *v = (Vdbe*)pStmt; int rc; - if( v->eVdbeState!=VDBE_READY_STATE ) return SQLITE_BUSY; - if( v->explain==eMode ) return SQLITE_OK; - if( v->zSql==0 || eMode<0 || eMode>2 ) return SQLITE_ERROR; sqlite3_mutex_enter(v->db->mutex); - if( v->nMem>=10 && (eMode!=2 || v->haveEqpOps) ){ + if( v->explain==eMode ){ + rc = SQLITE_OK; + }else if( eMode<0 || eMode>2 ){ + rc = SQLITE_ERROR; + }else if( (v->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){ + rc = SQLITE_ERROR; + }else if( v->eVdbeState!=VDBE_READY_STATE ){ + rc = SQLITE_BUSY; + }else if( v->nMem>=10 && (eMode!=2 || v->haveEqpOps) ){ /* No reprepare necessary */ v->explain = eMode; rc = SQLITE_OK; }else{ - int haveEqpOps = v->explain==2 || v->haveEqpOps; v->explain = eMode; rc = sqlite3Reprepare(v); - v->haveEqpOps = haveEqpOps!=0; + v->haveEqpOps = eMode==2; } if( v->explain ){ v->nResColumn = 12 - 4*v->explain; |