aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-02-13 14:24:52 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2014-02-13 14:24:52 -0500
commit170590261c02fd50f714f960cefd43d86dad067a (patch)
treec1b817c5e4f7d9e26bb9241c6a4bf527a0282ff4 /src
parent0d4a2f8d4c502aa5fdcca9a0d3ad9e884c7bf814 (diff)
downloadpostgresql-170590261c02fd50f714f960cefd43d86dad067a.tar.gz
postgresql-170590261c02fd50f714f960cefd43d86dad067a.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/scan.l16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 4f9af543d68..ae79182cb2e 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -696,28 +696,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;
}