postgres.git / summary / log / commit / refs
commit 8439ee415f4d8850806a7fb59cc7ce4dbb6ea2ed
Author: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu Feb 13 19:24:49 2014 +0000
First released in: 9.4.0, 8.4.20, 9.0.16, 9.1.12, 9.2.7, 9.3.3
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.
src/backend/parser/scan.l | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 6b216b53786..cde8fae620f 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -697,28 +697,32 @@ other .
return IDENT;
}
<xui>{xuistop1} {
- char *ident;
+ char *ident;
+ int identlen;
BEGIN(INITIAL);
if (yyextra->literallen == 0)
yyerror("zero-length delimited identifier");
ident = litbuf_udeescape('\\', yyscanner);
- if (yyextra->literallen >= NAMEDATALEN)
- truncate_identifier(ident, yyextra->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;
}
<xui>{xuistop2} {
- char *ident;
+ char *ident;
+ int identlen;
BEGIN(INITIAL);
if (yyextra->literallen == 0)
yyerror("zero-length delimited identifier");
ident = litbuf_udeescape(yytext[yyleng - 2], yyscanner);
- if (yyextra->literallen >= NAMEDATALEN)
- truncate_identifier(ident, yyextra->literallen, true);
+ identlen = strlen(ident);
+ if (identlen >= NAMEDATALEN)
+ truncate_identifier(ident, identlen, true);
yylval->str = ident;
return IDENT;
}
[parent: 22fce59aaf81]