aboutsummaryrefslogtreecommitdiff
path: root/test/fuzzinvariants.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/fuzzinvariants.c')
-rw-r--r--test/fuzzinvariants.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/test/fuzzinvariants.c b/test/fuzzinvariants.c
index 80eb4aecb..36121963f 100644
--- a/test/fuzzinvariants.c
+++ b/test/fuzzinvariants.c
@@ -39,6 +39,31 @@ static void reportInvariantFailed(
);
/*
+** Special parameter binding, for testing and debugging purposes.
+**
+** $int_NNN -> integer value NNN
+** $text_TTTT -> floating point value TTT with destructor
+*/
+static void bindDebugParameters(sqlite3_stmt *pStmt){
+ int nVar = sqlite3_bind_parameter_count(pStmt);
+ int i;
+ for(i=0; i<nVar; i++){
+ const char *zVar = sqlite3_bind_parameter_name(pStmt, i+1);
+ if( zVar==0 ) continue;
+ if( strncmp(zVar, "$int_", 5)==0 ){
+ sqlite3_bind_int(pStmt, i+1, atoi(&zVar[5]));
+ }else
+ if( strncmp(zVar, "$text_", 6)==0 ){
+ char *zBuf = sqlite3_malloc64( strlen(zVar)-5 );
+ if( zBuf ){
+ memcpy(zBuf, &zVar[6], strlen(zVar)-5);
+ sqlite3_bind_text64(pStmt, i+1, zBuf, -1, sqlite3_free, SQLITE_UTF8);
+ }
+ }
+ }
+}
+
+/*
** Do an invariant check on pStmt. iCnt determines which invariant check to
** perform. The first check is iCnt==0.
**
@@ -107,6 +132,7 @@ int fuzz_invariant(
return rc;
}
sqlite3_free(zTest);
+ bindDebugParameters(pTestStmt);
nCol = sqlite3_column_count(pStmt);
for(i=0; i<nCol; i++){
rc = sqlite3_bind_value(pTestStmt,i+1+nParam,sqlite3_column_value(pStmt,i));
@@ -171,6 +197,7 @@ int fuzz_invariant(
printf("invariant-validity-check #2:\n%s\n", zSql);
sqlite3_free(zSql);
}
+ bindDebugParameters(pCk);
while( (rc = sqlite3_step(pCk))==SQLITE_ROW ){
for(i=0; i<nCol; i++){
if( !sameValue(pStmt, i, pTestStmt, i, 0) ) break;
@@ -199,6 +226,7 @@ int fuzz_invariant(
}
sqlite3_reset(pTestStmt);
+ bindDebugParameters(pCk);
while( (rc = sqlite3_step(pTestStmt))==SQLITE_ROW ){
for(i=0; i<nCol; i++){
if( !sameValue(pStmt, i, pTestStmt, i, pCk) ) break;
@@ -298,6 +326,7 @@ static char *fuzz_invariant_sql(sqlite3_stmt *pStmt, int iCnt){
sqlite3_finalize(pBase);
pBase = pStmt;
}
+ bindDebugParameters(pBase);
for(i=0; i<sqlite3_column_count(pStmt); i++){
const char *zColName = sqlite3_column_name(pBase,i);
const char *zSuffix = zColName ? strrchr(zColName, ':') : 0;