Fix pgbench lexer's "continuation" rule to cope with Windows newlines.
authorTom Lane
Mon, 17 Sep 2018 16:11:43 +0000 (12:11 -0400)
committerTom Lane
Mon, 17 Sep 2018 16:11:43 +0000 (12:11 -0400)
Our general practice in frontend code is to accept input with either
Unix-style newlines (\n) or DOS-style (\r\n).  pgbench was mostly down
with that, but its rule for line continuations (backslash-newline) was
not.  This had been masked on Windows buildfarm machines before commit
0ba06e0bf by use of Windows text mode to read files.  We could have fixed
it by forcing text mode again, but it's better to fix the parsing code
so that Windows-style text files on Unix systems don't cause problems.

Back-patch to v10 where pgbench grew line continuations.

Discussion: https://postgr.es/m/17194.1537191697@sss.pgh.pa.us

src/bin/pgbench/exprscan.l

index dc1367bbdbcb0853a43759f5a1324b11c6e886fc..c3eb5f9c6bac2682843a250652f40e534a4ba859 100644 (file)
@@ -67,7 +67,7 @@ nonspace      [^ \t\r\f\v\n]
 newline            [\n]
 
 /* Line continuation marker */
-continuation   \\{newline}
+continuation   \\\r?{newline}
 
 /* Exclusive states */
 %x EXPR
@@ -104,8 +104,12 @@ continuation   \\{newline}
     * a continuation marker just after a word:
     */
 {nonspace}+{continuation}  {
-                   /* Found "word\\\n", emit and return just "word" */
-                   psqlscan_emit(cur_state, yytext, yyleng - 2);
+                   /* Found "word\\\r?\n", emit and return just "word" */
+                   int     wordlen = yyleng - 2;
+                   if (yytext[wordlen] == '\r')
+                       wordlen--;
+                   Assert(yytext[wordlen] == '\\');
+                   psqlscan_emit(cur_state, yytext, wordlen);
                    return 1;
                }