*** pgbench.c.orig	Mon Jan 22 11:17:30 2007
--- pgbench.c	Mon Mar  5 14:59:14 2007
*************** getrand(int min, int max)
*** 188,199 ****
  	return min + (int) (((max - min) * (double) random()) / MAX_RANDOM_VALUE + 0.5);
  }
  
  /* set up a connection to the backend */
  static PGconn *
  doConnect(void)
  {
  	PGconn	   *con;
- 	PGresult   *res;
  
  	con = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName,
  					   login, pwd);
--- 188,213 ----
  	return min + (int) (((max - min) * (double) random()) / MAX_RANDOM_VALUE + 0.5);
  }
  
+ /* call PQexec() and exit() on failure */
+ static void
+ executeStatement(PGconn *con, const char* sql)
+ {
+ 	PGresult   *res;
+ 
+ 	res = PQexec(con, sql);
+ 	if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ 	{
+ 		fprintf(stderr, "%s", PQerrorMessage(con));
+ 		exit(1);
+ 	}
+ 	PQclear(res);
+ }
+ 
  /* set up a connection to the backend */
  static PGconn *
  doConnect(void)
  {
  	PGconn	   *con;
  
  	con = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName,
  					   login, pwd);
*************** doConnect(void)
*** 216,228 ****
  		return (NULL);
  	}
  
! 	res = PQexec(con, "SET search_path = public");
! 	if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 	{
! 		fprintf(stderr, "%s", PQerrorMessage(con));
! 		exit(1);
! 	}
! 	PQclear(res);
  
  	return (con);
  }
--- 230,236 ----
  		return (NULL);
  	}
  
! 	executeStatement(con, "SET search_path = public");
  
  	return (con);
  }
*************** init(void)
*** 720,737 ****
  	PGconn	   *con;
  	PGresult   *res;
  	static char *DDLs[] = {
! 		"drop table branches",
  		"create table branches(bid int not null,bbalance int,filler char(88))",
! 		"drop table tellers",
  		"create table tellers(tid int not null,bid int,tbalance int,filler char(84))",
! 		"drop table accounts",
  		"create table accounts(aid int not null,bid int,abalance int,filler char(84))",
! 		"drop table history",
! 	"create table history(tid int,bid int,aid int,delta int,mtime timestamp,filler char(22))"};
  	static char *DDLAFTERs[] = {
  		"alter table branches add primary key (bid)",
  		"alter table tellers add primary key (tid)",
! 	"alter table accounts add primary key (aid)"};
  
  
  	char		sql[256];
--- 728,745 ----
  	PGconn	   *con;
  	PGresult   *res;
  	static char *DDLs[] = {
! 		"drop table if exists branches",
  		"create table branches(bid int not null,bbalance int,filler char(88))",
! 		"drop table if exists tellers",
  		"create table tellers(tid int not null,bid int,tbalance int,filler char(84))",
! 		"drop table if exists accounts",
  		"create table accounts(aid int not null,bid int,abalance int,filler char(84))",
! 		"drop table if exists history",
! 		"create table history(tid int,bid int,aid int,delta int,mtime timestamp,filler char(22))"};
  	static char *DDLAFTERs[] = {
  		"alter table branches add primary key (bid)",
  		"alter table tellers add primary key (tid)",
! 		"alter table accounts add primary key (aid)"};
  
  
  	char		sql[256];
*************** init(void)
*** 741,817 ****
  	if ((con = doConnect()) == NULL)
  		exit(1);
  
! 	for (i = 0; i < (sizeof(DDLs) / sizeof(char *)); i++)
! 	{
! 		res = PQexec(con, DDLs[i]);
! 		if (strncmp(DDLs[i], "drop", 4) && PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
! 	}
  
! 	res = PQexec(con, "begin");
! 	if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 	{
! 		fprintf(stderr, "%s", PQerrorMessage(con));
! 		exit(1);
! 	}
! 	PQclear(res);
  
  	for (i = 0; i < nbranches * scale; i++)
  	{
  		snprintf(sql, 256, "insert into branches(bid,bbalance) values(%d,0)", i + 1);
! 		res = PQexec(con, sql);
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
  	}
  
  	for (i = 0; i < ntellers * scale; i++)
  	{
  		snprintf(sql, 256, "insert into tellers(tid,bid,tbalance) values (%d,%d,0)"
  				 ,i + 1, i / ntellers + 1);
! 		res = PQexec(con, sql);
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
  	}
  
! 	res = PQexec(con, "end");
! 	if (PQresultStatus(res) != PGRES_COMMAND_OK)
  	{
  		fprintf(stderr, "%s", PQerrorMessage(con));
  		exit(1);
  	}
  	PQclear(res);
  
- 	/*
- 	 * occupy accounts table with some data
- 	 */
- 	fprintf(stderr, "creating tables...\n");
  	for (i = 0; i < naccounts * scale; i++)
  	{
  		int			j = i + 1;
  
- 		if (j % 10000 == 1)
- 		{
- 			res = PQexec(con, "copy accounts from stdin");
- 			if (PQresultStatus(res) != PGRES_COPY_IN)
- 			{
- 				fprintf(stderr, "%s", PQerrorMessage(con));
- 				exit(1);
- 			}
- 			PQclear(res);
- 		}
- 
  		snprintf(sql, 256, "%d\t%d\t%d\t\n", j, i / naccounts + 1, 0);
  		if (PQputline(con, sql))
  		{
--- 749,794 ----
  	if ((con = doConnect()) == NULL)
  		exit(1);
  
! 	for (i = 0; i < lengthof(DDLs); i++)
! 		executeStatement(con, DDLs[i]);
  
! 	executeStatement(con, "begin");
  
  	for (i = 0; i < nbranches * scale; i++)
  	{
  		snprintf(sql, 256, "insert into branches(bid,bbalance) values(%d,0)", i + 1);
! 		executeStatement(con, sql);
  	}
  
  	for (i = 0; i < ntellers * scale; i++)
  	{
  		snprintf(sql, 256, "insert into tellers(tid,bid,tbalance) values (%d,%d,0)"
  				 ,i + 1, i / ntellers + 1);
! 		executeStatement(con, sql);
  	}
  
! 	executeStatement(con, "commit");
! 
! 	/*
! 	 * fill the accounts table with some data
! 	 */
! 	fprintf(stderr, "creating tables...\n");
! 
! 	executeStatement(con, "begin");
! 	executeStatement(con, "truncate accounts");
! 
! 	res = PQexec(con, "copy accounts from stdin");
! 	if (PQresultStatus(res) != PGRES_COPY_IN)
  	{
  		fprintf(stderr, "%s", PQerrorMessage(con));
  		exit(1);
  	}
  	PQclear(res);
  
  	for (i = 0; i < naccounts * scale; i++)
  	{
  		int			j = i + 1;
  
  		snprintf(sql, 256, "%d\t%d\t%d\t\n", j, i / naccounts + 1, 0);
  		if (PQputline(con, sql))
  		{
*************** init(void)
*** 820,881 ****
  		}
  
  		if (j % 10000 == 0)
- 		{
- 			/*
- 			 * every 10000 tuples, we commit the copy command. this should
- 			 * avoid generating too much WAL logs
- 			 */
  			fprintf(stderr, "%d tuples done.\n", j);
- 			if (PQputline(con, "\\.\n"))
- 			{
- 				fprintf(stderr, "very last PQputline failed\n");
- 				exit(1);
- 			}
- 
- 			if (PQendcopy(con))
- 			{
- 				fprintf(stderr, "PQendcopy failed\n");
- 				exit(1);
- 			}
- 
- #ifdef NOT_USED
- 
- 			/*
- 			 * do a checkpoint to purge the old WAL logs
- 			 */
- 			res = PQexec(con, "checkpoint");
- 			if (PQresultStatus(res) != PGRES_COMMAND_OK)
- 			{
- 				fprintf(stderr, "%s", PQerrorMessage(con));
- 				exit(1);
- 			}
- 			PQclear(res);
- #endif   /* NOT_USED */
- 		}
  	}
! 	fprintf(stderr, "set primary key...\n");
! 	for (i = 0; i < (sizeof(DDLAFTERs) / sizeof(char *)); i++)
  	{
! 		res = PQexec(con, DDLAFTERs[i]);
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
  	}
! 
! 	/* vacuum */
! 	fprintf(stderr, "vacuum...");
! 	res = PQexec(con, "vacuum analyze");
! 	if (PQresultStatus(res) != PGRES_COMMAND_OK)
  	{
! 		fprintf(stderr, "%s", PQerrorMessage(con));
  		exit(1);
  	}
! 	PQclear(res);
! 	fprintf(stderr, "done.\n");
  
  	PQfinish(con);
  }
  
--- 797,828 ----
  		}
  
  		if (j % 10000 == 0)
  			fprintf(stderr, "%d tuples done.\n", j);
  	}
! 	if (PQputline(con, "\\.\n"))
  	{
! 		fprintf(stderr, "very last PQputline failed\n");
! 		exit(1);
  	}
! 	if (PQendcopy(con))
  	{
! 		fprintf(stderr, "PQendcopy failed\n");
  		exit(1);
  	}
! 	executeStatement(con, "commit");
! 
! 	/*
! 	 * create indexes
! 	 */
! 	fprintf(stderr, "set primary key...\n");
! 	for (i = 0; i < lengthof(DDLAFTERs); i++)
! 		executeStatement(con, DDLAFTERs[i]);
  
+ 	/* vacuum */
+ 	fprintf(stderr, "vacuum...");
+ 	executeStatement(con, "vacuum analyze");
+ 
+ 	fprintf(stderr, "done.\n");
  	PQfinish(con);
  }
  
*************** main(int argc, char **argv)
*** 1155,1161 ****
  	int			c;
  	int			is_init_mode = 0;		/* initialize mode? */
  	int			is_no_vacuum = 0;		/* no vacuum at all before testing? */
! 	int			is_full_vacuum = 0;		/* do full vacuum before testing? */
  	int			debug = 0;		/* debug flag */
  	int			ttype = 0;		/* transaction type. 0: TPC-B, 1: SELECT only,
  								 * 2: skip update of branches and tellers */
--- 1102,1108 ----
  	int			c;
  	int			is_init_mode = 0;		/* initialize mode? */
  	int			is_no_vacuum = 0;		/* no vacuum at all before testing? */
! 	int			do_vacuum_accounts = 0;	/* do vacuum accounts before testing? */
  	int			debug = 0;		/* debug flag */
  	int			ttype = 0;		/* transaction type. 0: TPC-B, 1: SELECT only,
  								 * 2: skip update of branches and tellers */
*************** main(int argc, char **argv)
*** 1214,1220 ****
  				is_no_vacuum++;
  				break;
  			case 'v':
! 				is_full_vacuum++;
  				break;
  			case 'p':
  				pgport = optarg;
--- 1161,1167 ----
  				is_no_vacuum++;
  				break;
  			case 'v':
! 				do_vacuum_accounts++;
  				break;
  			case 'p':
  				pgport = optarg;
*************** main(int argc, char **argv)
*** 1451,1499 ****
  	if (!is_no_vacuum)
  	{
  		fprintf(stderr, "starting vacuum...");
! 		res = PQexec(con, "vacuum branches");
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
! 
! 		res = PQexec(con, "vacuum tellers");
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
! 
! 		res = PQexec(con, "delete from history");
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
! 		res = PQexec(con, "vacuum history");
! 		if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 		{
! 			fprintf(stderr, "%s", PQerrorMessage(con));
! 			exit(1);
! 		}
! 		PQclear(res);
! 
  		fprintf(stderr, "end.\n");
  
! 		if (is_full_vacuum)
  		{
! 			fprintf(stderr, "starting full vacuum...");
! 			res = PQexec(con, "vacuum analyze accounts");
! 			if (PQresultStatus(res) != PGRES_COMMAND_OK)
! 			{
! 				fprintf(stderr, "%s", PQerrorMessage(con));
! 				exit(1);
! 			}
! 			PQclear(res);
  			fprintf(stderr, "end.\n");
  		}
  	}
--- 1398,1413 ----
  	if (!is_no_vacuum)
  	{
  		fprintf(stderr, "starting vacuum...");
! 		executeStatement(con, "vacuum branches");
! 		executeStatement(con, "vacuum tellers");
! 		executeStatement(con, "delete from history");
! 		executeStatement(con, "vacuum history");
  		fprintf(stderr, "end.\n");
  
! 		if (do_vacuum_accounts)
  		{
! 			fprintf(stderr, "starting vacuum accounts...");
! 			executeStatement(con, "vacuum analyze accounts");
  			fprintf(stderr, "end.\n");
  		}
  	}