Fix bugs in the isolation tester flex rules.
authorHeikki Linnakangas <[email protected]>
Thu, 10 Mar 2011 07:01:27 +0000 (09:01 +0200)
committerHeikki Linnakangas <[email protected]>
Thu, 10 Mar 2011 07:06:56 +0000 (09:06 +0200)
Tom Lane pointed out that it was giving a warning: "-s option given but
default rule can be matched". That was because there was no rule to handle
newline in a quoted string. I made that throw an error.

Also, line number tracking was broken, giving incorrect line number on
error. Fixed that too.

src/test/isolation/specscanner.l

index 6752aca82d460357e2a19ca9b6602aa04045d82d..c3193917c037427c40ce62602c0fc04c4b7d6e77 100644 (file)
@@ -32,10 +32,9 @@ static void addlitchar(const char c);
 %x qstr
 
 non_newline            [^\n\r]
-space                  [ \t\n\r\f]
+space                  [ \t\r\f]
 
 comment                        ("#"{non_newline}*)
-whitespace             ({space}+|{comment})
 
 %%
 
@@ -46,10 +45,10 @@ step                        { return(STEP); }
 teardown               { return(TEARDOWN); }
 
 [\n]                   { yyline++; }
-{whitespace}   {
-                                       /* ignore */
-                               }
+{comment}              { /* ignore */ }
+{space}                        { /* ignore */ }
 
+ /* Quoted strings: "foo" */
 \"                             {
                                        litbufpos = 0;
                                        BEGIN(qstr);
@@ -61,27 +60,36 @@ teardown            { return(TEARDOWN); }
                                        return(string);
                                }
 <qstr>.                        { addlitchar(yytext[0]); }
+<qstr>\n               { yyerror("unexpected newline in quoted string"); }
+<qstr><<EOF>>  { yyerror("unterminated quoted string"); }
 
+ /* SQL blocks: { UPDATE ... } */
 "{"                            {
 
                                        litbufpos = 0;
                                        BEGIN(sql);
                                }
-
 <sql>"}"               {
                                        litbuf[litbufpos] = '\0';
                                        yylval.str = strdup(litbuf);
                                        BEGIN(INITIAL);
                                        return(sqlblock);
                                }
-<sql>[^}]              { addlitchar(yytext[0]);}
-
+<sql>.                 {
+                                       addlitchar(yytext[0]);
+                               }
+<sql>\n                        {
+                                       yyline++;
+                                       addlitchar(yytext[0]);
+                               }
+<sql><<EOF>>   {
+                                       yyerror("unterminated sql block");
+                               }
 
 .                              {
                                        fprintf(stderr, "syntax error at line %d: unexpected character \"%s\"\n", yyline, yytext);
                                        exit(1);
                                }
-
 %%
 
 static void