Problem with do_quote_ident()

Started by Bruce Momjianabout 24 years ago2 messageshackers
Jump to latest
#1Bruce Momjian
bruce@momjian.us

I see in quote.c::do_quote_ident():

*cp2++ = '"';
while (len-- > 0)
{
if (*cp1 == '"')
*cp2++ = '"';
if (*cp1 == '\\')
*cp2++ = '\\';
*cp2++ = *cp1++;
}
*cp2++ = '"';

I am confused by the backslash handling. In my tests, a backslash in a
double-quoted string does not require two backslashes:

test=> create user "a\d";
CREATE USER
test=> select usename, length(usename) from pg_user;
usename | length
----------+--------
a\d | 3

This is because a double-quote in a double-quoted string is entered as
"", not \".

Is it adding another backslash because it assumes the result will appear
in another quoted string?

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#2Jan Wieck
JanWieck@Yahoo.com
In reply to: Bruce Momjian (#1)
Re: Problem with do_quote_ident()

Bruce Momjian wrote:

I see in quote.c::do_quote_ident():

*cp2++ = '"';
while (len-- > 0)
{
if (*cp1 == '"')
*cp2++ = '"';
if (*cp1 == '\\')
*cp2++ = '\\';
*cp2++ = *cp1++;
}
*cp2++ = '"';

I am confused by the backslash handling. In my tests, a backslash in a
double-quoted string does not require two backslashes:

test=> create user "a\d";
CREATE USER
test=> select usename, length(usename) from pg_user;
usename | length
----------+--------
a\d | 3

This is because a double-quote in a double-quoted string is entered as
"", not \".

Is it adding another backslash because it assumes the result will appear
in another quoted string?

I would say it is adding another backslash because it is a
bug. If you use quote_ident() in a plpgsql procedure to
build querystrings for EXECUTE (and you should do it that
way), then it'll no handle identifiers that contain
backslashes correctly.

Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com