aboutsummaryrefslogtreecommitdiff
path: root/src/vdbeaux.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2014-10-31 20:11:32 +0000
committerdan <dan@noemail.net>2014-10-31 20:11:32 +0000
commit04489b6dce1b28fffb9afa524b0eb854a400da21 (patch)
tree73a1b1140f1910e31f7d1c44b377b139c31d9f52 /src/vdbeaux.c
parent0fb5daed34ba6f16d761b8ad02b944ec59cf5c03 (diff)
downloadsqlite-04489b6dce1b28fffb9afa524b0eb854a400da21.tar.gz
sqlite-04489b6dce1b28fffb9afa524b0eb854a400da21.zip
Add the experimental sqlite3_stmt_scanstatus() API.
FossilOrigin-Name: 6a9bab34aeb6a01b612211a28c140de60a3e883c
Diffstat (limited to 'src/vdbeaux.c')
-rw-r--r--src/vdbeaux.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index 7dfb64130..a8223890b 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -672,6 +672,7 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){
if( p4 ){
assert( db );
switch( p4type ){
+ case P4_EXPLAIN:
case P4_REAL:
case P4_INT64:
case P4_DYNAMIC:
@@ -820,6 +821,13 @@ void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){
pOp->p4type = P4_VTAB;
sqlite3VtabLock((VTable *)zP4);
assert( ((VTable *)zP4)->db==p->db );
+ }else if( n==P4_EXPLAIN ){
+ pOp->p4.p = (void*)zP4;
+ pOp->p4type = P4_EXPLAIN;
+ p->apExplain = (ExplainArg**)sqlite3DbReallocOrFree(
+ p->db, p->apExplain, sizeof(ExplainArg*) * p->nExplain + 1
+ );
+ if( p->apExplain ) p->apExplain[p->nExplain++] = (ExplainArg*)zP4;
}else if( n<0 ){
pOp->p4.p = (void*)zP4;
pOp->p4type = (signed char)n;
@@ -1103,6 +1111,10 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
zTemp[0] = 0;
break;
}
+ case P4_EXPLAIN: {
+ zP4 = (char*)pOp->p4.pExplain->zExplain;
+ break;
+ }
default: {
zP4 = pOp->p4.z;
if( zP4==0 ){
@@ -2685,6 +2697,7 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
sqlite3DbFree(db, p->aColName);
sqlite3DbFree(db, p->zSql);
sqlite3DbFree(db, p->pFree);
+ sqlite3DbFree(db, p->apExplain);
}
/*