Age Owner TLA Line data Source code
1 : %{
2 : /*-------------------------------------------------------------------------
3 : *
4 : * specparse.y
5 : * bison grammar for the isolation test file format
6 : *
7 : * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 : * Portions Copyright (c) 1994, Regents of the University of California
9 : *
10 : *-------------------------------------------------------------------------
11 : */
12 :
13 : #include "postgres_fe.h"
14 :
15 : #include "isolationtester.h"
16 : #include "specparse.h"
17 :
18 : /* silence -Wmissing-variable-declarations */
19 : extern int spec_yychar;
20 : extern int spec_yynerrs;
21 :
22 : TestSpec parseresult; /* result of parsing is left here */
23 :
24 : %}
25 :
26 : %expect 0
27 : %name-prefix="spec_yy"
28 :
29 : %union
30 : {
31 : char *str;
32 : int integer;
33 : Session *session;
34 : Step *step;
35 : Permutation *permutation;
36 : PermutationStep *permutationstep;
37 : PermutationStepBlocker *blocker;
38 : struct
39 : {
40 : void **elements;
41 : int nelements;
42 : } ptr_list;
43 : }
44 :
45 : %type <ptr_list> setup_list
46 : %type <str> opt_setup opt_teardown
47 : %type <str> setup
48 : %type <ptr_list> step_list session_list permutation_list opt_permutation_list
49 : %type <ptr_list> permutation_step_list blocker_list
50 : %type <session> session
51 : %type <step> step
52 : %type <permutation> permutation
53 : %type <permutationstep> permutation_step
54 : %type <blocker> blocker
55 :
56 : %token <str> sqlblock identifier
57 : %token <integer> INTEGER
58 : %token NOTICES PERMUTATION SESSION SETUP STEP TEARDOWN TEST
59 :
60 : %%
61 :
62 : TestSpec:
63 : setup_list
64 : opt_teardown
65 : session_list
66 : opt_permutation_list
67 : {
4750 kgrittn@postgresql.o 68 CBC 139 : parseresult.setupsqls = (char **) $1.elements;
69 139 : parseresult.nsetupsqls = $1.nelements;
5325 heikki.linnakangas@i 70 139 : parseresult.teardownsql = $2;
71 139 : parseresult.sessions = (Session **) $3.elements;
72 139 : parseresult.nsessions = $3.nelements;
73 139 : parseresult.permutations = (Permutation **) $4.elements;
74 139 : parseresult.npermutations = $4.nelements;
75 : }
76 : ;
77 :
78 : setup_list:
79 : /* EMPTY */
80 : {
4750 kgrittn@postgresql.o 81 139 : $$.elements = NULL;
82 139 : $$.nelements = 0;
83 : }
84 : | setup_list setup
85 : {
3294 tgl@sss.pgh.pa.us 86 280 : $$.elements = pg_realloc($1.elements,
87 140 : ($1.nelements + 1) * sizeof(void *));
4750 kgrittn@postgresql.o 88 140 : $$.elements[$1.nelements] = $2;
89 140 : $$.nelements = $1.nelements + 1;
90 : }
91 : ;
92 :
93 : opt_setup:
5325 heikki.linnakangas@i 94 133 : /* EMPTY */ { $$ = NULL; }
4750 kgrittn@postgresql.o 95 209 : | setup { $$ = $1; }
96 : ;
97 :
98 : setup:
99 349 : SETUP sqlblock { $$ = $2; }
100 : ;
101 :
102 : opt_teardown:
5325 heikki.linnakangas@i 103 330 : /* EMPTY */ { $$ = NULL; }
104 151 : | TEARDOWN sqlblock { $$ = $2; }
105 : ;
106 :
107 : session_list:
108 : session_list session
109 : {
3294 tgl@sss.pgh.pa.us 110 406 : $$.elements = pg_realloc($1.elements,
111 203 : ($1.nelements + 1) * sizeof(void *));
5325 heikki.linnakangas@i 112 203 : $$.elements[$1.nelements] = $2;
113 203 : $$.nelements = $1.nelements + 1;
114 : }
115 : | session
116 : {
117 139 : $$.nelements = 1;
3294 tgl@sss.pgh.pa.us 118 139 : $$.elements = pg_malloc(sizeof(void *));
5325 heikki.linnakangas@i 119 139 : $$.elements[0] = $1;
120 : }
121 : ;
122 :
123 : session:
124 : SESSION identifier opt_setup step_list opt_teardown
125 : {
3294 tgl@sss.pgh.pa.us 126 342 : $$ = pg_malloc(sizeof(Session));
5325 heikki.linnakangas@i 127 342 : $$->name = $2;
128 342 : $$->setupsql = $3;
129 342 : $$->steps = (Step **) $4.elements;
130 342 : $$->nsteps = $4.nelements;
131 342 : $$->teardownsql = $5;
132 : }
133 : ;
134 :
135 : step_list:
136 : step_list step
137 : {
3294 tgl@sss.pgh.pa.us 138 2176 : $$.elements = pg_realloc($1.elements,
139 1088 : ($1.nelements + 1) * sizeof(void *));
5325 heikki.linnakangas@i 140 1088 : $$.elements[$1.nelements] = $2;
141 1088 : $$.nelements = $1.nelements + 1;
142 : }
143 : | step
144 : {
145 342 : $$.nelements = 1;
3294 tgl@sss.pgh.pa.us 146 342 : $$.elements = pg_malloc(sizeof(void *));
5325 heikki.linnakangas@i 147 342 : $$.elements[0] = $1;
148 : }
149 : ;
150 :
151 :
152 : step:
153 : STEP identifier sqlblock
154 : {
3294 tgl@sss.pgh.pa.us 155 1430 : $$ = pg_malloc(sizeof(Step));
5325 heikki.linnakangas@i 156 1430 : $$->name = $2;
157 1430 : $$->sql = $3;
1537 tgl@sss.pgh.pa.us 158 1430 : $$->session = -1; /* until filled */
2205 michael@paquier.xyz 159 1430 : $$->used = false;
160 : }
161 : ;
162 :
163 :
164 : opt_permutation_list:
165 : permutation_list
166 : {
5325 heikki.linnakangas@i 167 125 : $$ = $1;
168 : }
169 : | /* EMPTY */
170 : {
171 14 : $$.elements = NULL;
172 14 : $$.nelements = 0;
173 : }
174 :
175 : permutation_list:
176 : permutation_list permutation
177 : {
3294 tgl@sss.pgh.pa.us 178 2154 : $$.elements = pg_realloc($1.elements,
179 1077 : ($1.nelements + 1) * sizeof(void *));
5325 heikki.linnakangas@i 180 1077 : $$.elements[$1.nelements] = $2;
181 1077 : $$.nelements = $1.nelements + 1;
182 : }
183 : | permutation
184 : {
185 125 : $$.nelements = 1;
3294 tgl@sss.pgh.pa.us 186 125 : $$.elements = pg_malloc(sizeof(void *));
5325 heikki.linnakangas@i 187 125 : $$.elements[0] = $1;
188 : }
189 : ;
190 :
191 :
192 : permutation:
193 : PERMUTATION permutation_step_list
194 : {
3294 tgl@sss.pgh.pa.us 195 1202 : $$ = pg_malloc(sizeof(Permutation));
5325 heikki.linnakangas@i 196 1202 : $$->nsteps = $2.nelements;
1537 tgl@sss.pgh.pa.us 197 1202 : $$->steps = (PermutationStep **) $2.elements;
198 : }
199 : ;
200 :
201 : permutation_step_list:
202 : permutation_step_list permutation_step
203 : {
3294 204 15602 : $$.elements = pg_realloc($1.elements,
205 7801 : ($1.nelements + 1) * sizeof(void *));
5325 heikki.linnakangas@i 206 7801 : $$.elements[$1.nelements] = $2;
207 7801 : $$.nelements = $1.nelements + 1;
208 : }
209 : | permutation_step
210 : {
211 1202 : $$.nelements = 1;
3294 tgl@sss.pgh.pa.us 212 1202 : $$.elements = pg_malloc(sizeof(void *));
5325 heikki.linnakangas@i 213 1202 : $$.elements[0] = $1;
214 : }
215 : ;
216 :
217 : permutation_step:
218 : identifier
219 : {
1537 tgl@sss.pgh.pa.us 220 8943 : $$ = pg_malloc(sizeof(PermutationStep));
221 8943 : $$->name = $1;
222 8943 : $$->blockers = NULL;
223 8943 : $$->nblockers = 0;
224 8943 : $$->step = NULL;
225 : }
226 : | identifier '(' blocker_list ')'
227 : {
228 60 : $$ = pg_malloc(sizeof(PermutationStep));
229 60 : $$->name = $1;
230 60 : $$->blockers = (PermutationStepBlocker **) $3.elements;
231 60 : $$->nblockers = $3.nelements;
232 60 : $$->step = NULL;
233 : }
234 : ;
235 :
236 : blocker_list:
237 : blocker_list ',' blocker
238 : {
1537 tgl@sss.pgh.pa.us 239 UBC 0 : $$.elements = pg_realloc($1.elements,
240 0 : ($1.nelements + 1) * sizeof(void *));
241 0 : $$.elements[$1.nelements] = $3;
242 0 : $$.nelements = $1.nelements + 1;
243 : }
244 : | blocker
245 : {
1537 tgl@sss.pgh.pa.us 246 CBC 60 : $$.nelements = 1;
247 60 : $$.elements = pg_malloc(sizeof(void *));
248 60 : $$.elements[0] = $1;
249 : }
250 : ;
251 :
252 : blocker:
253 : identifier
254 : {
255 47 : $$ = pg_malloc(sizeof(PermutationStepBlocker));
256 47 : $$->stepname = $1;
257 47 : $$->blocktype = PSB_OTHER_STEP;
258 47 : $$->num_notices = -1;
259 47 : $$->step = NULL;
260 47 : $$->target_notices = -1;
261 : }
262 : | identifier NOTICES INTEGER
263 : {
264 1 : $$ = pg_malloc(sizeof(PermutationStepBlocker));
265 1 : $$->stepname = $1;
266 1 : $$->blocktype = PSB_NUM_NOTICES;
267 1 : $$->num_notices = $3;
268 1 : $$->step = NULL;
269 1 : $$->target_notices = -1;
270 : }
271 : | '*'
272 : {
273 12 : $$ = pg_malloc(sizeof(PermutationStepBlocker));
274 12 : $$->stepname = NULL;
275 12 : $$->blocktype = PSB_ONCE;
276 12 : $$->num_notices = -1;
277 12 : $$->step = NULL;
278 12 : $$->target_notices = -1;
279 : }
280 : ;
281 :
282 : %%
|