Allow backslash line continuations in pgbench's meta commands.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Jan 2017 16:10:02 +0000 (11:10 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
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 <optional> <replaceable>options</> </optional> <replaceable>dbname</>
 
   <para>
    Script file meta commands begin with a backslash (<literal>\</>) 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:
   </para>
@@ -838,7 +839,8 @@ pgbench <optional> <replaceable>options</> </optional> <replaceable>dbname</>
       Examples:
 <programlisting>
 \set ntellers 10 * :scale
-\set aid (1021 * random(1, 100000 * :scale)) % (100000 * :scale) + 1
+\set aid (1021 * random(1, 100000 * :scale)) % \
+           (100000 * :scale) + 1
 </programlisting></para>
     </listitem>
    </varlistentry>
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