Allow isolation tests to specify multiple setup blocks.

Each setup block is run as a single PQexec submission, and some
statements such as VACUUM cannot be combined with others in such a
block.

Backpatch to 9.2.

Kevin Grittner and Tom Lane
This commit is contained in:
Kevin Grittner 2012-09-04 19:31:06 -05:00
parent 63f1ccd838
commit c63f309cca
4 changed files with 35 additions and 8 deletions

View File

@ -49,8 +49,12 @@ subdirectory. A test specification consists of four parts, in this order:
setup { <SQL> }
The given SQL block is executed once, in one session only, before running
the test. Create any test tables or other required objects here. This
part is optional.
the test. Create any test tables or other required objects here. This
part is optional. Multiple setup blocks are allowed if needed; each is
run separately, in the given order. (The reason for allowing multiple
setup blocks is that each block is run as a single PQexec submission,
and some statements such as VACUUM cannot be combined with others in such
a block.)
teardown { <SQL> }

View File

@ -512,9 +512,9 @@ run_permutation(TestSpec * testspec, int nsteps, Step ** steps)
printf("\n");
/* Perform setup */
if (testspec->setupsql)
for (i = 0; i < testspec->nsetupsqls; i++)
{
res = PQexec(conns[0], testspec->setupsql);
res = PQexec(conns[0], testspec->setupsqls[i]);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "setup failed: %s", PQerrorMessage(conns[0]));

View File

@ -42,7 +42,8 @@ typedef struct
typedef struct
{
char *setupsql;
char **setupsqls;
int nsetupsqls;
char *teardownsql;
Session **sessions;
int nsessions;

View File

@ -35,7 +35,9 @@ TestSpec parseresult; /* result of parsing is left here */
} ptr_list;
}
%type <ptr_list> setup_list
%type <str> opt_setup opt_teardown
%type <str> setup
%type <ptr_list> step_list session_list permutation_list opt_permutation_list
%type <ptr_list> string_list
%type <session> session
@ -48,12 +50,13 @@ TestSpec parseresult; /* result of parsing is left here */
%%
TestSpec:
opt_setup
setup_list
opt_teardown
session_list
opt_permutation_list
{
parseresult.setupsql = $1;
parseresult.setupsqls = (char **) $1.elements;
parseresult.nsetupsqls = $1.nelements;
parseresult.teardownsql = $2;
parseresult.sessions = (Session **) $3.elements;
parseresult.nsessions = $3.nelements;
@ -62,9 +65,28 @@ TestSpec:
}
;
setup_list:
/* EMPTY */
{
$$.elements = NULL;
$$.nelements = 0;
}
| setup_list setup
{
$$.elements = realloc($1.elements,
($1.nelements + 1) * sizeof(void *));
$$.elements[$1.nelements] = $2;
$$.nelements = $1.nelements + 1;
}
;
opt_setup:
/* EMPTY */ { $$ = NULL; }
| SETUP sqlblock { $$ = $2; }
| setup { $$ = $1; }
;
setup:
SETUP sqlblock { $$ = $2; }
;
opt_teardown: