diff options
Diffstat (limited to 'test/fuzzinvariants.c')
-rw-r--r-- | test/fuzzinvariants.c | 29 |
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; |