*** a/src/test/isolation/isolationtester.c --- b/src/test/isolation/isolationtester.c *************** *** 512,520 **** run_permutation(TestSpec * testspec, int nsteps, Step ** steps) printf("\n"); /* Perform setup */ ! if (testspec->setupsql) { ! res = PQexec(conns[0], testspec->setupsql); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "setup failed: %s", PQerrorMessage(conns[0])); --- 512,520 ---- printf("\n"); /* Perform setup */ ! for (i = 0; i < testspec->nsetupsqls; i++) { ! res = PQexec(conns[0], testspec->setupsqls[i]); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "setup failed: %s", PQerrorMessage(conns[0])); *** a/src/test/isolation/isolationtester.h --- b/src/test/isolation/isolationtester.h *************** *** 42,48 **** typedef struct typedef struct { ! char *setupsql; char *teardownsql; Session **sessions; int nsessions; --- 42,49 ---- typedef struct { ! char **setupsqls; ! int nsetupsqls; char *teardownsql; Session **sessions; int nsessions; *** a/src/test/isolation/specparse.y --- b/src/test/isolation/specparse.y *************** *** 35,41 **** TestSpec parseresult; /* result of parsing is left here */ --- 35,43 ---- } ptr_list; } + %type setup_list %type opt_setup opt_teardown + %type setup %type step_list session_list permutation_list opt_permutation_list %type string_list %type session *************** *** 48,59 **** TestSpec parseresult; /* result of parsing is left here */ %% TestSpec: ! opt_setup opt_teardown session_list opt_permutation_list { ! parseresult.setupsql = $1; parseresult.teardownsql = $2; parseresult.sessions = (Session **) $3.elements; parseresult.nsessions = $3.nelements; --- 50,62 ---- %% TestSpec: ! setup_list opt_teardown session_list opt_permutation_list { ! parseresult.setupsqls = (char **) $1.elements; ! parseresult.nsetupsqls = $1.nelements; parseresult.teardownsql = $2; parseresult.sessions = (Session **) $3.elements; parseresult.nsessions = $3.nelements; *************** *** 62,70 **** TestSpec: } ; opt_setup: /* EMPTY */ { $$ = NULL; } ! | SETUP sqlblock { $$ = $2; } ; opt_teardown: --- 65,93 ---- } ; + setup_list: + setup_list setup + { + $$.elements = realloc($1.elements, + ($1.nelements + 1) * sizeof(void *)); + $$.elements[$1.nelements] = $2; + $$.nelements = $1.nelements + 1; + } + | setup + { + $$.nelements = 1; + $$.elements = malloc(sizeof(void *)); + $$.elements[0] = $1; + } + ; + opt_setup: /* EMPTY */ { $$ = NULL; } ! | setup { $$ = $1; } ! ; ! ! setup: ! SETUP sqlblock { $$ = $2; } ; opt_teardown: