I'm trying to write an sql function in Postgresql that will parse a file path. I want to return just the file name.
I cannot get past getting an accurate text string in the function.
Here is the function:
Function: job_page("inputText" text)
DECLARE
$5 text;
BEGIN
$5 = quote_literal("inputText");
return $5;
END
When I run this:
select job_page('\\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG')
I get this result:
"E'\\CAD_SVRCADJOBSé2-CEDARHURST ELEMENTARY SCHOOLé2-20.DWG'"
Postgresql interprets the slash followed by certain characters as a special character.
How do I escape?
PostgreSQL also accepts “escape” string constants, which are an extension to the SQL standard. An escape string constant is specified by writing the letter E (upper or lower case) just before the opening single quote, e.g., E'foo' .
Within an escape string, a backslash character (\) begins a C-like backslash escape sequence, in which the combination of backslash and following character(s) represents a special byte value. \b is a backspace, \f is a form feed, \n is a newline, \r is a carriage return, \t is a tab.
Simply enclose year in double quotes to stop it being interpreted as a keyword: INSERT INTO table (id, name, "year") VALUES ( ... );
> Quotes and double quotes should be escaped using \.
You should use escape string syntax:
select E'\\CAD_SVR\\CADJOBS\\7512-CEDARHURST ELEMENTARY SCHOOL\\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST ELEMENTARY SCHOOL\7512-20.DWG
This will work in any case.
Or you can set standard_conforming_strings=on
and use:
select '\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG';
\CAD_SVR\CADJOBS\7512-CEDARHURST/ ELEMENTARY SCHOOL\7512-20.DWG
quote_literal
function should be used only when you will be constructing a query for exec
call in pl/pgsql function. For constructing a query in a client you should use a client's library quoting function, like PQescapeStringConn
in libpq or pg_escape_string
in PHP. But the best option is to use prepared statements and use a string as an argument, which eliminates all quoting and is much safer too.
You have to escape the \ with another \
i.e. \\
You can change this behavior off by setting the standard_conforming_strings option to on. By default it is off, but this default will change some time in the future.
I recommend the double backslash for the time being.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With