From f7559c0101afa33bfb4e104036ca46adac900111 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 14 Mar 2013 20:31:27 +0200 Subject: [PATCH] Also update psqlscan.l with the UESCAPE error rule changes. Even though this patch had no user-visible difference, better keep the code in psqlscan.l sync with the backend lexer. And of course it's nice to shrink the psql binary, too. Ecpg's version of the lexer doesn't have the error rule, it doesn't try to avoid backing up, so it doesn't need to be modified. As reminded by Tom Lane --- src/bin/psql/psqlscan.l | 42 +++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/bin/psql/psqlscan.l b/src/bin/psql/psqlscan.l index d7ac1f9f06..d61387ddf9 100644 --- a/src/bin/psql/psqlscan.l +++ b/src/bin/psql/psqlscan.l @@ -166,7 +166,8 @@ static void escape_variable(bool as_ident); * extended quoted strings (support backslash escape sequences) * $foo$ quoted strings * quoted identifier with Unicode escapes - * quoted string with Unicode escapes + * end of a quoted identifier with Unicode escapes, UESCAPE can follow * quoted string with Unicode escapes + * end of a quoted string with Unicode escapes, UESCAPE can follow * * Note: we intentionally don't mimic the backend's state; we have * no need to distinguish it from state, and no good way to get out @@ -182,7 +183,9 @@ static void escape_variable(bool as_ident); %x xq %x xdolq %x xui +%x xuiend %x xus +%x xusend /* Additional exclusive states for psql only: lex backslash commands */ %x xslashcmd %x xslashargstart @@ -307,17 +310,17 @@ xdinside [^"]+ /* Unicode escapes */ uescape [uU][eE][sS][cC][aA][pP][eE]{whitespace}*{quote}[^']{quote} /* error rule to avoid backup */ -uescapefail ("-"|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*"-"|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*{quote}[^']|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*{quote}|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*|[uU][eE][sS][cC][aA][pP]|[uU][eE][sS][cC][aA]|[uU][eE][sS][cC]|[uU][eE][sS]|[uU][eE]|[uU]) +uescapefail [uU][eE][sS][cC][aA][pP][eE]{whitespace}*"-"|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*{quote}[^']|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*{quote}|[uU][eE][sS][cC][aA][pP][eE]{whitespace}*|[uU][eE][sS][cC][aA][pP]|[uU][eE][sS][cC][aA]|[uU][eE][sS][cC]|[uU][eE][sS]|[uU][eE]|[uU] /* Quoted identifier with Unicode escapes */ xuistart [uU]&{dquote} -xuistop1 {dquote}{whitespace}*{uescapefail}? -xuistop2 {dquote}{whitespace}*{uescape} /* Quoted string with Unicode escapes */ xusstart [uU]&{quote} -xusstop1 {quote}{whitespace}*{uescapefail}? -xusstop2 {quote}{whitespace}*{uescape} + +/* Optional UESCAPE after a quoted string or identifier with Unicode escapes. */ +xustop1 {uescapefail}? +xustop2 {uescape} /* error rule to avoid backup */ xufailed [uU]& @@ -520,12 +523,22 @@ other . BEGIN(INITIAL); ECHO; } -{xusstop1} { +{quotestop} | +{quotefail} { yyless(1); + BEGIN(xusend); + ECHO; + } +{whitespace} { + ECHO; + } +{other} | +{xustop1} { + yyless(0); BEGIN(INITIAL); ECHO; } -{xusstop2} { +{xustop2} { BEGIN(INITIAL); ECHO; } @@ -612,12 +625,21 @@ other . BEGIN(INITIAL); ECHO; } -{xuistop1} { +{dquote} { yyless(1); + BEGIN(xuiend); + ECHO; + } +{whitespace} { + ECHO; + } +{other} | +{xustop1} { + yyless(0); BEGIN(INITIAL); ECHO; } -{xuistop2} { +{xustop2} { BEGIN(INITIAL); ECHO; }