On Wed, 28 Jul 2010, James William Pye wrote:

Not directly regarding your patch, but while the discussion is in the general area. I think it would be wise to throw an error when non-empty CopyData messages are received after CopyData(EOF). Chances are that the user is making a mistake and should be notified of it.


As this is also the direction that Tom Lane indicated we should go, here is a patch which errors out after receiving any more copy data past the EOF marker. This also fixes the protocol problem I previously brought up because the act of checking to see if there is any more data does ensure that if there isn't any more data in the current buffer, that we wait for the client to provide CopyDone/Fail.

Kris Jurka
*** a/src/backend/commands/copy.c
--- b/src/backend/commands/copy.c
***************
*** 2058,2069 **** CopyFrom(CopyState cstate)
                        int16           fld_count;
                        ListCell   *cur;
  
!                       if (!CopyGetInt16(cstate, &fld_count) ||
!                               fld_count == -1)
                        {
                                done = true;
                                break;
                        }
  
                        if (fld_count != attr_count)
                                ereport(ERROR,
--- 2058,2090 ----
                        int16           fld_count;
                        ListCell   *cur;
  
!                       if (!CopyGetInt16(cstate, &fld_count))
                        {
                                done = true;
                                break;
                        }
+                       
+                       if (fld_count == -1)
+                       {
+                               /*
+                                * Reached EOF.  In protocol version 3, we must 
wait for
+                                * the protocol end of copy (CopyDone/Fail).  
If we
+                                * receive any more copy data after EOF, 
complain.
+                                */
+                               if (cstate->copy_dest == COPY_NEW_FE)
+                               {
+                                       int8 unused;
+                                       if (CopyGetData(cstate, &unused, 
sizeof(unused), sizeof(unused)))
+                                       {
+                                               ereport(ERROR,
+                                                               
(errcode(ERRCODE_BAD_COPY_FILE_FORMAT),
+                                                                
errmsg("received copy data after EOF marker")));
+                                       } else {
+                                               done = true;
+                                               break;
+                                       }
+                               }
+                       }
  
                        if (fld_count != attr_count)
                                ereport(ERROR,
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to