You have rules for

        {nonspace}+ [...]
        {continuation}

Remember that flex always takes the rule that produces the longest match
starting at the current point.  {space}+ and {newline} don't conflict with
continuations, but {nonspace}+ does:

Indeed, I totally overlooked "{nonspace}+".

[...] I think this is surprising and inconsistent.

Sure.

Probably the easiest fix is to add a rule that explicitly matches this situation:

{nonspace}+{continuation}  { ... throw back 2 chars and return the rest ... }

Well, as the continuation characters must be ignored, so there is no need to throw them back, just adding the special case is enough?

Attached a patch which adds the rule and just sends the found word, plus a test script which also exercises this particular case.

Note anyway that it is not necessarily what people may intend when using a continuation:

  foo\
bla

might mean "foobla" rather than "foo" then "bla". For instance with bash:

 sh>ec\
 > ho 1
 1

But the same trick in python gives a syntax error:

  py> print\
  ... (1)
  1 # ok...
  py> pri\
  ... nt(1)
    File "<stdin>", line 2
      nt(1)
       ^
  SyntaxError: invalid syntax

I think it fine if pgbench behaves as python.

--
Fabien.
diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml
index 3fb29f8..eb0e8ac 100644
--- a/doc/src/sgml/ref/pgbench.sgml
+++ b/doc/src/sgml/ref/pgbench.sgml
@@ -810,6 +810,7 @@ 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.
+   They can spread over several lines with backslash-return continuations.
    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 9a3be3d..ec58ae3 100644
--- a/src/bin/pgbench/exprscan.l
+++ b/src/bin/pgbench/exprscan.l
@@ -65,6 +65,7 @@ alnum			[a-zA-Z0-9_]
 space			[ \t\r\f\v]
 nonspace		[^ \t\r\f\v\n]
 newline			[\n]
+continuation	\\{newline}
 
 /* Exclusive states */
 %x EXPR
@@ -90,6 +91,11 @@ newline			[\n]
 
 	/* INITIAL state */
 
+{nonspace}+{continuation}		{
+					/* Found "word\\\n", just emit word and return it */
+					psqlscan_emit(cur_state, yytext, yyleng-2);
+					return 1;
+				}
 {nonspace}+		{
 					/* Found a word, emit and return it */
 					psqlscan_emit(cur_state, yytext, yyleng);
@@ -104,6 +110,8 @@ newline			[\n]
 					return 0;
 				}
 
+{continuation}	{ /* ignore */ }
+
 	/* EXPR state */
 
 <EXPR>{
@@ -138,6 +146,8 @@ newline			[\n]
 					return FUNCTION;
 				}
 
+{continuation}	{ /* ignore */ }
+
 {newline}		{
 					/* report end of command */
 					last_was_newline = true;

Attachment: cont.sql
Description: application/sql

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to