Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit35d8940

Browse files
committed
Fix up some oversights in psql's Unicode-escape support.
Original patch failed to include new exclusive states in a switch thatneeded to include them; and also was guilty of very fuzzy thinkingabout how to handle error cases. Per bug #5729 from Alan Choi.
1 parent5a12c80 commit35d8940

File tree

1 file changed

+17
-22
lines changed

1 file changed

+17
-22
lines changed

‎src/bin/psql/psqlscan.l

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ static bool var_is_current_source(PsqlScanState state, const char *varname);
120120
static YY_BUFFER_STATEprepare_buffer(constchar *txt,int len,
121121
char **txtcopy);
122122
staticvoidemit(constchar *txt,int len);
123-
staticboolis_utf16_surrogate_first(uint32 c);
124123
staticvoidescape_variable(bool as_ident);
125124

126125
#defineECHOemit(yytext, yyleng)
@@ -163,7 +162,11 @@ static void escape_variable(bool as_ident);
163162
* <xdolq> $foo$ quoted strings
164163
* <xui> quoted identifier with Unicode escapes
165164
* <xus> quoted string with Unicode escapes
166-
* <xeu> Unicode surrogate pair in extended quoted string
165+
*
166+
* Note: we intentionally don't mimic the backend's <xeu> state; we have
167+
* no need to distinguish it from <xe> state, and no good way to get out
168+
* of it in error cases. The backend just throws yyerror() in those
169+
* cases, but that's not an option here.
167170
*/
168171

169172
%x xb
@@ -175,7 +178,6 @@ static void escape_variable(bool as_ident);
175178
%x xdolq
176179
%x xui
177180
%x xus
178-
%x xeu
179181
/* Additional exclusive states for psql only: lex backslash commands*/
180182
%x xslashcmd
181183
%x xslasharg
@@ -529,19 +531,9 @@ other.
529531
ECHO;
530532
}
531533
<xe>{xeunicode} {
532-
uint32 c =strtoul(yytext+2,NULL,16);
533-
534-
if (is_utf16_surrogate_first(c))
535-
BEGIN(xeu);
536-
ECHO;
537-
}
538-
<xeu>{xeunicode} {
539-
BEGIN(xe);
540534
ECHO;
541535
}
542-
<xeu>.{ ECHO; }
543-
<xeu>\n{ ECHO; }
544-
<xe,xeu>{xeunicodefail}{
536+
<xe>{xeunicodefail}{
545537
ECHO;
546538
}
547539
<xe>{xeescape} {
@@ -1242,6 +1234,7 @@ psql_scan(PsqlScanState state,
12421234
case LEXRES_EOL:/* end of input */
12431235
switch (state->start_state)
12441236
{
1237+
/* This switch must cover all non-slash-command states. */
12451238
case INITIAL:
12461239
if (state->paren_depth >0)
12471240
{
@@ -1276,18 +1269,26 @@ psql_scan(PsqlScanState state,
12761269
result = PSCAN_INCOMPLETE;
12771270
*prompt = PROMPT_SINGLEQUOTE;
12781271
break;
1279-
casexq:
1272+
casexe:
12801273
result = PSCAN_INCOMPLETE;
12811274
*prompt = PROMPT_SINGLEQUOTE;
12821275
break;
1283-
casexe:
1276+
casexq:
12841277
result = PSCAN_INCOMPLETE;
12851278
*prompt = PROMPT_SINGLEQUOTE;
12861279
break;
12871280
case xdolq:
12881281
result = PSCAN_INCOMPLETE;
12891282
*prompt = PROMPT_DOLLARQUOTE;
12901283
break;
1284+
case xui:
1285+
result = PSCAN_INCOMPLETE;
1286+
*prompt = PROMPT_DOUBLEQUOTE;
1287+
break;
1288+
case xus:
1289+
result = PSCAN_INCOMPLETE;
1290+
*prompt = PROMPT_SINGLEQUOTE;
1291+
break;
12911292
default:
12921293
/* can't get here */
12931294
fprintf(stderr,"invalid YY_START\n");
@@ -1814,12 +1815,6 @@ emit(const char *txt, int len)
18141815
}
18151816
}
18161817

1817-
staticbool
1818-
is_utf16_surrogate_first(uint32 c)
1819-
{
1820-
return (c >=0xD800 && c <=0xDBFF);
1821-
}
1822-
18231818
staticvoid
18241819
escape_variable(bool as_ident)
18251820
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp