Thanks...progress...now we get a SIGBUS later on...

Program received signal SIGBUS, Bus error.
0x000000000046ce4c in treeShmalloc (pDb=0x6c9728, bAlign=0, nByte=25,
pRc=0x7fffffffd784) at src/lsm_tree.c:668
668             pNext->iNext = 0;

pRc looks suspiciously like it's ready to overflow

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include "sqlite4/sqlite4.h"

#define NRECORDS 50000000

time_t base_seconds;
suseconds_t base_useconds;

double tic() {
  struct timeval tv;
  double f;
  gettimeofday(&tv,NULL);
  base_seconds=tv.tv_sec;
  base_useconds=tv.tv_usec;
  f= base_seconds + base_useconds/1.0e6;
  return f;
}

// returns time in seconds since tic() was called
double toc() {
  struct timeval tv;
  gettimeofday(&tv,NULL);
  double mark=(tv.tv_sec-base_seconds)+(tv.tv_usec-base_useconds)/1.0e6;
  return mark;
}

void checkrc(sqlite4 *db,int rc,int checkrc,int flag,char *msg,char *str) {
  if (rc != checkrc) {
    fprintf(stderr,msg,str);
    fprintf(stderr,"%s\n",sqlite4_errmsg(db));
    if (flag) { // then fatal
      exit(1);
    }
  }
}

int main(int argc, char *argv[]) {
  int rc;
  long i;
  double startTime,stopTime;
  char *sql,*errmsg=NULL;
  char *databaseName="data.db";
  sqlite4 *db;
  sqlite4_env *env=NULL;
  sqlite4_stmt *stmt1,*stmt2;
  remove(databaseName);
  rc =
sqlite4_open(env,"data.db",&db,SQLITE4_OPEN_READWRITE|SQLITE4_OPEN_CREATE,NU
LL);
  checkrc(db,SQLITE4_OK,rc,1,"Error opening database '%s': ",databaseName);
  //sql = "create table if not exists t_foo (key binary(16) primary key,
value binary(16))";
  sql = "create table if not exists t_foo (key binary(16) , value
binary(16))";
  rc=sqlite4_prepare(db,sql,-1,&stmt1,NULL);
  checkrc(db,SQLITE4_OK,rc,1,"Error preparing statement '%s': ",sql);
  rc=sqlite4_step(stmt1);
  checkrc(db,SQLITE4_DONE,rc,1,"Error executing statement '%s': ",sql);
  rc=sqlite4_finalize(stmt1);
  checkrc(db,SQLITE4_OK,rc,1,"Error finalizing statement '%s': ",sql);
  rc=sqlite4_exec(db, "PRAGMA journal_mode=wal",NULL,NULL,&errmsg);
  checkrc(db,SQLITE4_OK,rc,1,"Error on WAL mode statement '%s': ",sql);
  rc=sqlite4_exec(db, "PRAGMA synchronous=OFF",NULL,NULL,&errmsg);
  checkrc(db,SQLITE4_OK,rc,1,"Error on synchronous mode statement '%s':
",sql);
  rc=sqlite4_exec(db, "PRAGMA cache_size=8000",NULL,NULL,&errmsg);
  checkrc(db,SQLITE4_OK,rc,1,"Error on synchronous mode statement '%s':
",sql);
  rc=sqlite4_exec(db, "PRAGMA page_size=4096",NULL,NULL,&errmsg);
  checkrc(db,SQLITE4_OK,rc,1,"Error on synchronous mode statement '%s':
",sql);
  sql="BEGIN";
  rc=sqlite4_exec(db,sql,NULL,NULL,&errmsg);
  checkrc(db,SQLITE4_OK,rc,1,"Error preparing statement '%s': ",sql);
  sql = "insert or replace into t_foo(key,value) values(?,?)";
  rc=sqlite4_prepare(db,sql,-1,&stmt2,NULL);
  checkrc(db,SQLITE4_OK,rc,1,"Error preparing statement '%s': ",sql);
  startTime=tic();
  for(i=0; i<=NRECORDS; ++i) {
    char key[16],value[16];
    long number = random();
    memcpy(key,&number,8);
    memcpy(&key[8],&number,8);
    memcpy(value,&i,8);
    rc=sqlite4_bind_blob(stmt2,1,key,16,SQLITE4_STATIC);
    checkrc(db,SQLITE4_OK,rc,1,"Error bind1 statement '%s': ",sql);
    rc=sqlite4_bind_blob(stmt2,2,value,16,SQLITE4_STATIC);
    checkrc(db,SQLITE4_OK,rc,1,"Error bind2 statement '%s': ",sql);
    rc=sqlite4_step(stmt2);
    checkrc(db,SQLITE4_DONE,rc,1,"Error finalizing statement '%s': ",sql);
    rc=sqlite4_reset(stmt2);
    checkrc(db,SQLITE4_OK,rc,1,"Error resetting statement '%s': ",sql);
#if 0
    if  (i>0&&(i % 1000000)==0) {
      sql="COMMIT";
      rc=sqlite4_exec(db,sql,NULL,NULL,&errmsg);
      checkrc(db,SQLITE4_OK,rc,1,"Error executing statement '%s': ",errmsg);
      sql="BEGIN";
      rc=sqlite4_exec(db,sql,NULL,NULL,&errmsg);
      checkrc(db,SQLITE4_OK,rc,1,"Error executing statement '%s': ",errmsg);
    }
#endif
    if (i>0 && (i % 100000) == 0) {
      //printf("%ld,%g \n",i,100000/toc());
      printf("%g \n",100000/toc());
      fflush(stdout);
      tic();
    }
  }
  rc=sqlite4_finalize(stmt2);
  checkrc(db,SQLITE4_OK,rc,1,"Error finalizing statement '%s': ",sql);
  rc=sqlite4_close(db);
  checkrc(db,SQLITE4_OK,rc,1,"Error closing database'%s': ",databaseName);
  stopTime=tic();
  printf("avg %.0f inserts/sec\n",NRECORDS/(stopTime-startTime));
  return 0;
}

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to