diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2014-02-13 14:24:52 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2014-02-13 14:24:52 -0500 |
commit | 170590261c02fd50f714f960cefd43d86dad067a (patch) | |
tree | c1b817c5e4f7d9e26bb9241c6a4bf527a0282ff4 /src | |
parent | 0d4a2f8d4c502aa5fdcca9a0d3ad9e884c7bf814 (diff) | |
download | postgresql-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.l | 16 |
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; } |