mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
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.
This commit is contained in:
parent
22fce59aaf
commit
8439ee415f
@ -697,28 +697,32 @@ other .
|
|||||||
return IDENT;
|
return IDENT;
|
||||||
}
|
}
|
||||||
<xui>{xuistop1} {
|
<xui>{xuistop1} {
|
||||||
char *ident;
|
char *ident;
|
||||||
|
int identlen;
|
||||||
|
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
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;
|
||||||
/* throw back all but the quote */
|
/* throw back all but the quote */
|
||||||
yyless(1);
|
yyless(1);
|
||||||
return IDENT;
|
return IDENT;
|
||||||
}
|
}
|
||||||
<xui>{xuistop2} {
|
<xui>{xuistop2} {
|
||||||
char *ident;
|
char *ident;
|
||||||
|
int identlen;
|
||||||
|
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
if (yyextra->literallen == 0)
|
if (yyextra->literallen == 0)
|
||||||
yyerror("zero-length delimited identifier");
|
yyerror("zero-length delimited identifier");
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user