Обсуждение: Problem with do_quote_ident()
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 USERtest=> 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,
Pennsylvania19026
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