aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-02-03 19:47:57 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2014-02-03 19:47:57 -0500
commit0c2338abbb17b7b319f36a73d8db77735346804f (patch)
treee9e4dfa75ea7ff247cf2326c493842e1ae4ef8a3 /src
parent0def2573c5f0ff127d0c7dc12ec7da56ae6fb7fe (diff)
downloadpostgresql-0c2338abbb17b7b319f36a73d8db77735346804f.tar.gz
postgresql-0c2338abbb17b7b319f36a73d8db77735346804f.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/scan.l17
-rw-r--r--src/bin/psql/psqlscan.l3
2 files changed, 13 insertions, 7 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 68492204c77..e102e7c81e8 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 7d61f932fdd..9231459755b 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