1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-01 06:27:03 +03:00

Improvements to speedtest1. Added the --memdb and --output options. The

--verify option now outputs a hash of SQL outputs.  The speed-check.sh script
disables the hashing feature with --legacy and adds the --verify option.

FossilOrigin-Name: f3455cecf22ea98f9ad48e92d620c8e2ec94877e4581731afff0f2bd32014a1d
This commit is contained in:
drh
2020-06-26 15:42:55 +00:00
4 changed files with 169 additions and 13 deletions

View File

@ -1,6 +1,6 @@
B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
C Add\sthe\sieee754_to_blob()\sand\sieee754_from_blob()\sfunctions.\s\sFix\sthe\shandling\nof\ssubnormal\sforms\sin\sthe\stwo-argument\sversion\sof\sieee754().
D 2020-06-26T15:32:29.122
C Improvements\sto\sspeedtest1.\s\sAdded\sthe\s--memdb\sand\s--output\soptions.\s\sThe\n--verify\soption\snow\soutputs\sa\shash\sof\sSQL\soutputs.\s\sThe\sspeed-check.sh\sscript\ndisables\sthe\shashing\sfeature\swith\s--legacy\sand\sadds\sthe\s--verify\soption.
D 2020-06-26T15:42:55.300
F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
@ -15,12 +15,14 @@ F src/test1.c fe56c4bcaa2685ca9aa25d817a0ee9345e189aff4a5a71a3d8ba946c7776feb8
F test/decimal.test 12739a01bdba4c4d79f95b323e6b67b9fad1ab6ffb56116bd2b9c81a5b19e1d9
F test/fuzzdata8.db 0ae860b36b79fd41cafddc9e6602358b2d5c331cf200283221e659f86e196c0c
F test/ieee754.test b0945d12be7d255f3dfa18e2511b17ca37e0edd2b803231c52d05b86c04ab26e
F test/speedtest1.c ea201573f9b27542ea1e74a68e74f121e0eb04c89e67039f40ed68f1b833339f
F test/speedtest1.c 18c3a29fba651788a3dc423277d4aa1245860f03fa115f5cad1bebdfbf92bc02
F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8
F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfae0e84c
F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564
P cc888878ea8d5bc754c69de523819d32d6d9853857e31d7287f9dbfd723428db
R f9fe5af62ab3ae1046135e82fbe40688
F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58
P c78cbf2e86850cc6882d3f0bd5415f6e731c3c675ffe77bb343682c619cb8cd9 89a11120ab2ce13f8a539cb05a9d0628a1f83b4790910b2023c21d60aabc43ee
R a961dfa6c547c0e352a2b23d7aadd325
T +closed 89a11120ab2ce13f8a539cb05a9d0628a1f83b4790910b2023c21d60aabc43ee
U drh
Z e965f5dba0fbca5306547d1182c19c0d
Z 238e33700b7e820c72970002a0f9bd64

View File

@ -1 +1 @@
c78cbf2e86850cc6882d3f0bd5415f6e731c3c675ffe77bb343682c619cb8cd9
f3455cecf22ea98f9ad48e92d620c8e2ec94877e4581731afff0f2bd32014a1d

View File

@ -15,11 +15,13 @@ static const char zHelp[] =
" --journal M Set the journal_mode to M\n"
" --key KEY Set the encryption key to KEY\n"
" --lookaside N SZ Configure lookaside for N slots of SZ bytes each\n"
" --memdb Use an in-memory database\n"
" --mmap SZ MMAP the first SZ bytes of the database file\n"
" --multithread Set multithreaded mode\n"
" --nomemstat Disable memory statistics\n"
" --nosync Set PRAGMA synchronous=OFF\n"
" --notnull Add NOT NULL constraints to table columns\n"
" --output FILE Store SQL output in FILE\n"
" --pagesize N Set the page size to N\n"
" --pcache N SZ Configure N pages of pagecache each of size SZ bytes\n"
" --primarykey Use PRIMARY KEY instead of UNIQUE where appropriate\n"
@ -41,7 +43,6 @@ static const char zHelp[] =
" --without-rowid Use WITHOUT ROWID where appropriate\n"
;
#include "sqlite3.h"
#include <assert.h>
#include <stdio.h>
@ -61,6 +62,20 @@ static const char zHelp[] =
# define sqlite3_int64 sqlite_int64
#endif
typedef sqlite3_uint64 u64;
/*
** State structure for a Hash hash in progress
*/
typedef struct HashContext HashContext;
struct HashContext {
unsigned char isInit; /* True if initialized */
unsigned char i, j; /* State variables */
unsigned char s[256]; /* State variables */
unsigned char r[32]; /* Result */
};
/* All global state is held in this structure */
static struct Global {
sqlite3 *db; /* The open database connection */
@ -80,8 +95,13 @@ static struct Global {
const char *zNN; /* Might be NOT NULL */
const char *zPK; /* Might be UNIQUE or PRIMARY KEY */
unsigned int x, y; /* Pseudo-random number generator state */
u64 nResByte; /* Total number of result bytes */
int nResult; /* Size of the current result */
char zResult[3000]; /* Text of the current result */
#ifndef SPEEDTEST_OMIT_HASH
FILE *hashFile; /* Store all hash results in this file */
HashContext hash; /* Hash of all output */
#endif
} g;
/* Return " TEMP" or "", as appropriate for creating a table.
@ -90,7 +110,6 @@ static const char *isTemp(int N){
return g.eTemp>=N ? " TEMP" : "";
}
/* Print an error message and exit */
static void fatal_error(const char *zMsg, ...){
va_list ap;
@ -100,6 +119,72 @@ static void fatal_error(const char *zMsg, ...){
exit(1);
}
#ifndef SPEEDTEST_OMIT_HASH
/****************************************************************************
** Hash algorithm used to verify that compilation is not miscompiled
** in such a was as to generate an incorrect result.
*/
/*
** Initialize a new hash. iSize determines the size of the hash
** in bits and should be one of 224, 256, 384, or 512. Or iSize
** can be zero to use the default hash size of 256 bits.
*/
static void HashInit(void){
unsigned int k;
g.hash.i = 0;
g.hash.j = 0;
for(k=0; k<256; k++) g.hash.s[k] = k;
}
/*
** Make consecutive calls to the HashUpdate function to add new content
** to the hash
*/
static void HashUpdate(
const unsigned char *aData,
unsigned int nData
){
unsigned char t;
unsigned char i = g.hash.i;
unsigned char j = g.hash.j;
unsigned int k;
if( g.hashFile ) fwrite(aData, 1, nData, g.hashFile);
for(k=0; k<nData; k++){
j += g.hash.s[i] + aData[k];
t = g.hash.s[j];
g.hash.s[j] = g.hash.s[i];
g.hash.s[i] = t;
i++;
}
g.hash.i = i;
g.hash.j = j;
}
/*
** After all content has been added, invoke HashFinal() to compute
** the final hash. The hash result is stored in g.hash.r[].
*/
static void HashFinal(void){
unsigned int k;
unsigned char t, i, j;
i = g.hash.i;
j = g.hash.j;
for(k=0; k<32; k++){
i++;
t = g.hash.s[i];
j += t;
g.hash.s[i] = g.hash.s[j];
g.hash.s[j] = t;
t += g.hash.s[i];
g.hash.r[k] = g.hash.s[t];
}
}
/* End of the Hash hashing logic
*****************************************************************************/
#endif /* SPEEDTEST_OMIT_HASH */
/*
** Return the value of a hexadecimal digit. Return -1 if the input
** is not a hex digit.
@ -324,6 +409,21 @@ void speedtest1_final(void){
printf(" TOTAL%.*s %4d.%03ds\n", NAMEWIDTH-5, zDots,
(int)(g.iTotal/1000), (int)(g.iTotal%1000));
}
if( g.bVerify ){
#ifndef SPEEDTEST_OMIT_HASH
int i;
#endif
printf("Verification Hash: %llu ", g.nResByte);
#ifndef SPEEDTEST_OMIT_HASH
HashUpdate((const unsigned char*)"\n", 1);
HashFinal();
for(i=0; i<24; i++){
printf("%02x", g.hash.r[i]);
}
if( g.hashFile && g.hashFile!=stdout ) fclose(g.hashFile);
#endif
printf("\n");
}
}
/* Print an SQL statement to standard output */
@ -434,6 +534,28 @@ void speedtest1_run(void){
const char *z = (const char*)sqlite3_column_text(g.pStmt, i);
if( z==0 ) z = "nil";
len = (int)strlen(z);
#ifndef SPEEDTEST_OMIT_HASH
if( g.bVerify ){
int eType = sqlite3_column_type(g.pStmt, i);
unsigned char zPrefix[2];
zPrefix[0] = '\n';
zPrefix[1] = "-IFTBN"[eType];
if( g.nResByte ){
HashUpdate(zPrefix, 2);
}else{
HashUpdate(zPrefix+1, 1);
}
if( eType==SQLITE_BLOB ){
int nBlob = sqlite3_column_bytes(g.pStmt, i);
const unsigned char *aBlob = sqlite3_column_blob(g.pStmt, i);
HashUpdate(aBlob, nBlob);
g.nResByte += nBlob + 2;
}else{
HashUpdate((unsigned char*)z, len);
g.nResByte += len + 2;
}
}
#endif
if( g.nResult+len<sizeof(g.zResult)-2 ){
if( g.nResult>0 ) g.zResult[g.nResult++] = ' ';
memcpy(g.zResult + g.nResult, z, len+1);
@ -2017,6 +2139,7 @@ int main(int argc, char **argv){
int showStats = 0; /* True for --stats */
int nThread = 0; /* --threads value */
int mmapSize = 0; /* How big of a memory map to use */
int memDb = 0; /* --memdb. Use an in-memory database */
char *zTSet = "main"; /* Which --testset torun */
int doTrace = 0; /* True for --trace */
const char *zEncoding = 0; /* --utf16be or --utf16le */
@ -2030,7 +2153,7 @@ int main(int argc, char **argv){
int rc; /* API return code */
/* Display the version of SQLite being tested */
printf("-- Speedtest1 for SQLite %s %.50s\n",
printf("-- Speedtest1 for SQLite %s %.48s\n",
sqlite3_libversion(), sqlite3_sourceid());
/* Process command-line arguments */
@ -2072,6 +2195,8 @@ int main(int argc, char **argv){
nLook = integerValue(argv[i+1]);
szLook = integerValue(argv[i+2]);
i += 2;
}else if( strcmp(z,"memdb")==0 ){
memDb = 1;
#if SQLITE_VERSION_NUMBER>=3006000
}else if( strcmp(z,"multithread")==0 ){
sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
@ -2087,6 +2212,22 @@ int main(int argc, char **argv){
noSync = 1;
}else if( strcmp(z,"notnull")==0 ){
g.zNN = "NOT NULL";
}else if( strcmp(z,"output")==0 ){
#ifdef SPEEDTEST_OMIT_HASH
fatal_error("The --output option is not supported with"
" -DSPEEDTEST_OMIT_HASH\n");
#else
if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
i++;
if( strcmp(argv[i],"-")==0 ){
g.hashFile = stdout;
}else{
g.hashFile = fopen(argv[i], "wb");
if( g.hashFile==0 ){
fatal_error("cannot open \"%s\" for writing\n", argv[i]);
}
}
#endif
}else if( strcmp(z,"pagesize")==0 ){
if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
pageSize = integerValue(argv[++i]);
@ -2140,6 +2281,9 @@ int main(int argc, char **argv){
zEncoding = "utf16be";
}else if( strcmp(z,"verify")==0 ){
g.bVerify = 1;
#ifndef SPEEDTEST_OMIT_HASH
HashInit();
#endif
}else if( strcmp(z,"without-rowid")==0 ){
g.zWR = "WITHOUT ROWID";
g.zPK = "PRIMARY KEY";
@ -2181,13 +2325,13 @@ int main(int argc, char **argv){
sqlite3_initialize();
/* Open the database and the input file */
if( sqlite3_open(zDbName, &g.db) ){
if( sqlite3_open(memDb ? ":memory:" : zDbName, &g.db) ){
fatal_error("Cannot open database file: %s\n", zDbName);
}
#if SQLITE_VERSION_NUMBER>=3006001
if( nLook>0 && szLook>0 ){
pLook = malloc( nLook*szLook );
rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE, pLook, szLook,nLook);
rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE,pLook,szLook,nLook);
if( rc ) fatal_error("lookaside configuration failed: %d\n", rc);
}
#endif
@ -2197,6 +2341,9 @@ int main(int argc, char **argv){
#ifndef SQLITE_OMIT_DEPRECATED
if( doTrace ) sqlite3_trace(g.db, traceCallback, 0);
#endif
if( memDb>0 ){
speedtest1_exec("PRAGMA temp_store=memory");
}
if( mmapSize>0 ){
speedtest1_exec("PRAGMA mmap_size=%d", mmapSize);
}
@ -2236,6 +2383,9 @@ int main(int argc, char **argv){
}else{
zTSet = "";
}
if( g.iTotal>0 || zComma!=0 ){
printf(" Begin testset \"%s\"\n", zThisTest);
}
if( strcmp(zThisTest,"main")==0 ){
testset_main();
}else if( strcmp(zThisTest,"debug1")==0 ){

View File

@ -79,6 +79,10 @@ while test "$1" != ""; do
;;
--legacy)
doWal=0
CC_OPTS="$CC_OPTS -DSPEEDTEST_OMIT_HASH"
;;
--verify)
SPEEDTEST_OPTS="$SPEEDTEST_OPTS --verify"
;;
--wal)
doWal=1