Thread: The number of character limitation of custom script on pgbench

The number of character limitation of custom script on pgbench

From
Sawada Masahiko
Date:
Hi all,

The function of custom script of pgbench allows only  BUFSIZ
(i.g.,1024byte) or less as length of a SQL.
I think that  when we want to bench mark with long SQL then it will difficult.
At that time even pgbench doesn't return ERROR. It will try to do
query with the broken SQL.
And user can not know why function of custom script is not work fine.
It look as just error of SQL to user.

So I'm thinking following solution.
(1) to increase buffer size
(2) to change to variable buffer size
(3) to return ERROR with information

Thought?


Regards,

-------
Sawada Masahiko



Re: The number of character limitation of custom script on pgbench

From
Peter Eisentraut
Date:
On 11/13/13, 6:18 AM, Sawada Masahiko wrote:
> Hi all,
> 
> The function of custom script of pgbench allows only  BUFSIZ
> (i.g.,1024byte) or less as length of a SQL.
> I think that  when we want to bench mark with long SQL then it will difficult.
> At that time even pgbench doesn't return ERROR. It will try to do
> query with the broken SQL.
> And user can not know why function of custom script is not work fine.
> It look as just error of SQL to user.
> 
> So I'm thinking following solution.
> (1) to increase buffer size
> (2) to change to variable buffer size
> (3) to return ERROR with information

I'd go for #2.  But at least an error.




Re: The number of character limitation of custom script on pgbench

From
Tom Lane
Date:
Peter Eisentraut <peter_e@gmx.net> writes:
> On 11/13/13, 6:18 AM, Sawada Masahiko wrote:
>> The function of custom script of pgbench allows only  BUFSIZ
>> (i.g.,1024byte) or less as length of a SQL.
>> So I'm thinking following solution.
>> (1) to increase buffer size
>> (2) to change to variable buffer size
>> (3) to return ERROR with information

> I'd go for #2.  But at least an error.

#2 definitely.  I've run into this limitation myself recently, and
so have other people.  It's time to fix it.
        regards, tom lane



Re: The number of character limitation of custom script on pgbench

From
Sawada Masahiko
Date:
On Wed, Nov 13, 2013 at 10:27 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Peter Eisentraut <peter_e@gmx.net> writes:
>> On 11/13/13, 6:18 AM, Sawada Masahiko wrote:
>>> The function of custom script of pgbench allows only  BUFSIZ
>>> (i.g.,1024byte) or less as length of a SQL.
>>> So I'm thinking following solution.
>>> (1) to increase buffer size
>>> (2) to change to variable buffer size
>>> (3) to return ERROR with information
>
>> I'd go for #2.  But at least an error.
>
> #2 definitely.  I've run into this limitation myself recently, and
> so have other people.  It's time to fix it.
>

Yes, I also think #2 is good.
I will implement the patch.

Regards,

-------
Sawada Masahiko



Re: The number of character limitation of custom script on pgbench

From
Sawada Masahiko
Date:
On Wed, Nov 13, 2013 at 10:27 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Peter Eisentraut <peter_e@gmx.net> writes:
>> On 11/13/13, 6:18 AM, Sawada Masahiko wrote:
>>> The function of custom script of pgbench allows only  BUFSIZ
>>> (i.g.,1024byte) or less as length of a SQL.
>>> So I'm thinking following solution.
>>> (1) to increase buffer size
>>> (2) to change to variable buffer size
>>> (3) to return ERROR with information
>
>> I'd go for #2.  But at least an error.
>
> #2 definitely.  I've run into this limitation myself recently, and
> so have other people.  It's time to fix it.
>

I attached the patch which solves this problem, and have submitted to CF3.
I changed how to get the SQL from custom script file.

Regards,

-------
Sawada Masahiko

Attachment

Re: The number of character limitation of custom script on pgbench

From
Alvaro Herrera
Date:
Sawada Masahiko escribió:

> Yes, I also think #2 is good.
> I will implement the patch.

I remember this was recently discussed in the spanish list.  Please see
this email:

http://archives.postgresql.org/message-id/48589.192.168.207.54.1382570043.squirrel@webmail.etecsa.cu

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services



Re: The number of character limitation of custom script on pgbench

From
Tom Lane
Date:
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;