COPY allows parameters which corrupt output

Started by Kris Jurkaover 22 years ago2 messagesbugs
Jump to latest
#1Kris Jurka
books@ejurka.com

COPY allows DELIMITER and NULL to be specified which don't allow the data
to be copied back in properly. Using any delimiter that could be part of
a backslash escape sequence (\n \0 \t) will break if any of the data has a
character matching the delimiter because it will be escaped and then be
read as a special character.

It also allows DELIMITER and NULL to overlap. No character in the NULL
specification should be the DELIMITER.

Kris Jurka

Attachments:

copytest.sqltext/plain; charset=US-ASCII; name=copytest.sqlDownload
#2Bruce Momjian
bruce@momjian.us
In reply to: Kris Jurka (#1)
Re: [BUGS] COPY allows parameters which corrupt output

Kris Jurka wrote:

COPY allows DELIMITER and NULL to be specified which don't allow the data
to be copied back in properly. Using any delimiter that could be part of
a backslash escape sequence (\n \0 \t) will break if any of the data has a
character matching the delimiter because it will be escaped and then be
read as a special character.

It also allows DELIMITER and NULL to overlap. No character in the NULL
specification should be the DELIMITER.

The attached applied patch throws an error if the delimiter appears in
the COPY NULL string:

test=> copy pg_language to '/tmp/x' with delimiter '|';
COPY
test=> copy pg_language to '/tmp/x' with delimiter '|' null '|x';
ERROR: COPY delimiter must not appear in the NULL specification
test=> copy pg_language from '/tmp/x' with delimiter '|' null '|x';
ERROR: COPY delimiter must not appear in the NULL specification

It also throws an error if it conflicts with the default NULL string:

test=> copy pg_language to '/tmp/x' with delimiter '\\';
ERROR: COPY delimiter must not appear in the NULL specification
test=> copy pg_language to '/tmp/x' with delimiter '\\' NULL 'x';
COPY

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Attachments:

/bjm/difftext/plainDownload+8-0