Allow backslash line continuations in pgbench's meta commands.
authorTom Lane
Fri, 20 Jan 2017 16:10:02 +0000 (11:10 -0500)
committerTom Lane
Fri, 20 Jan 2017 16:10:22 +0000 (11:10 -0500)
A pgbench meta command can now be continued onto additional line(s) of a
script file by writing backslash-return.  The continuation marker is
equivalent to white space in that it separates tokens.

Eventually it'd be nice to have the same thing in psql, but that will
be a much larger project.

Fabien Coelho, reviewed by Rafia Sabih

Discussion: https://postgr.es/m/alpine.DEB.2.20.1610031049310.19411@lancre

doc/src/sgml/ref/pgbench.sgml
src/bin/pgbench/exprscan.l

index 3fb29f8c1d47287cf9e188a5200e99dfae70cbb9..1eee8dc5742d5795395a73a167a203138b63d19b 100644 (file)
@@ -809,7 +809,8 @@ pgbench  options  dbname
 
   
    Script file meta commands begin with a backslash (\) and
-   extend to the end of the line.
+   normally extend to the end of the line, although they can be continued
+   to additional lines by writing backslash-return.
    Arguments to a meta command are separated by white space.
    These meta commands are supported:
   
@@ -838,7 +839,8 @@ pgbench  options  dbname
       Examples:
 
 \set ntellers 10 * :scale
-\set aid (1021 * random(1, 100000 * :scale)) % (100000 * :scale) + 1
+\set aid (1021 * random(1, 100000 * :scale)) % \
+           (100000 * :scale) + 1
 
     
    
index 9a3be3d667ff0125b5ae82f8bccda0541062b629..dc1367bbdbcb0853a43759f5a1324b11c6e886fc 100644 (file)
@@ -66,6 +66,9 @@ space         [ \t\r\f\v]
 nonspace       [^ \t\r\f\v\n]
 newline            [\n]
 
+/* Line continuation marker */
+continuation   \\{newline}
+
 /* Exclusive states */
 %x EXPR
 
@@ -96,8 +99,20 @@ newline          [\n]
                    return 1;
                }
 
+   /*
+    * We need this rule to avoid returning "word\" instead of recognizing
+    * a continuation marker just after a word:
+    */
+{nonspace}+{continuation}  {
+                   /* Found "word\\\n", emit and return just "word" */
+                   psqlscan_emit(cur_state, yytext, yyleng - 2);
+                   return 1;
+               }
+
 {space}+       { /* ignore */ }
 
+{continuation} { /* ignore */ }
+
 {newline}      {
                    /* report end of command */
                    last_was_newline = true;
@@ -138,14 +153,16 @@ newline           [\n]
                    return FUNCTION;
                }
 
+{space}+       { /* ignore */ }
+
+{continuation} { /* ignore */ }
+
 {newline}      {
                    /* report end of command */
                    last_was_newline = true;
                    return 0;
                }
 
-{space}+       { /* ignore */ }
-
 .              {
                    /*
                     * must strdup yytext so that expr_yyerror_more doesn't