Andrew Dunstan wrote:



Tom Lane wrote:


If you're sure the code in that routine hasn't changed since 7.4, then I can just apply the patch to that branch.


It has - the prompt changes in version 1.37. But I don't think that conflict with this patch. I'll have a look this morning.


As expected:

Hunk #1 succeeded at 496 (offset -167 lines).
Hunk #2 succeeded at 689 (offset -7 lines).
Hunk #3 succeeded at 579 (offset -167 lines).



Here's the diff with 7.4 line numbers - tests fine for me.

cheers

andrew
*** copy.c.orig Mon Aug  4 19:59:39 2003
--- copy.c      Sat Aug 14 09:12:04 2004
***************
*** 496,501 ****
--- 496,502 ----
        bool            copydone = false;
        bool            firstload;
        bool            linedone;
+       bool            saw_cr = false;
        char            copybuf[COPYBUFSIZ];
        char       *s;
        int                     bufleft;
***************
*** 521,550 ****
  
                while (!linedone)
                {                                               /* for each bufferload 
in line ... */
                        s = copybuf;
                        for (bufleft = COPYBUFSIZ - 1; bufleft > 0; bufleft--)
                        {
                                c = getc(copystream);
!                               if (c == '\n' || c == EOF)
                                {
                                        linedone = true;
                                        break;
                                }
                                *s++ = c;
                        }
                        *s = '\0';
                        if (c == EOF && s == copybuf && firstload)
                        {
!                               PQputline(conn, "\\.");
                                copydone = true;
                                if (pset.cur_cmd_interactive)
                                        puts("\\.");
                                break;
                        }
                        PQputline(conn, copybuf);
                        if (firstload)
                        {
!                               if (!strcmp(copybuf, "\\."))
                                {
                                        copydone = true;
                                        break;
--- 522,570 ----
  
                while (!linedone)
                {                                               /* for each bufferload 
in line ... */
+                       /* Fetch string until \n, EOF, or buffer full */
                        s = copybuf;
                        for (bufleft = COPYBUFSIZ - 1; bufleft > 0; bufleft--)
                        {
                                c = getc(copystream);
!                               if (c == EOF)
                                {
                                        linedone = true;
                                        break;
                                }
                                *s++ = c;
+                               if (c == '\n')
+                               {
+                                       linedone = true;
+                                       break;
+                               }
+                               if (c == '\r')
+                                       saw_cr = true;
                        }
                        *s = '\0';
+                       /* EOF with empty line-so-far? */
                        if (c == EOF && s == copybuf && firstload)
                        {
!                               /*
!                                * We are guessing a little bit as to the right 
line-ending
!                                * here...
!                                */
!                               if (saw_cr)
!                                       PQputline(conn, "\\.\r\n");
!                               else
!                                       PQputline(conn, "\\.\n");
                                copydone = true;
                                if (pset.cur_cmd_interactive)
                                        puts("\\.");
                                break;
                        }
+                       /* No, so pass the data to the backend */
                        PQputline(conn, copybuf);
+                       /* Check for line consisting only of \. */
                        if (firstload)
                        {
!                               if (strcmp(copybuf, "\\.\n") == 0 ||
!                                       strcmp(copybuf, "\\.\r\n") == 0)
                                {
                                        copydone = true;
                                        break;
***************
*** 552,558 ****
                                firstload = false;
                        }
                }
-               PQputline(conn, "\n");
                linecount++;
        }
        ret = !PQendcopy(conn);
--- 572,577 ----
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to