Fix lexing of U& sequences just before EOF.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 4 Feb 2014 00:47:57 +0000 (19:47 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 4 Feb 2014 00:47:57 +0000 (19:47 -0500)
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
src/bin/psql/psqlscan.l

index 68492204c777df00a2efb8e97d22db6f727ecb0b..e102e7c81e853a387c77b0a2ce42f46fedfa8427 100644 (file)
@@ -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;
 
index 7d61f932fdd6f02daa46c8c9305ea7696746c138..9231459755be6aad4aa8a0ea3797473d84cc87a6 100644 (file)
@@ -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