mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
Add extra debugging code for sqlite3_stmt_scanstatus_v2() to test1.c.
FossilOrigin-Name: f936f101406069b29218c89a36581b4497226fb61906782ea368f12d943c901c
This commit is contained in:
45
src/test1.c
45
src/test1.c
@@ -2216,6 +2216,7 @@ static int SQLITE_TCLAPI test_stmt_scanstatus(
|
||||
int flags = 0;
|
||||
int iSelectId = 0;
|
||||
int iParentId = 0;
|
||||
int bDebug = 0;
|
||||
|
||||
if( objc==5 ){
|
||||
struct Flag {
|
||||
@@ -2223,6 +2224,7 @@ static int SQLITE_TCLAPI test_stmt_scanstatus(
|
||||
int flag;
|
||||
} aTbl[] = {
|
||||
{"complex", SQLITE_SCANSTAT_COMPLEX},
|
||||
{"debug", -1},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
@@ -2239,7 +2241,11 @@ static int SQLITE_TCLAPI test_stmt_scanstatus(
|
||||
interp, aFlag[ii], aTbl, sizeof(aTbl[0]), "flag", 0, &iVal
|
||||
);
|
||||
if( res ) return TCL_ERROR;
|
||||
flags |= aTbl[iVal].flag;
|
||||
if( aTbl[iVal].flag==-1 ){
|
||||
bDebug = 1;
|
||||
}else{
|
||||
flags |= aTbl[iVal].flag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2253,6 +2259,13 @@ static int SQLITE_TCLAPI test_stmt_scanstatus(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if( bDebug && 0==(flags & SQLITE_SCANSTAT_COMPLEX) ){
|
||||
Tcl_SetObjResult(interp,
|
||||
Tcl_NewStringObj("may not specify debug without complex", -1)
|
||||
);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if( idx<0 ){
|
||||
Tcl_Obj *pRet = Tcl_NewObj();
|
||||
res = sqlite3_stmt_scanstatus_v2(
|
||||
@@ -2299,6 +2312,36 @@ static int SQLITE_TCLAPI test_stmt_scanstatus(
|
||||
pStmt, idx, SQLITE_SCANSTAT_NCYCLE, flags, (void*)&nCycle);
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj("nCycle", -1));
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewWideIntObj(nCycle));
|
||||
|
||||
if( bDebug ){
|
||||
int ii;
|
||||
ScanStatus *pScan = &((Vdbe*)pStmt)->aScan[idx];
|
||||
Tcl_Obj *pRange = Tcl_NewObj();
|
||||
Tcl_Obj *pCsr = Tcl_NewObj();
|
||||
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj("debug_loop", -1));
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(pScan->addrLoop));
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj("debug_visit", -1));
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(pScan->addrVisit));
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj("debug_explain",-1));
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(pScan->addrExplain));
|
||||
for(ii=0; ii<ArraySize(pScan->aAddrRange)/2; ii++){
|
||||
int iStart = pScan->aAddrRange[ii*2];
|
||||
int iEnd = pScan->aAddrRange[ii*2+1];
|
||||
if( iStart>0 ){
|
||||
Tcl_ListObjAppendElement(0, pRange, Tcl_NewIntObj(iStart));
|
||||
Tcl_ListObjAppendElement(0, pRange, Tcl_NewIntObj(iEnd));
|
||||
}else if( iStart<0 ){
|
||||
Tcl_ListObjAppendElement(0, pCsr, Tcl_NewIntObj(iEnd));
|
||||
}
|
||||
}
|
||||
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj("debug_range", -1));
|
||||
Tcl_ListObjAppendElement(0, pRet, pRange);
|
||||
Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj("debug_csr", -1));
|
||||
Tcl_ListObjAppendElement(0, pRet, pCsr);
|
||||
}
|
||||
|
||||
Tcl_SetObjResult(interp, pRet);
|
||||
}else{
|
||||
Tcl_ResetResult(interp);
|
||||
|
||||
Reference in New Issue
Block a user