dump of functions does not handle backslashes correctly

Started by Robert B. Easterover 25 years ago2 messagesbugs
Jump to latest
#1Robert B. Easter
reaster@comptechnews.com

If you create a function from psql like:

CREATE FUNCTION "plpgsql_call_handler" ( ) RETURNS opaque AS
'/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C';
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER "plpgsql_call_handler"
LANCOMPILER 'PL/pgSQL';
CREATE FUNCTION "atestfun" ( ) RETURNS text AS 'DECLARE mtt TEXT; BEGIN mtt
:= ''This is a \\\\ test.''; RETURN mtt; END;' LANGUAGE 'plpgsql';

Then use pg_dump on it, you get:

CREATE FUNCTION "plpgsql_call_handler" ( ) RETURNS opaque AS
'/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C';
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER "plpgsql_call_handler"
LANCOMPILER 'PL/pgSQL';
CREATE FUNCTION "atestfun" ( ) RETURNS text AS 'DECLARE mtt TEXT; BEGIN mtt
:= ''This is a \\ test.''; RETURN mtt; END;' LANGUAGE 'plpgsql';

In the function, the variable "mtt" loses half of the '\' characters. When
you reload this dump, the embedded '\' is lost. When you do a

SELECT atestfun();

The ouput should be:

atestfun
------------------
This is a \ test.
(1 row)

But instead, it returns:

atestfun
------------------
This is a test.
(1 row)

Is this a pg_dump bug or is there there some way to do this right?

--
-------- Robert B. Easter reaster@comptechnews.com ---------
- CompTechNews Message Board http://www.comptechnews.com/ -
- CompTechServ Tech Services http://www.comptechserv.com/ -
---------- http://www.comptechnews.com/~reaster/ ------------

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Robert B. Easter (#1)
Re: dump of functions does not handle backslashes correctly

"Robert B. Easter" <reaster@comptechnews.com> writes:

Is this a pg_dump bug or is there there some way to do this right?

It's a pg_dump bug --- pg_dump knows how to quote special characters
in string literals, but failed to do so for function bodies
(and a number of other places too). I've committed a fix.

regards, tom lane