libpq v2 protocol error: COPY FROM STDIN, PQputCopyEnd()

Поиск
Список
Период
Сортировка
От ljb
Тема libpq v2 protocol error: COPY FROM STDIN, PQputCopyEnd()
Дата
Msg-id c2j7k3$2sus$1@news.hub.org
обсуждение исходный текст
Ответы Re: libpq v2 protocol error: COPY FROM STDIN, PQputCopyEnd()  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-patches
This fixes a protocol violation and disconnect when 7.4.x libpq is talking
to a v2 protocol (<=7.3.x) server. The client does COPY FROM STDIN, uses
the new call PQputCopyData(), then ends the copy using PQputCopyEnd(),
and gets back the odd message:
                   FATAL:  Socket command type
followed by "server closed the connection unexpectedly..."

(This won't be seen with psql because it uses the older PQputline() and
PQendcopy() functions. But it breaks COPY into a 7.3 server with my new
Tcl interface pgtcl-ng.)

The problem is that PQputCopyEnd() in libpq sends the copy terminator "\\.\n"
with a trailing null byte. The 7.3.x server does not want the trailing
null there, so it takes it for a command byte. The actual error is
"Socket command type %c unknown" but the %c is '\0' so you lose the rest.

Here's a 1-line patch against 7.4.1 which has PQputCopyEnd() send the
terminator "\\.\n" without a trailing null. (Sorry I missed 7.4.2, but I
just found this.) It will also apply OK (with offset) to what I think will
be 7.4.2 (in CVS as fe-exec.c,v 1.153.2.3). Note this only affects the
down-level "v2" protocol code in libpq.


*** src/interfaces/libpq/fe-exec.c~    Sun Nov 30 15:53:43 2003
--- src/interfaces/libpq/fe-exec.c    Mon Mar  8 19:16:37 2004
***************
*** 1447,1453 ****
          {
              /* Send old-style end-of-data marker */
              if (pqPutMsgStart(0, false, conn) < 0 ||
!                 pqPuts("\\.\n", conn) < 0 ||
                  pqPutMsgEnd(conn) < 0)
                  return -1;
          }
--- 1447,1453 ----
          {
              /* Send old-style end-of-data marker */
              if (pqPutMsgStart(0, false, conn) < 0 ||
!                 pqPutnchar("\\.\n", 3, conn) < 0 ||
                  pqPutMsgEnd(conn) < 0)
                  return -1;
          }

В списке pgsql-patches по дате отправления:

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: Alter table patch
Следующее
От: Bruce Momjian
Дата:
Сообщение: Re: log_line_info