15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Performance test for SQLite. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This program reads ASCII text from a file named on the command-line 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and submits that text to SQLite for evaluation. A new database 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is created at the beginning of the program. All statements are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** timed using the high-resolution timer built into Intel-class processors. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To compile this program, first compile the SQLite library separately 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will full optimizations. For example: 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** gcc -c -O6 -DSQLITE_THREADSAFE=0 sqlite3.c 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then link against this program. But to do optimize this program 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** because that defeats the hi-res timer. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** gcc speedtest8.c sqlite3.o -ldl -I../src 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then run this program with a single argument which is the name of 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a file containing SQL script that you want to test: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ./a.out test.db test.sql 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <time.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/times.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sched.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqlite3.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** hwtime.h contains inline assembler code for implementing 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** high-performance timing routines. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hwtime.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Timers 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite_uint64 prepTime = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite_uint64 runTime = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite_uint64 finalizeTime = 0; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Prepare and run a single statement of SQL. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void prepareAndRun(sqlite3 *db, const char *zSql, int bQuiet){ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt *pStmt; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *stmtTail; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_uint64 iStart, iElapse; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet){ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("***************************************************************\n"); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet) printf("SQL statement: [%s]\n", zSql); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3Hwtime(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &stmtTail); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iElapse = sqlite3Hwtime() - iStart; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepTime += iElapse; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet){ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("sqlite3_prepare_v2() returns %d in %llu cycles\n", rc, iElapse); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK ){ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nRow = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3Hwtime(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( (rc=sqlite3_step(pStmt))==SQLITE_ROW ){ nRow++; } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iElapse = sqlite3Hwtime() - iStart; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runTime += iElapse; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet){ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("sqlite3_step() returns %d after %d rows in %llu cycles\n", 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc, nRow, iElapse); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3Hwtime(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_finalize(pStmt); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iElapse = sqlite3Hwtime() - iStart; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) finalizeTime += iElapse; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet){ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("sqlite3_finalize() returns %d in %llu cycles\n", rc, iElapse); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, char **argv){ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nSql; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zSql; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE *in; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_uint64 iStart, iElapse; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_uint64 iSetup = 0; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nStmt = 0; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte = 0; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zArgv0 = argv[0]; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bQuiet = 0; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_MSC_VER) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct tms tmsStart, tmsEnd; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clock_t clkStart, clkEnd; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_OSINST 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern sqlite3_vfs *sqlite3_instvfs_binarylog(char *, char *, char *); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern void sqlite3_instvfs_destroy(sqlite3_vfs *); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs = 0; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (argc>3) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_OSINST 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc>4 && (strcmp(argv[1], "-log")==0) ){ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pVfs = sqlite3_instvfs_binarylog("oslog", 0, argv[2]); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(pVfs, 1); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv += 2; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argc -= 2; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Increasing the priority slightly above normal can help with 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** repeatability of testing. Note that with Cygwin, -5 equates 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to "High", +5 equates to "Low", and anything in between 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** equates to "Normal". 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc>4 && (strcmp(argv[1], "-priority")==0) ){ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_MSC_VER) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_priority = atoi(argv[2]); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(!SetPriorityClass(GetCurrentProcess(), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_priority<=-5) ? HIGH_PRIORITY_CLASS : 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_priority<=0) ? ABOVE_NORMAL_PRIORITY_CLASS : 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_priority==0) ? NORMAL_PRIORITY_CLASS : 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_priority<5) ? BELOW_NORMAL_PRIORITY_CLASS : 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDLE_PRIORITY_CLASS)){ 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf ("error setting priority\n"); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(2); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct sched_param myParam; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sched_getparam(0, &myParam); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf ("Current process priority is %d.\n", (int)myParam.sched_priority); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) myParam.sched_priority = atoi(argv[2]); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf ("Setting process priority to %d.\n", (int)myParam.sched_priority); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sched_setparam (0, &myParam) != 0){ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf ("error setting priority\n"); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(2); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv += 2; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argc -= 2; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc>3 && strcmp(argv[1], "-quiet")==0 ){ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bQuiet = -1; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv++; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argc--; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( argc!=3 ){ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "Usage: %s [options] FILENAME SQL-SCRIPT\n" 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Runs SQL-SCRIPT against a UTF8 database\n" 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\toptions:\n" 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_OSINST 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\t-log <log>\n" 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\t-priority <value> : set priority of task\n" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\t-quiet : only display summary results\n", 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zArgv0); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit(1); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in = fopen(argv[2], "r"); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fseek(in, 0L, SEEK_END); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nSql = ftell(in); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql = malloc( nSql+1 ); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fseek(in, 0L, SEEK_SET); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nSql = fread(zSql, 1, nSql, in); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[nSql] = 0; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("SQLite version: %d\n", sqlite3_libversion_number()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unlink(argv[1]); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_MSC_VER) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clkStart = times(&tmsStart); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3Hwtime(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_open(argv[1], &db); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iElapse = sqlite3Hwtime() - iStart; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iSetup = iElapse; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet) printf("sqlite3_open() returns %d in %llu cycles\n", rc, iElapse); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=j=0; j<nSql; j++){ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zSql[j]==';' ){ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isComplete; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char c = zSql[j+1]; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j+1] = 0; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isComplete = sqlite3_complete(&zSql[i]); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j+1] = c; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isComplete ){ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j] = 0; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( i<j && isspace(zSql[i]) ){ i++; } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<j ){ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = j - i; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n>=6 && memcmp(&zSql[i], ".crash",6)==0 ) exit(1); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nStmt++; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += n; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepareAndRun(db, &zSql[i], bQuiet); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSql[j] = ';'; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = j+1; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3Hwtime(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_close(db); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iElapse = sqlite3Hwtime() - iStart; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_MSC_VER) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clkEnd = times(&tmsEnd); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iSetup += iElapse; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bQuiet) printf("sqlite3_close() returns in %llu cycles\n", iElapse); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("\n"); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Statements run: %15d stmts\n", nStmt); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Bytes of SQL text: %15d bytes\n", nByte); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total prepare time: %15llu cycles\n", prepTime); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total run time: %15llu cycles\n", runTime); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total finalize time: %15llu cycles\n", finalizeTime); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Open/Close time: %15llu cycles\n", iSetup); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total time: %15llu cycles\n", 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prepTime + runTime + finalizeTime + iSetup); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_MSC_VER) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("\n"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total user CPU time: %15.3g secs\n", (tmsEnd.tms_utime - tmsStart.tms_utime)/(double)CLOCKS_PER_SEC ); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total system CPU time: %15.3g secs\n", (tmsEnd.tms_stime - tmsStart.tms_stime)/(double)CLOCKS_PER_SEC ); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Total real time: %15.3g secs\n", (clkEnd -clkStart)/(double)CLOCKS_PER_SEC ); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_OSINST 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pVfs ){ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_instvfs_destroy(pVfs); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("vfs log written to %s\n", argv[0]); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 261