diff options
author | Tom Lane | 2017-01-20 16:10:02 +0000 |
---|---|---|
committer | Tom Lane | 2017-01-20 16:10:22 +0000 |
commit | cdc2a70470bdbe3663dc464deb753d6d931bba61 (patch) | |
tree | 66d0896df12847de3794d3dd28f4e610ddbd9659 | |
parent | 954737095061e5b5f1d87fb8cc43f7f8afff64c6 (diff) |
Allow backslash line continuations in pgbench's meta commands.
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
-rw-r--r-- | doc/src/sgml/ref/pgbench.sgml | 6 | ||||
-rw-r--r-- | src/bin/pgbench/exprscan.l | 21 |
2 files changed, 23 insertions, 4 deletions
diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 3fb29f8c1d..1eee8dc574 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -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> diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l index 9a3be3d667..dc1367bbdb 100644 --- a/src/bin/pgbench/exprscan.l +++ b/src/bin/pgbench/exprscan.l @@ -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 |