Commit 44c21633 authored by Tom Lane's avatar Tom Lane

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.
parent 3f735ae8
...@@ -737,7 +737,8 @@ other . ...@@ -737,7 +737,8 @@ other .
<xuiend>{xustop1} | <xuiend>{xustop1} |
<xuiend><<EOF>> { <xuiend><<EOF>> {
/* no UESCAPE after the quote, throw back everything */ /* no UESCAPE after the quote, throw back everything */
char *ident; char *ident;
int identlen;
yyless(0); yyless(0);
...@@ -745,14 +746,16 @@ other . ...@@ -745,14 +746,16 @@ other .
if (yyextra->literallen == 0) if (yyextra->literallen == 0)
yyerror("zero-length delimited identifier"); yyerror("zero-length delimited identifier");
ident = litbuf_udeescape('\\', yyscanner); ident = litbuf_udeescape('\\', yyscanner);
if (yyextra->literallen >= NAMEDATALEN) identlen = strlen(ident);
truncate_identifier(ident, yyextra->literallen, true); if (identlen >= NAMEDATALEN)
truncate_identifier(ident, identlen, true);
yylval->str = ident; yylval->str = ident;
return IDENT; return IDENT;
} }
<xuiend>{xustop2} { <xuiend>{xustop2} {
/* found UESCAPE after the end quote */ /* found UESCAPE after the end quote */
char *ident; char *ident;
int identlen;
BEGIN(INITIAL); BEGIN(INITIAL);
if (yyextra->literallen == 0) if (yyextra->literallen == 0)
...@@ -764,8 +767,9 @@ other . ...@@ -764,8 +767,9 @@ other .
yyerror("invalid Unicode escape character"); yyerror("invalid Unicode escape character");
} }
ident = litbuf_udeescape(yytext[yyleng - 2], yyscanner); ident = litbuf_udeescape(yytext[yyleng - 2], yyscanner);
if (yyextra->literallen >= NAMEDATALEN) identlen = strlen(ident);
truncate_identifier(ident, yyextra->literallen, true); if (identlen >= NAMEDATALEN)
truncate_identifier(ident, identlen, true);
yylval->str = ident; yylval->str = ident;
return IDENT; return IDENT;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment