Re: Fixing backslash dot for COPY FROM...CSV - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Fixing backslash dot for COPY FROM...CSV
Date
Msg-id 1719392.1727736302@sss.pgh.pa.us
Whole thread Raw
In response to Fixing backslash dot for COPY FROM...CSV  ("Daniel Verite" <daniel@manitou-mail.org>)
Responses Re: Fixing backslash dot for COPY FROM...CSV
List pgsql-hackers
"Daniel Verite" <daniel@manitou-mail.org> writes:
> [ v6-0001-Support-backslash-dot-on-a-line-by-itself-as-vali.patch ]

I did some more work on the docs and comments, and pushed that.

Returning to my upthread thought that

>>> I think we should fix it so that \. that's not alone on a line
>>> throws an error, but I wouldn't go further than that.

here's a quick follow-on patch to make that happen.  It could
probably do with a test case to demonstrate the error, but
I didn't bother yet pending approval that we want to do this.
(This passes check-world as it stands, indicating we have no
existing test that expects this case to work.)

Also, I used the same error message "end-of-copy marker corrupt"
that we have for the case of junk following the marker, but
I can't say that I think much of that phrasing.  What do people
think of "end-of-copy marker is not alone on its line", instead?

            regards, tom lane

diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c
index a280efe23f..2ea9679b3c 100644
--- a/src/backend/commands/copyfromparse.c
+++ b/src/backend/commands/copyfromparse.c
@@ -1426,13 +1426,17 @@ CopyReadLineText(CopyFromState cstate)
                 }

                 /*
-                 * Transfer only the data before the \. into line_buf, then
-                 * discard the data and the \. sequence.
+                 * If there is any data on this line before the \., complain.
+                 */
+                if (cstate->line_buf.len > 0 ||
+                    prev_raw_ptr > cstate->input_buf_index)
+                    ereport(ERROR,
+                            (errcode(ERRCODE_BAD_COPY_FILE_FORMAT),
+                             errmsg("end-of-copy marker corrupt")));
+
+                /*
+                 * Discard the \. and newline, then report EOF.
                  */
-                if (prev_raw_ptr > cstate->input_buf_index)
-                    appendBinaryStringInfo(&cstate->line_buf,
-                                           cstate->input_buf + cstate->input_buf_index,
-                                           prev_raw_ptr - cstate->input_buf_index);
                 cstate->input_buf_index = input_buf_ptr;
                 result = true;    /* report EOF */
                 break;

pgsql-hackers by date:

Previous
From: Michael Banck
Date:
Subject: Re: Changing the state of data checksums in a running cluster
Next
From: Jacob Champion
Date:
Subject: Re: [PoC] Federated Authn/z with OAUTHBEARER