mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Enhancements and improved documentation to the byte-code branch coverage
testing logic. Provide new macros that allow the code to specify that some branch instructions can never take the NULL path and that the OP_Jump opcode is only interested in equal/not-equal. The SQLITE_TESTCTRL_VDBE_COVERAGE file control callback now works slightly differently (it provides the callback with a bitmask of the branch action, rather than an integer). FossilOrigin-Name: cd2da7e1ba4e78e68ccf65d4969df963c1e3085930e74419450bda2799381e05
This commit is contained in:
33
src/vdbe.h
33
src/vdbe.h
@@ -73,7 +73,8 @@ struct VdbeOp {
|
||||
u64 cycles; /* Total time spent executing this instruction */
|
||||
#endif
|
||||
#ifdef SQLITE_VDBE_COVERAGE
|
||||
int iSrcLine; /* Source-code line that generated this opcode */
|
||||
u32 iSrcLine; /* Source-code line that generated this opcode
|
||||
** with flags in the upper 8 bits */
|
||||
#endif
|
||||
};
|
||||
typedef struct VdbeOp VdbeOp;
|
||||
@@ -317,23 +318,49 @@ int sqlite3NotPureFunc(sqlite3_context*);
|
||||
**
|
||||
** VdbeCoverageNeverTaken(v) // Previous branch is never taken
|
||||
**
|
||||
** VdbeCoverageNeverNull(v) // Previous three-way branch is only
|
||||
** // taken on the first two ways. The
|
||||
** // NULL option is not possible
|
||||
**
|
||||
** VdbeCoverageEqNe(v) // Previous OP_Jump is only interested
|
||||
** // in distingishing equal and not-equal.
|
||||
**
|
||||
** Every VDBE branch operation must be tagged with one of the macros above.
|
||||
** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and
|
||||
** -DSQLITE_DEBUG then an ALWAYS() will fail in the vdbeTakeBranch()
|
||||
** routine in vdbe.c, alerting the developer to the missed tag.
|
||||
**
|
||||
** During testing, the test application will invoke
|
||||
** sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE,...) to set a callback
|
||||
** routine that is invoked as each bytecode branch is taken. The callback
|
||||
** contains the sqlite3.c source line number ov the VdbeCoverage macro and
|
||||
** flags to indicate whether or not the branch was taken. The test application
|
||||
** is responsible for keeping track of this and reporting byte-code branches
|
||||
** that are never taken.
|
||||
**
|
||||
** See the VdbeBranchTaken() macro and vdbeTakeBranch() function in the
|
||||
** vdbe.c source file for additional information.
|
||||
*/
|
||||
#ifdef SQLITE_VDBE_COVERAGE
|
||||
void sqlite3VdbeSetLineNumber(Vdbe*,int);
|
||||
# define VdbeCoverage(v) sqlite3VdbeSetLineNumber(v,__LINE__)
|
||||
# define VdbeCoverageIf(v,x) if(x)sqlite3VdbeSetLineNumber(v,__LINE__)
|
||||
# define VdbeCoverageAlwaysTaken(v) sqlite3VdbeSetLineNumber(v,2);
|
||||
# define VdbeCoverageNeverTaken(v) sqlite3VdbeSetLineNumber(v,1);
|
||||
# define VdbeCoverageAlwaysTaken(v) \
|
||||
sqlite3VdbeSetLineNumber(v,__LINE__|0x5000000);
|
||||
# define VdbeCoverageNeverTaken(v) \
|
||||
sqlite3VdbeSetLineNumber(v,__LINE__|0x6000000);
|
||||
# define VdbeCoverageNeverNull(v) \
|
||||
sqlite3VdbeSetLineNumber(v,__LINE__|0x4000000);
|
||||
# define VdbeCoverageEqNe(v) \
|
||||
sqlite3VdbeSetLineNumber(v,__LINE__|0x8000000);
|
||||
# define VDBE_OFFSET_LINENO(x) (__LINE__+x)
|
||||
#else
|
||||
# define VdbeCoverage(v)
|
||||
# define VdbeCoverageIf(v,x)
|
||||
# define VdbeCoverageAlwaysTaken(v)
|
||||
# define VdbeCoverageNeverTaken(v)
|
||||
# define VdbeCoverageNeverNull(v)
|
||||
# define VdbeCoverageEqNe(v)
|
||||
# define VDBE_OFFSET_LINENO(x) 0
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user