Andrew Dunstan <[EMAIL PROTECTED]> writes:
>> The attached patch appears to solve the problem. However, while it 
>> makes us conform to the first sentence below from the docs, it doesn't 
>> comply with the second. Not sure what to do about that. Maybe there's 
>> a better solution?

> Attached patch seems much better, I think.

I think it is still not quite there.  Since as you noted the backend
will complain if line endings don't match, if we hit EOF then we have
to cons up a \. line with the correct ending.  (BTW, this is not
actually necessary when talking 3.0 protocol, but it is when talking
to an older server.)

I modified the patch a little more and applied the attached.  It seems
to work for me but could use more testing.

                        regards, tom lane

*** src/bin/psql/copy.c.orig    Fri Aug 13 10:47:23 2004
--- src/bin/psql/copy.c Fri Aug 13 18:51:25 2004
***************
*** 663,668 ****
--- 663,669 ----
        bool            copydone = false;
        bool            firstload;
        bool            linedone;
+       bool            saw_cr = false;
        char            copybuf[COPYBUFSIZ];
        char       *s;
        int                     bufleft;
***************
*** 695,724 ****
  
                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;
--- 696,744 ----
  
                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;
***************
*** 726,732 ****
                                firstload = false;
                        }
                }
-               PQputline(conn, "\n");
                linecount++;
        }
        ret = !PQendcopy(conn);
--- 746,751 ----

---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to