| Index: third_party/sqlite/src/test/speedtest1.c
|
| diff --git a/third_party/sqlite/src/test/speedtest1.c b/third_party/sqlite/src/test/speedtest1.c
|
| index b41c732053c15e1a978a8151bac49bfabc92aaeb..f5b79915c87ccb2007be1aea7012321bbcaa590f 100644
|
| --- a/third_party/sqlite/src/test/speedtest1.c
|
| +++ b/third_party/sqlite/src/test/speedtest1.c
|
| @@ -15,6 +15,7 @@ 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"
|
| + " --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"
|
| @@ -22,6 +23,7 @@ static const char zHelp[] =
|
| " --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"
|
| + " --repeat N Repeat each SELECT N times (default: 1)\n"
|
| " --reprepare Reprepare each statement upon every invocation\n"
|
| " --scratch N SZ Configure scratch memory for N slots of SZ bytes each\n"
|
| " --serialized Set serialized threading mode\n"
|
| @@ -30,6 +32,7 @@ static const char zHelp[] =
|
| " --shrink-memory Invoke sqlite3_db_release_memory() frequently.\n"
|
| " --size N Relative test size. Default=100\n"
|
| " --stats Show statistics at the end\n"
|
| + " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n"
|
| " --testset T Run test-set T\n"
|
| " --trace Turn on SQL tracing\n"
|
| " --threads N Use up to N threads for sorting\n"
|
| @@ -47,15 +50,17 @@ static const char zHelp[] =
|
| #include <stdarg.h>
|
| #include <string.h>
|
| #include <ctype.h>
|
| +#ifndef _WIN32
|
| +# include <unistd.h>
|
| +#else
|
| +# include <io.h>
|
| +#endif
|
| #define ISSPACE(X) isspace((unsigned char)(X))
|
| #define ISDIGIT(X) isdigit((unsigned char)(X))
|
|
|
| #if SQLITE_VERSION_NUMBER<3005000
|
| # define sqlite3_int64 sqlite_int64
|
| #endif
|
| -#ifdef SQLITE_ENABLE_RBU
|
| -# include "sqlite3rbu.h"
|
| -#endif
|
|
|
| /* All global state is held in this structure */
|
| static struct Global {
|
| @@ -69,7 +74,9 @@ static struct Global {
|
| int bExplain; /* Print SQL with EXPLAIN prefix */
|
| int bVerify; /* Try to verify that results are correct */
|
| int bMemShrink; /* Call sqlite3_db_release_memory() often */
|
| + int eTemp; /* 0: no TEMP. 9: always TEMP. */
|
| int szTest; /* Scale factor for test iterations */
|
| + int nRepeat; /* Repeat selects this many times */
|
| const char *zWR; /* Might be WITHOUT ROWID */
|
| const char *zNN; /* Might be NOT NULL */
|
| const char *zPK; /* Might be UNIQUE or PRIMARY KEY */
|
| @@ -78,6 +85,12 @@ static struct Global {
|
| char zResult[3000]; /* Text of the current result */
|
| } g;
|
|
|
| +/* Return " TEMP" or "", as appropriate for creating a table.
|
| +*/
|
| +static const char *isTemp(int N){
|
| + return g.eTemp>=N ? " TEMP" : "";
|
| +}
|
| +
|
|
|
| /* Print an error message and exit */
|
| static void fatal_error(const char *zMsg, ...){
|
| @@ -413,12 +426,14 @@ void speedtest1_run(void){
|
| speedtest1_shrink_memory();
|
| }
|
|
|
| +#ifndef SQLITE_OMIT_DEPRECATED
|
| /* The sqlite3_trace() callback function */
|
| static void traceCallback(void *NotUsed, const char *zSql){
|
| int n = (int)strlen(zSql);
|
| while( n>0 && (zSql[n-1]==';' || ISSPACE(zSql[n-1])) ) n--;
|
| fprintf(stderr,"%.*s;\n", n, zSql);
|
| }
|
| +#endif /* SQLITE_OMIT_DEPRECATED */
|
|
|
| /* Substitute random() function that gives the same random
|
| ** sequence on each run, for repeatability. */
|
| @@ -443,6 +458,68 @@ static int est_square_root(int x){
|
| return y0;
|
| }
|
|
|
| +
|
| +#if SQLITE_VERSION_NUMBER<3005004
|
| +/*
|
| +** An implementation of group_concat(). Used only when testing older
|
| +** versions of SQLite that lack the built-in group_concat().
|
| +*/
|
| +struct groupConcat {
|
| + char *z;
|
| + int nAlloc;
|
| + int nUsed;
|
| +};
|
| +static void groupAppend(struct groupConcat *p, const char *z, int n){
|
| + if( p->nUsed+n >= p->nAlloc ){
|
| + int n2 = (p->nAlloc+n+1)*2;
|
| + char *z2 = sqlite3_realloc(p->z, n2);
|
| + if( z2==0 ) return;
|
| + p->z = z2;
|
| + p->nAlloc = n2;
|
| + }
|
| + memcpy(p->z+p->nUsed, z, n);
|
| + p->nUsed += n;
|
| +}
|
| +static void groupStep(
|
| + sqlite3_context *context,
|
| + int argc,
|
| + sqlite3_value **argv
|
| +){
|
| + const char *zVal;
|
| + struct groupConcat *p;
|
| + const char *zSep;
|
| + int nVal, nSep;
|
| + assert( argc==1 || argc==2 );
|
| + if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
|
| + p= (struct groupConcat*)sqlite3_aggregate_context(context, sizeof(*p));
|
| +
|
| + if( p ){
|
| + int firstTerm = p->nUsed==0;
|
| + if( !firstTerm ){
|
| + if( argc==2 ){
|
| + zSep = (char*)sqlite3_value_text(argv[1]);
|
| + nSep = sqlite3_value_bytes(argv[1]);
|
| + }else{
|
| + zSep = ",";
|
| + nSep = 1;
|
| + }
|
| + if( nSep ) groupAppend(p, zSep, nSep);
|
| + }
|
| + zVal = (char*)sqlite3_value_text(argv[0]);
|
| + nVal = sqlite3_value_bytes(argv[0]);
|
| + if( zVal ) groupAppend(p, zVal, nVal);
|
| + }
|
| +}
|
| +static void groupFinal(sqlite3_context *context){
|
| + struct groupConcat *p;
|
| + p = sqlite3_aggregate_context(context, 0);
|
| + if( p && p->z ){
|
| + p->z[p->nUsed] = 0;
|
| + sqlite3_result_text(context, p->z, p->nUsed, sqlite3_free);
|
| + }
|
| +}
|
| +#endif
|
| +
|
| /*
|
| ** The main and default testset
|
| */
|
| @@ -451,16 +528,17 @@ void testset_main(void){
|
| int n; /* iteration count */
|
| int sz; /* Size of the tables */
|
| int maxb; /* Maximum swizzled value */
|
| - unsigned x1, x2; /* Parameters */
|
| - int len; /* Length of the zNum[] string */
|
| + unsigned x1 = 0, x2 = 0; /* Parameters */
|
| + int len = 0; /* Length of the zNum[] string */
|
| char zNum[2000]; /* A number name */
|
|
|
| sz = n = g.szTest*500;
|
| + zNum[0] = 0;
|
| maxb = roundup_allones(sz);
|
| speedtest1_begin_test(100, "%d INSERTs into table with no index", n);
|
| speedtest1_exec("BEGIN");
|
| - speedtest1_exec("CREATE TABLE t1(a INTEGER %s, b INTEGER %s, c TEXT %s);",
|
| - g.zNN, g.zNN, g.zNN);
|
| + speedtest1_exec("CREATE%s TABLE t1(a INTEGER %s, b INTEGER %s, c TEXT %s);",
|
| + isTemp(9), g.zNN, g.zNN, g.zNN);
|
| speedtest1_prepare("INSERT INTO t1 VALUES(?1,?2,?3); -- %d times", n);
|
| for(i=1; i<=n; i++){
|
| x1 = swizzle(i,maxb);
|
| @@ -477,8 +555,9 @@ void testset_main(void){
|
| n = sz;
|
| speedtest1_begin_test(110, "%d ordered INSERTS with one index/PK", n);
|
| speedtest1_exec("BEGIN");
|
| - speedtest1_exec("CREATE TABLE t2(a INTEGER %s %s, b INTEGER %s, c TEXT %s) %s",
|
| - g.zNN, g.zPK, g.zNN, g.zNN, g.zWR);
|
| + speedtest1_exec(
|
| + "CREATE%s TABLE t2(a INTEGER %s %s, b INTEGER %s, c TEXT %s) %s",
|
| + isTemp(5), g.zNN, g.zPK, g.zNN, g.zNN, g.zWR);
|
| speedtest1_prepare("INSERT INTO t2 VALUES(?1,?2,?3); -- %d times", n);
|
| for(i=1; i<=n; i++){
|
| x1 = swizzle(i,maxb);
|
| @@ -495,8 +574,9 @@ void testset_main(void){
|
| n = sz;
|
| speedtest1_begin_test(120, "%d unordered INSERTS with one index/PK", n);
|
| speedtest1_exec("BEGIN");
|
| - speedtest1_exec("CREATE TABLE t3(a INTEGER %s %s, b INTEGER %s, c TEXT %s) %s",
|
| - g.zNN, g.zPK, g.zNN, g.zNN, g.zWR);
|
| + speedtest1_exec(
|
| + "CREATE%s TABLE t3(a INTEGER %s %s, b INTEGER %s, c TEXT %s) %s",
|
| + isTemp(3), g.zNN, g.zPK, g.zNN, g.zNN, g.zWR);
|
| speedtest1_prepare("INSERT INTO t3 VALUES(?1,?2,?3); -- %d times", n);
|
| for(i=1; i<=n; i++){
|
| x1 = swizzle(i,maxb);
|
| @@ -509,17 +589,23 @@ void testset_main(void){
|
| speedtest1_exec("COMMIT");
|
| speedtest1_end_test();
|
|
|
| +#if SQLITE_VERSION_NUMBER<3005004
|
| + sqlite3_create_function(g.db, "group_concat", 1, SQLITE_UTF8, 0,
|
| + 0, groupStep, groupFinal);
|
| +#endif
|
|
|
| n = 25;
|
| speedtest1_begin_test(130, "%d SELECTS, numeric BETWEEN, unindexed", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_prepare(
|
| - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n"
|
| + "SELECT count(*), avg(b), sum(length(c)), group_concat(c) FROM t1\n"
|
| " WHERE b BETWEEN ?1 AND ?2; -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = speedtest1_random()%maxb;
|
| - x2 = speedtest1_random()%10 + sz/5000 + x1;
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = speedtest1_random()%maxb;
|
| + x2 = speedtest1_random()%10 + sz/5000 + x1;
|
| + }
|
| sqlite3_bind_int(g.pStmt, 1, x1);
|
| sqlite3_bind_int(g.pStmt, 2, x2);
|
| speedtest1_run();
|
| @@ -532,16 +618,18 @@ void testset_main(void){
|
| speedtest1_begin_test(140, "%d SELECTS, LIKE, unindexed", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_prepare(
|
| - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n"
|
| + "SELECT count(*), avg(b), sum(length(c)), group_concat(c) FROM t1\n"
|
| " WHERE c LIKE ?1; -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = speedtest1_random()%maxb;
|
| - zNum[0] = '%';
|
| - len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2);
|
| - zNum[len] = '%';
|
| - zNum[len+1] = 0;
|
| - sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC);
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = speedtest1_random()%maxb;
|
| + zNum[0] = '%';
|
| + len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2);
|
| + zNum[len] = '%';
|
| + zNum[len+1] = 0;
|
| + }
|
| + sqlite3_bind_text(g.pStmt, 1, zNum, len+1, SQLITE_STATIC);
|
| speedtest1_run();
|
| }
|
| speedtest1_exec("COMMIT");
|
| @@ -556,12 +644,14 @@ void testset_main(void){
|
| " ORDER BY a; -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = speedtest1_random()%maxb;
|
| - zNum[0] = '%';
|
| - len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2);
|
| - zNum[len] = '%';
|
| - zNum[len+1] = 0;
|
| - sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC);
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = speedtest1_random()%maxb;
|
| + zNum[0] = '%';
|
| + len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2);
|
| + zNum[len] = '%';
|
| + zNum[len+1] = 0;
|
| + }
|
| + sqlite3_bind_text(g.pStmt, 1, zNum, len+1, SQLITE_STATIC);
|
| speedtest1_run();
|
| }
|
| speedtest1_exec("COMMIT");
|
| @@ -575,12 +665,14 @@ void testset_main(void){
|
| " ORDER BY a LIMIT 10; -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = speedtest1_random()%maxb;
|
| - zNum[0] = '%';
|
| - len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2);
|
| - zNum[len] = '%';
|
| - zNum[len+1] = 0;
|
| - sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC);
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = speedtest1_random()%maxb;
|
| + zNum[0] = '%';
|
| + len = speedtest1_numbername(i, zNum+1, sizeof(zNum)-2);
|
| + zNum[len] = '%';
|
| + zNum[len+1] = 0;
|
| + }
|
| + sqlite3_bind_text(g.pStmt, 1, zNum, len+1, SQLITE_STATIC);
|
| speedtest1_run();
|
| }
|
| speedtest1_exec("COMMIT");
|
| @@ -602,12 +694,14 @@ void testset_main(void){
|
| speedtest1_begin_test(160, "%d SELECTS, numeric BETWEEN, indexed", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_prepare(
|
| - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n"
|
| + "SELECT count(*), avg(b), sum(length(c)), group_concat(a) FROM t1\n"
|
| " WHERE b BETWEEN ?1 AND ?2; -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = speedtest1_random()%maxb;
|
| - x2 = speedtest1_random()%10 + sz/5000 + x1;
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = speedtest1_random()%maxb;
|
| + x2 = speedtest1_random()%10 + sz/5000 + x1;
|
| + }
|
| sqlite3_bind_int(g.pStmt, 1, x1);
|
| sqlite3_bind_int(g.pStmt, 2, x2);
|
| speedtest1_run();
|
| @@ -620,12 +714,14 @@ void testset_main(void){
|
| speedtest1_begin_test(161, "%d SELECTS, numeric BETWEEN, PK", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_prepare(
|
| - "SELECT count(*), avg(b), sum(length(c)) FROM t2\n"
|
| + "SELECT count(*), avg(b), sum(length(c)), group_concat(a) FROM t2\n"
|
| " WHERE a BETWEEN ?1 AND ?2; -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = speedtest1_random()%maxb;
|
| - x2 = speedtest1_random()%10 + sz/5000 + x1;
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = speedtest1_random()%maxb;
|
| + x2 = speedtest1_random()%10 + sz/5000 + x1;
|
| + }
|
| sqlite3_bind_int(g.pStmt, 1, x1);
|
| sqlite3_bind_int(g.pStmt, 2, x2);
|
| speedtest1_run();
|
| @@ -638,12 +734,14 @@ void testset_main(void){
|
| speedtest1_begin_test(170, "%d SELECTS, text BETWEEN, indexed", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_prepare(
|
| - "SELECT count(*), avg(b), sum(length(c)) FROM t1\n"
|
| + "SELECT count(*), avg(b), sum(length(c)), group_concat(a) FROM t1\n"
|
| " WHERE c BETWEEN ?1 AND (?1||'~'); -- %d times", n
|
| );
|
| for(i=1; i<=n; i++){
|
| - x1 = swizzle(i, maxb);
|
| - len = speedtest1_numbername(x1, zNum, sizeof(zNum)-1);
|
| + if( (i-1)%g.nRepeat==0 ){
|
| + x1 = swizzle(i, maxb);
|
| + len = speedtest1_numbername(x1, zNum, sizeof(zNum)-1);
|
| + }
|
| sqlite3_bind_text(g.pStmt, 1, zNum, len, SQLITE_STATIC);
|
| speedtest1_run();
|
| }
|
| @@ -654,12 +752,12 @@ void testset_main(void){
|
| speedtest1_begin_test(180, "%d INSERTS with three indexes", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_exec(
|
| - "CREATE TABLE t4(\n"
|
| + "CREATE%s TABLE t4(\n"
|
| " a INTEGER %s %s,\n"
|
| " b INTEGER %s,\n"
|
| " c TEXT %s\n"
|
| ") %s",
|
| - g.zNN, g.zPK, g.zNN, g.zNN, g.zWR);
|
| + isTemp(1), g.zNN, g.zPK, g.zNN, g.zNN, g.zWR);
|
| speedtest1_exec("CREATE INDEX t4b ON t4(b)");
|
| speedtest1_exec("CREATE INDEX t4c ON t4(c)");
|
| speedtest1_exec("INSERT INTO t4 SELECT * FROM t1");
|
| @@ -802,6 +900,65 @@ void testset_main(void){
|
| speedtest1_run();
|
| speedtest1_end_test();
|
|
|
| + sz = n = g.szTest*700;
|
| + zNum[0] = 0;
|
| + maxb = roundup_allones(sz/3);
|
| + speedtest1_begin_test(400, "%d REPLACE ops on an IPK", n);
|
| + speedtest1_exec("BEGIN");
|
| + speedtest1_exec("CREATE%s TABLE t5(a INTEGER PRIMARY KEY, b %s);",
|
| + isTemp(9), g.zNN);
|
| + speedtest1_prepare("REPLACE INTO t5 VALUES(?1,?2); -- %d times",n);
|
| + for(i=1; i<=n; i++){
|
| + x1 = swizzle(i,maxb);
|
| + speedtest1_numbername(i, zNum, sizeof(zNum));
|
| + sqlite3_bind_int(g.pStmt, 1, (sqlite3_int64)x1);
|
| + sqlite3_bind_text(g.pStmt, 2, zNum, -1, SQLITE_STATIC);
|
| + speedtest1_run();
|
| + }
|
| + speedtest1_exec("COMMIT");
|
| + speedtest1_end_test();
|
| + speedtest1_begin_test(410, "%d SELECTS on an IPK", n);
|
| + speedtest1_prepare("SELECT b FROM t5 WHERE a=?1; -- %d times",n);
|
| + for(i=1; i<=n; i++){
|
| + x1 = swizzle(i,maxb);
|
| + sqlite3_bind_int(g.pStmt, 1, (sqlite3_int64)x1);
|
| + speedtest1_run();
|
| + }
|
| + speedtest1_end_test();
|
| +
|
| + sz = n = g.szTest*700;
|
| + zNum[0] = 0;
|
| + maxb = roundup_allones(sz/3);
|
| + speedtest1_begin_test(500, "%d REPLACE on TEXT PK", n);
|
| + speedtest1_exec("BEGIN");
|
| + speedtest1_exec("CREATE%s TABLE t6(a TEXT PRIMARY KEY, b %s)%s;",
|
| + isTemp(9), g.zNN,
|
| + sqlite3_libversion_number()>=3008002 ? "WITHOUT ROWID" : "");
|
| + speedtest1_prepare("REPLACE INTO t6 VALUES(?1,?2); -- %d times",n);
|
| + for(i=1; i<=n; i++){
|
| + x1 = swizzle(i,maxb);
|
| + speedtest1_numbername(x1, zNum, sizeof(zNum));
|
| + sqlite3_bind_int(g.pStmt, 2, i);
|
| + sqlite3_bind_text(g.pStmt, 1, zNum, -1, SQLITE_STATIC);
|
| + speedtest1_run();
|
| + }
|
| + speedtest1_exec("COMMIT");
|
| + speedtest1_end_test();
|
| + speedtest1_begin_test(510, "%d SELECTS on a TEXT PK", n);
|
| + speedtest1_prepare("SELECT b FROM t6 WHERE a=?1; -- %d times",n);
|
| + for(i=1; i<=n; i++){
|
| + x1 = swizzle(i,maxb);
|
| + speedtest1_numbername(x1, zNum, sizeof(zNum));
|
| + sqlite3_bind_text(g.pStmt, 1, zNum, -1, SQLITE_STATIC);
|
| + speedtest1_run();
|
| + }
|
| + speedtest1_end_test();
|
| + speedtest1_begin_test(520, "%d SELECT DISTINCT", n);
|
| + speedtest1_exec("SELECT DISTINCT b FROM t5;");
|
| + speedtest1_exec("SELECT DISTINCT b FROM t6;");
|
| + speedtest1_end_test();
|
| +
|
| +
|
| speedtest1_begin_test(980, "PRAGMA integrity_check");
|
| speedtest1_exec("PRAGMA integrity_check");
|
| speedtest1_end_test();
|
| @@ -1021,10 +1178,10 @@ void testset_rtree(int p1, int p2){
|
| unsigned mxCoord;
|
| unsigned x0, x1, y0, y1, z0, z1;
|
| unsigned iStep;
|
| - int *aCheck = sqlite3_malloc( sizeof(int)*g.szTest*100 );
|
| + int *aCheck = sqlite3_malloc( sizeof(int)*g.szTest*500 );
|
|
|
| mxCoord = 15000;
|
| - n = g.szTest*100;
|
| + n = g.szTest*500;
|
| speedtest1_begin_test(100, "%d INSERTs into an r-tree", n);
|
| speedtest1_exec("BEGIN");
|
| speedtest1_exec("CREATE VIRTUAL TABLE rt1 USING rtree(id,x0,x1,y0,y1,z0,z1)");
|
| @@ -1051,7 +1208,7 @@ void testset_rtree(int p1, int p2){
|
| speedtest1_exec("INSERT INTO t1 SELECT * FROM rt1");
|
| speedtest1_end_test();
|
|
|
| - n = g.szTest*20;
|
| + n = g.szTest*100;
|
| speedtest1_begin_test(110, "%d one-dimensional intersect slice queries", n);
|
| speedtest1_prepare("SELECT count(*) FROM rt1 WHERE x0>=?1 AND x1<=?2");
|
| iStep = mxCoord/n;
|
| @@ -1064,7 +1221,7 @@ void testset_rtree(int p1, int p2){
|
| speedtest1_end_test();
|
|
|
| if( g.bVerify ){
|
| - n = g.szTest*20;
|
| + n = g.szTest*100;
|
| speedtest1_begin_test(111, "Verify result from 1-D intersect slice queries");
|
| speedtest1_prepare("SELECT count(*) FROM t1 WHERE x0>=?1 AND x1<=?2");
|
| iStep = mxCoord/n;
|
| @@ -1080,7 +1237,7 @@ void testset_rtree(int p1, int p2){
|
| speedtest1_end_test();
|
| }
|
|
|
| - n = g.szTest*20;
|
| + n = g.szTest*100;
|
| speedtest1_begin_test(120, "%d one-dimensional overlap slice queries", n);
|
| speedtest1_prepare("SELECT count(*) FROM rt1 WHERE y1>=?1 AND y0<=?2");
|
| iStep = mxCoord/n;
|
| @@ -1093,7 +1250,7 @@ void testset_rtree(int p1, int p2){
|
| speedtest1_end_test();
|
|
|
| if( g.bVerify ){
|
| - n = g.szTest*20;
|
| + n = g.szTest*100;
|
| speedtest1_begin_test(121, "Verify result from 1-D overlap slice queries");
|
| speedtest1_prepare("SELECT count(*) FROM t1 WHERE y1>=?1 AND y0<=?2");
|
| iStep = mxCoord/n;
|
| @@ -1110,7 +1267,7 @@ void testset_rtree(int p1, int p2){
|
| }
|
|
|
|
|
| - n = g.szTest*20;
|
| + n = g.szTest*100;
|
| speedtest1_begin_test(125, "%d custom geometry callback queries", n);
|
| sqlite3_rtree_geometry_callback(g.db, "xslice", xsliceGeometryCallback, 0);
|
| speedtest1_prepare("SELECT count(*) FROM rt1 WHERE id MATCH xslice(?1,?2)");
|
| @@ -1126,7 +1283,7 @@ void testset_rtree(int p1, int p2){
|
| }
|
| speedtest1_end_test();
|
|
|
| - n = g.szTest*80;
|
| + n = g.szTest*400;
|
| speedtest1_begin_test(130, "%d three-dimensional intersect box queries", n);
|
| speedtest1_prepare("SELECT count(*) FROM rt1 WHERE x1>=?1 AND x0<=?2"
|
| " AND y1>=?1 AND y0<=?2 AND z1>=?1 AND z0<=?2");
|
| @@ -1139,7 +1296,7 @@ void testset_rtree(int p1, int p2){
|
| }
|
| speedtest1_end_test();
|
|
|
| - n = g.szTest*100;
|
| + n = g.szTest*500;
|
| speedtest1_begin_test(140, "%d rowid queries", n);
|
| speedtest1_prepare("SELECT * FROM rt1 WHERE id=?1");
|
| for(i=1; i<=n; i++){
|
| @@ -1167,6 +1324,49 @@ void testset_debug1(void){
|
| }
|
| }
|
|
|
| +#ifdef __linux__
|
| +#include <sys/types.h>
|
| +#include <unistd.h>
|
| +
|
| +/*
|
| +** Attempt to display I/O stats on Linux using /proc/PID/io
|
| +*/
|
| +static void displayLinuxIoStats(FILE *out){
|
| + FILE *in;
|
| + char z[200];
|
| + sqlite3_snprintf(sizeof(z), z, "/proc/%d/io", getpid());
|
| + in = fopen(z, "rb");
|
| + if( in==0 ) return;
|
| + while( fgets(z, sizeof(z), in)!=0 ){
|
| + static const struct {
|
| + const char *zPattern;
|
| + const char *zDesc;
|
| + } aTrans[] = {
|
| + { "rchar: ", "Bytes received by read():" },
|
| + { "wchar: ", "Bytes sent to write():" },
|
| + { "syscr: ", "Read() system calls:" },
|
| + { "syscw: ", "Write() system calls:" },
|
| + { "read_bytes: ", "Bytes rcvd from storage:" },
|
| + { "write_bytes: ", "Bytes sent to storage:" },
|
| + { "cancelled_write_bytes: ", "Cancelled write bytes:" },
|
| + };
|
| + int i;
|
| + for(i=0; i<sizeof(aTrans)/sizeof(aTrans[0]); i++){
|
| + int n = (int)strlen(aTrans[i].zPattern);
|
| + if( strncmp(aTrans[i].zPattern, z, n)==0 ){
|
| + fprintf(out, "-- %-28s %s", aTrans[i].zDesc, &z[n]);
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + fclose(in);
|
| +}
|
| +#endif
|
| +
|
| +#if SQLITE_VERSION_NUMBER<3006018
|
| +# define sqlite3_sourceid(X) "(before 3.6.18)"
|
| +#endif
|
| +
|
| int main(int argc, char **argv){
|
| int doAutovac = 0; /* True for --autovacuum */
|
| int cacheSize = 0; /* Desired cache size. 0 means default */
|
| @@ -1175,7 +1375,7 @@ int main(int argc, char **argv){
|
| int doIncrvac = 0; /* True for --incrvacuum */
|
| const char *zJMode = 0; /* Journal mode */
|
| const char *zKey = 0; /* Encryption key */
|
| - int nLook = 0, szLook = 0; /* --lookaside configuration */
|
| + int nLook = -1, szLook = 0; /* --lookaside configuration */
|
| int noSync = 0; /* True for --nosync */
|
| int pageSize = 0; /* Desired page size. 0 means default */
|
| int nPCache = 0, szPCache = 0;/* --pcache configuration */
|
| @@ -1183,6 +1383,7 @@ int main(int argc, char **argv){
|
| int nScratch = 0, szScratch=0;/* --scratch configuration */
|
| int showStats = 0; /* True for --stats */
|
| int nThread = 0; /* --threads value */
|
| + int mmapSize = 0; /* How big of a memory map to use */
|
| const char *zTSet = "main"; /* Which --testset torun */
|
| int doTrace = 0; /* True for --trace */
|
| const char *zEncoding = 0; /* --utf16be or --utf16le */
|
| @@ -1196,11 +1397,16 @@ int main(int argc, char **argv){
|
| int i; /* Loop counter */
|
| int rc; /* API return code */
|
|
|
| + /* Display the version of SQLite being tested */
|
| + printf("-- Speedtest1 for SQLite %s %.50s\n",
|
| + sqlite3_libversion(), sqlite3_sourceid());
|
| +
|
| /* Process command-line arguments */
|
| g.zWR = "";
|
| g.zNN = "";
|
| g.zPK = "UNIQUE";
|
| g.szTest = 100;
|
| + g.nRepeat = 1;
|
| for(i=1; i<argc; i++){
|
| const char *z = argv[i];
|
| if( z[0]=='-' ){
|
| @@ -1234,19 +1440,21 @@ int main(int argc, char **argv){
|
| nLook = integerValue(argv[i+1]);
|
| szLook = integerValue(argv[i+2]);
|
| i += 2;
|
| +#if SQLITE_VERSION_NUMBER>=3006000
|
| }else if( strcmp(z,"multithread")==0 ){
|
| sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
|
| }else if( strcmp(z,"nomemstat")==0 ){
|
| sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0);
|
| +#endif
|
| +#if SQLITE_VERSION_NUMBER>=3007017
|
| + }else if( strcmp(z, "mmap")==0 ){
|
| + if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
|
| + mmapSize = integerValue(argv[++i]);
|
| + #endif
|
| }else if( strcmp(z,"nosync")==0 ){
|
| noSync = 1;
|
| }else if( strcmp(z,"notnull")==0 ){
|
| g.zNN = "NOT NULL";
|
| -#ifdef SQLITE_ENABLE_RBU
|
| - }else if( strcmp(z,"rbu")==0 ){
|
| - sqlite3ota_create_vfs("rbu", 0);
|
| - sqlite3_vfs_register(sqlite3_vfs_find("rbu"), 1);
|
| -#endif
|
| }else if( strcmp(z,"pagesize")==0 ){
|
| if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
|
| pageSize = integerValue(argv[++i]);
|
| @@ -1258,6 +1466,10 @@ int main(int argc, char **argv){
|
| i += 2;
|
| }else if( strcmp(z,"primarykey")==0 ){
|
| g.zPK = "PRIMARY KEY";
|
| + }else if( strcmp(z,"repeat")==0 ){
|
| + if( i>=argc-1 ) fatal_error("missing arguments on %s\n", argv[i]);
|
| + g.nRepeat = integerValue(argv[i+1]);
|
| + i += 1;
|
| }else if( strcmp(z,"reprepare")==0 ){
|
| g.bReprepare = 1;
|
| }else if( strcmp(z,"scratch")==0 ){
|
| @@ -1265,10 +1477,12 @@ int main(int argc, char **argv){
|
| nScratch = integerValue(argv[i+1]);
|
| szScratch = integerValue(argv[i+2]);
|
| i += 2;
|
| +#if SQLITE_VERSION_NUMBER>=3006000
|
| }else if( strcmp(z,"serialized")==0 ){
|
| sqlite3_config(SQLITE_CONFIG_SERIALIZED);
|
| }else if( strcmp(z,"singlethread")==0 ){
|
| sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
|
| +#endif
|
| }else if( strcmp(z,"sqlonly")==0 ){
|
| g.bSqlOnly = 1;
|
| }else if( strcmp(z,"shrink-memory")==0 ){
|
| @@ -1278,6 +1492,13 @@ int main(int argc, char **argv){
|
| g.szTest = integerValue(argv[++i]);
|
| }else if( strcmp(z,"stats")==0 ){
|
| showStats = 1;
|
| + }else if( strcmp(z,"temp")==0 ){
|
| + if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
|
| + i++;
|
| + if( argv[i][0]<'0' || argv[i][0]>'9' || argv[i][1]!=0 ){
|
| + fatal_error("argument to --temp should be integer between 0 and 9");
|
| + }
|
| + g.eTemp = argv[i][0] - '0';
|
| }else if( strcmp(z,"testset")==0 ){
|
| if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
|
| zTSet = argv[++i];
|
| @@ -1309,11 +1530,7 @@ int main(int argc, char **argv){
|
| argv[i], argv[0]);
|
| }
|
| }
|
| -#if 0
|
| - if( zDbName==0 ){
|
| - fatal_error(zHelp, argv[0]);
|
| - }
|
| -#endif
|
| + if( zDbName!=0 ) unlink(zDbName);
|
| #if SQLITE_VERSION_NUMBER>=3006001
|
| if( nHeap>0 ){
|
| pHeap = malloc( nHeap );
|
| @@ -1337,7 +1554,7 @@ int main(int argc, char **argv){
|
| rc = sqlite3_config(SQLITE_CONFIG_SCRATCH, pScratch, szScratch, nScratch);
|
| if( rc ) fatal_error("scratch configuration failed: %d\n", rc);
|
| }
|
| - if( nLook>0 ){
|
| + if( nLook>=0 ){
|
| sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 0, 0);
|
| }
|
| #endif
|
| @@ -1356,7 +1573,12 @@ int main(int argc, char **argv){
|
|
|
| /* Set database connection options */
|
| sqlite3_create_function(g.db, "random", 0, SQLITE_UTF8, 0, randomFunc, 0, 0);
|
| +#ifndef SQLITE_OMIT_DEPRECATED
|
| if( doTrace ) sqlite3_trace(g.db, traceCallback, 0);
|
| +#endif
|
| + if( mmapSize>0 ){
|
| + speedtest1_exec("PRAGMA mmap_size=%d", mmapSize);
|
| + }
|
| speedtest1_exec("PRAGMA threads=%d", nThread);
|
| if( zKey ){
|
| speedtest1_exec("PRAGMA key('%s')", zKey);
|
| @@ -1457,6 +1679,12 @@ int main(int argc, char **argv){
|
| }
|
| #endif
|
|
|
| +#ifdef __linux__
|
| + if( showStats ){
|
| + displayLinuxIoStats(stdout);
|
| + }
|
| +#endif
|
| +
|
| /* Release memory */
|
| free( pLook );
|
| free( pPCache );
|
|
|