mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-11 20:47:31 +08:00
209 lines
4.0 KiB
Plaintext
209 lines
4.0 KiB
Plaintext
%{
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* specparse.y
|
|
* bison grammar for the isolation test file format
|
|
*
|
|
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres_fe.h"
|
|
|
|
#include "isolationtester.h"
|
|
|
|
|
|
TestSpec parseresult; /* result of parsing is left here */
|
|
|
|
%}
|
|
|
|
%expect 0
|
|
%name-prefix="spec_yy"
|
|
|
|
%union
|
|
{
|
|
char *str;
|
|
Session *session;
|
|
Step *step;
|
|
Permutation *permutation;
|
|
struct
|
|
{
|
|
void **elements;
|
|
int nelements;
|
|
} 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_literal_list
|
|
%type <session> session
|
|
%type <step> step
|
|
%type <permutation> permutation
|
|
|
|
%token <str> sqlblock string_literal
|
|
%token PERMUTATION SESSION SETUP STEP TEARDOWN TEST
|
|
|
|
%%
|
|
|
|
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;
|
|
parseresult.permutations = (Permutation **) $4.elements;
|
|
parseresult.npermutations = $4.nelements;
|
|
}
|
|
;
|
|
|
|
setup_list:
|
|
/* EMPTY */
|
|
{
|
|
$$.elements = NULL;
|
|
$$.nelements = 0;
|
|
}
|
|
| setup_list setup
|
|
{
|
|
$$.elements = pg_realloc($1.elements,
|
|
($1.nelements + 1) * sizeof(void *));
|
|
$$.elements[$1.nelements] = $2;
|
|
$$.nelements = $1.nelements + 1;
|
|
}
|
|
;
|
|
|
|
opt_setup:
|
|
/* EMPTY */ { $$ = NULL; }
|
|
| setup { $$ = $1; }
|
|
;
|
|
|
|
setup:
|
|
SETUP sqlblock { $$ = $2; }
|
|
;
|
|
|
|
opt_teardown:
|
|
/* EMPTY */ { $$ = NULL; }
|
|
| TEARDOWN sqlblock { $$ = $2; }
|
|
;
|
|
|
|
session_list:
|
|
session_list session
|
|
{
|
|
$$.elements = pg_realloc($1.elements,
|
|
($1.nelements + 1) * sizeof(void *));
|
|
$$.elements[$1.nelements] = $2;
|
|
$$.nelements = $1.nelements + 1;
|
|
}
|
|
| session
|
|
{
|
|
$$.nelements = 1;
|
|
$$.elements = pg_malloc(sizeof(void *));
|
|
$$.elements[0] = $1;
|
|
}
|
|
;
|
|
|
|
session:
|
|
SESSION string_literal opt_setup step_list opt_teardown
|
|
{
|
|
$$ = pg_malloc(sizeof(Session));
|
|
$$->name = $2;
|
|
$$->setupsql = $3;
|
|
$$->steps = (Step **) $4.elements;
|
|
$$->nsteps = $4.nelements;
|
|
$$->teardownsql = $5;
|
|
}
|
|
;
|
|
|
|
step_list:
|
|
step_list step
|
|
{
|
|
$$.elements = pg_realloc($1.elements,
|
|
($1.nelements + 1) * sizeof(void *));
|
|
$$.elements[$1.nelements] = $2;
|
|
$$.nelements = $1.nelements + 1;
|
|
}
|
|
| step
|
|
{
|
|
$$.nelements = 1;
|
|
$$.elements = pg_malloc(sizeof(void *));
|
|
$$.elements[0] = $1;
|
|
}
|
|
;
|
|
|
|
|
|
step:
|
|
STEP string_literal sqlblock
|
|
{
|
|
$$ = pg_malloc(sizeof(Step));
|
|
$$->name = $2;
|
|
$$->sql = $3;
|
|
$$->errormsg = NULL;
|
|
}
|
|
;
|
|
|
|
|
|
opt_permutation_list:
|
|
permutation_list
|
|
{
|
|
$$ = $1;
|
|
}
|
|
| /* EMPTY */
|
|
{
|
|
$$.elements = NULL;
|
|
$$.nelements = 0;
|
|
}
|
|
|
|
permutation_list:
|
|
permutation_list permutation
|
|
{
|
|
$$.elements = pg_realloc($1.elements,
|
|
($1.nelements + 1) * sizeof(void *));
|
|
$$.elements[$1.nelements] = $2;
|
|
$$.nelements = $1.nelements + 1;
|
|
}
|
|
| permutation
|
|
{
|
|
$$.nelements = 1;
|
|
$$.elements = pg_malloc(sizeof(void *));
|
|
$$.elements[0] = $1;
|
|
}
|
|
;
|
|
|
|
|
|
permutation:
|
|
PERMUTATION string_literal_list
|
|
{
|
|
$$ = pg_malloc(sizeof(Permutation));
|
|
$$->stepnames = (char **) $2.elements;
|
|
$$->nsteps = $2.nelements;
|
|
}
|
|
;
|
|
|
|
string_literal_list:
|
|
string_literal_list string_literal
|
|
{
|
|
$$.elements = pg_realloc($1.elements,
|
|
($1.nelements + 1) * sizeof(void *));
|
|
$$.elements[$1.nelements] = $2;
|
|
$$.nelements = $1.nelements + 1;
|
|
}
|
|
| string_literal
|
|
{
|
|
$$.nelements = 1;
|
|
$$.elements = pg_malloc(sizeof(void *));
|
|
$$.elements[0] = $1;
|
|
}
|
|
;
|
|
|
|
%%
|
|
|
|
#include "specscanner.c"
|