Re: psql misbehaves because of a simple typo - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: psql misbehaves because of a simple typo
Date
Msg-id 200112281933.fBSJX0T05480@candle.pha.pa.us
Whole thread Raw
In response to Re: psql misbehaves because of a simple typo  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-hackers
> Bruce Momjian writes:
>
> > OK, here is a patch for 7.3.  It clears the paren counter only when the
> > buffer is cleared.  Forget what I said about recomputing quotes.  You
> > can't use backslash commands while you are in quotes.
>
> I don't think this works when the command is \g because you're testing for
> the cleared buffer too early.  Look at what happens under "if
> (slashCmdStatus == CMD_SEND)".  The test should be after that (around line
> 489 in original copy).

Are you sure?

    test=> (select
    test(> \g
    ERROR:  parser: parse error at or near ""
    test(>


I now see the next \p kills me:

    test(> \p
    ( select
    test=>

Oops, line 489 doesn't work either:

    test=> (select
    test(> \g
    ERROR:  parser: parse error at or near ""
    test=>

I now remember how confusing the previous_buffer handling is.  It is
this line that is tricky:

    /* handle backslash command */
    slashCmdStatus = HandleSlashCmds(&line[i],
           query_buf->len > 0 ? query_buf : previous_buf,
                                        ^^^^^^^^^^^^^^^^^^^^^^^^
                                        &end_of_cmd);
It works now:

    test=> (select
    test(> \g
    ERROR:  parser: parse error at or near ""
    test(> \p
    (select

Patch attached.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: src/bin/psql/mainloop.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/mainloop.c,v
retrieving revision 1.45
diff -c -r1.45 mainloop.c
*** src/bin/psql/mainloop.c    2001/12/28 05:01:05    1.45
--- src/bin/psql/mainloop.c    2001/12/28 19:12:37
***************
*** 447,453 ****
              {
                  const char *end_of_cmd = NULL;

-                 paren_level = 0;
                  line[i - prevlen] = '\0';        /* overwrites backslash */

                  /* is there anything else on the line for the command? */
--- 447,452 ----
***************
*** 473,479 ****
                  if ((slashCmdStatus == CMD_SEND || slashCmdStatus == CMD_NEWEDIT) &&
                      query_buf->len == 0)
                  {
!                     /* copy previous buffer to current for for handling */
                      appendPQExpBufferStr(query_buf, previous_buf->data);
                  }

--- 472,478 ----
                  if ((slashCmdStatus == CMD_SEND || slashCmdStatus == CMD_NEWEDIT) &&
                      query_buf->len == 0)
                  {
!                     /* copy previous buffer to current for handling */
                      appendPQExpBufferStr(query_buf, previous_buf->data);
                  }

***************
*** 486,491 ****
--- 485,493 ----
                      appendPQExpBufferStr(previous_buf, query_buf->data);
                      resetPQExpBuffer(query_buf);
                  }
+
+                 if (query_buf->len == 0 && previous_buf->len == 0)
+                     paren_level = 0;

                  /* process anything left after the backslash command */
                  i += end_of_cmd - &line[i];

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: [GENERAL] Problem (bug?) with like
Next
From: Bruce Momjian
Date:
Subject: Re: Undocumented feature costs a lot of performance in COPY