isolation-setuplist-v2.patch
application/octet-stream
Filename: isolation-setuplist-v2.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
Series: patch v2
| File | + | − |
|---|---|---|
| src/test/isolation/isolationtester.c | 2 | 0 |
| src/test/isolation/isolationtester.h | 2 | 0 |
| src/test/isolation/README | 5 | 0 |
| src/test/isolation/specparse.y | 26 | 0 |
*** a/src/test/isolation/README
--- b/src/test/isolation/README
***************
*** 48,56 **** 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.
teardown { <SQL> }
--- 48,58 ----
setup { <SQL> }
! Multiple setup blocks are allowed. Each is run separately (in the given
! order). Some statements, like VACUUM, need to be split to a separate
! block. Each 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 required.
teardown { <SQL> }
*** 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 <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,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: