]> granicus.if.org Git - postgresql/commitdiff
Fix portability issue in isolationtester grammar.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 27 May 2015 23:14:40 +0000 (19:14 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 27 May 2015 23:14:40 +0000 (19:14 -0400)
specparse.y and specscanner.l used "string" as a token name.  Now, bison
likes to define each token name as a macro for the token code it assigns,
which means those names are basically off-limits for any other use within
the grammar file or included headers.  So names as generic as "string" are
dangerous.  This is what was causing the recent failures on protosciurus:
some versions of Solaris' sys/kstat.h use "string" as a field name.
With late-model bison we don't see this problem because the token macros
aren't defined till later (that is why castoroides didn't show the problem
even though it's on the same machine).  But protosciurus uses bison 1.875
which defines the token macros up front.

This land mine has been there from day one; we'd have found it sooner
except that protosciurus wasn't trying to run the isolation tests till
recently.

To fix, rename the token to "string_literal" which is hopefully less
likely to collide with names used by system headers.  Back-patch to
all branches containing the isolation tests.

src/test/isolation/specparse.y
src/test/isolation/specscanner.l

index 47bfbc4f399eafd66687d871f3fdbbc1b4f62d7c..1b984cccde42e0836dcfb50619094b56831cea1a 100644 (file)
@@ -37,12 +37,12 @@ TestSpec            parseresult;                    /* result of parsing is left here */
 
 %type <str>  opt_setup opt_teardown
 %type <ptr_list> step_list session_list permutation_list opt_permutation_list
-%type <ptr_list> string_list
+%type <ptr_list> string_literal_list
 %type <session> session
 %type <step> step
 %type <permutation> permutation
 
-%token <str> sqlblock string
+%token <str> sqlblock string_literal
 %token PERMUTATION SESSION SETUP STEP TEARDOWN TEST
 
 %%
@@ -89,7 +89,7 @@ session_list:
                ;
 
 session:
-                       SESSION string opt_setup step_list opt_teardown
+                       SESSION string_literal opt_setup step_list opt_teardown
                        {
                                $$ = malloc(sizeof(Session));
                                $$->name = $2;
@@ -118,7 +118,7 @@ step_list:
 
 
 step:
-                       STEP string sqlblock
+                       STEP string_literal sqlblock
                        {
                                $$ = malloc(sizeof(Step));
                                $$->name = $2;
@@ -156,7 +156,7 @@ permutation_list:
 
 
 permutation:
-                       PERMUTATION string_list
+                       PERMUTATION string_literal_list
                        {
                                $$ = malloc(sizeof(Permutation));
                                $$->stepnames = (char **) $2.elements;
@@ -164,15 +164,15 @@ permutation:
                        }
                ;
 
-string_list:
-                       string_list string
+string_literal_list:
+                       string_literal_list string_literal
                        {
                                $$.elements = realloc($1.elements,
                                                                          ($1.nelements + 1) * sizeof(void *));
                                $$.elements[$1.nelements] = $2;
                                $$.nelements = $1.nelements + 1;
                        }
-                       | string
+                       | string_literal
                        {
                                $$.nelements = 1;
                                $$.elements = malloc(sizeof(void *));
index 36e10e7678572622669708b5b20f17b6c9ecbad9..a8d5fc7e879c68be6b9efdb0bb20ec1775ff8871 100644 (file)
@@ -57,7 +57,7 @@ teardown              { return(TEARDOWN); }
                                        litbuf[litbufpos] = '\0';
                                        yylval.str = strdup(litbuf);
                                        BEGIN(INITIAL);
-                                       return(string);
+                                       return(string_literal);
                                }
 <qstr>.                        { addlitchar(yytext[0]); }
 <qstr>\n               { yyerror("unexpected newline in quoted string"); }