Re: The number of character limitation of custom script on pgbench
От | Tom Lane |
---|---|
Тема | Re: The number of character limitation of custom script on pgbench |
Дата | |
Msg-id | 32435.1384562886@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: The number of character limitation of custom script on pgbench (Sawada Masahiko <sawada.mshk@gmail.com>) |
Список | pgsql-hackers |
Sawada Masahiko <sawada.mshk@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;
В списке pgsql-hackers по дате отправления: