From: Tom Lane Date: Thu, 13 Feb 2014 19:24:58 +0000 (-0500) Subject: Fix length checking for Unicode identifiers containing escapes (U&"..."). X-Git-Tag: REL8_4_20~15 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a8a46d846c13d1ed07ad0a900e37dd318c8096e2;p=postgresql Fix length checking for Unicode identifiers containing escapes (U&"..."). We used the length of the input string, not the de-escaped string, as the trigger for NAMEDATALEN truncation. AFAICS this would only result in sometimes printing a phony truncation warning; but it's just luck that there was no worse problem, since we were violating the API spec for truncate_identifier(). Per bug #9204 from Joshua Yanovski. This has been wrong since the Unicode-identifier support was added, so back-patch to all supported branches. --- diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 6e18a41db1..f8c18689f8 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -620,28 +620,32 @@ other . return IDENT; } {xuistop1} { - char *ident; + char *ident; + int identlen; BEGIN(INITIAL); if (literallen == 0) yyerror("zero-length delimited identifier"); ident = litbuf_udeescape('\\'); - if (literallen >= NAMEDATALEN) - truncate_identifier(ident, literallen, true); + identlen = strlen(ident); + if (identlen >= NAMEDATALEN) + truncate_identifier(ident, identlen, true); yylval.str = ident; /* throw back all but the quote */ yyless(1); return IDENT; } {xuistop2} { - char *ident; + char *ident; + int identlen; BEGIN(INITIAL); if (literallen == 0) yyerror("zero-length delimited identifier"); ident = litbuf_udeescape(yytext[yyleng - 2]); - if (literallen >= NAMEDATALEN) - truncate_identifier(ident, literallen, true); + identlen = strlen(ident); + if (identlen >= NAMEDATALEN) + truncate_identifier(ident, identlen, true); yylval.str = ident; return IDENT; }