postgres.git / summary / log / commit / refs

commit    4c70cb1d341d9f0d53d4bfc31327dd68285586ae
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Tue Feb 04 00:48:00 2014 +0000
First released in: 9.4.0, 9.3.3

    Fix lexing of U& sequences just before EOF.
    
    Commit a5ff502fceadc7c203b0d7a11b45c73f1b421f69 was a brick shy of a load
    in the backend lexer too, not just psql.  Per further testing of bug #9068.
    
    In passing, improve related comments.


src/backend/parser/scan.l | 17 +++++++++++------ src/bin/psql/psqlscan.l | 3 ++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 92f38a2a07a..b65ee3e667a 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -155,6 +155,9 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * <xus> quoted string with Unicode escapes * <xusend> end of a quoted string with Unicode escapes, UESCAPE can follow * <xeu> Unicode surrogate pair in extended quoted string + * + * Remember to add an <<EOF>> case whenever you add a new exclusive state! + * The default one is probably not the right thing. */ %x xb @@ -545,12 +548,13 @@ other . <xus>{quotefail} { /* throw back all but the quote */ yyless(1); - /* handle possible UESCAPE in xusend mode */ + /* xusend state looks for possible UESCAPE */ BEGIN(xusend); } -<xusend>{whitespace} +<xusend>{whitespace} { /* stay in xusend state over whitespace */ } <xusend>{other} | -<xusend>{xustop1} { +<xusend>{xustop1} | +<xusend><<EOF>> { /* no UESCAPE after the quote, throw back everything */ yyless(0); BEGIN(INITIAL); @@ -725,12 +729,13 @@ other . } <xui>{dquote} { yyless(1); - /* handle possible UESCAPE in xuiend mode */ + /* xuiend state looks for possible UESCAPE */ BEGIN(xuiend); } -<xuiend>{whitespace} { } +<xuiend>{whitespace} { /* stay in xuiend state over whitespace */ } <xuiend>{other} | -<xuiend>{xustop1} { +<xuiend>{xustop1} | +<xuiend><<EOF>> { /* no UESCAPE after the quote, throw back everything */ char *ident; diff --git a/src/bin/psql/psqlscan.l b/src/bin/psql/psqlscan.l index dd80611d738..20ffa3ab5b6 100644 --- a/src/bin/psql/psqlscan.l +++ b/src/bin/psql/psqlscan.l @@ -166,7 +166,8 @@ static void escape_variable(bool as_ident); * <xe> extended quoted strings (support backslash escape sequences) * <xdolq> $foo$ quoted strings * <xui> quoted identifier with Unicode escapes - * <xuiend> end of a quoted identifier with Unicode escapes, UESCAPE can follow * <xus> quoted string with Unicode escapes + * <xuiend> end of a quoted identifier with Unicode escapes, UESCAPE can follow + * <xus> quoted string with Unicode escapes * <xusend> end of a quoted string with Unicode escapes, UESCAPE can follow * * Note: we intentionally don't mimic the backend's <xeu> state; we have [parent: 641c08041fab]