Sawada Masahiko <sawada.m...@gmail.com> writes:
> I attached the patch which solves this problem, and have submitted to CF3.
> I changed how to get the SQL from custom script file.

This needed a bit of work:

- Use of strncat didn't seem particularly safe, or efficient.  I changed
it to explicitly account for space consumption in the result buffer.
- It leaked the buffer space used.  While this likely doesn't matter for
foreseeable usage, it seemed worth fixing.
- Didn't do the right thing for a file not ending with a newline.
- Didn't follow project code layout standards.

I've committed the attached revised version.

                        regards, tom lane

diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c
index fff71e5..2c96fae 100644
*** a/contrib/pgbench/pgbench.c
--- b/contrib/pgbench/pgbench.c
*************** process_commands(char *buf)
*** 2016,2021 ****
--- 2016,2064 ----
  	return my_commands;
  }
  
+ /*
+  * Read a line from fd, and return it in a malloc'd buffer.
+  * Return NULL at EOF.
+  *
+  * The buffer will typically be larger than necessary, but we don't care
+  * in this program, because we'll free it as soon as we've parsed the line.
+  */
+ static char *
+ read_line_from_file(FILE *fd)
+ {
+ 	char		tmpbuf[BUFSIZ];
+ 	char	   *buf;
+ 	size_t		buflen = BUFSIZ;
+ 	size_t		used = 0;
+ 
+ 	buf = (char *) palloc(buflen);
+ 	buf[0] = '\0';
+ 
+ 	while (fgets(tmpbuf, BUFSIZ, fd) != NULL)
+ 	{
+ 		size_t		thislen = strlen(tmpbuf);
+ 
+ 		/* Append tmpbuf to whatever we had already */
+ 		memcpy(buf + used, tmpbuf, thislen + 1);
+ 		used += thislen;
+ 
+ 		/* Done if we collected a newline */
+ 		if (thislen > 0 && tmpbuf[thislen - 1] == '\n')
+ 			break;
+ 
+ 		/* Else, enlarge buf to ensure we can append next bufferload */
+ 		buflen += BUFSIZ;
+ 		buf = (char *) pg_realloc(buf, buflen);
+ 	}
+ 
+ 	if (used > 0)
+ 		return buf;
+ 
+ 	/* Reached EOF */
+ 	free(buf);
+ 	return NULL;
+ }
+ 
  static int
  process_file(char *filename)
  {
*************** process_file(char *filename)
*** 2024,2030 ****
  	Command   **my_commands;
  	FILE	   *fd;
  	int			lineno;
! 	char		buf[BUFSIZ];
  	int			alloc_num;
  
  	if (num_files >= MAX_FILES)
--- 2067,2073 ----
  	Command   **my_commands;
  	FILE	   *fd;
  	int			lineno;
! 	char	   *buf;
  	int			alloc_num;
  
  	if (num_files >= MAX_FILES)
*************** process_file(char *filename)
*** 2046,2056 ****
  
  	lineno = 0;
  
! 	while (fgets(buf, sizeof(buf), fd) != NULL)
  	{
  		Command    *command;
  
  		command = process_commands(buf);
  		if (command == NULL)
  			continue;
  
--- 2089,2102 ----
  
  	lineno = 0;
  
! 	while ((buf = read_line_from_file(fd)) != NULL)
  	{
  		Command    *command;
  
  		command = process_commands(buf);
+ 
+ 		free(buf);
+ 
  		if (command == NULL)
  			continue;
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to