Branch data Line data Source code
1 : : /* header */
2 : : /* src/interfaces/ecpg/preproc/ecpg.header */
3 : :
4 : : /* Copyright comment */
5 : : %{
6 : : #include "postgres_fe.h"
7 : :
8 : : #include "preproc_extern.h"
9 : : #include "preproc.h"
10 : : #include "ecpg_config.h"
11 : : #include <unistd.h>
12 : :
13 : : /* silence -Wmissing-variable-declarations */
14 : : extern int base_yychar;
15 : : extern int base_yynerrs;
16 : :
17 : :
18 : : /*
19 : : * The %name-prefix option below will make bison call base_yylex, but we
20 : : * really want it to call filtered_base_yylex (see parser.c).
21 : : */
22 : : #define base_yylex filtered_base_yylex
23 : :
24 : : /*
25 : : * This is only here so the string gets into the POT. Bison uses it
26 : : * internally.
27 : : */
28 : : #define bison_gettext_dummy gettext_noop("syntax error")
29 : :
30 : : /*
31 : : * Variables containing simple states.
32 : : */
33 : : int struct_level = 0;
34 : : int braces_open; /* brace level counter */
35 : : char *current_function;
36 : : int ecpg_internal_var = 0;
37 : : char *connection = NULL;
38 : : char *input_filename = NULL;
39 : :
40 : : static int FoundInto = 0;
41 : : static int initializer = 0;
42 : : static int pacounter = 1;
43 : : static struct this_type actual_type[STRUCT_DEPTH];
44 : : static char *actual_startline[STRUCT_DEPTH];
45 : : static int varchar_counter = 1;
46 : : static int bytea_counter = 1;
47 : :
48 : : /*
49 : : * We temporarily store struct members here while parsing struct declarations.
50 : : * The struct_member_list (at a given nesting depth) is constructed while
51 : : * scanning the fields within "struct { .... }", but we can't remove it upon
52 : : * seeing the right brace. It's kept around and copied into the variables
53 : : * or typedefs that follow, in order to handle cases like
54 : : * "struct foo { ... } foovar1, foovar2;". We recycle the storage only
55 : : * upon closing the current nesting level or starting the next struct
56 : : * declaration within the same nesting level.
57 : : * For cases like "struct foo foovar1, foovar2;", we copy the saved struct
58 : : * field list for the typedef or struct tag into the struct_member_list
59 : : * global variable, and then copy it again to the newly-declared variables.
60 : : */
61 : : struct ECPGstruct_member *struct_member_list[STRUCT_DEPTH] = {NULL};
62 : :
63 : : /* also store struct type so we can do a sizeof() later */
64 : : static char *ECPGstruct_sizeof = NULL;
65 : :
66 : : /* for forward declarations we have to store some data as well */
67 : : static char *forward_name = NULL;
68 : :
69 : : struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, NULL, NULL, NULL, {NULL}, 0};
70 : : struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
71 : :
72 : : static struct ECPGtype ecpg_query = {ECPGt_char_variable, NULL, NULL, NULL, {NULL}, 0};
73 : :
74 : : static bool check_declared_list(const char *name);
75 : : static void update_connection(const char *newconn);
76 : :
77 : :
78 : : /*
79 : : * "Location tracking" support. We commandeer Bison's location tracking
80 : : * mechanism to manage the output string for productions that ordinarily would
81 : : * return a <str> result. This allows the majority of those productions to
82 : : * have default semantic actions, reducing the size of the parser, and also
83 : : * greatly reducing its compilation time on some versions of clang.
84 : : *
85 : : * To do this, we make YYLTYPE be a pointer to a malloc'd string, and then
86 : : * merge the location strings of the input tokens in the default YYLLOC
87 : : * computation. Productions that are okay with the standard merge need not
88 : : * do anything more; otherwise, they can override it by assigning to @$.
89 : : */
90 : : #define YYLLOC_DEFAULT(Current, Rhs, N) yylloc_default(&(Current), Rhs, N)
91 : :
92 : : static void
93 : 126181 : yylloc_default(YYLTYPE *target, YYLTYPE *rhs, int N)
94 : : {
95 [ + + ]: 126181 : if (N > 1)
96 : : {
97 : : /* Concatenate non-empty inputs with one space between them */
98 : : char *result,
99 : : *ptr;
100 : 31984 : size_t needed = 0;
101 : :
102 [ + + ]: 106810 : for (int i = 1; i <= N; i++)
103 : : {
104 : 74826 : size_t thislen = strlen(rhs[i]);
105 : :
106 [ + + + + ]: 74826 : if (needed > 0 && thislen > 0)
107 : 10943 : needed++;
108 : 74826 : needed += thislen;
109 : : }
110 : 31984 : result = (char *) loc_alloc(needed + 1);
111 : 31984 : ptr = result;
112 [ + + ]: 106810 : for (int i = 1; i <= N; i++)
113 : : {
114 : 74826 : size_t thislen = strlen(rhs[i]);
115 : :
116 [ + + + + ]: 74826 : if (ptr > result && thislen > 0)
117 : 10943 : *ptr++ = ' ';
118 : 74826 : memcpy(ptr, rhs[i], thislen);
119 : 74826 : ptr += thislen;
120 : : }
121 : 31984 : *ptr = '\0';
122 : 31984 : *target = result;
123 : : }
124 [ + + ]: 94197 : else if (N == 1)
125 : : {
126 : : /* Just re-use the single input */
127 : 88168 : *target = rhs[1];
128 : : }
129 : : else
130 : : {
131 : : /* No need to allocate any space */
132 : 6029 : *target = "";
133 : : }
134 : 126181 : }
135 : :
136 : : /* and the rest */
137 : : static char *
138 : 133 : create_questionmarks(const char *name, bool array)
139 : : {
140 : 133 : struct variable *p = find_variable(name);
141 : : int count;
142 : 133 : char *result = "";
143 : :
144 : : /*
145 : : * In case we have a struct, we have to print as many "?" as there are
146 : : * attributes in the struct
147 : : *
148 : : * An array is only allowed together with an element argument
149 : : *
150 : : * This is essentially only used for inserts, but using a struct as input
151 : : * parameter is an error anywhere else so we don't have to worry here.
152 : : */
153 : :
154 [ + - - + : 133 : if (p->type->type == ECPGt_struct || (array && p->type->type == ECPGt_array && p->type->u.element->type == ECPGt_struct))
- - - - ]
155 : 0 : {
156 : : struct ECPGstruct_member *m;
157 : :
158 [ # # ]: 0 : if (p->type->type == ECPGt_struct)
159 : 0 : m = p->type->u.members;
160 : : else
161 : 0 : m = p->type->u.element->u.members;
162 : :
163 [ # # ]: 0 : for (count = 0; m != NULL; m = m->next, count++);
164 : : }
165 : : else
166 : 133 : count = 1;
167 : :
168 [ + + ]: 266 : for (; count > 0; count--)
169 : : {
170 : : char buf[32];
171 : :
172 : 133 : snprintf(buf, sizeof(buf), "$%d", pacounter++);
173 : 133 : result = cat_str(3, result, buf, " , ");
174 : : }
175 : :
176 : : /* remove the trailing " ," */
177 : 133 : result[strlen(result) - 3] = '\0';
178 : 133 : return result;
179 : : }
180 : :
181 : : static char *
182 : 43 : adjust_outofscope_cursor_vars(struct cursor *cur)
183 : : {
184 : : /*
185 : : * Informix accepts DECLARE with variables that are out of scope when OPEN
186 : : * is called. For instance you can DECLARE a cursor in one function, and
187 : : * OPEN/FETCH/CLOSE it in another functions. This is very useful for e.g.
188 : : * event-driver programming, but may also lead to dangerous programming.
189 : : * The limitation when this is allowed and doesn't cause problems have to
190 : : * be documented, like the allocated variables must not be realloc()'ed.
191 : : *
192 : : * We have to change the variables to our own struct and just store the
193 : : * pointer instead of the variable. Do it only for local variables, not
194 : : * for globals.
195 : : */
196 : 43 : char *result = "";
197 : : int insert;
198 : :
199 [ + + ]: 129 : for (insert = 1; insert >= 0; insert--)
200 : : {
201 : : struct arguments *list;
202 : : struct arguments *ptr;
203 : 86 : struct arguments *newlist = NULL;
204 : : struct variable *newvar,
205 : : *newind;
206 : :
207 [ + + ]: 86 : list = (insert ? cur->argsinsert : cur->argsresult);
208 : :
209 [ + + ]: 122 : for (ptr = list; ptr != NULL; ptr = ptr->next)
210 : : {
211 : : char var_text[20];
212 : : char *original_var;
213 : 36 : bool skip_set_var = false;
214 : 36 : bool var_ptr = false;
215 : :
216 : : /* change variable name to "ECPGget_var(<counter>)" */
217 : 36 : original_var = ptr->variable->name;
218 : 36 : snprintf(var_text, sizeof(var_text), "%d))", ecpg_internal_var);
219 : :
220 : : /* Don't emit ECPGset_var() calls for global variables */
221 [ + + ]: 36 : if (ptr->variable->brace_level == 0)
222 : : {
223 : 21 : newvar = ptr->variable;
224 : 21 : skip_set_var = true;
225 : : }
226 [ - + ]: 15 : else if ((ptr->variable->type->type == ECPGt_char_variable)
227 [ # # ]: 0 : && (strncmp(ptr->variable->name, "ECPGprepared_statement", strlen("ECPGprepared_statement")) == 0))
228 : : {
229 : 0 : newvar = ptr->variable;
230 : 0 : skip_set_var = true;
231 : : }
232 [ + + ]: 15 : else if ((ptr->variable->type->type != ECPGt_varchar
233 [ + + ]: 14 : && ptr->variable->type->type != ECPGt_char
234 [ + - ]: 7 : && ptr->variable->type->type != ECPGt_unsigned_char
235 [ + - ]: 7 : && ptr->variable->type->type != ECPGt_string
236 [ + + ]: 7 : && ptr->variable->type->type != ECPGt_bytea)
237 [ - + ]: 6 : && atoi(ptr->variable->type->size) > 1)
238 : : {
239 : 0 : newvar = new_variable(cat_str(4, "(",
240 : 0 : ecpg_type_name(ptr->variable->type->u.element->type),
241 : : " *)(ECPGget_var(",
242 : : var_text),
243 : 0 : ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type,
244 : : "1",
245 : 0 : ptr->variable->type->u.element->counter),
246 : 0 : ptr->variable->type->size),
247 : : 0);
248 : : }
249 [ + + ]: 15 : else if ((ptr->variable->type->type == ECPGt_varchar
250 [ + + ]: 14 : || ptr->variable->type->type == ECPGt_char
251 [ + - ]: 7 : || ptr->variable->type->type == ECPGt_unsigned_char
252 [ + - ]: 7 : || ptr->variable->type->type == ECPGt_string
253 [ + + ]: 7 : || ptr->variable->type->type == ECPGt_bytea)
254 [ + + ]: 9 : && atoi(ptr->variable->type->size) > 1)
255 : : {
256 : 3 : newvar = new_variable(cat_str(4, "(",
257 : 3 : ecpg_type_name(ptr->variable->type->type),
258 : : " *)(ECPGget_var(",
259 : : var_text),
260 : 3 : ECPGmake_simple_type(ptr->variable->type->type,
261 : 3 : ptr->variable->type->size,
262 : 3 : ptr->variable->type->counter),
263 : : 0);
264 [ + + ]: 3 : if (ptr->variable->type->type == ECPGt_varchar ||
265 [ + + ]: 2 : ptr->variable->type->type == ECPGt_bytea)
266 : 2 : var_ptr = true;
267 : : }
268 [ + - ]: 12 : else if (ptr->variable->type->type == ECPGt_struct
269 [ - + ]: 12 : || ptr->variable->type->type == ECPGt_union)
270 : : {
271 : 0 : newvar = new_variable(cat_str(5, "(*(",
272 : 0 : ptr->variable->type->type_name,
273 : : " *)(ECPGget_var(",
274 : : var_text,
275 : : ")"),
276 : 0 : ECPGmake_struct_type(ptr->variable->type->u.members,
277 : 0 : ptr->variable->type->type,
278 : 0 : ptr->variable->type->type_name,
279 : 0 : ptr->variable->type->struct_sizeof),
280 : : 0);
281 : 0 : var_ptr = true;
282 : : }
283 [ + + ]: 12 : else if (ptr->variable->type->type == ECPGt_array)
284 : : {
285 [ - + ]: 1 : if (ptr->variable->type->u.element->type == ECPGt_struct
286 [ # # ]: 0 : || ptr->variable->type->u.element->type == ECPGt_union)
287 : : {
288 : 1 : newvar = new_variable(cat_str(5, "(*(",
289 : 1 : ptr->variable->type->u.element->type_name,
290 : : " *)(ECPGget_var(",
291 : : var_text,
292 : : ")"),
293 : 1 : ECPGmake_struct_type(ptr->variable->type->u.element->u.members,
294 : 1 : ptr->variable->type->u.element->type,
295 : 1 : ptr->variable->type->u.element->type_name,
296 : 1 : ptr->variable->type->u.element->struct_sizeof),
297 : : 0);
298 : : }
299 : : else
300 : : {
301 : 0 : newvar = new_variable(cat_str(4, "(",
302 : 0 : ecpg_type_name(ptr->variable->type->u.element->type),
303 : : " *)(ECPGget_var(",
304 : : var_text),
305 : 0 : ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type,
306 : 0 : ptr->variable->type->u.element->size,
307 : 0 : ptr->variable->type->u.element->counter),
308 : 0 : ptr->variable->type->size),
309 : : 0);
310 : 0 : var_ptr = true;
311 : : }
312 : : }
313 : : else
314 : : {
315 : 11 : newvar = new_variable(cat_str(4, "*(",
316 : 11 : ecpg_type_name(ptr->variable->type->type),
317 : : " *)(ECPGget_var(",
318 : : var_text),
319 : 11 : ECPGmake_simple_type(ptr->variable->type->type,
320 : 11 : ptr->variable->type->size,
321 : 11 : ptr->variable->type->counter),
322 : : 0);
323 : 11 : var_ptr = true;
324 : : }
325 : :
326 : : /*
327 : : * create call to "ECPGset_var(<counter>, <connection>, <pointer>.
328 : : * <line number>)"
329 : : */
330 [ + + ]: 36 : if (!skip_set_var)
331 : : {
332 [ + + ]: 15 : snprintf(var_text, sizeof(var_text), "%d, %s",
333 : : ecpg_internal_var++, var_ptr ? "&(" : "(");
334 : 15 : result = cat_str(5, result, "ECPGset_var(",
335 : : var_text, original_var,
336 : : "), __LINE__);\n");
337 : : }
338 : :
339 : : /*
340 : : * now the indicator if there is one and it's not a global
341 : : * variable
342 : : */
343 [ + + - + ]: 36 : if ((ptr->indicator->type->type == ECPGt_NO_INDICATOR) || (ptr->indicator->brace_level == 0))
344 : : {
345 : 35 : newind = ptr->indicator;
346 : : }
347 : : else
348 : : {
349 : : /* change variable name to "ECPGget_var(<counter>)" */
350 : 1 : original_var = ptr->indicator->name;
351 : 1 : snprintf(var_text, sizeof(var_text), "%d))", ecpg_internal_var);
352 : 1 : var_ptr = false;
353 : :
354 [ + - ]: 1 : if (ptr->indicator->type->type == ECPGt_struct
355 [ - + ]: 1 : || ptr->indicator->type->type == ECPGt_union)
356 : : {
357 : 0 : newind = new_variable(cat_str(5, "(*(",
358 : 0 : ptr->indicator->type->type_name,
359 : : " *)(ECPGget_var(",
360 : : var_text,
361 : : ")"),
362 : 0 : ECPGmake_struct_type(ptr->indicator->type->u.members,
363 : 0 : ptr->indicator->type->type,
364 : 0 : ptr->indicator->type->type_name,
365 : 0 : ptr->indicator->type->struct_sizeof),
366 : : 0);
367 : 0 : var_ptr = true;
368 : : }
369 [ + - ]: 1 : else if (ptr->indicator->type->type == ECPGt_array)
370 : : {
371 [ - + ]: 1 : if (ptr->indicator->type->u.element->type == ECPGt_struct
372 [ # # ]: 0 : || ptr->indicator->type->u.element->type == ECPGt_union)
373 : : {
374 : 1 : newind = new_variable(cat_str(5, "(*(",
375 : 1 : ptr->indicator->type->u.element->type_name,
376 : : " *)(ECPGget_var(",
377 : : var_text,
378 : : ")"),
379 : 1 : ECPGmake_struct_type(ptr->indicator->type->u.element->u.members,
380 : 1 : ptr->indicator->type->u.element->type,
381 : 1 : ptr->indicator->type->u.element->type_name,
382 : 1 : ptr->indicator->type->u.element->struct_sizeof),
383 : : 0);
384 : : }
385 : : else
386 : : {
387 : 0 : newind = new_variable(cat_str(4, "(",
388 : 0 : ecpg_type_name(ptr->indicator->type->u.element->type),
389 : : " *)(ECPGget_var(",
390 : : var_text),
391 : 0 : ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->u.element->type,
392 : 0 : ptr->indicator->type->u.element->size,
393 : 0 : ptr->indicator->type->u.element->counter),
394 : 0 : ptr->indicator->type->size),
395 : : 0);
396 : 0 : var_ptr = true;
397 : : }
398 : : }
399 [ # # ]: 0 : else if (atoi(ptr->indicator->type->size) > 1)
400 : : {
401 : 0 : newind = new_variable(cat_str(4, "(",
402 : 0 : ecpg_type_name(ptr->indicator->type->type),
403 : : " *)(ECPGget_var(",
404 : : var_text),
405 : 0 : ECPGmake_simple_type(ptr->indicator->type->type,
406 : 0 : ptr->indicator->type->size,
407 : 0 : ptr->variable->type->counter),
408 : : 0);
409 : : }
410 : : else
411 : : {
412 : 0 : newind = new_variable(cat_str(4, "*(",
413 : 0 : ecpg_type_name(ptr->indicator->type->type),
414 : : " *)(ECPGget_var(",
415 : : var_text),
416 : 0 : ECPGmake_simple_type(ptr->indicator->type->type,
417 : 0 : ptr->indicator->type->size,
418 : 0 : ptr->variable->type->counter),
419 : : 0);
420 : 0 : var_ptr = true;
421 : : }
422 : :
423 : : /*
424 : : * create call to "ECPGset_var(<counter>, <pointer>. <line
425 : : * number>)"
426 : : */
427 [ - + ]: 1 : snprintf(var_text, sizeof(var_text), "%d, %s",
428 : : ecpg_internal_var++, var_ptr ? "&(" : "(");
429 : 1 : result = cat_str(5, result, "ECPGset_var(",
430 : : var_text, original_var,
431 : : "), __LINE__);\n");
432 : : }
433 : :
434 : 36 : add_variable_to_tail(&newlist, newvar, newind);
435 : : }
436 : :
437 [ + + ]: 86 : if (insert)
438 : 43 : cur->argsinsert_oos = newlist;
439 : : else
440 : 43 : cur->argsresult_oos = newlist;
441 : : }
442 : :
443 : 43 : return result;
444 : : }
445 : :
446 : : /* This tests whether the cursor was declared and opened in the same function. */
447 : : #define SAMEFUNC(cur) \
448 : : ((cur->function == NULL) || \
449 : : (cur->function != NULL && current_function != NULL && \
450 : : strcmp(cur->function, current_function) == 0))
451 : :
452 : : static struct cursor *
453 : 104 : add_additional_variables(const char *name, bool insert)
454 : : {
455 : : struct cursor *ptr;
456 : : struct arguments *p;
457 [ + + - + ]: 104 : int (*strcmp_fn) (const char *, const char *) = ((name[0] == ':' || name[0] == '"') ? strcmp : pg_strcasecmp);
458 : :
459 [ + - ]: 111 : for (ptr = cur; ptr != NULL; ptr = ptr->next)
460 : : {
461 [ + + ]: 111 : if (strcmp_fn(ptr->name, name) == 0)
462 : 104 : break;
463 : : }
464 : :
465 [ - + ]: 104 : if (ptr == NULL)
466 : : {
467 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" does not exist", name);
468 : 0 : return NULL;
469 : : }
470 : :
471 [ + + ]: 104 : if (insert)
472 : : {
473 : : /*
474 : : * add all those input variables that were given earlier
475 : : *
476 : : * note that we have to append here but have to keep the existing
477 : : * order
478 : : */
479 [ + - + - : 71 : for (p = (SAMEFUNC(ptr) ? ptr->argsinsert : ptr->argsinsert_oos); p; p = p->next)
+ - + + +
+ ]
480 : 31 : add_variable_to_tail(&argsinsert, p->variable, p->indicator);
481 : : }
482 : :
483 : : /* add all those output variables that were given earlier */
484 [ + - + - : 122 : for (p = (SAMEFUNC(ptr) ? ptr->argsresult : ptr->argsresult_oos); p; p = p->next)
+ - + + +
+ ]
485 : 18 : add_variable_to_tail(&argsresult, p->variable, p->indicator);
486 : :
487 : 104 : return ptr;
488 : : }
489 : :
490 : : static void
491 : 25 : add_typedef(const char *name, const char *dimension, const char *length,
492 : : enum ECPGttype type_enum,
493 : : const char *type_dimension, const char *type_index,
494 : : int initializer, int array)
495 : : {
496 : : /* add entry to list */
497 : : struct typedefs *ptr,
498 : : *this;
499 : :
500 [ + + + + ]: 25 : if ((type_enum == ECPGt_struct ||
501 [ - + ]: 12 : type_enum == ECPGt_union) &&
502 : : initializer == 1)
503 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "initializer not allowed in type definition");
504 [ + - - + : 25 : else if (INFORMIX_MODE && strcmp(name, "string") == 0)
- - ]
505 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "type name \"string\" is reserved in Informix mode");
506 : : else
507 : : {
508 [ + + ]: 69 : for (ptr = types; ptr != NULL; ptr = ptr->next)
509 : : {
510 [ - + ]: 44 : if (strcmp(name, ptr->name) == 0)
511 : : /* re-definition is a bug */
512 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "type \"%s\" is already defined", name);
513 : : }
514 : 25 : adjust_array(type_enum, &dimension, &length,
515 : : type_dimension, type_index, array, true);
516 : :
517 : 25 : this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
518 : :
519 : : /* initial definition */
520 : 25 : this->next = types;
521 : 25 : this->name = mm_strdup(name);
522 : 25 : this->brace_level = braces_open;
523 : 25 : this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
524 : 25 : this->type->type_storage = NULL;
525 : 25 : this->type->type_enum = type_enum;
526 : 25 : this->type->type_str = mm_strdup(name);
527 : 25 : this->type->type_dimension = mm_strdup(dimension); /* dimension of array */
528 : 25 : this->type->type_index = mm_strdup(length); /* length of string */
529 [ + + ]: 25 : this->type->type_sizeof = ECPGstruct_sizeof ? mm_strdup(ECPGstruct_sizeof) : NULL;
530 [ + + ]: 15 : this->struct_member_list = (type_enum == ECPGt_struct || type_enum == ECPGt_union) ?
531 [ + + ]: 40 : ECPGstruct_member_dup(struct_member_list[struct_level]) : NULL;
532 : :
533 [ + + + - ]: 25 : if (type_enum != ECPGt_varchar &&
534 [ + + ]: 23 : type_enum != ECPGt_bytea &&
535 [ + - ]: 16 : type_enum != ECPGt_char &&
536 [ + - ]: 16 : type_enum != ECPGt_unsigned_char &&
537 : 16 : type_enum != ECPGt_string &&
538 [ - + ]: 16 : atoi(this->type->type_index) >= 0)
539 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
540 : :
541 : 25 : types = this;
542 : : }
543 : 25 : }
544 : :
545 : : /*
546 : : * check an SQL identifier is declared or not.
547 : : * If it is already declared, the global variable
548 : : * connection will be changed to the related connection.
549 : : */
550 : : static bool
551 : 171 : check_declared_list(const char *name)
552 : : {
553 : 171 : struct declared_list *ptr = NULL;
554 : :
555 [ + + ]: 195 : for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
556 : : {
557 [ + + ]: 31 : if (!ptr->connection)
558 : 18 : continue;
559 [ + + ]: 13 : if (strcmp(name, ptr->name) == 0)
560 : : {
561 [ - + - - ]: 7 : if (connection && strcmp(ptr->connection, connection) != 0)
562 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "connection %s is overwritten with %s by DECLARE statement %s", connection, ptr->connection, name);
563 : 7 : update_connection(ptr->connection);
564 : 7 : return true;
565 : : }
566 : : }
567 : 164 : return false;
568 : : }
569 : :
570 : : /*
571 : : * If newconn isn't NULL, update the global "connection" variable to that;
572 : : * otherwise do nothing.
573 : : */
574 : : static void
575 : 108 : update_connection(const char *newconn)
576 : : {
577 [ + + ]: 108 : if (newconn)
578 : : {
579 : 46 : free(connection);
580 : 46 : connection = mm_strdup(newconn);
581 : : }
582 : 108 : }
583 : : %}
584 : :
585 : : %expect 0
586 : : %name-prefix="base_yy"
587 : : %locations
588 : :
589 : : %union {
590 : : double dval;
591 : : char *str;
592 : : int ival;
593 : : struct when action;
594 : : struct index index;
595 : : int tagname;
596 : : struct this_type type;
597 : : enum ECPGttype type_enum;
598 : : enum ECPGdtype dtype_enum;
599 : : struct fetch_desc descriptor;
600 : : struct su_symbol struct_union;
601 : : struct prep prep;
602 : : struct exec exec;
603 : : struct describe describe;
604 : : }
605 : : /* tokens */
606 : : /* src/interfaces/ecpg/preproc/ecpg.tokens */
607 : :
608 : : /* special embedded SQL tokens */
609 : : %token SQL_ALLOCATE SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
610 : : SQL_CARDINALITY SQL_CONNECT
611 : : SQL_COUNT
612 : : SQL_DATETIME_INTERVAL_CODE
613 : : SQL_DATETIME_INTERVAL_PRECISION SQL_DESCRIBE
614 : : SQL_DESCRIPTOR SQL_DISCONNECT SQL_FOUND
615 : : SQL_FREE SQL_GET SQL_GO SQL_GOTO SQL_IDENTIFIED
616 : : SQL_INDICATOR SQL_KEY_MEMBER SQL_LENGTH
617 : : SQL_LONG SQL_NULLABLE SQL_OCTET_LENGTH
618 : : SQL_OPEN SQL_OUTPUT SQL_REFERENCE
619 : : SQL_RETURNED_LENGTH SQL_RETURNED_OCTET_LENGTH SQL_SCALE
620 : : SQL_SECTION SQL_SHORT SQL_SIGNED SQL_SQLERROR
621 : : SQL_SQLPRINT SQL_SQLWARNING SQL_START SQL_STOP
622 : : SQL_STRUCT SQL_UNSIGNED SQL_VAR SQL_WHENEVER
623 : :
624 : : /* C tokens */
625 : : %token S_ADD S_AND S_ANYTHING S_AUTO S_CONST S_DEC S_DIV
626 : : S_DOTPOINT S_EQUAL S_EXTERN S_INC S_LSHIFT S_MEMPOINT
627 : : S_MEMBER S_MOD S_MUL S_NEQUAL S_OR S_REGISTER S_RSHIFT
628 : : S_STATIC S_SUB S_VOLATILE
629 : : S_TYPEDEF
630 : :
631 : : %token CSTRING CVARIABLE CPP_LINE IP
632 : : /* types */
633 : : %type <prep> PrepareStmt
634 : : %type <exec> ExecuteStmt
635 : : %type <index> opt_array_bounds
636 : : /* ecpgtype */
637 : : /* src/interfaces/ecpg/preproc/ecpg.type */
638 : : %type <struct_union> s_struct_union_symbol
639 : :
640 : : %type <descriptor> ECPGGetDescriptor
641 : : %type <descriptor> ECPGSetDescriptor
642 : :
643 : : %type <type_enum> simple_type
644 : : %type <type_enum> signed_type
645 : : %type <type_enum> unsigned_type
646 : :
647 : : %type <dtype_enum> descriptor_item
648 : : %type <dtype_enum> desc_header_item
649 : :
650 : : %type <type> var_type
651 : :
652 : : %type <action> action
653 : :
654 : : %type <describe> ECPGDescribe
655 : : /* orig_tokens */
656 : : %token IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
657 : : %token ICONST PARAM
658 : : %token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
659 : : %token LESS_EQUALS GREATER_EQUALS NOT_EQUALS
660 : :
661 : :
662 : :
663 : :
664 : :
665 : :
666 : :
667 : : %token ABORT_P ABSENT ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
668 : : AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
669 : : ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC ATOMIC AT ATTACH ATTRIBUTE AUTHORIZATION
670 : : BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
671 : : BOOLEAN_P BOTH BREADTH BY
672 : : CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
673 : : CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
674 : : CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT
675 : : COMMITTED COMPRESSION CONCURRENTLY CONDITIONAL CONFIGURATION CONFLICT
676 : : CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY
677 : : COST CREATE CROSS CSV CUBE CURRENT_P
678 : : CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
679 : : CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
680 : : DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
681 : : DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DEPENDS DEPTH DESC DESTINATION
682 : : DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
683 : : DOUBLE_P DROP
684 : : EACH EDGE ELSE EMPTY_P ENABLE_P ENCODING ENCRYPTED END_P ENFORCED ENUM_P
685 : : ERROR_P ESCAPE EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS
686 : : EXPLAIN EXPRESSION EXTENSION EXTERNAL EXTRACT
687 : : FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR
688 : : FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS
689 : : GENERATED GLOBAL GRANT GRANTED GRAPH GRAPH_TABLE GREATEST GROUP_P GROUPING GROUPS
690 : : HANDLER HAVING HEADER_P HOLD HOUR_P
691 : : IDENTITY_P IF_P IGNORE_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P INCLUDE
692 : : INCLUDING INCREMENT INDENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
693 : : INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
694 : : INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
695 : : JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG
696 : : JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_TABLE JSON_VALUE
697 : : KEEP KEY KEYS
698 : : LABEL LANGUAGE LARGE_P LAST_P LATERAL_P
699 : : LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
700 : : LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED LSN_P
701 : : MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE MERGE_ACTION METHOD
702 : : MINUTE_P MINVALUE MODE MONTH_P MOVE
703 : : NAME_P NAMES NATIONAL NATURAL NCHAR NESTED NEW NEXT NFC NFD NFKC NFKD NO NODE
704 : : NONE NORMALIZE NORMALIZED
705 : : NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
706 : : NULLS_P NUMERIC
707 : : OBJECT_P OBJECTS_P OF OFF OFFSET OIDS OLD OMIT ON ONLY OPERATOR OPTION OPTIONS OR
708 : : ORDER ORDINALITY OTHERS OUT_P OUTER_P
709 : : OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER
710 : : PARALLEL PARAMETER PARSER PARTIAL PARTITION PARTITIONS PASSING PASSWORD PATH
711 : : PERIOD PLACING PLAN PLANS POLICY PORTION
712 : : POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
713 : : PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PROPERTIES PROPERTY PUBLICATION
714 : : QUOTE QUOTES
715 : : RANGE READ REAL REASSIGN RECURSIVE REF_P REFERENCES REFERENCING
716 : : REFRESH REINDEX RELATIONSHIP RELATIVE_P RELEASE RENAME REPACK REPEATABLE REPLACE REPLICA
717 : : RESET RESPECT_P RESTART RESTRICT RETURN RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
718 : : ROUTINE ROUTINES ROW ROWS RULE
719 : : SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT
720 : : SEQUENCE SEQUENCES
721 : : SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
722 : : SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SPLIT SOURCE SQL_P STABLE STANDALONE_P
723 : : START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRING_P STRIP_P
724 : : SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P SYSTEM_USER
725 : : TABLE TABLES TABLESAMPLE TABLESPACE TARGET TEMP TEMPLATE TEMPORARY TEXT_P THEN
726 : : TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
727 : : TREAT TRIGGER TRIM TRUE_P
728 : : TRUNCATE TRUSTED TYPE_P TYPES_P
729 : : UESCAPE UNBOUNDED UNCONDITIONAL UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN
730 : : UNLISTEN UNLOGGED UNTIL UPDATE USER USING
731 : : VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
732 : : VERBOSE VERSION_P VERTEX VIEW VIEWS VIRTUAL VOLATILE
733 : : WAIT WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
734 : : XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES
735 : : XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE
736 : : YEAR_P YES_P
737 : : ZONE
738 : :
739 : :
740 : :
741 : :
742 : :
743 : :
744 : :
745 : :
746 : :
747 : :
748 : :
749 : : %token FORMAT_LA NOT_LA NULLS_LA WITH_LA WITHOUT_LA
750 : :
751 : :
752 : :
753 : :
754 : :
755 : :
756 : :
757 : : %token MODE_TYPE_NAME
758 : : %token MODE_PLPGSQL_EXPR
759 : : %token MODE_PLPGSQL_ASSIGN1
760 : : %token MODE_PLPGSQL_ASSIGN2
761 : : %token MODE_PLPGSQL_ASSIGN3
762 : :
763 : : %left UNION EXCEPT
764 : : %left INTERSECT
765 : : %left OR
766 : : %left AND
767 : : %right NOT
768 : : %nonassoc IS ISNULL NOTNULL
769 : : %nonassoc '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS
770 : : %nonassoc BETWEEN IN_P LIKE ILIKE SIMILAR NOT_LA
771 : : %nonassoc ESCAPE
772 : :
773 : :
774 : :
775 : :
776 : :
777 : :
778 : :
779 : :
780 : :
781 : :
782 : :
783 : :
784 : :
785 : :
786 : :
787 : :
788 : :
789 : :
790 : :
791 : :
792 : :
793 : :
794 : :
795 : :
796 : :
797 : :
798 : :
799 : :
800 : :
801 : :
802 : :
803 : :
804 : :
805 : :
806 : :
807 : :
808 : :
809 : :
810 : :
811 : :
812 : :
813 : :
814 : :
815 : :
816 : :
817 : :
818 : :
819 : :
820 : :
821 : : %nonassoc UNBOUNDED NESTED
822 : : %nonassoc IDENT CSTRING PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
823 : : SET KEYS OBJECT_P SCALAR TO USING VALUE_P WITH WITHOUT PATH
824 : : %left Op OPERATOR RIGHT_ARROW '|'
825 : : %left '+' '-'
826 : : %left '*' '/' '%'
827 : : %left '^'
828 : :
829 : : %left AT
830 : : %left COLLATE
831 : : %right UMINUS
832 : : %left '[' ']'
833 : : %left '(' ')'
834 : : %left TYPECAST
835 : : %left '.'
836 : :
837 : :
838 : :
839 : :
840 : :
841 : :
842 : :
843 : : %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
844 : : %%
845 : : prog: statements;
846 : : /* rules */
847 : : toplevel_stmt:
848 : : stmt
849 : : | TransactionStmtLegacy
850 : : {
851 [ + + ]: 8 : fprintf(base_yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", @1);
852 : 8 : whenever_action(2);
853 : : }
854 : : ;
855 : :
856 : :
857 : : stmt:
858 : : AlterEventTrigStmt
859 : 0 : { output_statement(@1, 0, ECPGst_normal); }
860 : : | AlterCollationStmt
861 : 0 : { output_statement(@1, 0, ECPGst_normal); }
862 : : | AlterDatabaseStmt
863 : 0 : { output_statement(@1, 0, ECPGst_normal); }
864 : : | AlterDatabaseSetStmt
865 : 0 : { output_statement(@1, 0, ECPGst_normal); }
866 : : | AlterDefaultPrivilegesStmt
867 : 0 : { output_statement(@1, 0, ECPGst_normal); }
868 : : | AlterDomainStmt
869 : 0 : { output_statement(@1, 0, ECPGst_normal); }
870 : : | AlterEnumStmt
871 : 0 : { output_statement(@1, 0, ECPGst_normal); }
872 : : | AlterExtensionStmt
873 : 0 : { output_statement(@1, 0, ECPGst_normal); }
874 : : | AlterExtensionContentsStmt
875 : 0 : { output_statement(@1, 0, ECPGst_normal); }
876 : : | AlterFdwStmt
877 : 0 : { output_statement(@1, 0, ECPGst_normal); }
878 : : | AlterForeignServerStmt
879 : 0 : { output_statement(@1, 0, ECPGst_normal); }
880 : : | AlterFunctionStmt
881 : 0 : { output_statement(@1, 0, ECPGst_normal); }
882 : : | AlterGroupStmt
883 : 0 : { output_statement(@1, 0, ECPGst_normal); }
884 : : | AlterObjectDependsStmt
885 : 0 : { output_statement(@1, 0, ECPGst_normal); }
886 : : | AlterObjectSchemaStmt
887 : 0 : { output_statement(@1, 0, ECPGst_normal); }
888 : : | AlterOwnerStmt
889 : 0 : { output_statement(@1, 0, ECPGst_normal); }
890 : : | AlterOperatorStmt
891 : 0 : { output_statement(@1, 0, ECPGst_normal); }
892 : : | AlterTypeStmt
893 : 0 : { output_statement(@1, 0, ECPGst_normal); }
894 : : | AlterPolicyStmt
895 : 0 : { output_statement(@1, 0, ECPGst_normal); }
896 : : | AlterPropGraphStmt
897 : 0 : { output_statement(@1, 0, ECPGst_normal); }
898 : : | AlterSeqStmt
899 : 0 : { output_statement(@1, 0, ECPGst_normal); }
900 : : | AlterSystemStmt
901 : 0 : { output_statement(@1, 0, ECPGst_normal); }
902 : : | AlterTableStmt
903 : 2 : { output_statement(@1, 0, ECPGst_normal); }
904 : : | AlterTblSpcStmt
905 : 0 : { output_statement(@1, 0, ECPGst_normal); }
906 : : | AlterCompositeTypeStmt
907 : 0 : { output_statement(@1, 0, ECPGst_normal); }
908 : : | AlterPublicationStmt
909 : 0 : { output_statement(@1, 0, ECPGst_normal); }
910 : : | AlterRoleSetStmt
911 : 0 : { output_statement(@1, 0, ECPGst_normal); }
912 : : | AlterRoleStmt
913 : 3 : { output_statement(@1, 0, ECPGst_normal); }
914 : : | AlterSubscriptionStmt
915 : 0 : { output_statement(@1, 0, ECPGst_normal); }
916 : : | AlterStatsStmt
917 : 0 : { output_statement(@1, 0, ECPGst_normal); }
918 : : | AlterTSConfigurationStmt
919 : 0 : { output_statement(@1, 0, ECPGst_normal); }
920 : : | AlterTSDictionaryStmt
921 : 0 : { output_statement(@1, 0, ECPGst_normal); }
922 : : | AlterUserMappingStmt
923 : 0 : { output_statement(@1, 0, ECPGst_normal); }
924 : : | AnalyzeStmt
925 : 0 : { output_statement(@1, 0, ECPGst_normal); }
926 : : | CallStmt
927 : 0 : { output_statement(@1, 0, ECPGst_normal); }
928 : : | CheckPointStmt
929 : 0 : { output_statement(@1, 0, ECPGst_normal); }
930 : : | ClosePortalStmt
931 : : {
932 [ + + - + ]: 40 : if (INFORMIX_MODE)
933 : : {
934 [ + + ]: 5 : if (pg_strcasecmp(@1 + strlen("close "), "database") == 0)
935 : : {
936 [ + + ]: 3 : if (connection)
937 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CLOSE DATABASE statement");
938 : :
939 : 3 : fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, \"CURRENT\");");
940 : 3 : whenever_action(2);
941 : 3 : break;
942 : : }
943 : : }
944 : :
945 : 37 : output_statement(@1, 0, ECPGst_normal);
946 : : }
947 : : | CommentStmt
948 : 0 : { output_statement(@1, 0, ECPGst_normal); }
949 : : | ConstraintsSetStmt
950 : 0 : { output_statement(@1, 0, ECPGst_normal); }
951 : : | CopyStmt
952 : 2 : { output_statement(@1, 0, ECPGst_normal); }
953 : : | CreateAmStmt
954 : 0 : { output_statement(@1, 0, ECPGst_normal); }
955 : : | CreateAsStmt
956 : 2 : { output_statement(@1, 0, ECPGst_normal); }
957 : : | CreateAssertionStmt
958 : 0 : { output_statement(@1, 0, ECPGst_normal); }
959 : : | CreateCastStmt
960 : 0 : { output_statement(@1, 0, ECPGst_normal); }
961 : : | CreateConversionStmt
962 : 0 : { output_statement(@1, 0, ECPGst_normal); }
963 : : | CreateDomainStmt
964 : 0 : { output_statement(@1, 0, ECPGst_normal); }
965 : : | CreateExtensionStmt
966 : 0 : { output_statement(@1, 0, ECPGst_normal); }
967 : : | CreateFdwStmt
968 : 0 : { output_statement(@1, 0, ECPGst_normal); }
969 : : | CreateForeignServerStmt
970 : 0 : { output_statement(@1, 0, ECPGst_normal); }
971 : : | CreateForeignTableStmt
972 : 0 : { output_statement(@1, 0, ECPGst_normal); }
973 : : | CreateFunctionStmt
974 : 1 : { output_statement(@1, 0, ECPGst_normal); }
975 : : | CreateGroupStmt
976 : 0 : { output_statement(@1, 0, ECPGst_normal); }
977 : : | CreateMatViewStmt
978 : 0 : { output_statement(@1, 0, ECPGst_normal); }
979 : : | CreateOpClassStmt
980 : 0 : { output_statement(@1, 0, ECPGst_normal); }
981 : : | CreateOpFamilyStmt
982 : 0 : { output_statement(@1, 0, ECPGst_normal); }
983 : : | CreatePublicationStmt
984 : 0 : { output_statement(@1, 0, ECPGst_normal); }
985 : : | AlterOpFamilyStmt
986 : 0 : { output_statement(@1, 0, ECPGst_normal); }
987 : : | CreatePolicyStmt
988 : 0 : { output_statement(@1, 0, ECPGst_normal); }
989 : : | CreatePLangStmt
990 : 0 : { output_statement(@1, 0, ECPGst_normal); }
991 : : | CreatePropGraphStmt
992 : 1 : { output_statement(@1, 0, ECPGst_normal); }
993 : : | CreateSchemaStmt
994 : 1 : { output_statement(@1, 0, ECPGst_normal); }
995 : : | CreateSeqStmt
996 : 0 : { output_statement(@1, 0, ECPGst_normal); }
997 : : | CreateStmt
998 : 54 : { output_statement(@1, 0, ECPGst_normal); }
999 : : | CreateSubscriptionStmt
1000 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1001 : : | CreateStatsStmt
1002 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1003 : : | CreateTableSpaceStmt
1004 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1005 : : | CreateTransformStmt
1006 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1007 : : | CreateTrigStmt
1008 : 1 : { output_statement(@1, 0, ECPGst_normal); }
1009 : : | CreateEventTrigStmt
1010 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1011 : : | CreateRoleStmt
1012 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1013 : : | CreateUserStmt
1014 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1015 : : | CreateUserMappingStmt
1016 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1017 : : | CreatedbStmt
1018 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1019 : : | DeallocateStmt
1020 : : {
1021 : 41 : output_deallocate_prepare_statement(@1);
1022 : : }
1023 : : | DeclareCursorStmt
1024 : : {
1025 [ + + ]: 22 : output_simple_statement(@1, (strncmp(@1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0);
1026 : : }
1027 : : | DefineStmt
1028 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1029 : : | DeleteStmt
1030 : 2 : { output_statement(@1, 1, ECPGst_prepnormal); }
1031 : : | DiscardStmt
1032 : 0 : { output_statement(@1, 1, ECPGst_normal); }
1033 : : | DoStmt
1034 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1035 : : | DropCastStmt
1036 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1037 : : | DropOpClassStmt
1038 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1039 : : | DropOpFamilyStmt
1040 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1041 : : | DropOwnedStmt
1042 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1043 : : | DropStmt
1044 : 43 : { output_statement(@1, 0, ECPGst_normal); }
1045 : : | DropSubscriptionStmt
1046 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1047 : : | DropTableSpaceStmt
1048 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1049 : : | DropTransformStmt
1050 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1051 : : | DropRoleStmt
1052 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1053 : : | DropUserMappingStmt
1054 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1055 : : | DropdbStmt
1056 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1057 : : | ExecuteStmt
1058 : : {
1059 : 35 : check_declared_list($1.name);
1060 [ + - + + ]: 35 : if ($1.type == NULL || strlen($1.type) == 0)
1061 : 26 : output_statement($1.name, 1, ECPGst_execute);
1062 : : else
1063 : : {
1064 [ + + ]: 9 : if ($1.name[0] != '"')
1065 : : /* case of char_variable */
1066 : 4 : add_variable_to_tail(&argsinsert, find_variable($1.name), &no_indicator);
1067 : : else
1068 : : {
1069 : : /* case of ecpg_ident or CSTRING */
1070 : : char length[32];
1071 : : char *str;
1072 : :
1073 : : /* Remove double quotes from name */
1074 : 5 : str = loc_strdup($1.name + 1);
1075 : 5 : str[strlen(str) - 1] = '\0';
1076 : 5 : snprintf(length, sizeof(length), "%zu", strlen(str));
1077 : 5 : add_variable_to_tail(&argsinsert, new_variable(str, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
1078 : : }
1079 : 9 : output_statement(cat_str(3, "execute", "$0", $1.type), 0, ECPGst_exec_with_exprlist);
1080 : : }
1081 : : }
1082 : : | ExplainStmt
1083 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1084 : : | FetchStmt
1085 : 64 : { output_statement(@1, 1, ECPGst_normal); }
1086 : : | GrantStmt
1087 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1088 : : | GrantRoleStmt
1089 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1090 : : | ImportForeignSchemaStmt
1091 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1092 : : | IndexStmt
1093 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1094 : : | InsertStmt
1095 : 114 : { output_statement(@1, 1, ECPGst_prepnormal); }
1096 : : | ListenStmt
1097 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1098 : : | RefreshMatViewStmt
1099 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1100 : : | LoadStmt
1101 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1102 : : | LockStmt
1103 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1104 : : | MergeStmt
1105 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1106 : : | NotifyStmt
1107 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1108 : : | PrepareStmt
1109 : : {
1110 : 56 : check_declared_list($1.name);
1111 [ + + ]: 56 : if ($1.type == NULL)
1112 : 50 : output_prepare_statement($1.name, $1.stmt);
1113 [ + + ]: 6 : else if (strlen($1.type) == 0)
1114 : : {
1115 : 1 : char *stmt = cat_str(3, "\"", $1.stmt, "\"");
1116 : :
1117 : 1 : output_prepare_statement($1.name, stmt);
1118 : : }
1119 : : else
1120 : : {
1121 [ + + ]: 5 : if ($1.name[0] != '"')
1122 : : /* case of char_variable */
1123 : 2 : add_variable_to_tail(&argsinsert, find_variable($1.name), &no_indicator);
1124 : : else
1125 : : {
1126 : : char length[32];
1127 : : char *str;
1128 : :
1129 : : /* Remove double quotes from name */
1130 : 3 : str = loc_strdup($1.name + 1);
1131 : 3 : str[strlen(str) - 1] = '\0';
1132 : 3 : snprintf(length, sizeof(length), "%zu", strlen(str));
1133 : 3 : add_variable_to_tail(&argsinsert, new_variable(str, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
1134 : : }
1135 : 5 : output_statement(cat_str(5, "prepare", "$0", $1.type, "as", $1.stmt), 0, ECPGst_prepare);
1136 : : }
1137 : : }
1138 : : | ReassignOwnedStmt
1139 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1140 : : | ReindexStmt
1141 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1142 : : | RemoveAggrStmt
1143 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1144 : : | RemoveFuncStmt
1145 : 1 : { output_statement(@1, 0, ECPGst_normal); }
1146 : : | RemoveOperStmt
1147 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1148 : : | RenameStmt
1149 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1150 : : | RepackStmt
1151 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1152 : : | RevokeStmt
1153 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1154 : : | RevokeRoleStmt
1155 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1156 : : | RuleStmt
1157 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1158 : : | SecLabelStmt
1159 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1160 : : | SelectStmt
1161 : 105 : { output_statement(@1, 1, ECPGst_prepnormal); }
1162 : : | TransactionStmt
1163 : : {
1164 [ + + ]: 82 : fprintf(base_yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", @1);
1165 : 82 : whenever_action(2);
1166 : : }
1167 : : | TruncateStmt
1168 : 22 : { output_statement(@1, 0, ECPGst_normal); }
1169 : : | UnlistenStmt
1170 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1171 : : | UpdateStmt
1172 : 5 : { output_statement(@1, 1, ECPGst_prepnormal); }
1173 : : | VacuumStmt
1174 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1175 : : | VariableResetStmt
1176 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1177 : : | VariableSetStmt
1178 : 23 : { output_statement(@1, 0, ECPGst_normal); }
1179 : : | VariableShowStmt
1180 : 7 : { output_statement(@1, 0, ECPGst_normal); }
1181 : : | ViewStmt
1182 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1183 : : | ECPGAllocateDescr
1184 : : {
1185 : 20 : fprintf(base_yyout, "ECPGallocate_desc(__LINE__, %s);", @1);
1186 : 20 : whenever_action(0);
1187 : : }
1188 : : | ECPGConnect
1189 : : {
1190 [ + + ]: 98 : if (connection)
1191 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in CONNECT statement");
1192 : :
1193 : 98 : fprintf(base_yyout, "{ ECPGconnect(__LINE__, %d, %s, %d); ", compat, @1, autocommit);
1194 : 98 : reset_variables();
1195 : 98 : whenever_action(2);
1196 : : }
1197 : : | ECPGDeclareStmt
1198 : : {
1199 : 5 : output_simple_statement(@1, 0);
1200 : : }
1201 : : | ECPGCursorStmt
1202 : : {
1203 [ + + ]: 21 : output_simple_statement(@1, (strncmp(@1, "ECPGset_var", strlen("ECPGset_var")) == 0) ? 4 : 0);
1204 : : }
1205 : : | ECPGDeallocateDescr
1206 : : {
1207 : 16 : fprintf(base_yyout, "ECPGdeallocate_desc(__LINE__, %s);", @1);
1208 : 16 : whenever_action(0);
1209 : : }
1210 : : | ECPGDeclare
1211 : : {
1212 : 0 : output_simple_statement(@1, 0);
1213 : : }
1214 : : | ECPGDescribe
1215 : : {
1216 : 21 : check_declared_list($1.stmt_name);
1217 : :
1218 [ + + ]: 21 : fprintf(base_yyout, "{ ECPGdescribe(__LINE__, %d, %d, %s, %s,", compat, $1.input, connection ? connection : "NULL", $1.stmt_name);
1219 : 21 : dump_variables(argsresult, 1);
1220 : 21 : argsresult = NULL;
1221 : 21 : fputs("ECPGt_EORT);", base_yyout);
1222 : 21 : fprintf(base_yyout, "}");
1223 : 21 : output_line_number();
1224 : : }
1225 : : | ECPGDisconnect
1226 : : {
1227 [ + + ]: 89 : if (connection)
1228 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in DISCONNECT statement");
1229 : :
1230 : 89 : fprintf(base_yyout, "{ ECPGdisconnect(__LINE__, %s);",
1231 [ + - ]: 89 : @1 ? @1 : "\"CURRENT\"");
1232 : 89 : whenever_action(2);
1233 : : }
1234 : : | ECPGExecuteImmediateStmt
1235 : : {
1236 : 7 : output_statement(@1, 0, ECPGst_exec_immediate);
1237 : : }
1238 : : | ECPGFree
1239 : : {
1240 [ - + ]: 1 : const char *con = connection ? connection : "NULL";
1241 : :
1242 [ - + ]: 1 : if (strcmp(@1, "all") == 0)
1243 : 0 : fprintf(base_yyout, "{ ECPGdeallocate_all(__LINE__, %d, %s);", compat, con);
1244 [ - + ]: 1 : else if (@1[0] == ':')
1245 : 0 : fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, %s);", compat, con, @1 + 1);
1246 : : else
1247 : 1 : fprintf(base_yyout, "{ ECPGdeallocate(__LINE__, %d, %s, \"%s\");", compat, con, @1);
1248 : :
1249 : 1 : whenever_action(2);
1250 : : }
1251 : : | ECPGGetDescriptor
1252 : : {
1253 : 32 : lookup_descriptor($1.name, connection);
1254 : 32 : output_get_descr($1.name, $1.str);
1255 : : }
1256 : : | ECPGGetDescriptorHeader
1257 : : {
1258 : 11 : lookup_descriptor(@1, connection);
1259 : 11 : output_get_descr_header(@1);
1260 : : }
1261 : : | ECPGOpen
1262 : : {
1263 : : struct cursor *ptr;
1264 : :
1265 [ + - ]: 40 : if ((ptr = add_additional_variables(@1, true)) != NULL)
1266 : : {
1267 : 40 : free(connection);
1268 [ + + ]: 40 : connection = ptr->connection ? mm_strdup(ptr->connection) : NULL;
1269 : 40 : output_statement(ptr->command, 0, ECPGst_normal);
1270 : 40 : ptr->opened = true;
1271 : : }
1272 : : }
1273 : : | ECPGSetAutocommit
1274 : : {
1275 [ - + ]: 13 : fprintf(base_yyout, "{ ECPGsetcommit(__LINE__, \"%s\", %s);", @1, connection ? connection : "NULL");
1276 : 13 : whenever_action(2);
1277 : : }
1278 : : | ECPGSetConnection
1279 : : {
1280 [ + + ]: 3 : if (connection)
1281 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in SET CONNECTION statement");
1282 : :
1283 : 3 : fprintf(base_yyout, "{ ECPGsetconn(__LINE__, %s);", @1);
1284 : 3 : whenever_action(2);
1285 : : }
1286 : : | ECPGSetDescriptor
1287 : : {
1288 : 13 : lookup_descriptor($1.name, connection);
1289 : 13 : output_set_descr($1.name, $1.str);
1290 : : }
1291 : : | ECPGSetDescriptorHeader
1292 : : {
1293 : 1 : lookup_descriptor(@1, connection);
1294 : 1 : output_set_descr_header(@1);
1295 : : }
1296 : : | ECPGTypedef
1297 : : {
1298 [ + + ]: 16 : if (connection)
1299 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in TYPE statement");
1300 : :
1301 : 16 : fprintf(base_yyout, "%s", @1);
1302 : 16 : output_line_number();
1303 : : }
1304 : : | ECPGVar
1305 : : {
1306 [ + + ]: 3 : if (connection)
1307 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in VAR statement");
1308 : :
1309 : 3 : output_simple_statement(@1, 0);
1310 : : }
1311 : : | ECPGWhenever
1312 : : {
1313 [ + + ]: 104 : if (connection)
1314 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "AT option not allowed in WHENEVER statement");
1315 : :
1316 : 104 : output_simple_statement(@1, 0);
1317 : : }
1318 : : | WaitStmt
1319 : 0 : { output_statement(@1, 0, ECPGst_normal); }
1320 : : |
1321 : : ;
1322 : :
1323 : :
1324 : : opt_single_name:
1325 : : ColId
1326 : : |
1327 : : ;
1328 : :
1329 : :
1330 : : opt_qualified_name:
1331 : : any_name
1332 : : |
1333 : : ;
1334 : :
1335 : :
1336 : : opt_concurrently:
1337 : : CONCURRENTLY
1338 : : |
1339 : : ;
1340 : :
1341 : :
1342 : : opt_usingindex:
1343 : : USING INDEX
1344 : : |
1345 : : ;
1346 : :
1347 : :
1348 : : opt_drop_behavior:
1349 : : CASCADE
1350 : : | RESTRICT
1351 : : |
1352 : : ;
1353 : :
1354 : :
1355 : : opt_utility_option_list:
1356 : : '(' utility_option_list ')'
1357 : : |
1358 : : ;
1359 : :
1360 : :
1361 : : utility_option_list:
1362 : : utility_option_elem
1363 : : | utility_option_list ',' utility_option_elem
1364 : : ;
1365 : :
1366 : :
1367 : : utility_option_elem:
1368 : : utility_option_name utility_option_arg
1369 : : ;
1370 : :
1371 : :
1372 : : utility_option_name:
1373 : : NonReservedWord
1374 : : | analyze_keyword
1375 : : | FORMAT_LA
1376 : : ;
1377 : :
1378 : :
1379 : : utility_option_arg:
1380 : : opt_boolean_or_string
1381 : : | NumericOnly
1382 : : |
1383 : : ;
1384 : :
1385 : :
1386 : : CallStmt:
1387 : : CALL func_application
1388 : : ;
1389 : :
1390 : :
1391 : : CreateRoleStmt:
1392 : : CREATE ROLE RoleId opt_with OptRoleList
1393 : : ;
1394 : :
1395 : :
1396 : : opt_with:
1397 : : WITH
1398 : : | WITH_LA
1399 : : |
1400 : : ;
1401 : :
1402 : :
1403 : : OptRoleList:
1404 : : OptRoleList CreateOptRoleElem
1405 : : |
1406 : : ;
1407 : :
1408 : :
1409 : : AlterOptRoleList:
1410 : : AlterOptRoleList AlterOptRoleElem
1411 : : |
1412 : : ;
1413 : :
1414 : :
1415 : : AlterOptRoleElem:
1416 : : PASSWORD ecpg_sconst
1417 : : | PASSWORD NULL_P
1418 : : | ENCRYPTED PASSWORD ecpg_sconst
1419 : : | UNENCRYPTED PASSWORD ecpg_sconst
1420 : : {
1421 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
1422 : : }
1423 : : | INHERIT
1424 : : | CONNECTION LIMIT SignedIconst
1425 : : | VALID UNTIL ecpg_sconst
1426 : : | USER role_list
1427 : : | ecpg_ident
1428 : : ;
1429 : :
1430 : :
1431 : : CreateOptRoleElem:
1432 : : AlterOptRoleElem
1433 : : | SYSID Iconst
1434 : : | ADMIN role_list
1435 : : | ROLE role_list
1436 : : | IN_P ROLE role_list
1437 : : | IN_P GROUP_P role_list
1438 : : ;
1439 : :
1440 : :
1441 : : CreateUserStmt:
1442 : : CREATE USER RoleId opt_with OptRoleList
1443 : : ;
1444 : :
1445 : :
1446 : : AlterRoleStmt:
1447 : : ALTER ROLE RoleSpec opt_with AlterOptRoleList
1448 : : | ALTER USER RoleSpec opt_with AlterOptRoleList
1449 : : ;
1450 : :
1451 : :
1452 : : opt_in_database:
1453 : :
1454 : : | IN_P DATABASE name
1455 : : ;
1456 : :
1457 : :
1458 : : AlterRoleSetStmt:
1459 : : ALTER ROLE RoleSpec opt_in_database SetResetClause
1460 : : | ALTER ROLE ALL opt_in_database SetResetClause
1461 : : | ALTER USER RoleSpec opt_in_database SetResetClause
1462 : : | ALTER USER ALL opt_in_database SetResetClause
1463 : : ;
1464 : :
1465 : :
1466 : : DropRoleStmt:
1467 : : DROP ROLE role_list
1468 : : | DROP ROLE IF_P EXISTS role_list
1469 : : | DROP USER role_list
1470 : : | DROP USER IF_P EXISTS role_list
1471 : : | DROP GROUP_P role_list
1472 : : | DROP GROUP_P IF_P EXISTS role_list
1473 : : ;
1474 : :
1475 : :
1476 : : CreateGroupStmt:
1477 : : CREATE GROUP_P RoleId opt_with OptRoleList
1478 : : ;
1479 : :
1480 : :
1481 : : AlterGroupStmt:
1482 : : ALTER GROUP_P RoleSpec add_drop USER role_list
1483 : : ;
1484 : :
1485 : :
1486 : : add_drop:
1487 : : ADD_P
1488 : : | DROP
1489 : : ;
1490 : :
1491 : :
1492 : : CreateSchemaStmt:
1493 : : CREATE SCHEMA opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
1494 : : | CREATE SCHEMA ColId OptSchemaEltList
1495 : : | CREATE SCHEMA IF_P NOT EXISTS opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
1496 : : | CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList
1497 : : ;
1498 : :
1499 : :
1500 : : OptSchemaEltList:
1501 : : OptSchemaEltList schema_stmt
1502 : : |
1503 : : ;
1504 : :
1505 : :
1506 : : schema_stmt:
1507 : : CreateStmt
1508 : : | IndexStmt
1509 : : | CreateDomainStmt
1510 : : | CreateFunctionStmt
1511 : : | CreateSeqStmt
1512 : : | CreateTrigStmt
1513 : : | DefineStmt
1514 : : | GrantStmt
1515 : : | ViewStmt
1516 : : ;
1517 : :
1518 : :
1519 : : VariableSetStmt:
1520 : : SET set_rest
1521 : : | SET LOCAL set_rest
1522 : : | SET SESSION set_rest
1523 : : ;
1524 : :
1525 : :
1526 : : set_rest:
1527 : : TRANSACTION transaction_mode_list
1528 : : | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
1529 : : | set_rest_more
1530 : : ;
1531 : :
1532 : :
1533 : : generic_set:
1534 : : var_name TO var_list
1535 : : | var_name '=' var_list
1536 : : | var_name TO NULL_P
1537 : : | var_name '=' NULL_P
1538 : : | var_name TO DEFAULT
1539 : : | var_name '=' DEFAULT
1540 : : ;
1541 : :
1542 : :
1543 : : set_rest_more:
1544 : : generic_set
1545 : : | var_name FROM CURRENT_P
1546 : : | TIME ZONE zone_value
1547 : : | CATALOG_P ecpg_sconst
1548 : : {
1549 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
1550 : : }
1551 : : | SCHEMA ecpg_sconst
1552 : : | NAMES opt_encoding
1553 : : | ROLE NonReservedWord_or_Sconst
1554 : : | SESSION AUTHORIZATION NonReservedWord_or_Sconst
1555 : : | SESSION AUTHORIZATION DEFAULT
1556 : : | XML_P OPTION document_or_content
1557 : : | TRANSACTION SNAPSHOT ecpg_sconst
1558 : : ;
1559 : :
1560 : :
1561 : : var_name:
1562 : : ECPGColId
1563 : : | var_name '.' ColId
1564 : : ;
1565 : :
1566 : :
1567 : : var_list:
1568 : : var_value
1569 : : | var_list ',' var_value
1570 : : ;
1571 : :
1572 : :
1573 : : var_value:
1574 : : opt_boolean_or_string
1575 : : | NumericOnly
1576 : : {
1577 [ + - ]: 1 : if (@1[0] == '$')
1578 : 1 : @$ = "$0";
1579 : : }
1580 : : ;
1581 : :
1582 : :
1583 : : iso_level:
1584 : : READ UNCOMMITTED
1585 : : | READ COMMITTED
1586 : : | REPEATABLE READ
1587 : : | SERIALIZABLE
1588 : : ;
1589 : :
1590 : :
1591 : : opt_boolean_or_string:
1592 : : TRUE_P
1593 : : | FALSE_P
1594 : : | ON
1595 : : | NonReservedWord_or_Sconst
1596 : : ;
1597 : :
1598 : :
1599 : : zone_value:
1600 : : ecpg_sconst
1601 : : | ecpg_ident
1602 : : | ConstInterval ecpg_sconst opt_interval
1603 : : | ConstInterval '(' Iconst ')' ecpg_sconst
1604 : : | NumericOnly
1605 : : | DEFAULT
1606 : : | LOCAL
1607 : : ;
1608 : :
1609 : :
1610 : : opt_encoding:
1611 : : ecpg_sconst
1612 : : | DEFAULT
1613 : : |
1614 : : ;
1615 : :
1616 : :
1617 : : NonReservedWord_or_Sconst:
1618 : : NonReservedWord
1619 : : | ecpg_sconst
1620 : : ;
1621 : :
1622 : :
1623 : : VariableResetStmt:
1624 : : RESET reset_rest
1625 : : ;
1626 : :
1627 : :
1628 : : reset_rest:
1629 : : generic_reset
1630 : : | TIME ZONE
1631 : : | TRANSACTION ISOLATION LEVEL
1632 : : | SESSION AUTHORIZATION
1633 : : ;
1634 : :
1635 : :
1636 : : generic_reset:
1637 : : var_name
1638 : : | ALL
1639 : : ;
1640 : :
1641 : :
1642 : : SetResetClause:
1643 : : SET set_rest
1644 : : | VariableResetStmt
1645 : : ;
1646 : :
1647 : :
1648 : : FunctionSetResetClause:
1649 : : SET set_rest_more
1650 : : | VariableResetStmt
1651 : : ;
1652 : :
1653 : :
1654 : : VariableShowStmt:
1655 : : SHOW var_name ecpg_into
1656 : : | SHOW TIME ZONE ecpg_into
1657 : : | SHOW TRANSACTION ISOLATION LEVEL ecpg_into
1658 : : | SHOW SESSION AUTHORIZATION ecpg_into
1659 : : | SHOW ALL
1660 : : {
1661 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "SHOW ALL is not implemented");
1662 : : }
1663 : : ;
1664 : :
1665 : :
1666 : : ConstraintsSetStmt:
1667 : : SET CONSTRAINTS constraints_set_list constraints_set_mode
1668 : : ;
1669 : :
1670 : :
1671 : : constraints_set_list:
1672 : : ALL
1673 : : | qualified_name_list
1674 : : ;
1675 : :
1676 : :
1677 : : constraints_set_mode:
1678 : : DEFERRED
1679 : : | IMMEDIATE
1680 : : ;
1681 : :
1682 : :
1683 : : CheckPointStmt:
1684 : : CHECKPOINT opt_utility_option_list
1685 : : ;
1686 : :
1687 : :
1688 : : DiscardStmt:
1689 : : DISCARD ALL
1690 : : | DISCARD TEMP
1691 : : | DISCARD TEMPORARY
1692 : : | DISCARD PLANS
1693 : : | DISCARD SEQUENCES
1694 : : ;
1695 : :
1696 : :
1697 : : AlterTableStmt:
1698 : : ALTER TABLE relation_expr alter_table_cmds
1699 : : | ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
1700 : : | ALTER TABLE relation_expr partition_cmd
1701 : : | ALTER TABLE IF_P EXISTS relation_expr partition_cmd
1702 : : | ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
1703 : : | ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
1704 : : | ALTER INDEX qualified_name alter_table_cmds
1705 : : | ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
1706 : : | ALTER INDEX qualified_name index_partition_cmd
1707 : : | ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
1708 : : | ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
1709 : : | ALTER SEQUENCE qualified_name alter_table_cmds
1710 : : | ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
1711 : : | ALTER VIEW qualified_name alter_table_cmds
1712 : : | ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
1713 : : | ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
1714 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
1715 : : | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
1716 : : | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
1717 : : | ALTER FOREIGN TABLE relation_expr alter_table_cmds
1718 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
1719 : : ;
1720 : :
1721 : :
1722 : : alter_table_cmds:
1723 : : alter_table_cmd
1724 : : | alter_table_cmds ',' alter_table_cmd
1725 : : ;
1726 : :
1727 : :
1728 : : partitions_list:
1729 : : SinglePartitionSpec
1730 : : | partitions_list ',' SinglePartitionSpec
1731 : : ;
1732 : :
1733 : :
1734 : : SinglePartitionSpec:
1735 : : PARTITION qualified_name PartitionBoundSpec
1736 : : ;
1737 : :
1738 : :
1739 : : partition_cmd:
1740 : : ATTACH PARTITION qualified_name PartitionBoundSpec
1741 : : | DETACH PARTITION qualified_name opt_concurrently
1742 : : | DETACH PARTITION qualified_name FINALIZE
1743 : : | SPLIT PARTITION qualified_name INTO '(' partitions_list ')'
1744 : : | MERGE PARTITIONS '(' qualified_name_list ')' INTO qualified_name
1745 : : ;
1746 : :
1747 : :
1748 : : index_partition_cmd:
1749 : : ATTACH PARTITION qualified_name
1750 : : ;
1751 : :
1752 : :
1753 : : alter_table_cmd:
1754 : : ADD_P columnDef
1755 : : | ADD_P IF_P NOT EXISTS columnDef
1756 : : | ADD_P COLUMN columnDef
1757 : : | ADD_P COLUMN IF_P NOT EXISTS columnDef
1758 : : | ALTER opt_column ColId alter_column_default
1759 : : | ALTER opt_column ColId DROP NOT NULL_P
1760 : : | ALTER opt_column ColId SET NOT NULL_P
1761 : : | ALTER opt_column ColId SET EXPRESSION AS '(' a_expr ')'
1762 : : | ALTER opt_column ColId DROP EXPRESSION
1763 : : | ALTER opt_column ColId DROP EXPRESSION IF_P EXISTS
1764 : : | ALTER opt_column ColId SET STATISTICS set_statistics_value
1765 : : | ALTER opt_column Iconst SET STATISTICS set_statistics_value
1766 : : | ALTER opt_column ColId SET reloptions
1767 : : | ALTER opt_column ColId RESET reloptions
1768 : : | ALTER opt_column ColId SET column_storage
1769 : : | ALTER opt_column ColId SET column_compression
1770 : : | ALTER opt_column ColId ADD_P GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
1771 : : | ALTER opt_column ColId alter_identity_column_option_list
1772 : : | ALTER opt_column ColId DROP IDENTITY_P
1773 : : | ALTER opt_column ColId DROP IDENTITY_P IF_P EXISTS
1774 : : | DROP opt_column IF_P EXISTS ColId opt_drop_behavior
1775 : : | DROP opt_column ColId opt_drop_behavior
1776 : : | ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
1777 : : | ALTER opt_column ColId alter_generic_options
1778 : : | ADD_P TableConstraint
1779 : : | ALTER CONSTRAINT name ConstraintAttributeSpec
1780 : : | ALTER CONSTRAINT name INHERIT
1781 : : | VALIDATE CONSTRAINT name
1782 : : | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
1783 : : | DROP CONSTRAINT name opt_drop_behavior
1784 : : | SET WITHOUT OIDS
1785 : : | CLUSTER ON name
1786 : : | SET WITHOUT CLUSTER
1787 : : | SET LOGGED
1788 : : | SET UNLOGGED
1789 : : | ENABLE_P TRIGGER name
1790 : : | ENABLE_P ALWAYS TRIGGER name
1791 : : | ENABLE_P REPLICA TRIGGER name
1792 : : | ENABLE_P TRIGGER ALL
1793 : : | ENABLE_P TRIGGER USER
1794 : : | DISABLE_P TRIGGER name
1795 : : | DISABLE_P TRIGGER ALL
1796 : : | DISABLE_P TRIGGER USER
1797 : : | ENABLE_P RULE name
1798 : : | ENABLE_P ALWAYS RULE name
1799 : : | ENABLE_P REPLICA RULE name
1800 : : | DISABLE_P RULE name
1801 : : | INHERIT qualified_name
1802 : : | NO INHERIT qualified_name
1803 : : | OF any_name
1804 : : | NOT OF
1805 : : | OWNER TO RoleSpec
1806 : : | SET ACCESS METHOD set_access_method_name
1807 : : | SET TABLESPACE name
1808 : : | SET reloptions
1809 : : | RESET reloptions
1810 : : | REPLICA IDENTITY_P replica_identity
1811 : : | ENABLE_P ROW LEVEL SECURITY
1812 : : | DISABLE_P ROW LEVEL SECURITY
1813 : : | FORCE ROW LEVEL SECURITY
1814 : : | NO FORCE ROW LEVEL SECURITY
1815 : : | alter_generic_options
1816 : : ;
1817 : :
1818 : :
1819 : : alter_column_default:
1820 : : SET DEFAULT a_expr
1821 : : | DROP DEFAULT
1822 : : ;
1823 : :
1824 : :
1825 : : opt_collate_clause:
1826 : : COLLATE any_name
1827 : : |
1828 : : ;
1829 : :
1830 : :
1831 : : alter_using:
1832 : : USING a_expr
1833 : : |
1834 : : ;
1835 : :
1836 : :
1837 : : replica_identity:
1838 : : NOTHING
1839 : : | FULL
1840 : : | DEFAULT
1841 : : | USING INDEX name
1842 : : ;
1843 : :
1844 : :
1845 : : reloptions:
1846 : : '(' reloption_list ')'
1847 : : ;
1848 : :
1849 : :
1850 : : opt_reloptions:
1851 : : WITH reloptions
1852 : : |
1853 : : ;
1854 : :
1855 : :
1856 : : reloption_list:
1857 : : reloption_elem
1858 : : | reloption_list ',' reloption_elem
1859 : : ;
1860 : :
1861 : :
1862 : : reloption_elem:
1863 : : ColLabel '=' def_arg
1864 : : | ColLabel
1865 : : | ColLabel '.' ColLabel '=' def_arg
1866 : : | ColLabel '.' ColLabel
1867 : : ;
1868 : :
1869 : :
1870 : : alter_identity_column_option_list:
1871 : : alter_identity_column_option
1872 : : | alter_identity_column_option_list alter_identity_column_option
1873 : : ;
1874 : :
1875 : :
1876 : : alter_identity_column_option:
1877 : : RESTART
1878 : : | RESTART opt_with NumericOnly
1879 : : | SET SeqOptElem
1880 : : | SET GENERATED generated_when
1881 : : ;
1882 : :
1883 : :
1884 : : set_statistics_value:
1885 : : SignedIconst
1886 : : | DEFAULT
1887 : : ;
1888 : :
1889 : :
1890 : : set_access_method_name:
1891 : : ColId
1892 : : | DEFAULT
1893 : : ;
1894 : :
1895 : :
1896 : : PartitionBoundSpec:
1897 : : FOR VALUES WITH '(' hash_partbound ')'
1898 : : | FOR VALUES IN_P '(' expr_list ')'
1899 : : | FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
1900 : : | DEFAULT
1901 : : ;
1902 : :
1903 : :
1904 : : hash_partbound_elem:
1905 : : NonReservedWord Iconst
1906 : : ;
1907 : :
1908 : :
1909 : : hash_partbound:
1910 : : hash_partbound_elem
1911 : : | hash_partbound ',' hash_partbound_elem
1912 : : ;
1913 : :
1914 : :
1915 : : AlterCompositeTypeStmt:
1916 : : ALTER TYPE_P any_name alter_type_cmds
1917 : : ;
1918 : :
1919 : :
1920 : : alter_type_cmds:
1921 : : alter_type_cmd
1922 : : | alter_type_cmds ',' alter_type_cmd
1923 : : ;
1924 : :
1925 : :
1926 : : alter_type_cmd:
1927 : : ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
1928 : : | DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
1929 : : | DROP ATTRIBUTE ColId opt_drop_behavior
1930 : : | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
1931 : : ;
1932 : :
1933 : :
1934 : : ClosePortalStmt:
1935 : : CLOSE cursor_name
1936 : : {
1937 [ + + ]: 40 : const char *cursor_marker = @2[0] == ':' ? "$0" : @2;
1938 : 40 : struct cursor *ptr = NULL;
1939 : :
1940 [ + + ]: 42 : for (ptr = cur; ptr != NULL; ptr = ptr->next)
1941 : : {
1942 [ + + ]: 39 : if (strcmp(@2, ptr->name) == 0)
1943 : : {
1944 : 37 : update_connection(ptr->connection);
1945 : 37 : break;
1946 : : }
1947 : : }
1948 : 40 : @$ = cat2_str("close", cursor_marker);
1949 : : }
1950 : : | CLOSE ALL
1951 : : ;
1952 : :
1953 : :
1954 : : CopyStmt:
1955 : : COPY opt_binary qualified_name opt_column_list copy_from opt_program copy_file_name copy_delimiter opt_with copy_options where_clause
1956 : : {
1957 [ + + ]: 2 : if (strcmp(@5, "from") == 0 &&
1958 [ - + - - ]: 1 : (strcmp(@7, "stdin") == 0 || strcmp(@7, "stdout") == 0))
1959 : 1 : mmerror(PARSE_ERROR, ET_WARNING, "COPY FROM STDIN is not implemented");
1960 : : }
1961 : : | COPY '(' PreparableStmt ')' TO opt_program copy_file_name opt_with copy_options
1962 : : ;
1963 : :
1964 : :
1965 : : copy_from:
1966 : : FROM
1967 : : | TO
1968 : : ;
1969 : :
1970 : :
1971 : : opt_program:
1972 : : PROGRAM
1973 : : |
1974 : : ;
1975 : :
1976 : :
1977 : : copy_file_name:
1978 : : ecpg_sconst
1979 : : | STDIN
1980 : : | STDOUT
1981 : : ;
1982 : :
1983 : :
1984 : : copy_options:
1985 : : copy_opt_list
1986 : : | '(' copy_generic_opt_list ')'
1987 : : ;
1988 : :
1989 : :
1990 : : copy_opt_list:
1991 : : copy_opt_list copy_opt_item
1992 : : |
1993 : : ;
1994 : :
1995 : :
1996 : : copy_opt_item:
1997 : : BINARY
1998 : : | FREEZE
1999 : : | DELIMITER opt_as ecpg_sconst
2000 : : | NULL_P opt_as ecpg_sconst
2001 : : | CSV
2002 : : | JSON
2003 : : | HEADER_P
2004 : : | QUOTE opt_as ecpg_sconst
2005 : : | ESCAPE opt_as ecpg_sconst
2006 : : | FORCE QUOTE columnList
2007 : : | FORCE QUOTE '*'
2008 : : | FORCE NOT NULL_P columnList
2009 : : | FORCE NOT NULL_P '*'
2010 : : | FORCE NULL_P columnList
2011 : : | FORCE NULL_P '*'
2012 : : | ENCODING ecpg_sconst
2013 : : ;
2014 : :
2015 : :
2016 : : opt_binary:
2017 : : BINARY
2018 : : |
2019 : : ;
2020 : :
2021 : :
2022 : : copy_delimiter:
2023 : : opt_using DELIMITERS ecpg_sconst
2024 : : |
2025 : : ;
2026 : :
2027 : :
2028 : : opt_using:
2029 : : USING
2030 : : |
2031 : : ;
2032 : :
2033 : :
2034 : : copy_generic_opt_list:
2035 : : copy_generic_opt_elem
2036 : : | copy_generic_opt_list ',' copy_generic_opt_elem
2037 : : ;
2038 : :
2039 : :
2040 : : copy_generic_opt_elem:
2041 : : ColLabel copy_generic_opt_arg
2042 : : | FORMAT_LA copy_generic_opt_arg
2043 : : ;
2044 : :
2045 : :
2046 : : copy_generic_opt_arg:
2047 : : opt_boolean_or_string
2048 : : | NumericOnly
2049 : : | '*'
2050 : : | DEFAULT
2051 : : | '(' copy_generic_opt_arg_list ')'
2052 : : |
2053 : : ;
2054 : :
2055 : :
2056 : : copy_generic_opt_arg_list:
2057 : : copy_generic_opt_arg_list_item
2058 : : | copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
2059 : : ;
2060 : :
2061 : :
2062 : : copy_generic_opt_arg_list_item:
2063 : : opt_boolean_or_string
2064 : : ;
2065 : :
2066 : :
2067 : : CreateStmt:
2068 : : CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
2069 : : | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '(' OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
2070 : : | CREATE OptTemp TABLE qualified_name OF any_name OptTypedTableElementList OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
2071 : : | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name OptTypedTableElementList OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
2072 : : | CREATE OptTemp TABLE qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
2073 : : | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec table_access_method_clause OptWith OnCommitOption OptTableSpace
2074 : : ;
2075 : :
2076 : :
2077 : : OptTemp:
2078 : : TEMPORARY
2079 : : | TEMP
2080 : : | LOCAL TEMPORARY
2081 : : | LOCAL TEMP
2082 : : | GLOBAL TEMPORARY
2083 : : | GLOBAL TEMP
2084 : : | UNLOGGED
2085 : : |
2086 : : ;
2087 : :
2088 : :
2089 : : OptTableElementList:
2090 : : TableElementList
2091 : : |
2092 : : ;
2093 : :
2094 : :
2095 : : OptTypedTableElementList:
2096 : : '(' TypedTableElementList ')'
2097 : : |
2098 : : ;
2099 : :
2100 : :
2101 : : TableElementList:
2102 : : TableElement
2103 : : | TableElementList ',' TableElement
2104 : : ;
2105 : :
2106 : :
2107 : : TypedTableElementList:
2108 : : TypedTableElement
2109 : : | TypedTableElementList ',' TypedTableElement
2110 : : ;
2111 : :
2112 : :
2113 : : TableElement:
2114 : : columnDef
2115 : : | TableLikeClause
2116 : : | TableConstraint
2117 : : ;
2118 : :
2119 : :
2120 : : TypedTableElement:
2121 : : columnOptions
2122 : : | TableConstraint
2123 : : ;
2124 : :
2125 : :
2126 : : columnDef:
2127 : : ColId Typename opt_column_storage opt_column_compression create_generic_options ColQualList
2128 : : ;
2129 : :
2130 : :
2131 : : columnOptions:
2132 : : ColId ColQualList
2133 : : | ColId WITH OPTIONS ColQualList
2134 : : ;
2135 : :
2136 : :
2137 : : column_compression:
2138 : : COMPRESSION ColId
2139 : : | COMPRESSION DEFAULT
2140 : : ;
2141 : :
2142 : :
2143 : : opt_column_compression:
2144 : : column_compression
2145 : : |
2146 : : ;
2147 : :
2148 : :
2149 : : column_storage:
2150 : : STORAGE ColId
2151 : : | STORAGE DEFAULT
2152 : : ;
2153 : :
2154 : :
2155 : : opt_column_storage:
2156 : : column_storage
2157 : : |
2158 : : ;
2159 : :
2160 : :
2161 : : ColQualList:
2162 : : ColQualList ColConstraint
2163 : : |
2164 : : ;
2165 : :
2166 : :
2167 : : ColConstraint:
2168 : : CONSTRAINT name ColConstraintElem
2169 : : | ColConstraintElem
2170 : : | ConstraintAttr
2171 : : | COLLATE any_name
2172 : : ;
2173 : :
2174 : :
2175 : : ColConstraintElem:
2176 : : NOT NULL_P opt_no_inherit
2177 : : | NULL_P
2178 : : | UNIQUE opt_unique_null_treatment opt_definition OptConsTableSpace
2179 : : | PRIMARY KEY opt_definition OptConsTableSpace
2180 : : | CHECK '(' a_expr ')' opt_no_inherit
2181 : : | DEFAULT b_expr
2182 : : | GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
2183 : : | GENERATED generated_when AS '(' a_expr ')' opt_virtual_or_stored
2184 : : | REFERENCES qualified_name opt_column_list key_match key_actions
2185 : : ;
2186 : :
2187 : :
2188 : : opt_unique_null_treatment:
2189 : : NULLS_P DISTINCT
2190 : : | NULLS_P NOT DISTINCT
2191 : : |
2192 : : ;
2193 : :
2194 : :
2195 : : generated_when:
2196 : : ALWAYS
2197 : : | BY DEFAULT
2198 : : ;
2199 : :
2200 : :
2201 : : opt_virtual_or_stored:
2202 : : STORED
2203 : : | VIRTUAL
2204 : : |
2205 : : ;
2206 : :
2207 : :
2208 : : ConstraintAttr:
2209 : : DEFERRABLE
2210 : : | NOT DEFERRABLE
2211 : : | INITIALLY DEFERRED
2212 : : | INITIALLY IMMEDIATE
2213 : : | ENFORCED
2214 : : | NOT ENFORCED
2215 : : ;
2216 : :
2217 : :
2218 : : TableLikeClause:
2219 : : LIKE qualified_name TableLikeOptionList
2220 : : ;
2221 : :
2222 : :
2223 : : TableLikeOptionList:
2224 : : TableLikeOptionList INCLUDING TableLikeOption
2225 : : | TableLikeOptionList EXCLUDING TableLikeOption
2226 : : |
2227 : : ;
2228 : :
2229 : :
2230 : : TableLikeOption:
2231 : : COMMENTS
2232 : : | COMPRESSION
2233 : : | CONSTRAINTS
2234 : : | DEFAULTS
2235 : : | IDENTITY_P
2236 : : | GENERATED
2237 : : | INDEXES
2238 : : | STATISTICS
2239 : : | STORAGE
2240 : : | ALL
2241 : : ;
2242 : :
2243 : :
2244 : : TableConstraint:
2245 : : CONSTRAINT name ConstraintElem
2246 : : | ConstraintElem
2247 : : ;
2248 : :
2249 : :
2250 : : ConstraintElem:
2251 : : CHECK '(' a_expr ')' ConstraintAttributeSpec
2252 : : | NOT NULL_P ColId ConstraintAttributeSpec
2253 : : | UNIQUE opt_unique_null_treatment '(' columnList opt_without_overlaps ')' opt_c_include opt_definition OptConsTableSpace ConstraintAttributeSpec
2254 : : | UNIQUE ExistingIndex ConstraintAttributeSpec
2255 : : | PRIMARY KEY '(' columnList opt_without_overlaps ')' opt_c_include opt_definition OptConsTableSpace ConstraintAttributeSpec
2256 : : | PRIMARY KEY ExistingIndex ConstraintAttributeSpec
2257 : : | EXCLUDE access_method_clause '(' ExclusionConstraintList ')' opt_c_include opt_definition OptConsTableSpace OptWhereClause ConstraintAttributeSpec
2258 : : | FOREIGN KEY '(' columnList optionalPeriodName ')' REFERENCES qualified_name opt_column_and_period_list key_match key_actions ConstraintAttributeSpec
2259 : : ;
2260 : :
2261 : :
2262 : : DomainConstraint:
2263 : : CONSTRAINT name DomainConstraintElem
2264 : : | DomainConstraintElem
2265 : : ;
2266 : :
2267 : :
2268 : : DomainConstraintElem:
2269 : : CHECK '(' a_expr ')' ConstraintAttributeSpec
2270 : : | NOT NULL_P ConstraintAttributeSpec
2271 : : ;
2272 : :
2273 : :
2274 : : opt_no_inherit:
2275 : : NO INHERIT
2276 : : |
2277 : : ;
2278 : :
2279 : :
2280 : : opt_without_overlaps:
2281 : : WITHOUT OVERLAPS
2282 : : |
2283 : : ;
2284 : :
2285 : :
2286 : : opt_column_list:
2287 : : '(' columnList ')'
2288 : : |
2289 : : ;
2290 : :
2291 : :
2292 : : columnList:
2293 : : columnElem
2294 : : | columnList ',' columnElem
2295 : : ;
2296 : :
2297 : :
2298 : : optionalPeriodName:
2299 : : ',' PERIOD columnElem
2300 : : |
2301 : : ;
2302 : :
2303 : :
2304 : : opt_column_and_period_list:
2305 : : '(' columnList optionalPeriodName ')'
2306 : : |
2307 : : ;
2308 : :
2309 : :
2310 : : columnElem:
2311 : : ColId
2312 : : ;
2313 : :
2314 : :
2315 : : opt_c_include:
2316 : : INCLUDE '(' columnList ')'
2317 : : |
2318 : : ;
2319 : :
2320 : :
2321 : : key_match:
2322 : : MATCH FULL
2323 : : | MATCH PARTIAL
2324 : : {
2325 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
2326 : : }
2327 : : | MATCH SIMPLE
2328 : : |
2329 : : ;
2330 : :
2331 : :
2332 : : ExclusionConstraintList:
2333 : : ExclusionConstraintElem
2334 : : | ExclusionConstraintList ',' ExclusionConstraintElem
2335 : : ;
2336 : :
2337 : :
2338 : : ExclusionConstraintElem:
2339 : : index_elem WITH any_operator
2340 : : | index_elem WITH OPERATOR '(' any_operator ')'
2341 : : ;
2342 : :
2343 : :
2344 : : OptWhereClause:
2345 : : WHERE '(' a_expr ')'
2346 : : |
2347 : : ;
2348 : :
2349 : :
2350 : : key_actions:
2351 : : key_update
2352 : : | key_delete
2353 : : | key_update key_delete
2354 : : | key_delete key_update
2355 : : |
2356 : : ;
2357 : :
2358 : :
2359 : : key_update:
2360 : : ON UPDATE key_action
2361 : : ;
2362 : :
2363 : :
2364 : : key_delete:
2365 : : ON DELETE_P key_action
2366 : : ;
2367 : :
2368 : :
2369 : : key_action:
2370 : : NO ACTION
2371 : : | RESTRICT
2372 : : | CASCADE
2373 : : | SET NULL_P opt_column_list
2374 : : | SET DEFAULT opt_column_list
2375 : : ;
2376 : :
2377 : :
2378 : : OptInherit:
2379 : : INHERITS '(' qualified_name_list ')'
2380 : : |
2381 : : ;
2382 : :
2383 : :
2384 : : OptPartitionSpec:
2385 : : PartitionSpec
2386 : : |
2387 : : ;
2388 : :
2389 : :
2390 : : PartitionSpec:
2391 : : PARTITION BY ColId '(' part_params ')'
2392 : : ;
2393 : :
2394 : :
2395 : : part_params:
2396 : : part_elem
2397 : : | part_params ',' part_elem
2398 : : ;
2399 : :
2400 : :
2401 : : part_elem:
2402 : : ColId opt_collate opt_qualified_name
2403 : : | func_expr_windowless opt_collate opt_qualified_name
2404 : : | '(' a_expr ')' opt_collate opt_qualified_name
2405 : : ;
2406 : :
2407 : :
2408 : : table_access_method_clause:
2409 : : USING name
2410 : : |
2411 : : ;
2412 : :
2413 : :
2414 : : OptWith:
2415 : : WITH reloptions
2416 : : | WITHOUT OIDS
2417 : : |
2418 : : ;
2419 : :
2420 : :
2421 : : OnCommitOption:
2422 : : ON COMMIT DROP
2423 : : | ON COMMIT DELETE_P ROWS
2424 : : | ON COMMIT PRESERVE ROWS
2425 : : |
2426 : : ;
2427 : :
2428 : :
2429 : : OptTableSpace:
2430 : : TABLESPACE name
2431 : : |
2432 : : ;
2433 : :
2434 : :
2435 : : OptConsTableSpace:
2436 : : USING INDEX TABLESPACE name
2437 : : |
2438 : : ;
2439 : :
2440 : :
2441 : : ExistingIndex:
2442 : : USING INDEX name
2443 : : ;
2444 : :
2445 : :
2446 : : CreateStatsStmt:
2447 : : CREATE STATISTICS opt_qualified_name opt_name_list ON stats_params FROM from_list
2448 : : | CREATE STATISTICS IF_P NOT EXISTS any_name opt_name_list ON stats_params FROM from_list
2449 : : ;
2450 : :
2451 : :
2452 : : stats_params:
2453 : : stats_param
2454 : : | stats_params ',' stats_param
2455 : : ;
2456 : :
2457 : :
2458 : : stats_param:
2459 : : ColId
2460 : : | func_expr_windowless
2461 : : | '(' a_expr ')'
2462 : : ;
2463 : :
2464 : :
2465 : : AlterStatsStmt:
2466 : : ALTER STATISTICS any_name SET STATISTICS set_statistics_value
2467 : : | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS set_statistics_value
2468 : : ;
2469 : :
2470 : :
2471 : : create_as_target:
2472 : : qualified_name opt_column_list table_access_method_clause OptWith OnCommitOption OptTableSpace
2473 : : ;
2474 : :
2475 : :
2476 : : opt_with_data:
2477 : : WITH DATA_P
2478 : : | WITH NO DATA_P
2479 : : |
2480 : : ;
2481 : :
2482 : :
2483 : : CreateMatViewStmt:
2484 : : CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data
2485 : : | CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data
2486 : : ;
2487 : :
2488 : :
2489 : : create_mv_target:
2490 : : qualified_name opt_column_list table_access_method_clause opt_reloptions OptTableSpace
2491 : : ;
2492 : :
2493 : :
2494 : : OptNoLog:
2495 : : UNLOGGED
2496 : : |
2497 : : ;
2498 : :
2499 : :
2500 : : RefreshMatViewStmt:
2501 : : REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
2502 : : ;
2503 : :
2504 : :
2505 : : CreateSeqStmt:
2506 : : CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
2507 : : | CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList
2508 : : ;
2509 : :
2510 : :
2511 : : AlterSeqStmt:
2512 : : ALTER SEQUENCE qualified_name SeqOptList
2513 : : | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList
2514 : : ;
2515 : :
2516 : :
2517 : : OptSeqOptList:
2518 : : SeqOptList
2519 : : |
2520 : : ;
2521 : :
2522 : :
2523 : : OptParenthesizedSeqOptList:
2524 : : '(' SeqOptList ')'
2525 : : |
2526 : : ;
2527 : :
2528 : :
2529 : : SeqOptList:
2530 : : SeqOptElem
2531 : : | SeqOptList SeqOptElem
2532 : : ;
2533 : :
2534 : :
2535 : : SeqOptElem:
2536 : : AS SimpleTypename
2537 : : | CACHE NumericOnly
2538 : : | CYCLE
2539 : : | NO CYCLE
2540 : : | INCREMENT opt_by NumericOnly
2541 : : | LOGGED
2542 : : | MAXVALUE NumericOnly
2543 : : | MINVALUE NumericOnly
2544 : : | NO MAXVALUE
2545 : : | NO MINVALUE
2546 : : | OWNED BY any_name
2547 : : | SEQUENCE NAME_P any_name
2548 : : | START opt_with NumericOnly
2549 : : | RESTART
2550 : : | RESTART opt_with NumericOnly
2551 : : | UNLOGGED
2552 : : ;
2553 : :
2554 : :
2555 : : opt_by:
2556 : : BY
2557 : : |
2558 : : ;
2559 : :
2560 : :
2561 : : NumericOnly:
2562 : : ecpg_fconst
2563 : : | '+' ecpg_fconst
2564 : : | '-' ecpg_fconst
2565 : : | SignedIconst
2566 : : ;
2567 : :
2568 : :
2569 : : NumericOnly_list:
2570 : : NumericOnly
2571 : : | NumericOnly_list ',' NumericOnly
2572 : : ;
2573 : :
2574 : :
2575 : : CreatePLangStmt:
2576 : : CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
2577 : : | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name HANDLER handler_name opt_inline_handler opt_validator
2578 : : ;
2579 : :
2580 : :
2581 : : opt_trusted:
2582 : : TRUSTED
2583 : : |
2584 : : ;
2585 : :
2586 : :
2587 : : handler_name:
2588 : : name
2589 : : | name attrs
2590 : : ;
2591 : :
2592 : :
2593 : : opt_inline_handler:
2594 : : INLINE_P handler_name
2595 : : |
2596 : : ;
2597 : :
2598 : :
2599 : : validator_clause:
2600 : : VALIDATOR handler_name
2601 : : | NO VALIDATOR
2602 : : ;
2603 : :
2604 : :
2605 : : opt_validator:
2606 : : validator_clause
2607 : : |
2608 : : ;
2609 : :
2610 : :
2611 : : opt_procedural:
2612 : : PROCEDURAL
2613 : : |
2614 : : ;
2615 : :
2616 : :
2617 : : CreateTableSpaceStmt:
2618 : : CREATE TABLESPACE name OptTableSpaceOwner LOCATION ecpg_sconst opt_reloptions
2619 : : ;
2620 : :
2621 : :
2622 : : OptTableSpaceOwner:
2623 : : OWNER RoleSpec
2624 : : |
2625 : : ;
2626 : :
2627 : :
2628 : : DropTableSpaceStmt:
2629 : : DROP TABLESPACE name
2630 : : | DROP TABLESPACE IF_P EXISTS name
2631 : : ;
2632 : :
2633 : :
2634 : : CreateExtensionStmt:
2635 : : CREATE EXTENSION name opt_with create_extension_opt_list
2636 : : | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
2637 : : ;
2638 : :
2639 : :
2640 : : create_extension_opt_list:
2641 : : create_extension_opt_list create_extension_opt_item
2642 : : |
2643 : : ;
2644 : :
2645 : :
2646 : : create_extension_opt_item:
2647 : : SCHEMA name
2648 : : | VERSION_P NonReservedWord_or_Sconst
2649 : : | FROM NonReservedWord_or_Sconst
2650 : : {
2651 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
2652 : : }
2653 : : | CASCADE
2654 : : ;
2655 : :
2656 : :
2657 : : AlterExtensionStmt:
2658 : : ALTER EXTENSION name UPDATE alter_extension_opt_list
2659 : : ;
2660 : :
2661 : :
2662 : : alter_extension_opt_list:
2663 : : alter_extension_opt_list alter_extension_opt_item
2664 : : |
2665 : : ;
2666 : :
2667 : :
2668 : : alter_extension_opt_item:
2669 : : TO NonReservedWord_or_Sconst
2670 : : ;
2671 : :
2672 : :
2673 : : AlterExtensionContentsStmt:
2674 : : ALTER EXTENSION name add_drop object_type_name name
2675 : : | ALTER EXTENSION name add_drop object_type_any_name any_name
2676 : : | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
2677 : : | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
2678 : : | ALTER EXTENSION name add_drop DOMAIN_P Typename
2679 : : | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
2680 : : | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
2681 : : | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name
2682 : : | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name
2683 : : | ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes
2684 : : | ALTER EXTENSION name add_drop ROUTINE function_with_argtypes
2685 : : | ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name
2686 : : | ALTER EXTENSION name add_drop TYPE_P Typename
2687 : : ;
2688 : :
2689 : :
2690 : : CreateFdwStmt:
2691 : : CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
2692 : : ;
2693 : :
2694 : :
2695 : : fdw_option:
2696 : : HANDLER handler_name
2697 : : | NO HANDLER
2698 : : | VALIDATOR handler_name
2699 : : | NO VALIDATOR
2700 : : | CONNECTION handler_name
2701 : : | NO CONNECTION
2702 : : ;
2703 : :
2704 : :
2705 : : fdw_options:
2706 : : fdw_option
2707 : : | fdw_options fdw_option
2708 : : ;
2709 : :
2710 : :
2711 : : opt_fdw_options:
2712 : : fdw_options
2713 : : |
2714 : : ;
2715 : :
2716 : :
2717 : : AlterFdwStmt:
2718 : : ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
2719 : : | ALTER FOREIGN DATA_P WRAPPER name fdw_options
2720 : : ;
2721 : :
2722 : :
2723 : : create_generic_options:
2724 : : OPTIONS '(' generic_option_list ')'
2725 : : |
2726 : : ;
2727 : :
2728 : :
2729 : : generic_option_list:
2730 : : generic_option_elem
2731 : : | generic_option_list ',' generic_option_elem
2732 : : ;
2733 : :
2734 : :
2735 : : alter_generic_options:
2736 : : OPTIONS '(' alter_generic_option_list ')'
2737 : : ;
2738 : :
2739 : :
2740 : : alter_generic_option_list:
2741 : : alter_generic_option_elem
2742 : : | alter_generic_option_list ',' alter_generic_option_elem
2743 : : ;
2744 : :
2745 : :
2746 : : alter_generic_option_elem:
2747 : : generic_option_elem
2748 : : | SET generic_option_elem
2749 : : | ADD_P generic_option_elem
2750 : : | DROP generic_option_name
2751 : : ;
2752 : :
2753 : :
2754 : : generic_option_elem:
2755 : : generic_option_name generic_option_arg
2756 : : ;
2757 : :
2758 : :
2759 : : generic_option_name:
2760 : : ColLabel
2761 : : ;
2762 : :
2763 : :
2764 : : generic_option_arg:
2765 : : ecpg_sconst
2766 : : ;
2767 : :
2768 : :
2769 : : CreateForeignServerStmt:
2770 : : CREATE SERVER name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options
2771 : : | CREATE SERVER IF_P NOT EXISTS name opt_type opt_foreign_server_version FOREIGN DATA_P WRAPPER name create_generic_options
2772 : : ;
2773 : :
2774 : :
2775 : : opt_type:
2776 : : TYPE_P ecpg_sconst
2777 : : |
2778 : : ;
2779 : :
2780 : :
2781 : : foreign_server_version:
2782 : : VERSION_P ecpg_sconst
2783 : : | VERSION_P NULL_P
2784 : : ;
2785 : :
2786 : :
2787 : : opt_foreign_server_version:
2788 : : foreign_server_version
2789 : : |
2790 : : ;
2791 : :
2792 : :
2793 : : AlterForeignServerStmt:
2794 : : ALTER SERVER name foreign_server_version alter_generic_options
2795 : : | ALTER SERVER name foreign_server_version
2796 : : | ALTER SERVER name alter_generic_options
2797 : : ;
2798 : :
2799 : :
2800 : : CreateForeignTableStmt:
2801 : : CREATE FOREIGN TABLE qualified_name '(' OptTableElementList ')' OptInherit SERVER name create_generic_options
2802 : : | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name '(' OptTableElementList ')' OptInherit SERVER name create_generic_options
2803 : : | CREATE FOREIGN TABLE qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec SERVER name create_generic_options
2804 : : | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec SERVER name create_generic_options
2805 : : ;
2806 : :
2807 : :
2808 : : ImportForeignSchemaStmt:
2809 : : IMPORT_P FOREIGN SCHEMA name import_qualification FROM SERVER name INTO name create_generic_options
2810 : : ;
2811 : :
2812 : :
2813 : : import_qualification_type:
2814 : : LIMIT TO
2815 : : | EXCEPT
2816 : : ;
2817 : :
2818 : :
2819 : : import_qualification:
2820 : : import_qualification_type '(' relation_expr_list ')'
2821 : : |
2822 : : ;
2823 : :
2824 : :
2825 : : CreateUserMappingStmt:
2826 : : CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
2827 : : | CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options
2828 : : ;
2829 : :
2830 : :
2831 : : auth_ident:
2832 : : RoleSpec
2833 : : | USER
2834 : : ;
2835 : :
2836 : :
2837 : : DropUserMappingStmt:
2838 : : DROP USER MAPPING FOR auth_ident SERVER name
2839 : : | DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
2840 : : ;
2841 : :
2842 : :
2843 : : AlterUserMappingStmt:
2844 : : ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
2845 : : ;
2846 : :
2847 : :
2848 : : CreatePolicyStmt:
2849 : : CREATE POLICY name ON qualified_name RowSecurityDefaultPermissive RowSecurityDefaultForCmd RowSecurityDefaultToRole RowSecurityOptionalExpr RowSecurityOptionalWithCheck
2850 : : ;
2851 : :
2852 : :
2853 : : AlterPolicyStmt:
2854 : : ALTER POLICY name ON qualified_name RowSecurityOptionalToRole RowSecurityOptionalExpr RowSecurityOptionalWithCheck
2855 : : ;
2856 : :
2857 : :
2858 : : RowSecurityOptionalExpr:
2859 : : USING '(' a_expr ')'
2860 : : |
2861 : : ;
2862 : :
2863 : :
2864 : : RowSecurityOptionalWithCheck:
2865 : : WITH CHECK '(' a_expr ')'
2866 : : |
2867 : : ;
2868 : :
2869 : :
2870 : : RowSecurityDefaultToRole:
2871 : : TO role_list
2872 : : |
2873 : : ;
2874 : :
2875 : :
2876 : : RowSecurityOptionalToRole:
2877 : : TO role_list
2878 : : |
2879 : : ;
2880 : :
2881 : :
2882 : : RowSecurityDefaultPermissive:
2883 : : AS ecpg_ident
2884 : : |
2885 : : ;
2886 : :
2887 : :
2888 : : RowSecurityDefaultForCmd:
2889 : : FOR row_security_cmd
2890 : : |
2891 : : ;
2892 : :
2893 : :
2894 : : row_security_cmd:
2895 : : ALL
2896 : : | SELECT
2897 : : | INSERT
2898 : : | UPDATE
2899 : : | DELETE_P
2900 : : ;
2901 : :
2902 : :
2903 : : CreateAmStmt:
2904 : : CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name
2905 : : ;
2906 : :
2907 : :
2908 : : am_type:
2909 : : INDEX
2910 : : | TABLE
2911 : : ;
2912 : :
2913 : :
2914 : : CreateTrigStmt:
2915 : : CREATE opt_or_replace TRIGGER name TriggerActionTime TriggerEvents ON qualified_name TriggerReferencing TriggerForSpec TriggerWhen EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
2916 : : | CREATE opt_or_replace CONSTRAINT TRIGGER name AFTER TriggerEvents ON qualified_name OptConstrFromTable ConstraintAttributeSpec FOR EACH ROW TriggerWhen EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
2917 : : ;
2918 : :
2919 : :
2920 : : TriggerActionTime:
2921 : : BEFORE
2922 : : | AFTER
2923 : : | INSTEAD OF
2924 : : ;
2925 : :
2926 : :
2927 : : TriggerEvents:
2928 : : TriggerOneEvent
2929 : : | TriggerEvents OR TriggerOneEvent
2930 : : ;
2931 : :
2932 : :
2933 : : TriggerOneEvent:
2934 : : INSERT
2935 : : | DELETE_P
2936 : : | UPDATE
2937 : : | UPDATE OF columnList
2938 : : | TRUNCATE
2939 : : ;
2940 : :
2941 : :
2942 : : TriggerReferencing:
2943 : : REFERENCING TriggerTransitions
2944 : : |
2945 : : ;
2946 : :
2947 : :
2948 : : TriggerTransitions:
2949 : : TriggerTransition
2950 : : | TriggerTransitions TriggerTransition
2951 : : ;
2952 : :
2953 : :
2954 : : TriggerTransition:
2955 : : TransitionOldOrNew TransitionRowOrTable opt_as TransitionRelName
2956 : : ;
2957 : :
2958 : :
2959 : : TransitionOldOrNew:
2960 : : NEW
2961 : : | OLD
2962 : : ;
2963 : :
2964 : :
2965 : : TransitionRowOrTable:
2966 : : TABLE
2967 : : | ROW
2968 : : ;
2969 : :
2970 : :
2971 : : TransitionRelName:
2972 : : ColId
2973 : : ;
2974 : :
2975 : :
2976 : : TriggerForSpec:
2977 : : FOR TriggerForOptEach TriggerForType
2978 : : |
2979 : : ;
2980 : :
2981 : :
2982 : : TriggerForOptEach:
2983 : : EACH
2984 : : |
2985 : : ;
2986 : :
2987 : :
2988 : : TriggerForType:
2989 : : ROW
2990 : : | STATEMENT
2991 : : ;
2992 : :
2993 : :
2994 : : TriggerWhen:
2995 : : WHEN '(' a_expr ')'
2996 : : |
2997 : : ;
2998 : :
2999 : :
3000 : : FUNCTION_or_PROCEDURE:
3001 : : FUNCTION
3002 : : | PROCEDURE
3003 : : ;
3004 : :
3005 : :
3006 : : TriggerFuncArgs:
3007 : : TriggerFuncArg
3008 : : | TriggerFuncArgs ',' TriggerFuncArg
3009 : : |
3010 : : ;
3011 : :
3012 : :
3013 : : TriggerFuncArg:
3014 : : Iconst
3015 : : | ecpg_fconst
3016 : : | ecpg_sconst
3017 : : | ColLabel
3018 : : ;
3019 : :
3020 : :
3021 : : OptConstrFromTable:
3022 : : FROM qualified_name
3023 : : |
3024 : : ;
3025 : :
3026 : :
3027 : : ConstraintAttributeSpec:
3028 : :
3029 : : | ConstraintAttributeSpec ConstraintAttributeElem
3030 : : ;
3031 : :
3032 : :
3033 : : ConstraintAttributeElem:
3034 : : NOT DEFERRABLE
3035 : : | DEFERRABLE
3036 : : | INITIALLY IMMEDIATE
3037 : : | INITIALLY DEFERRED
3038 : : | NOT VALID
3039 : : | NO INHERIT
3040 : : | NOT ENFORCED
3041 : : | ENFORCED
3042 : : ;
3043 : :
3044 : :
3045 : : CreateEventTrigStmt:
3046 : : CREATE EVENT TRIGGER name ON ColLabel EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
3047 : : | CREATE EVENT TRIGGER name ON ColLabel WHEN event_trigger_when_list EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
3048 : : ;
3049 : :
3050 : :
3051 : : event_trigger_when_list:
3052 : : event_trigger_when_item
3053 : : | event_trigger_when_list AND event_trigger_when_item
3054 : : ;
3055 : :
3056 : :
3057 : : event_trigger_when_item:
3058 : : ColId IN_P '(' event_trigger_value_list ')'
3059 : : ;
3060 : :
3061 : :
3062 : : event_trigger_value_list:
3063 : : SCONST
3064 : : | event_trigger_value_list ',' SCONST
3065 : : ;
3066 : :
3067 : :
3068 : : AlterEventTrigStmt:
3069 : : ALTER EVENT TRIGGER name enable_trigger
3070 : : ;
3071 : :
3072 : :
3073 : : enable_trigger:
3074 : : ENABLE_P
3075 : : | ENABLE_P REPLICA
3076 : : | ENABLE_P ALWAYS
3077 : : | DISABLE_P
3078 : : ;
3079 : :
3080 : :
3081 : : CreateAssertionStmt:
3082 : : CREATE ASSERTION any_name CHECK '(' a_expr ')' ConstraintAttributeSpec
3083 : : {
3084 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
3085 : : }
3086 : : ;
3087 : :
3088 : :
3089 : : DefineStmt:
3090 : : CREATE opt_or_replace AGGREGATE func_name aggr_args definition
3091 : : | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition
3092 : : | CREATE OPERATOR any_operator definition
3093 : : | CREATE TYPE_P any_name definition
3094 : : | CREATE TYPE_P any_name
3095 : : | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
3096 : : | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
3097 : : | CREATE TYPE_P any_name AS RANGE definition
3098 : : | CREATE TEXT_P SEARCH PARSER any_name definition
3099 : : | CREATE TEXT_P SEARCH DICTIONARY any_name definition
3100 : : | CREATE TEXT_P SEARCH TEMPLATE any_name definition
3101 : : | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
3102 : : | CREATE COLLATION any_name definition
3103 : : | CREATE COLLATION IF_P NOT EXISTS any_name definition
3104 : : | CREATE COLLATION any_name FROM any_name
3105 : : | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name
3106 : : ;
3107 : :
3108 : :
3109 : : definition:
3110 : : '(' def_list ')'
3111 : : ;
3112 : :
3113 : :
3114 : : def_list:
3115 : : def_elem
3116 : : | def_list ',' def_elem
3117 : : ;
3118 : :
3119 : :
3120 : : def_elem:
3121 : : ColLabel '=' def_arg
3122 : : | ColLabel
3123 : : ;
3124 : :
3125 : :
3126 : : def_arg:
3127 : : func_type
3128 : : | reserved_keyword
3129 : : | qual_all_Op
3130 : : | NumericOnly
3131 : : | ecpg_sconst
3132 : : | NONE
3133 : : ;
3134 : :
3135 : :
3136 : : old_aggr_definition:
3137 : : '(' old_aggr_list ')'
3138 : : ;
3139 : :
3140 : :
3141 : : old_aggr_list:
3142 : : old_aggr_elem
3143 : : | old_aggr_list ',' old_aggr_elem
3144 : : ;
3145 : :
3146 : :
3147 : : old_aggr_elem:
3148 : : ecpg_ident '=' def_arg
3149 : : ;
3150 : :
3151 : :
3152 : : opt_enum_val_list:
3153 : : enum_val_list
3154 : : |
3155 : : ;
3156 : :
3157 : :
3158 : : enum_val_list:
3159 : : ecpg_sconst
3160 : : | enum_val_list ',' ecpg_sconst
3161 : : ;
3162 : :
3163 : :
3164 : : AlterEnumStmt:
3165 : : ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists ecpg_sconst
3166 : : | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists ecpg_sconst BEFORE ecpg_sconst
3167 : : | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists ecpg_sconst AFTER ecpg_sconst
3168 : : | ALTER TYPE_P any_name RENAME VALUE_P ecpg_sconst TO ecpg_sconst
3169 : : | ALTER TYPE_P any_name DROP VALUE_P ecpg_sconst
3170 : : {
3171 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
3172 : : }
3173 : : ;
3174 : :
3175 : :
3176 : : opt_if_not_exists:
3177 : : IF_P NOT EXISTS
3178 : : |
3179 : : ;
3180 : :
3181 : :
3182 : : CreateOpClassStmt:
3183 : : CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename USING name opt_opfamily AS opclass_item_list
3184 : : ;
3185 : :
3186 : :
3187 : : opclass_item_list:
3188 : : opclass_item
3189 : : | opclass_item_list ',' opclass_item
3190 : : ;
3191 : :
3192 : :
3193 : : opclass_item:
3194 : : OPERATOR Iconst any_operator opclass_purpose
3195 : : | OPERATOR Iconst operator_with_argtypes opclass_purpose
3196 : : | FUNCTION Iconst function_with_argtypes
3197 : : | FUNCTION Iconst '(' type_list ')' function_with_argtypes
3198 : : | STORAGE Typename
3199 : : ;
3200 : :
3201 : :
3202 : : opt_default:
3203 : : DEFAULT
3204 : : |
3205 : : ;
3206 : :
3207 : :
3208 : : opt_opfamily:
3209 : : FAMILY any_name
3210 : : |
3211 : : ;
3212 : :
3213 : :
3214 : : opclass_purpose:
3215 : : FOR SEARCH
3216 : : | FOR ORDER BY any_name
3217 : : |
3218 : : ;
3219 : :
3220 : :
3221 : : CreateOpFamilyStmt:
3222 : : CREATE OPERATOR FAMILY any_name USING name
3223 : : ;
3224 : :
3225 : :
3226 : : AlterOpFamilyStmt:
3227 : : ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list
3228 : : | ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list
3229 : : ;
3230 : :
3231 : :
3232 : : opclass_drop_list:
3233 : : opclass_drop
3234 : : | opclass_drop_list ',' opclass_drop
3235 : : ;
3236 : :
3237 : :
3238 : : opclass_drop:
3239 : : OPERATOR Iconst '(' type_list ')'
3240 : : | FUNCTION Iconst '(' type_list ')'
3241 : : ;
3242 : :
3243 : :
3244 : : DropOpClassStmt:
3245 : : DROP OPERATOR CLASS any_name USING name opt_drop_behavior
3246 : : | DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior
3247 : : ;
3248 : :
3249 : :
3250 : : DropOpFamilyStmt:
3251 : : DROP OPERATOR FAMILY any_name USING name opt_drop_behavior
3252 : : | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior
3253 : : ;
3254 : :
3255 : :
3256 : : DropOwnedStmt:
3257 : : DROP OWNED BY role_list opt_drop_behavior
3258 : : ;
3259 : :
3260 : :
3261 : : ReassignOwnedStmt:
3262 : : REASSIGN OWNED BY role_list TO RoleSpec
3263 : : ;
3264 : :
3265 : :
3266 : : DropStmt:
3267 : : DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior
3268 : : | DROP object_type_any_name any_name_list opt_drop_behavior
3269 : : | DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior
3270 : : | DROP drop_type_name name_list opt_drop_behavior
3271 : : | DROP object_type_name_on_any_name name ON any_name opt_drop_behavior
3272 : : | DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior
3273 : : | DROP TYPE_P type_name_list opt_drop_behavior
3274 : : | DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior
3275 : : | DROP DOMAIN_P type_name_list opt_drop_behavior
3276 : : | DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior
3277 : : | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
3278 : : | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
3279 : : ;
3280 : :
3281 : :
3282 : : object_type_any_name:
3283 : : TABLE
3284 : : | SEQUENCE
3285 : : | VIEW
3286 : : | MATERIALIZED VIEW
3287 : : | INDEX
3288 : : | FOREIGN TABLE
3289 : : | PROPERTY GRAPH
3290 : : | COLLATION
3291 : : | CONVERSION_P
3292 : : | STATISTICS
3293 : : | TEXT_P SEARCH PARSER
3294 : : | TEXT_P SEARCH DICTIONARY
3295 : : | TEXT_P SEARCH TEMPLATE
3296 : : | TEXT_P SEARCH CONFIGURATION
3297 : : ;
3298 : :
3299 : :
3300 : : object_type_name:
3301 : : drop_type_name
3302 : : | DATABASE
3303 : : | ROLE
3304 : : | SUBSCRIPTION
3305 : : | TABLESPACE
3306 : : ;
3307 : :
3308 : :
3309 : : drop_type_name:
3310 : : ACCESS METHOD
3311 : : | EVENT TRIGGER
3312 : : | EXTENSION
3313 : : | FOREIGN DATA_P WRAPPER
3314 : : | opt_procedural LANGUAGE
3315 : : | PUBLICATION
3316 : : | SCHEMA
3317 : : | SERVER
3318 : : ;
3319 : :
3320 : :
3321 : : object_type_name_on_any_name:
3322 : : POLICY
3323 : : | RULE
3324 : : | TRIGGER
3325 : : ;
3326 : :
3327 : :
3328 : : any_name_list:
3329 : : any_name
3330 : : | any_name_list ',' any_name
3331 : : ;
3332 : :
3333 : :
3334 : : any_name:
3335 : : ColId
3336 : : | ColId attrs
3337 : : ;
3338 : :
3339 : :
3340 : : attrs:
3341 : : '.' attr_name
3342 : : | attrs '.' attr_name
3343 : : ;
3344 : :
3345 : :
3346 : : type_name_list:
3347 : : Typename
3348 : : | type_name_list ',' Typename
3349 : : ;
3350 : :
3351 : :
3352 : : TruncateStmt:
3353 : : TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
3354 : : ;
3355 : :
3356 : :
3357 : : opt_restart_seqs:
3358 : : CONTINUE_P IDENTITY_P
3359 : : | RESTART IDENTITY_P
3360 : : |
3361 : : ;
3362 : :
3363 : :
3364 : : CommentStmt:
3365 : : COMMENT ON object_type_any_name any_name IS comment_text
3366 : : | COMMENT ON COLUMN any_name IS comment_text
3367 : : | COMMENT ON object_type_name name IS comment_text
3368 : : | COMMENT ON TYPE_P Typename IS comment_text
3369 : : | COMMENT ON DOMAIN_P Typename IS comment_text
3370 : : | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text
3371 : : | COMMENT ON FUNCTION function_with_argtypes IS comment_text
3372 : : | COMMENT ON OPERATOR operator_with_argtypes IS comment_text
3373 : : | COMMENT ON CONSTRAINT name ON any_name IS comment_text
3374 : : | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text
3375 : : | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text
3376 : : | COMMENT ON PROCEDURE function_with_argtypes IS comment_text
3377 : : | COMMENT ON ROUTINE function_with_argtypes IS comment_text
3378 : : | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text
3379 : : | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text
3380 : : | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text
3381 : : | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
3382 : : | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
3383 : : ;
3384 : :
3385 : :
3386 : : comment_text:
3387 : : ecpg_sconst
3388 : : | NULL_P
3389 : : ;
3390 : :
3391 : :
3392 : : SecLabelStmt:
3393 : : SECURITY LABEL opt_provider ON object_type_any_name any_name IS security_label
3394 : : | SECURITY LABEL opt_provider ON COLUMN any_name IS security_label
3395 : : | SECURITY LABEL opt_provider ON object_type_name name IS security_label
3396 : : | SECURITY LABEL opt_provider ON TYPE_P Typename IS security_label
3397 : : | SECURITY LABEL opt_provider ON DOMAIN_P Typename IS security_label
3398 : : | SECURITY LABEL opt_provider ON AGGREGATE aggregate_with_argtypes IS security_label
3399 : : | SECURITY LABEL opt_provider ON FUNCTION function_with_argtypes IS security_label
3400 : : | SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly IS security_label
3401 : : | SECURITY LABEL opt_provider ON PROCEDURE function_with_argtypes IS security_label
3402 : : | SECURITY LABEL opt_provider ON ROUTINE function_with_argtypes IS security_label
3403 : : ;
3404 : :
3405 : :
3406 : : opt_provider:
3407 : : FOR NonReservedWord_or_Sconst
3408 : : |
3409 : : ;
3410 : :
3411 : :
3412 : : security_label:
3413 : : ecpg_sconst
3414 : : | NULL_P
3415 : : ;
3416 : :
3417 : :
3418 : : FetchStmt:
3419 : : FETCH fetch_args
3420 : : | MOVE fetch_args
3421 : : | FETCH fetch_args ecpg_fetch_into
3422 : : | FETCH FORWARD cursor_name opt_ecpg_fetch_into
3423 : : {
3424 [ + + ]: 2 : const char *cursor_marker = @3[0] == ':' ? "$0" : @3;
3425 : 2 : struct cursor *ptr = add_additional_variables(@3, false);
3426 : :
3427 : 2 : update_connection(ptr->connection);
3428 : :
3429 : 2 : @$ = cat_str(2, "fetch forward", cursor_marker);
3430 : : }
3431 : : | FETCH FORWARD from_in cursor_name opt_ecpg_fetch_into
3432 : : {
3433 [ - + ]: 1 : const char *cursor_marker = @4[0] == ':' ? "$0" : @4;
3434 : 1 : struct cursor *ptr = add_additional_variables(@4, false);
3435 : :
3436 : 1 : update_connection(ptr->connection);
3437 : :
3438 : 1 : @$ = cat_str(2, "fetch forward from", cursor_marker);
3439 : : }
3440 : : | FETCH BACKWARD cursor_name opt_ecpg_fetch_into
3441 : : {
3442 [ # # ]: 0 : const char *cursor_marker = @3[0] == ':' ? "$0" : @3;
3443 : 0 : struct cursor *ptr = add_additional_variables(@3, false);
3444 : :
3445 : 0 : update_connection(ptr->connection);
3446 : :
3447 : 0 : @$ = cat_str(2, "fetch backward", cursor_marker);
3448 : : }
3449 : : | FETCH BACKWARD from_in cursor_name opt_ecpg_fetch_into
3450 : : {
3451 [ # # ]: 0 : const char *cursor_marker = @4[0] == ':' ? "$0" : @4;
3452 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3453 : :
3454 : 0 : update_connection(ptr->connection);
3455 : :
3456 : 0 : @$ = cat_str(2, "fetch backward from", cursor_marker);
3457 : : }
3458 : : | MOVE FORWARD cursor_name
3459 : : {
3460 [ # # ]: 0 : const char *cursor_marker = @3[0] == ':' ? "$0" : @3;
3461 : 0 : struct cursor *ptr = add_additional_variables(@3, false);
3462 : :
3463 : 0 : update_connection(ptr->connection);
3464 : :
3465 : 0 : @$ = cat_str(2, "move forward", cursor_marker);
3466 : : }
3467 : : | MOVE FORWARD from_in cursor_name
3468 : : {
3469 [ # # ]: 0 : const char *cursor_marker = @4[0] == ':' ? "$0" : @4;
3470 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3471 : :
3472 : 0 : update_connection(ptr->connection);
3473 : :
3474 : 0 : @$ = cat_str(2, "move forward from", cursor_marker);
3475 : : }
3476 : : | MOVE BACKWARD cursor_name
3477 : : {
3478 [ # # ]: 0 : const char *cursor_marker = @3[0] == ':' ? "$0" : @3;
3479 : 0 : struct cursor *ptr = add_additional_variables(@3, false);
3480 : :
3481 : 0 : update_connection(ptr->connection);
3482 : :
3483 : 0 : @$ = cat_str(2, "move backward", cursor_marker);
3484 : : }
3485 : : | MOVE BACKWARD from_in cursor_name
3486 : : {
3487 [ # # ]: 0 : const char *cursor_marker = @4[0] == ':' ? "$0" : @4;
3488 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3489 : :
3490 : 0 : update_connection(ptr->connection);
3491 : :
3492 : 0 : @$ = cat_str(2, "move backward from", cursor_marker);
3493 : : }
3494 : : ;
3495 : :
3496 : :
3497 : : fetch_args:
3498 : : cursor_name
3499 : : {
3500 : 17 : struct cursor *ptr = add_additional_variables(@1, false);
3501 : :
3502 : 17 : update_connection(ptr->connection);
3503 [ + + ]: 17 : if (@1[0] == ':')
3504 : 3 : @$ = "$0";
3505 : : }
3506 : : | from_in cursor_name
3507 : : {
3508 : 11 : struct cursor *ptr = add_additional_variables(@2, false);
3509 : :
3510 : 11 : update_connection(ptr->connection);
3511 [ + + ]: 11 : if (@2[0] == ':')
3512 : 3 : @$ = cat2_str(@1, "$0");
3513 : : }
3514 : : | SignedIconst opt_from_in cursor_name
3515 : : {
3516 : 24 : struct cursor *ptr = add_additional_variables(@3, false);
3517 : 24 : bool replace = false;
3518 : :
3519 : 24 : update_connection(ptr->connection);
3520 [ + + ]: 24 : if (@3[0] == ':')
3521 : : {
3522 : 16 : @3 = "$0";
3523 : 16 : replace = true;
3524 : : }
3525 [ + + ]: 24 : if (@1[0] == '$')
3526 : : {
3527 : 9 : @1 = "$0";
3528 : 9 : replace = true;
3529 : : }
3530 [ + + ]: 24 : if (replace)
3531 : 17 : @$ = cat_str(3, @1, @2, @3);
3532 : : }
3533 : : | NEXT opt_from_in cursor_name
3534 : : {
3535 : 3 : struct cursor *ptr = add_additional_variables(@3, false);
3536 : :
3537 : 3 : update_connection(ptr->connection);
3538 [ - + ]: 3 : if (@3[0] == ':')
3539 : 0 : @$ = cat_str(3, @1, @2, "$0");
3540 : : }
3541 : : | PRIOR opt_from_in cursor_name
3542 : : {
3543 : 0 : struct cursor *ptr = add_additional_variables(@3, false);
3544 : :
3545 : 0 : update_connection(ptr->connection);
3546 [ # # ]: 0 : if (@3[0] == ':')
3547 : 0 : @$ = cat_str(3, @1, @2, "$0");
3548 : : }
3549 : : | FIRST_P opt_from_in cursor_name
3550 : : {
3551 : 0 : struct cursor *ptr = add_additional_variables(@3, false);
3552 : :
3553 : 0 : update_connection(ptr->connection);
3554 [ # # ]: 0 : if (@3[0] == ':')
3555 : 0 : @$ = cat_str(3, @1, @2, "$0");
3556 : : }
3557 : : | LAST_P opt_from_in cursor_name
3558 : : {
3559 : 0 : struct cursor *ptr = add_additional_variables(@3, false);
3560 : :
3561 : 0 : update_connection(ptr->connection);
3562 [ # # ]: 0 : if (@3[0] == ':')
3563 : 0 : @$ = cat_str(3, @1, @2, "$0");
3564 : : }
3565 : : | ABSOLUTE_P SignedIconst opt_from_in cursor_name
3566 : : {
3567 : 4 : struct cursor *ptr = add_additional_variables(@4, false);
3568 : 4 : bool replace = false;
3569 : :
3570 : 4 : update_connection(ptr->connection);
3571 [ + - ]: 4 : if (@4[0] == ':')
3572 : : {
3573 : 4 : @4 = "$0";
3574 : 4 : replace = true;
3575 : : }
3576 [ - + ]: 4 : if (@2[0] == '$')
3577 : : {
3578 : 0 : @2 = "$0";
3579 : 0 : replace = true;
3580 : : }
3581 [ + - ]: 4 : if (replace)
3582 : 4 : @$ = cat_str(4, @1, @2, @3, @4);
3583 : : }
3584 : : | RELATIVE_P SignedIconst opt_from_in cursor_name
3585 : : {
3586 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3587 : 0 : bool replace = false;
3588 : :
3589 : 0 : update_connection(ptr->connection);
3590 [ # # ]: 0 : if (@4[0] == ':')
3591 : : {
3592 : 0 : @4 = "$0";
3593 : 0 : replace = true;
3594 : : }
3595 [ # # ]: 0 : if (@2[0] == '$')
3596 : : {
3597 : 0 : @2 = "$0";
3598 : 0 : replace = true;
3599 : : }
3600 [ # # ]: 0 : if (replace)
3601 : 0 : @$ = cat_str(4, @1, @2, @3, @4);
3602 : : }
3603 : : | ALL opt_from_in cursor_name
3604 : : {
3605 : 1 : struct cursor *ptr = add_additional_variables(@3, false);
3606 : :
3607 : 1 : update_connection(ptr->connection);
3608 [ - + ]: 1 : if (@3[0] == ':')
3609 : 0 : @$ = cat_str(3, @1, @2, "$0");
3610 : : }
3611 : : | FORWARD SignedIconst opt_from_in cursor_name
3612 : : {
3613 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3614 : 0 : bool replace = false;
3615 : :
3616 : 0 : update_connection(ptr->connection);
3617 [ # # ]: 0 : if (@4[0] == ':')
3618 : : {
3619 : 0 : @4 = "$0";
3620 : 0 : replace = true;
3621 : : }
3622 [ # # ]: 0 : if (@2[0] == '$')
3623 : : {
3624 : 0 : @2 = "$0";
3625 : 0 : replace = true;
3626 : : }
3627 [ # # ]: 0 : if (replace)
3628 : 0 : @$ = cat_str(4, @1, @2, @3, @4);
3629 : : }
3630 : : | FORWARD ALL opt_from_in cursor_name
3631 : : {
3632 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3633 : :
3634 : 0 : update_connection(ptr->connection);
3635 [ # # ]: 0 : if (@4[0] == ':')
3636 : 0 : @$ = cat_str(4, @1, @2, @3, "$0");
3637 : : }
3638 : : | BACKWARD SignedIconst opt_from_in cursor_name
3639 : : {
3640 : 1 : struct cursor *ptr = add_additional_variables(@4, false);
3641 : 1 : bool replace = false;
3642 : :
3643 : 1 : update_connection(ptr->connection);
3644 [ - + ]: 1 : if (@4[0] == ':')
3645 : : {
3646 : 0 : @4 = "$0";
3647 : 0 : replace = true;
3648 : : }
3649 [ - + ]: 1 : if (@2[0] == '$')
3650 : : {
3651 : 0 : @2 = "$0";
3652 : 0 : replace = true;
3653 : : }
3654 [ - + ]: 1 : if (replace)
3655 : 0 : @$ = cat_str(4, @1, @2, @3, @4);
3656 : : }
3657 : : | BACKWARD ALL opt_from_in cursor_name
3658 : : {
3659 : 0 : struct cursor *ptr = add_additional_variables(@4, false);
3660 : :
3661 : 0 : update_connection(ptr->connection);
3662 [ # # ]: 0 : if (@4[0] == ':')
3663 : 0 : @$ = cat_str(4, @1, @2, @3, "$0");
3664 : : }
3665 : : ;
3666 : :
3667 : :
3668 : : from_in:
3669 : : FROM
3670 : : | IN_P
3671 : : ;
3672 : :
3673 : :
3674 : : opt_from_in:
3675 : : from_in
3676 : : |
3677 : : ;
3678 : :
3679 : :
3680 : : GrantStmt:
3681 : : GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option opt_granted_by
3682 : : ;
3683 : :
3684 : :
3685 : : RevokeStmt:
3686 : : REVOKE privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior
3687 : : | REVOKE GRANT OPTION FOR privileges ON privilege_target FROM grantee_list opt_granted_by opt_drop_behavior
3688 : : ;
3689 : :
3690 : :
3691 : : privileges:
3692 : : privilege_list
3693 : : | ALL
3694 : : | ALL PRIVILEGES
3695 : : | ALL '(' columnList ')'
3696 : : | ALL PRIVILEGES '(' columnList ')'
3697 : : ;
3698 : :
3699 : :
3700 : : privilege_list:
3701 : : privilege
3702 : : | privilege_list ',' privilege
3703 : : ;
3704 : :
3705 : :
3706 : : privilege:
3707 : : SELECT opt_column_list
3708 : : | REFERENCES opt_column_list
3709 : : | CREATE opt_column_list
3710 : : | ALTER SYSTEM_P
3711 : : | ColId opt_column_list
3712 : : ;
3713 : :
3714 : :
3715 : : parameter_name_list:
3716 : : parameter_name
3717 : : | parameter_name_list ',' parameter_name
3718 : : ;
3719 : :
3720 : :
3721 : : parameter_name:
3722 : : ColId
3723 : : | parameter_name '.' ColId
3724 : : ;
3725 : :
3726 : :
3727 : : privilege_target:
3728 : : qualified_name_list
3729 : : | TABLE qualified_name_list
3730 : : | SEQUENCE qualified_name_list
3731 : : | FOREIGN DATA_P WRAPPER name_list
3732 : : | FOREIGN SERVER name_list
3733 : : | FUNCTION function_with_argtypes_list
3734 : : | PROCEDURE function_with_argtypes_list
3735 : : | ROUTINE function_with_argtypes_list
3736 : : | DATABASE name_list
3737 : : | DOMAIN_P any_name_list
3738 : : | LANGUAGE name_list
3739 : : | LARGE_P OBJECT_P NumericOnly_list
3740 : : | PARAMETER parameter_name_list
3741 : : | PROPERTY GRAPH qualified_name_list
3742 : : | SCHEMA name_list
3743 : : | TABLESPACE name_list
3744 : : | TYPE_P any_name_list
3745 : : | ALL TABLES IN_P SCHEMA name_list
3746 : : | ALL SEQUENCES IN_P SCHEMA name_list
3747 : : | ALL FUNCTIONS IN_P SCHEMA name_list
3748 : : | ALL PROCEDURES IN_P SCHEMA name_list
3749 : : | ALL ROUTINES IN_P SCHEMA name_list
3750 : : ;
3751 : :
3752 : :
3753 : : grantee_list:
3754 : : grantee
3755 : : | grantee_list ',' grantee
3756 : : ;
3757 : :
3758 : :
3759 : : grantee:
3760 : : RoleSpec
3761 : : | GROUP_P RoleSpec
3762 : : ;
3763 : :
3764 : :
3765 : : opt_grant_grant_option:
3766 : : WITH GRANT OPTION
3767 : : |
3768 : : ;
3769 : :
3770 : :
3771 : : GrantRoleStmt:
3772 : : GRANT privilege_list TO role_list opt_granted_by
3773 : : | GRANT privilege_list TO role_list WITH grant_role_opt_list opt_granted_by
3774 : : ;
3775 : :
3776 : :
3777 : : RevokeRoleStmt:
3778 : : REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
3779 : : | REVOKE ColId OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
3780 : : ;
3781 : :
3782 : :
3783 : : grant_role_opt_list:
3784 : : grant_role_opt_list ',' grant_role_opt
3785 : : | grant_role_opt
3786 : : ;
3787 : :
3788 : :
3789 : : grant_role_opt:
3790 : : ColLabel grant_role_opt_value
3791 : : ;
3792 : :
3793 : :
3794 : : grant_role_opt_value:
3795 : : OPTION
3796 : : | TRUE_P
3797 : : | FALSE_P
3798 : : ;
3799 : :
3800 : :
3801 : : opt_granted_by:
3802 : : GRANTED BY RoleSpec
3803 : : |
3804 : : ;
3805 : :
3806 : :
3807 : : AlterDefaultPrivilegesStmt:
3808 : : ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
3809 : : ;
3810 : :
3811 : :
3812 : : DefACLOptionList:
3813 : : DefACLOptionList DefACLOption
3814 : : |
3815 : : ;
3816 : :
3817 : :
3818 : : DefACLOption:
3819 : : IN_P SCHEMA name_list
3820 : : | FOR ROLE role_list
3821 : : | FOR USER role_list
3822 : : ;
3823 : :
3824 : :
3825 : : DefACLAction:
3826 : : GRANT privileges ON defacl_privilege_target TO grantee_list opt_grant_grant_option
3827 : : | REVOKE privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior
3828 : : | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target FROM grantee_list opt_drop_behavior
3829 : : ;
3830 : :
3831 : :
3832 : : defacl_privilege_target:
3833 : : TABLES
3834 : : | FUNCTIONS
3835 : : | ROUTINES
3836 : : | SEQUENCES
3837 : : | TYPES_P
3838 : : | SCHEMAS
3839 : : | LARGE_P OBJECTS_P
3840 : : ;
3841 : :
3842 : :
3843 : : IndexStmt:
3844 : : CREATE opt_unique INDEX opt_concurrently opt_single_name ON relation_expr access_method_clause '(' index_params ')' opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
3845 : : | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name ON relation_expr access_method_clause '(' index_params ')' opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
3846 : : ;
3847 : :
3848 : :
3849 : : opt_unique:
3850 : : UNIQUE
3851 : : |
3852 : : ;
3853 : :
3854 : :
3855 : : access_method_clause:
3856 : : USING name
3857 : : |
3858 : : ;
3859 : :
3860 : :
3861 : : index_params:
3862 : : index_elem
3863 : : | index_params ',' index_elem
3864 : : ;
3865 : :
3866 : :
3867 : : index_elem_options:
3868 : : opt_collate opt_qualified_name opt_asc_desc opt_nulls_order
3869 : : | opt_collate any_name reloptions opt_asc_desc opt_nulls_order
3870 : : ;
3871 : :
3872 : :
3873 : : index_elem:
3874 : : ColId index_elem_options
3875 : : | func_expr_windowless index_elem_options
3876 : : | '(' a_expr ')' index_elem_options
3877 : : ;
3878 : :
3879 : :
3880 : : opt_include:
3881 : : INCLUDE '(' index_including_params ')'
3882 : : |
3883 : : ;
3884 : :
3885 : :
3886 : : index_including_params:
3887 : : index_elem
3888 : : | index_including_params ',' index_elem
3889 : : ;
3890 : :
3891 : :
3892 : : opt_collate:
3893 : : COLLATE any_name
3894 : : |
3895 : : ;
3896 : :
3897 : :
3898 : : opt_asc_desc:
3899 : : ASC
3900 : : | DESC
3901 : : |
3902 : : ;
3903 : :
3904 : :
3905 : : opt_nulls_order:
3906 : : NULLS_LA FIRST_P
3907 : : | NULLS_LA LAST_P
3908 : : |
3909 : : ;
3910 : :
3911 : :
3912 : : CreateFunctionStmt:
3913 : : CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS func_return opt_createfunc_opt_list opt_routine_body
3914 : : | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body
3915 : : | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body
3916 : : | CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults opt_createfunc_opt_list opt_routine_body
3917 : : ;
3918 : :
3919 : :
3920 : : opt_or_replace:
3921 : : OR REPLACE
3922 : : |
3923 : : ;
3924 : :
3925 : :
3926 : : func_args:
3927 : : '(' func_args_list ')'
3928 : : | '(' ')'
3929 : : ;
3930 : :
3931 : :
3932 : : func_args_list:
3933 : : func_arg
3934 : : | func_args_list ',' func_arg
3935 : : ;
3936 : :
3937 : :
3938 : : function_with_argtypes_list:
3939 : : function_with_argtypes
3940 : : | function_with_argtypes_list ',' function_with_argtypes
3941 : : ;
3942 : :
3943 : :
3944 : : function_with_argtypes:
3945 : : func_name func_args
3946 : : | type_func_name_keyword
3947 : : | ColId
3948 : : | ColId indirection
3949 : : ;
3950 : :
3951 : :
3952 : : func_args_with_defaults:
3953 : : '(' func_args_with_defaults_list ')'
3954 : : | '(' ')'
3955 : : ;
3956 : :
3957 : :
3958 : : func_args_with_defaults_list:
3959 : : func_arg_with_default
3960 : : | func_args_with_defaults_list ',' func_arg_with_default
3961 : : ;
3962 : :
3963 : :
3964 : : func_arg:
3965 : : arg_class param_name func_type
3966 : : | param_name arg_class func_type
3967 : : | param_name func_type
3968 : : | arg_class func_type
3969 : : | func_type
3970 : : ;
3971 : :
3972 : :
3973 : : arg_class:
3974 : : IN_P
3975 : : | OUT_P
3976 : : | INOUT
3977 : : | IN_P OUT_P
3978 : : | VARIADIC
3979 : : ;
3980 : :
3981 : :
3982 : : param_name:
3983 : : type_function_name
3984 : : ;
3985 : :
3986 : :
3987 : : func_return:
3988 : : func_type
3989 : : ;
3990 : :
3991 : :
3992 : : func_type:
3993 : : Typename
3994 : : | type_function_name attrs '%' TYPE_P
3995 : : | SETOF type_function_name attrs '%' TYPE_P
3996 : : ;
3997 : :
3998 : :
3999 : : func_arg_with_default:
4000 : : func_arg
4001 : : | func_arg DEFAULT a_expr
4002 : : | func_arg '=' a_expr
4003 : : ;
4004 : :
4005 : :
4006 : : aggr_arg:
4007 : : func_arg
4008 : : ;
4009 : :
4010 : :
4011 : : aggr_args:
4012 : : '(' '*' ')'
4013 : : | '(' aggr_args_list ')'
4014 : : | '(' ORDER BY aggr_args_list ')'
4015 : : | '(' aggr_args_list ORDER BY aggr_args_list ')'
4016 : : ;
4017 : :
4018 : :
4019 : : aggr_args_list:
4020 : : aggr_arg
4021 : : | aggr_args_list ',' aggr_arg
4022 : : ;
4023 : :
4024 : :
4025 : : aggregate_with_argtypes:
4026 : : func_name aggr_args
4027 : : ;
4028 : :
4029 : :
4030 : : aggregate_with_argtypes_list:
4031 : : aggregate_with_argtypes
4032 : : | aggregate_with_argtypes_list ',' aggregate_with_argtypes
4033 : : ;
4034 : :
4035 : :
4036 : : opt_createfunc_opt_list:
4037 : : createfunc_opt_list
4038 : : |
4039 : : ;
4040 : :
4041 : :
4042 : : createfunc_opt_list:
4043 : : createfunc_opt_item
4044 : : | createfunc_opt_list createfunc_opt_item
4045 : : ;
4046 : :
4047 : :
4048 : : common_func_opt_item:
4049 : : CALLED ON NULL_P INPUT_P
4050 : : | RETURNS NULL_P ON NULL_P INPUT_P
4051 : : | STRICT_P
4052 : : | IMMUTABLE
4053 : : | STABLE
4054 : : | VOLATILE
4055 : : | EXTERNAL SECURITY DEFINER
4056 : : | EXTERNAL SECURITY INVOKER
4057 : : | SECURITY DEFINER
4058 : : | SECURITY INVOKER
4059 : : | LEAKPROOF
4060 : : | NOT LEAKPROOF
4061 : : | COST NumericOnly
4062 : : | ROWS NumericOnly
4063 : : | SUPPORT any_name
4064 : : | FunctionSetResetClause
4065 : : | PARALLEL ColId
4066 : : ;
4067 : :
4068 : :
4069 : : createfunc_opt_item:
4070 : : AS func_as
4071 : : | LANGUAGE NonReservedWord_or_Sconst
4072 : : | TRANSFORM transform_type_list
4073 : : | WINDOW
4074 : : | common_func_opt_item
4075 : : ;
4076 : :
4077 : :
4078 : : func_as:
4079 : : ecpg_sconst
4080 : : | ecpg_sconst ',' ecpg_sconst
4081 : : ;
4082 : :
4083 : :
4084 : : ReturnStmt:
4085 : : RETURN a_expr
4086 : : ;
4087 : :
4088 : :
4089 : : opt_routine_body:
4090 : : ReturnStmt
4091 : : | BEGIN_P ATOMIC routine_body_stmt_list END_P
4092 : : |
4093 : : ;
4094 : :
4095 : :
4096 : : routine_body_stmt_list:
4097 : : routine_body_stmt_list routine_body_stmt ';'
4098 : : |
4099 : : ;
4100 : :
4101 : :
4102 : : routine_body_stmt:
4103 : : stmt
4104 : : | ReturnStmt
4105 : : ;
4106 : :
4107 : :
4108 : : transform_type_list:
4109 : : FOR TYPE_P Typename
4110 : : | transform_type_list ',' FOR TYPE_P Typename
4111 : : ;
4112 : :
4113 : :
4114 : : opt_definition:
4115 : : WITH definition
4116 : : |
4117 : : ;
4118 : :
4119 : :
4120 : : table_func_column:
4121 : : param_name func_type
4122 : : ;
4123 : :
4124 : :
4125 : : table_func_column_list:
4126 : : table_func_column
4127 : : | table_func_column_list ',' table_func_column
4128 : : ;
4129 : :
4130 : :
4131 : : AlterFunctionStmt:
4132 : : ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
4133 : : | ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict
4134 : : | ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict
4135 : : ;
4136 : :
4137 : :
4138 : : alterfunc_opt_list:
4139 : : common_func_opt_item
4140 : : | alterfunc_opt_list common_func_opt_item
4141 : : ;
4142 : :
4143 : :
4144 : : opt_restrict:
4145 : : RESTRICT
4146 : : |
4147 : : ;
4148 : :
4149 : :
4150 : : RemoveFuncStmt:
4151 : : DROP FUNCTION function_with_argtypes_list opt_drop_behavior
4152 : : | DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
4153 : : | DROP PROCEDURE function_with_argtypes_list opt_drop_behavior
4154 : : | DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
4155 : : | DROP ROUTINE function_with_argtypes_list opt_drop_behavior
4156 : : | DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
4157 : : ;
4158 : :
4159 : :
4160 : : RemoveAggrStmt:
4161 : : DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
4162 : : | DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
4163 : : ;
4164 : :
4165 : :
4166 : : RemoveOperStmt:
4167 : : DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
4168 : : | DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
4169 : : ;
4170 : :
4171 : :
4172 : : oper_argtypes:
4173 : : '(' Typename ')'
4174 : : | '(' Typename ',' Typename ')'
4175 : : | '(' NONE ',' Typename ')'
4176 : : | '(' Typename ',' NONE ')'
4177 : : ;
4178 : :
4179 : :
4180 : : any_operator:
4181 : : all_Op
4182 : : | ColId '.' any_operator
4183 : : ;
4184 : :
4185 : :
4186 : : operator_with_argtypes_list:
4187 : : operator_with_argtypes
4188 : : | operator_with_argtypes_list ',' operator_with_argtypes
4189 : : ;
4190 : :
4191 : :
4192 : : operator_with_argtypes:
4193 : : any_operator oper_argtypes
4194 : : ;
4195 : :
4196 : :
4197 : : DoStmt:
4198 : : DO dostmt_opt_list
4199 : : ;
4200 : :
4201 : :
4202 : : dostmt_opt_list:
4203 : : dostmt_opt_item
4204 : : | dostmt_opt_list dostmt_opt_item
4205 : : ;
4206 : :
4207 : :
4208 : : dostmt_opt_item:
4209 : : ecpg_sconst
4210 : : | LANGUAGE NonReservedWord_or_Sconst
4211 : : ;
4212 : :
4213 : :
4214 : : CreateCastStmt:
4215 : : CREATE CAST '(' Typename AS Typename ')' WITH FUNCTION function_with_argtypes cast_context
4216 : : | CREATE CAST '(' Typename AS Typename ')' WITHOUT FUNCTION cast_context
4217 : : | CREATE CAST '(' Typename AS Typename ')' WITH INOUT cast_context
4218 : : ;
4219 : :
4220 : :
4221 : : cast_context:
4222 : : AS IMPLICIT_P
4223 : : | AS ASSIGNMENT
4224 : : |
4225 : : ;
4226 : :
4227 : :
4228 : : DropCastStmt:
4229 : : DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
4230 : : ;
4231 : :
4232 : :
4233 : : opt_if_exists:
4234 : : IF_P EXISTS
4235 : : |
4236 : : ;
4237 : :
4238 : :
4239 : : CreatePropGraphStmt:
4240 : : CREATE OptTemp PROPERTY GRAPH qualified_name opt_vertex_tables_clause opt_edge_tables_clause
4241 : : ;
4242 : :
4243 : :
4244 : : opt_vertex_tables_clause:
4245 : : vertex_tables_clause
4246 : : |
4247 : : ;
4248 : :
4249 : :
4250 : : vertex_tables_clause:
4251 : : vertex_synonym TABLES '(' vertex_table_list ')'
4252 : : ;
4253 : :
4254 : :
4255 : : vertex_synonym:
4256 : : NODE
4257 : : | VERTEX
4258 : : ;
4259 : :
4260 : :
4261 : : vertex_table_list:
4262 : : vertex_table_definition
4263 : : | vertex_table_list ',' vertex_table_definition
4264 : : ;
4265 : :
4266 : :
4267 : : vertex_table_definition:
4268 : : qualified_name opt_propgraph_table_alias opt_graph_table_key_clause opt_element_table_label_and_properties
4269 : : ;
4270 : :
4271 : :
4272 : : opt_propgraph_table_alias:
4273 : : AS name
4274 : : |
4275 : : ;
4276 : :
4277 : :
4278 : : opt_graph_table_key_clause:
4279 : : KEY '(' columnList ')'
4280 : : |
4281 : : ;
4282 : :
4283 : :
4284 : : opt_edge_tables_clause:
4285 : : edge_tables_clause
4286 : : |
4287 : : ;
4288 : :
4289 : :
4290 : : edge_tables_clause:
4291 : : edge_synonym TABLES '(' edge_table_list ')'
4292 : : ;
4293 : :
4294 : :
4295 : : edge_synonym:
4296 : : EDGE
4297 : : | RELATIONSHIP
4298 : : ;
4299 : :
4300 : :
4301 : : edge_table_list:
4302 : : edge_table_definition
4303 : : | edge_table_list ',' edge_table_definition
4304 : : ;
4305 : :
4306 : :
4307 : : edge_table_definition:
4308 : : qualified_name opt_propgraph_table_alias opt_graph_table_key_clause source_vertex_table destination_vertex_table opt_element_table_label_and_properties
4309 : : ;
4310 : :
4311 : :
4312 : : source_vertex_table:
4313 : : SOURCE name
4314 : : | SOURCE KEY '(' columnList ')' REFERENCES name '(' columnList ')'
4315 : : ;
4316 : :
4317 : :
4318 : : destination_vertex_table:
4319 : : DESTINATION name
4320 : : | DESTINATION KEY '(' columnList ')' REFERENCES name '(' columnList ')'
4321 : : ;
4322 : :
4323 : :
4324 : : opt_element_table_label_and_properties:
4325 : : element_table_properties
4326 : : | label_and_properties_list
4327 : : |
4328 : : ;
4329 : :
4330 : :
4331 : : element_table_properties:
4332 : : NO PROPERTIES
4333 : : | PROPERTIES ALL COLUMNS
4334 : : | PROPERTIES '(' labeled_expr_list ')'
4335 : : ;
4336 : :
4337 : :
4338 : : label_and_properties_list:
4339 : : label_and_properties
4340 : : | label_and_properties_list label_and_properties
4341 : : ;
4342 : :
4343 : :
4344 : : label_and_properties:
4345 : : element_table_label_clause
4346 : : | element_table_label_clause element_table_properties
4347 : : ;
4348 : :
4349 : :
4350 : : element_table_label_clause:
4351 : : LABEL name
4352 : : | DEFAULT LABEL
4353 : : ;
4354 : :
4355 : :
4356 : : AlterPropGraphStmt:
4357 : : ALTER PROPERTY GRAPH qualified_name ADD_P vertex_tables_clause
4358 : : | ALTER PROPERTY GRAPH qualified_name ADD_P vertex_tables_clause ADD_P edge_tables_clause
4359 : : | ALTER PROPERTY GRAPH qualified_name ADD_P edge_tables_clause
4360 : : | ALTER PROPERTY GRAPH qualified_name DROP vertex_synonym TABLES '(' name_list ')' opt_drop_behavior
4361 : : | ALTER PROPERTY GRAPH qualified_name DROP edge_synonym TABLES '(' name_list ')' opt_drop_behavior
4362 : : | ALTER PROPERTY GRAPH qualified_name ALTER vertex_or_edge TABLE name add_label_list
4363 : : | ALTER PROPERTY GRAPH qualified_name ALTER vertex_or_edge TABLE name DROP LABEL name opt_drop_behavior
4364 : : | ALTER PROPERTY GRAPH qualified_name ALTER vertex_or_edge TABLE name ALTER LABEL name ADD_P PROPERTIES '(' labeled_expr_list ')'
4365 : : | ALTER PROPERTY GRAPH qualified_name ALTER vertex_or_edge TABLE name ALTER LABEL name DROP PROPERTIES '(' name_list ')' opt_drop_behavior
4366 : : ;
4367 : :
4368 : :
4369 : : vertex_or_edge:
4370 : : vertex_synonym
4371 : : | edge_synonym
4372 : : ;
4373 : :
4374 : :
4375 : : add_label_list:
4376 : : add_label
4377 : : | add_label_list add_label
4378 : : ;
4379 : :
4380 : :
4381 : : add_label:
4382 : : ADD_P LABEL name element_table_properties
4383 : : ;
4384 : :
4385 : :
4386 : : CreateTransformStmt:
4387 : : CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name '(' transform_element_list ')'
4388 : : ;
4389 : :
4390 : :
4391 : : transform_element_list:
4392 : : FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO SQL_P WITH FUNCTION function_with_argtypes
4393 : : | TO SQL_P WITH FUNCTION function_with_argtypes ',' FROM SQL_P WITH FUNCTION function_with_argtypes
4394 : : | FROM SQL_P WITH FUNCTION function_with_argtypes
4395 : : | TO SQL_P WITH FUNCTION function_with_argtypes
4396 : : ;
4397 : :
4398 : :
4399 : : DropTransformStmt:
4400 : : DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_drop_behavior
4401 : : ;
4402 : :
4403 : :
4404 : : ReindexStmt:
4405 : : REINDEX opt_utility_option_list reindex_target_relation opt_concurrently qualified_name
4406 : : | REINDEX opt_utility_option_list SCHEMA opt_concurrently name
4407 : : | REINDEX opt_utility_option_list reindex_target_all opt_concurrently opt_single_name
4408 : : ;
4409 : :
4410 : :
4411 : : reindex_target_relation:
4412 : : INDEX
4413 : : | TABLE
4414 : : ;
4415 : :
4416 : :
4417 : : reindex_target_all:
4418 : : SYSTEM_P
4419 : : | DATABASE
4420 : : ;
4421 : :
4422 : :
4423 : : AlterTblSpcStmt:
4424 : : ALTER TABLESPACE name SET reloptions
4425 : : | ALTER TABLESPACE name RESET reloptions
4426 : : ;
4427 : :
4428 : :
4429 : : RenameStmt:
4430 : : ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
4431 : : | ALTER COLLATION any_name RENAME TO name
4432 : : | ALTER CONVERSION_P any_name RENAME TO name
4433 : : | ALTER DATABASE name RENAME TO name
4434 : : | ALTER DOMAIN_P any_name RENAME TO name
4435 : : | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
4436 : : | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
4437 : : | ALTER FUNCTION function_with_argtypes RENAME TO name
4438 : : | ALTER GROUP_P RoleId RENAME TO RoleId
4439 : : | ALTER opt_procedural LANGUAGE name RENAME TO name
4440 : : | ALTER OPERATOR CLASS any_name USING name RENAME TO name
4441 : : | ALTER OPERATOR FAMILY any_name USING name RENAME TO name
4442 : : | ALTER POLICY name ON qualified_name RENAME TO name
4443 : : | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name
4444 : : | ALTER PROCEDURE function_with_argtypes RENAME TO name
4445 : : | ALTER PROPERTY GRAPH qualified_name RENAME TO name
4446 : : | ALTER PUBLICATION name RENAME TO name
4447 : : | ALTER ROUTINE function_with_argtypes RENAME TO name
4448 : : | ALTER SCHEMA name RENAME TO name
4449 : : | ALTER SERVER name RENAME TO name
4450 : : | ALTER SUBSCRIPTION name RENAME TO name
4451 : : | ALTER TABLE relation_expr RENAME TO name
4452 : : | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
4453 : : | ALTER SEQUENCE qualified_name RENAME TO name
4454 : : | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
4455 : : | ALTER VIEW qualified_name RENAME TO name
4456 : : | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
4457 : : | ALTER MATERIALIZED VIEW qualified_name RENAME TO name
4458 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
4459 : : | ALTER INDEX qualified_name RENAME TO name
4460 : : | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
4461 : : | ALTER FOREIGN TABLE relation_expr RENAME TO name
4462 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
4463 : : | ALTER TABLE relation_expr RENAME opt_column name TO name
4464 : : | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
4465 : : | ALTER VIEW qualified_name RENAME opt_column name TO name
4466 : : | ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
4467 : : | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
4468 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
4469 : : | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
4470 : : | ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
4471 : : | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
4472 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
4473 : : | ALTER RULE name ON qualified_name RENAME TO name
4474 : : | ALTER TRIGGER name ON qualified_name RENAME TO name
4475 : : | ALTER EVENT TRIGGER name RENAME TO name
4476 : : | ALTER ROLE RoleId RENAME TO RoleId
4477 : : | ALTER USER RoleId RENAME TO RoleId
4478 : : | ALTER TABLESPACE name RENAME TO name
4479 : : | ALTER STATISTICS any_name RENAME TO name
4480 : : | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
4481 : : | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
4482 : : | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
4483 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
4484 : : | ALTER TYPE_P any_name RENAME TO name
4485 : : | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
4486 : : ;
4487 : :
4488 : :
4489 : : opt_column:
4490 : : COLUMN
4491 : : |
4492 : : ;
4493 : :
4494 : :
4495 : : opt_set_data:
4496 : : SET DATA_P
4497 : : |
4498 : : ;
4499 : :
4500 : :
4501 : : AlterObjectDependsStmt:
4502 : : ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name
4503 : : | ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name
4504 : : | ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name
4505 : : | ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name
4506 : : | ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name
4507 : : | ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name
4508 : : ;
4509 : :
4510 : :
4511 : : opt_no:
4512 : : NO
4513 : : |
4514 : : ;
4515 : :
4516 : :
4517 : : AlterObjectSchemaStmt:
4518 : : ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name
4519 : : | ALTER COLLATION any_name SET SCHEMA name
4520 : : | ALTER CONVERSION_P any_name SET SCHEMA name
4521 : : | ALTER DOMAIN_P any_name SET SCHEMA name
4522 : : | ALTER EXTENSION name SET SCHEMA name
4523 : : | ALTER FUNCTION function_with_argtypes SET SCHEMA name
4524 : : | ALTER OPERATOR operator_with_argtypes SET SCHEMA name
4525 : : | ALTER OPERATOR CLASS any_name USING name SET SCHEMA name
4526 : : | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name
4527 : : | ALTER PROCEDURE function_with_argtypes SET SCHEMA name
4528 : : | ALTER PROPERTY GRAPH qualified_name SET SCHEMA name
4529 : : | ALTER PROPERTY GRAPH IF_P EXISTS qualified_name SET SCHEMA name
4530 : : | ALTER ROUTINE function_with_argtypes SET SCHEMA name
4531 : : | ALTER TABLE relation_expr SET SCHEMA name
4532 : : | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
4533 : : | ALTER STATISTICS any_name SET SCHEMA name
4534 : : | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
4535 : : | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
4536 : : | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
4537 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
4538 : : | ALTER SEQUENCE qualified_name SET SCHEMA name
4539 : : | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
4540 : : | ALTER VIEW qualified_name SET SCHEMA name
4541 : : | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
4542 : : | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
4543 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
4544 : : | ALTER FOREIGN TABLE relation_expr SET SCHEMA name
4545 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
4546 : : | ALTER TYPE_P any_name SET SCHEMA name
4547 : : ;
4548 : :
4549 : :
4550 : : AlterOperatorStmt:
4551 : : ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')'
4552 : : ;
4553 : :
4554 : :
4555 : : operator_def_list:
4556 : : operator_def_elem
4557 : : | operator_def_list ',' operator_def_elem
4558 : : ;
4559 : :
4560 : :
4561 : : operator_def_elem:
4562 : : ColLabel '=' NONE
4563 : : | ColLabel '=' operator_def_arg
4564 : : | ColLabel
4565 : : ;
4566 : :
4567 : :
4568 : : operator_def_arg:
4569 : : func_type
4570 : : | reserved_keyword
4571 : : | qual_all_Op
4572 : : | NumericOnly
4573 : : | ecpg_sconst
4574 : : ;
4575 : :
4576 : :
4577 : : AlterTypeStmt:
4578 : : ALTER TYPE_P any_name SET '(' operator_def_list ')'
4579 : : ;
4580 : :
4581 : :
4582 : : AlterOwnerStmt:
4583 : : ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
4584 : : | ALTER COLLATION any_name OWNER TO RoleSpec
4585 : : | ALTER CONVERSION_P any_name OWNER TO RoleSpec
4586 : : | ALTER DATABASE name OWNER TO RoleSpec
4587 : : | ALTER DOMAIN_P any_name OWNER TO RoleSpec
4588 : : | ALTER FUNCTION function_with_argtypes OWNER TO RoleSpec
4589 : : | ALTER opt_procedural LANGUAGE name OWNER TO RoleSpec
4590 : : | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleSpec
4591 : : | ALTER OPERATOR operator_with_argtypes OWNER TO RoleSpec
4592 : : | ALTER OPERATOR CLASS any_name USING name OWNER TO RoleSpec
4593 : : | ALTER OPERATOR FAMILY any_name USING name OWNER TO RoleSpec
4594 : : | ALTER PROCEDURE function_with_argtypes OWNER TO RoleSpec
4595 : : | ALTER PROPERTY GRAPH qualified_name OWNER TO RoleSpec
4596 : : | ALTER ROUTINE function_with_argtypes OWNER TO RoleSpec
4597 : : | ALTER SCHEMA name OWNER TO RoleSpec
4598 : : | ALTER TYPE_P any_name OWNER TO RoleSpec
4599 : : | ALTER TABLESPACE name OWNER TO RoleSpec
4600 : : | ALTER STATISTICS any_name OWNER TO RoleSpec
4601 : : | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec
4602 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleSpec
4603 : : | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleSpec
4604 : : | ALTER SERVER name OWNER TO RoleSpec
4605 : : | ALTER EVENT TRIGGER name OWNER TO RoleSpec
4606 : : | ALTER PUBLICATION name OWNER TO RoleSpec
4607 : : | ALTER SUBSCRIPTION name OWNER TO RoleSpec
4608 : : ;
4609 : :
4610 : :
4611 : : CreatePublicationStmt:
4612 : : CREATE PUBLICATION name opt_definition
4613 : : | CREATE PUBLICATION name FOR pub_all_obj_type_list opt_definition
4614 : : | CREATE PUBLICATION name FOR pub_obj_list opt_definition
4615 : : ;
4616 : :
4617 : :
4618 : : PublicationObjSpec:
4619 : : TABLE relation_expr opt_column_list OptWhereClause
4620 : : | TABLES IN_P SCHEMA ColId
4621 : : | TABLES IN_P SCHEMA CURRENT_SCHEMA
4622 : : | ColId opt_column_list OptWhereClause
4623 : : | ColId indirection opt_column_list OptWhereClause
4624 : : | extended_relation_expr opt_column_list OptWhereClause
4625 : : | CURRENT_SCHEMA
4626 : : ;
4627 : :
4628 : :
4629 : : pub_obj_list:
4630 : : PublicationObjSpec
4631 : : | pub_obj_list ',' PublicationObjSpec
4632 : : ;
4633 : :
4634 : :
4635 : : opt_pub_except_clause:
4636 : : EXCEPT '(' TABLE pub_except_obj_list ')'
4637 : : |
4638 : : ;
4639 : :
4640 : :
4641 : : PublicationAllObjSpec:
4642 : : ALL TABLES opt_pub_except_clause
4643 : : | ALL SEQUENCES
4644 : : ;
4645 : :
4646 : :
4647 : : pub_all_obj_type_list:
4648 : : PublicationAllObjSpec
4649 : : | pub_all_obj_type_list ',' PublicationAllObjSpec
4650 : : ;
4651 : :
4652 : :
4653 : : PublicationExceptObjSpec:
4654 : : relation_expr
4655 : : ;
4656 : :
4657 : :
4658 : : pub_except_obj_list:
4659 : : PublicationExceptObjSpec
4660 : : | pub_except_obj_list ',' opt_table PublicationExceptObjSpec
4661 : : ;
4662 : :
4663 : :
4664 : : AlterPublicationStmt:
4665 : : ALTER PUBLICATION name SET definition
4666 : : | ALTER PUBLICATION name ADD_P pub_obj_list
4667 : : | ALTER PUBLICATION name SET pub_obj_list
4668 : : | ALTER PUBLICATION name SET pub_all_obj_type_list
4669 : : | ALTER PUBLICATION name DROP pub_obj_list
4670 : : ;
4671 : :
4672 : :
4673 : : CreateSubscriptionStmt:
4674 : : CREATE SUBSCRIPTION name CONNECTION ecpg_sconst PUBLICATION name_list opt_definition
4675 : : | CREATE SUBSCRIPTION name SERVER name PUBLICATION name_list opt_definition
4676 : : ;
4677 : :
4678 : :
4679 : : AlterSubscriptionStmt:
4680 : : ALTER SUBSCRIPTION name SET definition
4681 : : | ALTER SUBSCRIPTION name CONNECTION ecpg_sconst
4682 : : | ALTER SUBSCRIPTION name SERVER name
4683 : : | ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition
4684 : : | ALTER SUBSCRIPTION name REFRESH SEQUENCES
4685 : : | ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition
4686 : : | ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition
4687 : : | ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition
4688 : : | ALTER SUBSCRIPTION name ENABLE_P
4689 : : | ALTER SUBSCRIPTION name DISABLE_P
4690 : : | ALTER SUBSCRIPTION name SKIP definition
4691 : : ;
4692 : :
4693 : :
4694 : : DropSubscriptionStmt:
4695 : : DROP SUBSCRIPTION name opt_drop_behavior
4696 : : | DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior
4697 : : ;
4698 : :
4699 : :
4700 : : RuleStmt:
4701 : : CREATE opt_or_replace RULE name AS ON event TO qualified_name where_clause DO opt_instead RuleActionList
4702 : : ;
4703 : :
4704 : :
4705 : : RuleActionList:
4706 : : NOTHING
4707 : : | RuleActionStmt
4708 : : | '(' RuleActionMulti ')'
4709 : : ;
4710 : :
4711 : :
4712 : : RuleActionMulti:
4713 : : RuleActionMulti ';' RuleActionStmtOrEmpty
4714 : : | RuleActionStmtOrEmpty
4715 : : ;
4716 : :
4717 : :
4718 : : RuleActionStmt:
4719 : : SelectStmt
4720 : : | InsertStmt
4721 : : | UpdateStmt
4722 : : | DeleteStmt
4723 : : | NotifyStmt
4724 : : ;
4725 : :
4726 : :
4727 : : RuleActionStmtOrEmpty:
4728 : : RuleActionStmt
4729 : : |
4730 : : ;
4731 : :
4732 : :
4733 : : event:
4734 : : SELECT
4735 : : | UPDATE
4736 : : | DELETE_P
4737 : : | INSERT
4738 : : ;
4739 : :
4740 : :
4741 : : opt_instead:
4742 : : INSTEAD
4743 : : | ALSO
4744 : : |
4745 : : ;
4746 : :
4747 : :
4748 : : NotifyStmt:
4749 : : NOTIFY ColId notify_payload
4750 : : ;
4751 : :
4752 : :
4753 : : notify_payload:
4754 : : ',' ecpg_sconst
4755 : : |
4756 : : ;
4757 : :
4758 : :
4759 : : ListenStmt:
4760 : : LISTEN ColId
4761 : : ;
4762 : :
4763 : :
4764 : : UnlistenStmt:
4765 : : UNLISTEN ColId
4766 : : | UNLISTEN '*'
4767 : : ;
4768 : :
4769 : :
4770 : : TransactionStmt:
4771 : : ABORT_P opt_transaction opt_transaction_chain
4772 : : | START TRANSACTION transaction_mode_list_or_empty
4773 : : | COMMIT opt_transaction opt_transaction_chain
4774 : : | ROLLBACK opt_transaction opt_transaction_chain
4775 : : | SAVEPOINT ColId
4776 : : | RELEASE SAVEPOINT ColId
4777 : : | RELEASE ColId
4778 : : | ROLLBACK opt_transaction TO SAVEPOINT ColId
4779 : : | ROLLBACK opt_transaction TO ColId
4780 : : | PREPARE TRANSACTION ecpg_sconst
4781 : : | COMMIT PREPARED ecpg_sconst
4782 : : | ROLLBACK PREPARED ecpg_sconst
4783 : : ;
4784 : :
4785 : :
4786 : : TransactionStmtLegacy:
4787 : : BEGIN_P opt_transaction transaction_mode_list_or_empty
4788 : : | END_P opt_transaction opt_transaction_chain
4789 : : ;
4790 : :
4791 : :
4792 : : opt_transaction:
4793 : : WORK
4794 : : | TRANSACTION
4795 : : |
4796 : : ;
4797 : :
4798 : :
4799 : : transaction_mode_item:
4800 : : ISOLATION LEVEL iso_level
4801 : : | READ ONLY
4802 : : | READ WRITE
4803 : : | DEFERRABLE
4804 : : | NOT DEFERRABLE
4805 : : ;
4806 : :
4807 : :
4808 : : transaction_mode_list:
4809 : : transaction_mode_item
4810 : : | transaction_mode_list ',' transaction_mode_item
4811 : : | transaction_mode_list transaction_mode_item
4812 : : ;
4813 : :
4814 : :
4815 : : transaction_mode_list_or_empty:
4816 : : transaction_mode_list
4817 : : |
4818 : : ;
4819 : :
4820 : :
4821 : : opt_transaction_chain:
4822 : : AND CHAIN
4823 : : | AND NO CHAIN
4824 : : |
4825 : : ;
4826 : :
4827 : :
4828 : : ViewStmt:
4829 : : CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions AS SelectStmt opt_check_option
4830 : : | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions AS SelectStmt opt_check_option
4831 : : | CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions AS SelectStmt opt_check_option
4832 : : | CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions AS SelectStmt opt_check_option
4833 : : ;
4834 : :
4835 : :
4836 : : opt_check_option:
4837 : : WITH CHECK OPTION
4838 : : | WITH CASCADED CHECK OPTION
4839 : : | WITH LOCAL CHECK OPTION
4840 : : |
4841 : : ;
4842 : :
4843 : :
4844 : : LoadStmt:
4845 : : LOAD file_name
4846 : : ;
4847 : :
4848 : :
4849 : : CreatedbStmt:
4850 : : CREATE DATABASE name opt_with createdb_opt_list
4851 : : ;
4852 : :
4853 : :
4854 : : createdb_opt_list:
4855 : : createdb_opt_items
4856 : : |
4857 : : ;
4858 : :
4859 : :
4860 : : createdb_opt_items:
4861 : : createdb_opt_item
4862 : : | createdb_opt_items createdb_opt_item
4863 : : ;
4864 : :
4865 : :
4866 : : createdb_opt_item:
4867 : : createdb_opt_name opt_equal NumericOnly
4868 : : | createdb_opt_name opt_equal opt_boolean_or_string
4869 : : | createdb_opt_name opt_equal DEFAULT
4870 : : ;
4871 : :
4872 : :
4873 : : createdb_opt_name:
4874 : : ecpg_ident
4875 : : | CONNECTION LIMIT
4876 : : | ENCODING
4877 : : | LOCATION
4878 : : | OWNER
4879 : : | TABLESPACE
4880 : : | TEMPLATE
4881 : : ;
4882 : :
4883 : :
4884 : : opt_equal:
4885 : : '='
4886 : : |
4887 : : ;
4888 : :
4889 : :
4890 : : AlterDatabaseStmt:
4891 : : ALTER DATABASE name WITH createdb_opt_list
4892 : : | ALTER DATABASE name createdb_opt_list
4893 : : | ALTER DATABASE name SET TABLESPACE name
4894 : : | ALTER DATABASE name REFRESH COLLATION VERSION_P
4895 : : ;
4896 : :
4897 : :
4898 : : AlterDatabaseSetStmt:
4899 : : ALTER DATABASE name SetResetClause
4900 : : ;
4901 : :
4902 : :
4903 : : DropdbStmt:
4904 : : DROP DATABASE name
4905 : : | DROP DATABASE IF_P EXISTS name
4906 : : | DROP DATABASE name opt_with '(' drop_option_list ')'
4907 : : | DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')'
4908 : : ;
4909 : :
4910 : :
4911 : : drop_option_list:
4912 : : drop_option
4913 : : | drop_option_list ',' drop_option
4914 : : ;
4915 : :
4916 : :
4917 : : drop_option:
4918 : : FORCE
4919 : : ;
4920 : :
4921 : :
4922 : : AlterCollationStmt:
4923 : : ALTER COLLATION any_name REFRESH VERSION_P
4924 : : ;
4925 : :
4926 : :
4927 : : AlterSystemStmt:
4928 : : ALTER SYSTEM_P SET generic_set
4929 : : | ALTER SYSTEM_P RESET generic_reset
4930 : : ;
4931 : :
4932 : :
4933 : : CreateDomainStmt:
4934 : : CREATE DOMAIN_P any_name opt_as Typename ColQualList
4935 : : ;
4936 : :
4937 : :
4938 : : AlterDomainStmt:
4939 : : ALTER DOMAIN_P any_name alter_column_default
4940 : : | ALTER DOMAIN_P any_name DROP NOT NULL_P
4941 : : | ALTER DOMAIN_P any_name SET NOT NULL_P
4942 : : | ALTER DOMAIN_P any_name ADD_P DomainConstraint
4943 : : | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
4944 : : | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
4945 : : | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
4946 : : ;
4947 : :
4948 : :
4949 : : opt_as:
4950 : : AS
4951 : : |
4952 : : ;
4953 : :
4954 : :
4955 : : AlterTSDictionaryStmt:
4956 : : ALTER TEXT_P SEARCH DICTIONARY any_name definition
4957 : : ;
4958 : :
4959 : :
4960 : : AlterTSConfigurationStmt:
4961 : : ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list
4962 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list
4963 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name
4964 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name
4965 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
4966 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
4967 : : ;
4968 : :
4969 : :
4970 : : any_with:
4971 : : WITH
4972 : : | WITH_LA
4973 : : ;
4974 : :
4975 : :
4976 : : CreateConversionStmt:
4977 : : CREATE opt_default CONVERSION_P any_name FOR ecpg_sconst TO ecpg_sconst FROM any_name
4978 : : ;
4979 : :
4980 : :
4981 : : RepackStmt:
4982 : : REPACK opt_utility_option_list vacuum_relation USING INDEX name
4983 : : | REPACK opt_utility_option_list vacuum_relation opt_usingindex
4984 : : | REPACK opt_utility_option_list opt_usingindex
4985 : : | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
4986 : : | CLUSTER opt_utility_option_list
4987 : : | CLUSTER opt_verbose qualified_name cluster_index_specification
4988 : : | CLUSTER VERBOSE
4989 : : | CLUSTER opt_verbose name ON qualified_name
4990 : : ;
4991 : :
4992 : :
4993 : : cluster_index_specification:
4994 : : USING name
4995 : : |
4996 : : ;
4997 : :
4998 : :
4999 : : VacuumStmt:
5000 : : VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
5001 : : | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
5002 : : ;
5003 : :
5004 : :
5005 : : AnalyzeStmt:
5006 : : analyze_keyword opt_utility_option_list opt_vacuum_relation_list
5007 : : | analyze_keyword VERBOSE opt_vacuum_relation_list
5008 : : ;
5009 : :
5010 : :
5011 : : analyze_keyword:
5012 : : ANALYZE
5013 : : | ANALYSE
5014 : : ;
5015 : :
5016 : :
5017 : : opt_analyze:
5018 : : analyze_keyword
5019 : : |
5020 : : ;
5021 : :
5022 : :
5023 : : opt_verbose:
5024 : : VERBOSE
5025 : : |
5026 : : ;
5027 : :
5028 : :
5029 : : opt_full:
5030 : : FULL
5031 : : |
5032 : : ;
5033 : :
5034 : :
5035 : : opt_freeze:
5036 : : FREEZE
5037 : : |
5038 : : ;
5039 : :
5040 : :
5041 : : opt_name_list:
5042 : : '(' name_list ')'
5043 : : |
5044 : : ;
5045 : :
5046 : :
5047 : : vacuum_relation:
5048 : : relation_expr opt_name_list
5049 : : ;
5050 : :
5051 : :
5052 : : vacuum_relation_list:
5053 : : vacuum_relation
5054 : : | vacuum_relation_list ',' vacuum_relation
5055 : : ;
5056 : :
5057 : :
5058 : : opt_vacuum_relation_list:
5059 : : vacuum_relation_list
5060 : : |
5061 : : ;
5062 : :
5063 : :
5064 : : ExplainStmt:
5065 : : EXPLAIN ExplainableStmt
5066 : : | EXPLAIN analyze_keyword opt_verbose ExplainableStmt
5067 : : | EXPLAIN VERBOSE ExplainableStmt
5068 : : | EXPLAIN '(' utility_option_list ')' ExplainableStmt
5069 : : ;
5070 : :
5071 : :
5072 : : ExplainableStmt:
5073 : : SelectStmt
5074 : : | InsertStmt
5075 : : | UpdateStmt
5076 : : | DeleteStmt
5077 : : | MergeStmt
5078 : : | DeclareCursorStmt
5079 : : | CreateAsStmt
5080 : : | CreateMatViewStmt
5081 : : | RefreshMatViewStmt
5082 : : | ExecuteStmt
5083 : : {
5084 : 0 : @$ = $1.name;
5085 : : }
5086 : : ;
5087 : :
5088 : :
5089 : : PrepareStmt:
5090 : : PREPARE prepared_name prep_type_clause AS PreparableStmt
5091 : : {
5092 : 6 : $$.name = @2;
5093 : 6 : $$.type = @3;
5094 : 6 : $$.stmt = @5;
5095 : : }
5096 : : | PREPARE prepared_name FROM execstring
5097 : : {
5098 : 50 : $$.name = @2;
5099 : 50 : $$.type = NULL;
5100 : 50 : $$.stmt = @4;
5101 : : }
5102 : : ;
5103 : :
5104 : :
5105 : : prep_type_clause:
5106 : : '(' type_list ')'
5107 : : |
5108 : : ;
5109 : :
5110 : :
5111 : : PreparableStmt:
5112 : : SelectStmt
5113 : : | InsertStmt
5114 : : | UpdateStmt
5115 : : | DeleteStmt
5116 : : | MergeStmt
5117 : : ;
5118 : :
5119 : :
5120 : : ExecuteStmt:
5121 : : EXECUTE prepared_name execute_param_clause execute_rest
5122 : : {
5123 : 35 : $$.name = @2;
5124 : 35 : $$.type = @3;
5125 : : }
5126 : : | CREATE OptTemp TABLE create_as_target AS EXECUTE prepared_name execute_param_clause opt_with_data execute_rest
5127 : : {
5128 : 0 : $$.name = @$;
5129 : : }
5130 : : | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS EXECUTE prepared_name execute_param_clause opt_with_data execute_rest
5131 : : {
5132 : 0 : $$.name = @$;
5133 : : }
5134 : : ;
5135 : :
5136 : :
5137 : : execute_param_clause:
5138 : : '(' expr_list ')'
5139 : : |
5140 : : ;
5141 : :
5142 : :
5143 : : InsertStmt:
5144 : : opt_with_clause INSERT INTO insert_target insert_rest opt_on_conflict returning_clause
5145 : : ;
5146 : :
5147 : :
5148 : : insert_target:
5149 : : qualified_name
5150 : : | qualified_name AS ColId
5151 : : ;
5152 : :
5153 : :
5154 : : insert_rest:
5155 : : SelectStmt
5156 : : | OVERRIDING override_kind VALUE_P SelectStmt
5157 : : | '(' insert_column_list ')' SelectStmt
5158 : : | '(' insert_column_list ')' OVERRIDING override_kind VALUE_P SelectStmt
5159 : : | DEFAULT VALUES
5160 : : ;
5161 : :
5162 : :
5163 : : override_kind:
5164 : : USER
5165 : : | SYSTEM_P
5166 : : ;
5167 : :
5168 : :
5169 : : insert_column_list:
5170 : : insert_column_item
5171 : : | insert_column_list ',' insert_column_item
5172 : : ;
5173 : :
5174 : :
5175 : : insert_column_item:
5176 : : ColId opt_indirection
5177 : : ;
5178 : :
5179 : :
5180 : : opt_on_conflict:
5181 : : ON CONFLICT opt_conf_expr DO SELECT opt_for_locking_strength where_clause
5182 : : | ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
5183 : : | ON CONFLICT opt_conf_expr DO NOTHING
5184 : : |
5185 : : ;
5186 : :
5187 : :
5188 : : opt_conf_expr:
5189 : : '(' index_params ')' where_clause
5190 : : | ON CONSTRAINT name
5191 : : |
5192 : : ;
5193 : :
5194 : :
5195 : : returning_clause:
5196 : : RETURNING returning_with_clause target_list opt_ecpg_into
5197 : : |
5198 : : ;
5199 : :
5200 : :
5201 : : returning_with_clause:
5202 : : WITH '(' returning_options ')'
5203 : : |
5204 : : ;
5205 : :
5206 : :
5207 : : returning_options:
5208 : : returning_option
5209 : : | returning_options ',' returning_option
5210 : : ;
5211 : :
5212 : :
5213 : : returning_option:
5214 : : returning_option_kind AS ColId
5215 : : ;
5216 : :
5217 : :
5218 : : returning_option_kind:
5219 : : OLD
5220 : : | NEW
5221 : : ;
5222 : :
5223 : :
5224 : : DeleteStmt:
5225 : : opt_with_clause DELETE_P FROM relation_expr_opt_alias using_clause where_or_current_clause returning_clause
5226 : : | opt_with_clause DELETE_P FROM relation_expr for_portion_of_clause for_portion_of_opt_alias using_clause where_or_current_clause returning_clause
5227 : : ;
5228 : :
5229 : :
5230 : : using_clause:
5231 : : USING from_list
5232 : : |
5233 : : ;
5234 : :
5235 : :
5236 : : LockStmt:
5237 : : LOCK_P opt_table relation_expr_list opt_lock opt_nowait
5238 : : ;
5239 : :
5240 : :
5241 : : opt_lock:
5242 : : IN_P lock_type MODE
5243 : : |
5244 : : ;
5245 : :
5246 : :
5247 : : lock_type:
5248 : : ACCESS SHARE
5249 : : | ROW SHARE
5250 : : | ROW EXCLUSIVE
5251 : : | SHARE UPDATE EXCLUSIVE
5252 : : | SHARE
5253 : : | SHARE ROW EXCLUSIVE
5254 : : | EXCLUSIVE
5255 : : | ACCESS EXCLUSIVE
5256 : : ;
5257 : :
5258 : :
5259 : : opt_nowait:
5260 : : NOWAIT
5261 : : |
5262 : : ;
5263 : :
5264 : :
5265 : : opt_nowait_or_skip:
5266 : : NOWAIT
5267 : : | SKIP LOCKED
5268 : : |
5269 : : ;
5270 : :
5271 : :
5272 : : UpdateStmt:
5273 : : opt_with_clause UPDATE relation_expr_opt_alias SET set_clause_list from_clause where_or_current_clause returning_clause
5274 : : | opt_with_clause UPDATE relation_expr for_portion_of_clause for_portion_of_opt_alias SET set_clause_list from_clause where_or_current_clause returning_clause
5275 : : ;
5276 : :
5277 : :
5278 : : set_clause_list:
5279 : : set_clause
5280 : : | set_clause_list ',' set_clause
5281 : : ;
5282 : :
5283 : :
5284 : : set_clause:
5285 : : set_target '=' a_expr
5286 : : | '(' set_target_list ')' '=' a_expr
5287 : : ;
5288 : :
5289 : :
5290 : : set_target:
5291 : : ColId opt_indirection
5292 : : ;
5293 : :
5294 : :
5295 : : set_target_list:
5296 : : set_target
5297 : : | set_target_list ',' set_target
5298 : : ;
5299 : :
5300 : :
5301 : : MergeStmt:
5302 : : opt_with_clause MERGE INTO relation_expr_opt_alias USING table_ref ON a_expr merge_when_list returning_clause
5303 : : ;
5304 : :
5305 : :
5306 : : merge_when_list:
5307 : : merge_when_clause
5308 : : | merge_when_list merge_when_clause
5309 : : ;
5310 : :
5311 : :
5312 : : merge_when_clause:
5313 : : merge_when_tgt_matched opt_merge_when_condition THEN merge_update
5314 : : | merge_when_tgt_matched opt_merge_when_condition THEN merge_delete
5315 : : | merge_when_tgt_not_matched opt_merge_when_condition THEN merge_insert
5316 : : | merge_when_tgt_matched opt_merge_when_condition THEN DO NOTHING
5317 : : | merge_when_tgt_not_matched opt_merge_when_condition THEN DO NOTHING
5318 : : ;
5319 : :
5320 : :
5321 : : merge_when_tgt_matched:
5322 : : WHEN MATCHED
5323 : : | WHEN NOT MATCHED BY SOURCE
5324 : : ;
5325 : :
5326 : :
5327 : : merge_when_tgt_not_matched:
5328 : : WHEN NOT MATCHED
5329 : : | WHEN NOT MATCHED BY TARGET
5330 : : ;
5331 : :
5332 : :
5333 : : opt_merge_when_condition:
5334 : : AND a_expr
5335 : : |
5336 : : ;
5337 : :
5338 : :
5339 : : merge_update:
5340 : : UPDATE SET set_clause_list
5341 : : ;
5342 : :
5343 : :
5344 : : merge_delete:
5345 : : DELETE_P
5346 : : ;
5347 : :
5348 : :
5349 : : merge_insert:
5350 : : INSERT merge_values_clause
5351 : : | INSERT OVERRIDING override_kind VALUE_P merge_values_clause
5352 : : | INSERT '(' insert_column_list ')' merge_values_clause
5353 : : | INSERT '(' insert_column_list ')' OVERRIDING override_kind VALUE_P merge_values_clause
5354 : : | INSERT DEFAULT VALUES
5355 : : ;
5356 : :
5357 : :
5358 : : merge_values_clause:
5359 : : VALUES '(' expr_list ')'
5360 : : ;
5361 : :
5362 : :
5363 : : DeclareCursorStmt:
5364 : : DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
5365 : : {
5366 : : struct cursor *ptr,
5367 : : *this;
5368 [ + + ]: 23 : const char *cursor_marker = @2[0] == ':' ? "$0" : @2;
5369 : : char *comment,
5370 : : *c1,
5371 : : *c2;
5372 [ + + - + ]: 23 : int (*strcmp_fn) (const char *, const char *) = ((@2[0] == ':' || @2[0] == '"') ? strcmp : pg_strcasecmp);
5373 : :
5374 [ + + - + : 23 : if (INFORMIX_MODE && pg_strcasecmp(@2, "database") == 0)
+ + ]
5375 : 1 : mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
5376 : :
5377 [ + + ]: 34 : for (ptr = cur; ptr != NULL; ptr = ptr->next)
5378 : : {
5379 [ + + ]: 12 : if (strcmp_fn(@2, ptr->name) == 0)
5380 : : {
5381 [ + + ]: 2 : if (@2[0] == ':')
5382 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", @2 + 1);
5383 : : else
5384 : 1 : mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", @2);
5385 : : }
5386 : : }
5387 : :
5388 : 22 : this = (struct cursor *) mm_alloc(sizeof(struct cursor));
5389 : :
5390 : 22 : this->next = cur;
5391 : 22 : this->name = mm_strdup(@2);
5392 [ + - ]: 22 : this->function = (current_function ? mm_strdup(current_function) : NULL);
5393 [ + + ]: 22 : this->connection = connection ? mm_strdup(connection) : NULL;
5394 : 22 : this->opened = false;
5395 : 22 : this->command = mm_strdup(cat_str(7, "declare", cursor_marker, @3, "cursor", @5, "for", @7));
5396 : 22 : this->argsinsert = argsinsert;
5397 : 22 : this->argsinsert_oos = NULL;
5398 : 22 : this->argsresult = argsresult;
5399 : 22 : this->argsresult_oos = NULL;
5400 : 22 : argsinsert = argsresult = NULL;
5401 : 22 : cur = this;
5402 : :
5403 : 22 : c1 = loc_strdup(this->command);
5404 [ - + ]: 22 : while ((c2 = strstr(c1, "*/")) != NULL)
5405 : : {
5406 : : /* We put this text into a comment, so we better remove [*][/]. */
5407 : 0 : c2[0] = '.';
5408 : 0 : c2[1] = '.';
5409 : : }
5410 : 22 : comment = cat_str(3, "/*", c1, "*/");
5411 : :
5412 : 22 : @$ = cat2_str(adjust_outofscope_cursor_vars(this), comment);
5413 : : }
5414 : : ;
5415 : :
5416 : :
5417 : : cursor_name:
5418 : : name
5419 : : | char_civar
5420 : : {
5421 : 45 : char *curname = loc_alloc(strlen(@1) + 2);
5422 : :
5423 : 45 : sprintf(curname, ":%s", @1);
5424 : 45 : @$ = curname;
5425 : : }
5426 : : ;
5427 : :
5428 : :
5429 : : cursor_options:
5430 : :
5431 : : | cursor_options NO SCROLL
5432 : : | cursor_options SCROLL
5433 : : | cursor_options BINARY
5434 : : | cursor_options ASENSITIVE
5435 : : | cursor_options INSENSITIVE
5436 : : ;
5437 : :
5438 : :
5439 : : opt_hold:
5440 : :
5441 : : {
5442 [ - + - - ]: 44 : if (compat == ECPG_COMPAT_INFORMIX_SE && autocommit)
5443 : 0 : @$ = "with hold";
5444 : : else
5445 : 44 : @$ = "";
5446 : : }
5447 : : | WITH HOLD
5448 : : | WITHOUT HOLD
5449 : : ;
5450 : :
5451 : :
5452 : : SelectStmt:
5453 : : select_no_parens %prec UMINUS
5454 : : | select_with_parens %prec UMINUS
5455 : : ;
5456 : :
5457 : :
5458 : : select_with_parens:
5459 : : '(' select_no_parens ')'
5460 : : | '(' select_with_parens ')'
5461 : : ;
5462 : :
5463 : :
5464 : : select_no_parens:
5465 : : simple_select
5466 : : | select_clause sort_clause
5467 : : | select_clause opt_sort_clause for_locking_clause opt_select_limit
5468 : : | select_clause opt_sort_clause select_limit opt_for_locking_clause
5469 : : | with_clause select_clause
5470 : : | with_clause select_clause sort_clause
5471 : : | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
5472 : : | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
5473 : : ;
5474 : :
5475 : :
5476 : : select_clause:
5477 : : simple_select
5478 : : | select_with_parens
5479 : : ;
5480 : :
5481 : :
5482 : : simple_select:
5483 : : SELECT opt_all_clause opt_target_list into_clause from_clause where_clause group_clause having_clause window_clause
5484 : : | SELECT distinct_clause target_list into_clause from_clause where_clause group_clause having_clause window_clause
5485 : : | values_clause
5486 : : | TABLE relation_expr
5487 : : | select_clause UNION set_quantifier select_clause
5488 : : | select_clause INTERSECT set_quantifier select_clause
5489 : : | select_clause EXCEPT set_quantifier select_clause
5490 : : ;
5491 : :
5492 : :
5493 : : with_clause:
5494 : : WITH cte_list
5495 : : | WITH_LA cte_list
5496 : : | WITH RECURSIVE cte_list
5497 : : ;
5498 : :
5499 : :
5500 : : cte_list:
5501 : : common_table_expr
5502 : : | cte_list ',' common_table_expr
5503 : : ;
5504 : :
5505 : :
5506 : : common_table_expr:
5507 : : name opt_name_list AS opt_materialized '(' PreparableStmt ')' opt_search_clause opt_cycle_clause
5508 : : ;
5509 : :
5510 : :
5511 : : opt_materialized:
5512 : : MATERIALIZED
5513 : : | NOT MATERIALIZED
5514 : : |
5515 : : ;
5516 : :
5517 : :
5518 : : opt_search_clause:
5519 : : SEARCH DEPTH FIRST_P BY columnList SET ColId
5520 : : | SEARCH BREADTH FIRST_P BY columnList SET ColId
5521 : : |
5522 : : ;
5523 : :
5524 : :
5525 : : opt_cycle_clause:
5526 : : CYCLE columnList SET ColId TO AexprConst DEFAULT AexprConst USING ColId
5527 : : | CYCLE columnList SET ColId USING ColId
5528 : : |
5529 : : ;
5530 : :
5531 : :
5532 : : opt_with_clause:
5533 : : with_clause
5534 : : |
5535 : : ;
5536 : :
5537 : :
5538 : : into_clause:
5539 : : INTO OptTempTableName
5540 : : {
5541 : 1 : FoundInto = 1;
5542 : 1 : @$ = cat2_str("into", @2);
5543 : : }
5544 : : | ecpg_into
5545 : : {
5546 : 94 : @$ = "";
5547 : : }
5548 : : |
5549 : : ;
5550 : :
5551 : :
5552 : : OptTempTableName:
5553 : : TEMPORARY opt_table qualified_name
5554 : : | TEMP opt_table qualified_name
5555 : : | LOCAL TEMPORARY opt_table qualified_name
5556 : : | LOCAL TEMP opt_table qualified_name
5557 : : | GLOBAL TEMPORARY opt_table qualified_name
5558 : : | GLOBAL TEMP opt_table qualified_name
5559 : : | UNLOGGED opt_table qualified_name
5560 : : | TABLE qualified_name
5561 : : | qualified_name
5562 : : ;
5563 : :
5564 : :
5565 : : opt_table:
5566 : : TABLE
5567 : : |
5568 : : ;
5569 : :
5570 : :
5571 : : set_quantifier:
5572 : : ALL
5573 : : | DISTINCT
5574 : : |
5575 : : ;
5576 : :
5577 : :
5578 : : distinct_clause:
5579 : : DISTINCT
5580 : : | DISTINCT ON '(' expr_list ')'
5581 : : ;
5582 : :
5583 : :
5584 : : opt_all_clause:
5585 : : ALL
5586 : : |
5587 : : ;
5588 : :
5589 : :
5590 : : opt_sort_clause:
5591 : : sort_clause
5592 : : |
5593 : : ;
5594 : :
5595 : :
5596 : : sort_clause:
5597 : : ORDER BY sortby_list
5598 : : ;
5599 : :
5600 : :
5601 : : sortby_list:
5602 : : sortby
5603 : : | sortby_list ',' sortby
5604 : : ;
5605 : :
5606 : :
5607 : : sortby:
5608 : : a_expr USING qual_all_Op opt_nulls_order
5609 : : | a_expr opt_asc_desc opt_nulls_order
5610 : : ;
5611 : :
5612 : :
5613 : : select_limit:
5614 : : limit_clause offset_clause
5615 : : | offset_clause limit_clause
5616 : : | limit_clause
5617 : : | offset_clause
5618 : : ;
5619 : :
5620 : :
5621 : : opt_select_limit:
5622 : : select_limit
5623 : : |
5624 : : ;
5625 : :
5626 : :
5627 : : limit_clause:
5628 : : LIMIT select_limit_value
5629 : : | LIMIT select_limit_value ',' select_offset_value
5630 : : {
5631 : 1 : mmerror(PARSE_ERROR, ET_WARNING, "no longer supported LIMIT #,# syntax passed to server");
5632 : : }
5633 : : | FETCH first_or_next select_fetch_first_value row_or_rows ONLY
5634 : : | FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES
5635 : : | FETCH first_or_next row_or_rows ONLY
5636 : : | FETCH first_or_next row_or_rows WITH TIES
5637 : : ;
5638 : :
5639 : :
5640 : : offset_clause:
5641 : : OFFSET select_offset_value
5642 : : | OFFSET select_fetch_first_value row_or_rows
5643 : : ;
5644 : :
5645 : :
5646 : : select_limit_value:
5647 : : a_expr
5648 : : | ALL
5649 : : ;
5650 : :
5651 : :
5652 : : select_offset_value:
5653 : : a_expr
5654 : : ;
5655 : :
5656 : :
5657 : : select_fetch_first_value:
5658 : : c_expr
5659 : : | '+' I_or_F_const
5660 : : | '-' I_or_F_const
5661 : : ;
5662 : :
5663 : :
5664 : : I_or_F_const:
5665 : : Iconst
5666 : : | ecpg_fconst
5667 : : ;
5668 : :
5669 : :
5670 : : row_or_rows:
5671 : : ROW
5672 : : | ROWS
5673 : : ;
5674 : :
5675 : :
5676 : : first_or_next:
5677 : : FIRST_P
5678 : : | NEXT
5679 : : ;
5680 : :
5681 : :
5682 : : group_clause:
5683 : : GROUP_P BY set_quantifier group_by_list
5684 : : | GROUP_P BY ALL
5685 : : |
5686 : : ;
5687 : :
5688 : :
5689 : : group_by_list:
5690 : : group_by_item
5691 : : | group_by_list ',' group_by_item
5692 : : ;
5693 : :
5694 : :
5695 : : group_by_item:
5696 : : a_expr
5697 : : | empty_grouping_set
5698 : : | cube_clause
5699 : : | rollup_clause
5700 : : | grouping_sets_clause
5701 : : ;
5702 : :
5703 : :
5704 : : empty_grouping_set:
5705 : : '(' ')'
5706 : : ;
5707 : :
5708 : :
5709 : : rollup_clause:
5710 : : ROLLUP '(' expr_list ')'
5711 : : ;
5712 : :
5713 : :
5714 : : cube_clause:
5715 : : CUBE '(' expr_list ')'
5716 : : ;
5717 : :
5718 : :
5719 : : grouping_sets_clause:
5720 : : GROUPING SETS '(' group_by_list ')'
5721 : : ;
5722 : :
5723 : :
5724 : : having_clause:
5725 : : HAVING a_expr
5726 : : |
5727 : : ;
5728 : :
5729 : :
5730 : : for_locking_clause:
5731 : : for_locking_items
5732 : : | FOR READ ONLY
5733 : : ;
5734 : :
5735 : :
5736 : : opt_for_locking_clause:
5737 : : for_locking_clause
5738 : : |
5739 : : ;
5740 : :
5741 : :
5742 : : for_locking_items:
5743 : : for_locking_item
5744 : : | for_locking_items for_locking_item
5745 : : ;
5746 : :
5747 : :
5748 : : for_locking_item:
5749 : : for_locking_strength locked_rels_list opt_nowait_or_skip
5750 : : ;
5751 : :
5752 : :
5753 : : for_locking_strength:
5754 : : FOR UPDATE
5755 : : | FOR NO KEY UPDATE
5756 : : | FOR SHARE
5757 : : | FOR KEY SHARE
5758 : : ;
5759 : :
5760 : :
5761 : : opt_for_locking_strength:
5762 : : for_locking_strength
5763 : : |
5764 : : ;
5765 : :
5766 : :
5767 : : locked_rels_list:
5768 : : OF qualified_name_list
5769 : : |
5770 : : ;
5771 : :
5772 : :
5773 : : values_clause:
5774 : : VALUES '(' expr_list ')'
5775 : : | values_clause ',' '(' expr_list ')'
5776 : : ;
5777 : :
5778 : :
5779 : : from_clause:
5780 : : FROM from_list
5781 : : |
5782 : : ;
5783 : :
5784 : :
5785 : : from_list:
5786 : : table_ref
5787 : : | from_list ',' table_ref
5788 : : ;
5789 : :
5790 : :
5791 : : table_ref:
5792 : : relation_expr opt_alias_clause
5793 : : | relation_expr opt_alias_clause tablesample_clause
5794 : : | func_table func_alias_clause
5795 : : | LATERAL_P func_table func_alias_clause
5796 : : | xmltable opt_alias_clause
5797 : : | LATERAL_P xmltable opt_alias_clause
5798 : : | GRAPH_TABLE '(' qualified_name MATCH graph_pattern COLUMNS '(' labeled_expr_list ')' ')' opt_alias_clause
5799 : : | select_with_parens opt_alias_clause
5800 : : | LATERAL_P select_with_parens opt_alias_clause
5801 : : | joined_table
5802 : : | '(' joined_table ')' alias_clause
5803 : : | json_table opt_alias_clause
5804 : : | LATERAL_P json_table opt_alias_clause
5805 : : ;
5806 : :
5807 : :
5808 : : joined_table:
5809 : : '(' joined_table ')'
5810 : : | table_ref CROSS JOIN table_ref
5811 : : | table_ref join_type JOIN table_ref join_qual
5812 : : | table_ref JOIN table_ref join_qual
5813 : : | table_ref NATURAL join_type JOIN table_ref
5814 : : | table_ref NATURAL JOIN table_ref
5815 : : ;
5816 : :
5817 : :
5818 : : alias_clause:
5819 : : AS ColId '(' name_list ')'
5820 : : | AS ColId
5821 : : | ColId '(' name_list ')'
5822 : : | ColId
5823 : : ;
5824 : :
5825 : :
5826 : : opt_alias_clause:
5827 : : alias_clause
5828 : : |
5829 : : ;
5830 : :
5831 : :
5832 : : opt_alias_clause_for_join_using:
5833 : : AS ColId
5834 : : |
5835 : : ;
5836 : :
5837 : :
5838 : : func_alias_clause:
5839 : : alias_clause
5840 : : | AS '(' TableFuncElementList ')'
5841 : : | AS ColId '(' TableFuncElementList ')'
5842 : : | ColId '(' TableFuncElementList ')'
5843 : : |
5844 : : ;
5845 : :
5846 : :
5847 : : join_type:
5848 : : FULL opt_outer
5849 : : | LEFT opt_outer
5850 : : | RIGHT opt_outer
5851 : : | INNER_P
5852 : : ;
5853 : :
5854 : :
5855 : : opt_outer:
5856 : : OUTER_P
5857 : : |
5858 : : ;
5859 : :
5860 : :
5861 : : join_qual:
5862 : : USING '(' name_list ')' opt_alias_clause_for_join_using
5863 : : | ON a_expr
5864 : : ;
5865 : :
5866 : :
5867 : : relation_expr:
5868 : : qualified_name
5869 : : | extended_relation_expr
5870 : : ;
5871 : :
5872 : :
5873 : : extended_relation_expr:
5874 : : qualified_name '*'
5875 : : | ONLY qualified_name
5876 : : | ONLY '(' qualified_name ')'
5877 : : ;
5878 : :
5879 : :
5880 : : relation_expr_list:
5881 : : relation_expr
5882 : : | relation_expr_list ',' relation_expr
5883 : : ;
5884 : :
5885 : :
5886 : : relation_expr_opt_alias:
5887 : : relation_expr %prec UMINUS
5888 : : | relation_expr ColId
5889 : : | relation_expr AS ColId
5890 : : ;
5891 : :
5892 : :
5893 : : for_portion_of_opt_alias:
5894 : : AS ColId
5895 : : | BareColLabel
5896 : : | %prec UMINUS
5897 : : ;
5898 : :
5899 : :
5900 : : for_portion_of_clause:
5901 : : FOR PORTION OF ColId '(' a_expr ')'
5902 : : | FOR PORTION OF ColId FROM a_expr TO a_expr
5903 : : ;
5904 : :
5905 : :
5906 : : tablesample_clause:
5907 : : TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
5908 : : ;
5909 : :
5910 : :
5911 : : opt_repeatable_clause:
5912 : : REPEATABLE '(' a_expr ')'
5913 : : |
5914 : : ;
5915 : :
5916 : :
5917 : : func_table:
5918 : : func_expr_windowless opt_ordinality
5919 : : | ROWS FROM '(' rowsfrom_list ')' opt_ordinality
5920 : : ;
5921 : :
5922 : :
5923 : : rowsfrom_item:
5924 : : func_expr_windowless opt_col_def_list
5925 : : ;
5926 : :
5927 : :
5928 : : rowsfrom_list:
5929 : : rowsfrom_item
5930 : : | rowsfrom_list ',' rowsfrom_item
5931 : : ;
5932 : :
5933 : :
5934 : : opt_col_def_list:
5935 : : AS '(' TableFuncElementList ')'
5936 : : |
5937 : : ;
5938 : :
5939 : :
5940 : : opt_ordinality:
5941 : : WITH_LA ORDINALITY
5942 : : |
5943 : : ;
5944 : :
5945 : :
5946 : : where_clause:
5947 : : WHERE a_expr
5948 : : |
5949 : : ;
5950 : :
5951 : :
5952 : : where_or_current_clause:
5953 : : WHERE a_expr
5954 : : | WHERE CURRENT_P OF cursor_name
5955 : : {
5956 [ # # ]: 0 : const char *cursor_marker = @4[0] == ':' ? "$0" : @4;
5957 : :
5958 : 0 : @$ = cat_str(2, "where current of", cursor_marker);
5959 : : }
5960 : : |
5961 : : ;
5962 : :
5963 : :
5964 : : OptTableFuncElementList:
5965 : : TableFuncElementList
5966 : : |
5967 : : ;
5968 : :
5969 : :
5970 : : TableFuncElementList:
5971 : : TableFuncElement
5972 : : | TableFuncElementList ',' TableFuncElement
5973 : : ;
5974 : :
5975 : :
5976 : : TableFuncElement:
5977 : : ColId Typename opt_collate_clause
5978 : : ;
5979 : :
5980 : :
5981 : : xmltable:
5982 : : XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
5983 : : | XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ',' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
5984 : : ;
5985 : :
5986 : :
5987 : : xmltable_column_list:
5988 : : xmltable_column_el
5989 : : | xmltable_column_list ',' xmltable_column_el
5990 : : ;
5991 : :
5992 : :
5993 : : xmltable_column_el:
5994 : : ColId Typename
5995 : : | ColId Typename xmltable_column_option_list
5996 : : | ColId FOR ORDINALITY
5997 : : ;
5998 : :
5999 : :
6000 : : xmltable_column_option_list:
6001 : : xmltable_column_option_el
6002 : : | xmltable_column_option_list xmltable_column_option_el
6003 : : ;
6004 : :
6005 : :
6006 : : xmltable_column_option_el:
6007 : : ecpg_ident b_expr
6008 : : | DEFAULT b_expr
6009 : : | NOT NULL_P
6010 : : | NULL_P
6011 : : | PATH b_expr
6012 : : ;
6013 : :
6014 : :
6015 : : xml_namespace_list:
6016 : : xml_namespace_el
6017 : : | xml_namespace_list ',' xml_namespace_el
6018 : : ;
6019 : :
6020 : :
6021 : : xml_namespace_el:
6022 : : b_expr AS ColLabel
6023 : : | DEFAULT b_expr
6024 : : ;
6025 : :
6026 : :
6027 : : json_table:
6028 : : JSON_TABLE '(' json_value_expr ',' a_expr json_table_path_name_opt json_passing_clause_opt COLUMNS '(' json_table_column_definition_list ')' json_table_plan_clause_opt json_on_error_clause_opt ')'
6029 : : ;
6030 : :
6031 : :
6032 : : json_table_path_name_opt:
6033 : : AS name
6034 : : |
6035 : : ;
6036 : :
6037 : :
6038 : : json_table_column_definition_list:
6039 : : json_table_column_definition
6040 : : | json_table_column_definition_list ',' json_table_column_definition
6041 : : ;
6042 : :
6043 : :
6044 : : json_table_column_definition:
6045 : : ColId FOR ORDINALITY
6046 : : | ColId Typename json_table_column_path_clause_opt json_wrapper_behavior json_quotes_clause_opt json_behavior_clause_opt
6047 : : | ColId Typename json_format_clause json_table_column_path_clause_opt json_wrapper_behavior json_quotes_clause_opt json_behavior_clause_opt
6048 : : | ColId Typename EXISTS json_table_column_path_clause_opt json_on_error_clause_opt
6049 : : | NESTED path_opt ecpg_sconst COLUMNS '(' json_table_column_definition_list ')'
6050 : : | NESTED path_opt ecpg_sconst AS name COLUMNS '(' json_table_column_definition_list ')'
6051 : : ;
6052 : :
6053 : :
6054 : : path_opt:
6055 : : PATH
6056 : : |
6057 : : ;
6058 : :
6059 : :
6060 : : json_table_column_path_clause_opt:
6061 : : PATH ecpg_sconst
6062 : : |
6063 : : ;
6064 : :
6065 : :
6066 : : json_table_plan_clause_opt:
6067 : : PLAN '(' json_table_plan ')'
6068 : : | PLAN DEFAULT '(' json_table_default_plan_choices ')'
6069 : : |
6070 : : ;
6071 : :
6072 : :
6073 : : json_table_plan:
6074 : : json_table_plan_simple
6075 : : | json_table_plan_outer
6076 : : | json_table_plan_inner
6077 : : | json_table_plan_union
6078 : : | json_table_plan_cross
6079 : : ;
6080 : :
6081 : :
6082 : : json_table_plan_simple:
6083 : : name
6084 : : ;
6085 : :
6086 : :
6087 : : json_table_plan_outer:
6088 : : json_table_plan_simple OUTER_P json_table_plan_primary
6089 : : ;
6090 : :
6091 : :
6092 : : json_table_plan_inner:
6093 : : json_table_plan_simple INNER_P json_table_plan_primary
6094 : : ;
6095 : :
6096 : :
6097 : : json_table_plan_union:
6098 : : json_table_plan_primary UNION json_table_plan_primary
6099 : : | json_table_plan_union UNION json_table_plan_primary
6100 : : ;
6101 : :
6102 : :
6103 : : json_table_plan_cross:
6104 : : json_table_plan_primary CROSS json_table_plan_primary
6105 : : | json_table_plan_cross CROSS json_table_plan_primary
6106 : : ;
6107 : :
6108 : :
6109 : : json_table_plan_primary:
6110 : : json_table_plan_simple
6111 : : | '(' json_table_plan ')'
6112 : : ;
6113 : :
6114 : :
6115 : : json_table_default_plan_choices:
6116 : : json_table_default_plan_inner_outer
6117 : : | json_table_default_plan_union_cross
6118 : : | json_table_default_plan_inner_outer ',' json_table_default_plan_union_cross
6119 : : | json_table_default_plan_union_cross ',' json_table_default_plan_inner_outer
6120 : : ;
6121 : :
6122 : :
6123 : : json_table_default_plan_inner_outer:
6124 : : INNER_P
6125 : : | OUTER_P
6126 : : ;
6127 : :
6128 : :
6129 : : json_table_default_plan_union_cross:
6130 : : UNION
6131 : : | CROSS
6132 : : ;
6133 : :
6134 : :
6135 : : Typename:
6136 : : SimpleTypename opt_array_bounds
6137 : : {
6138 : 199 : @$ = cat2_str(@1, $2.str);
6139 : : }
6140 : : | SETOF SimpleTypename opt_array_bounds
6141 : : {
6142 : 0 : @$ = cat_str(3, "setof", @2, $3.str);
6143 : : }
6144 : : | SimpleTypename ARRAY '[' Iconst ']'
6145 : : | SETOF SimpleTypename ARRAY '[' Iconst ']'
6146 : : | SimpleTypename ARRAY
6147 : : | SETOF SimpleTypename ARRAY
6148 : : ;
6149 : :
6150 : :
6151 : : opt_array_bounds:
6152 : : opt_array_bounds '[' ']'
6153 : : {
6154 : 3 : $$.index1 = $1.index1;
6155 : 3 : $$.index2 = $1.index2;
6156 [ + - ]: 3 : if (strcmp($$.index1, "-1") == 0)
6157 : 3 : $$.index1 = "0";
6158 [ # # ]: 0 : else if (strcmp($1.index2, "-1") == 0)
6159 : 0 : $$.index2 = "0";
6160 : 3 : $$.str = cat_str(2, $1.str, "[]");
6161 : : }
6162 : : | opt_array_bounds '[' Iresult ']'
6163 : : {
6164 : 129 : $$.index1 = $1.index1;
6165 : 129 : $$.index2 = $1.index2;
6166 [ + + ]: 129 : if (strcmp($1.index1, "-1") == 0)
6167 : 117 : $$.index1 = @3;
6168 [ + - ]: 12 : else if (strcmp($1.index2, "-1") == 0)
6169 : 12 : $$.index2 = @3;
6170 : 129 : $$.str = cat_str(4, $1.str, "[", @3, "]");
6171 : : }
6172 : : |
6173 : : {
6174 : 599 : $$.index1 = "-1";
6175 : 599 : $$.index2 = "-1";
6176 : 599 : $$.str = "";
6177 : : }
6178 : : ;
6179 : :
6180 : :
6181 : : SimpleTypename:
6182 : : GenericType
6183 : : | Numeric
6184 : : | Bit
6185 : : | Character
6186 : : | ConstDatetime
6187 : : | ConstInterval opt_interval
6188 : : | ConstInterval '(' Iconst ')'
6189 : : | JsonType
6190 : : ;
6191 : :
6192 : :
6193 : : ConstTypename:
6194 : : Numeric
6195 : : | ConstBit
6196 : : | ConstCharacter
6197 : : | ConstDatetime
6198 : : | JsonType
6199 : : ;
6200 : :
6201 : :
6202 : : GenericType:
6203 : : type_function_name opt_type_modifiers
6204 : : | type_function_name attrs opt_type_modifiers
6205 : : ;
6206 : :
6207 : :
6208 : : opt_type_modifiers:
6209 : : '(' expr_list ')'
6210 : : |
6211 : : ;
6212 : :
6213 : :
6214 : : Numeric:
6215 : : INT_P
6216 : : | INTEGER
6217 : : | SMALLINT
6218 : : | BIGINT
6219 : : | REAL
6220 : : | FLOAT_P opt_float
6221 : : | DOUBLE_P PRECISION
6222 : : | DECIMAL_P opt_type_modifiers
6223 : : | DEC opt_type_modifiers
6224 : : | NUMERIC opt_type_modifiers
6225 : : | BOOLEAN_P
6226 : : ;
6227 : :
6228 : :
6229 : : opt_float:
6230 : : '(' Iconst ')'
6231 : : |
6232 : : ;
6233 : :
6234 : :
6235 : : Bit:
6236 : : BitWithLength
6237 : : | BitWithoutLength
6238 : : ;
6239 : :
6240 : :
6241 : : ConstBit:
6242 : : BitWithLength
6243 : : | BitWithoutLength
6244 : : ;
6245 : :
6246 : :
6247 : : BitWithLength:
6248 : : BIT opt_varying '(' expr_list ')'
6249 : : ;
6250 : :
6251 : :
6252 : : BitWithoutLength:
6253 : : BIT opt_varying
6254 : : ;
6255 : :
6256 : :
6257 : : Character:
6258 : : CharacterWithLength
6259 : : | CharacterWithoutLength
6260 : : ;
6261 : :
6262 : :
6263 : : ConstCharacter:
6264 : : CharacterWithLength
6265 : : | CharacterWithoutLength
6266 : : ;
6267 : :
6268 : :
6269 : : CharacterWithLength:
6270 : : character '(' Iconst ')'
6271 : : ;
6272 : :
6273 : :
6274 : : CharacterWithoutLength:
6275 : : character
6276 : : ;
6277 : :
6278 : :
6279 : : character:
6280 : : CHARACTER opt_varying
6281 : : | CHAR_P opt_varying
6282 : : | VARCHAR
6283 : : | NATIONAL CHARACTER opt_varying
6284 : : | NATIONAL CHAR_P opt_varying
6285 : : | NCHAR opt_varying
6286 : : ;
6287 : :
6288 : :
6289 : : opt_varying:
6290 : : VARYING
6291 : : |
6292 : : ;
6293 : :
6294 : :
6295 : : ConstDatetime:
6296 : : TIMESTAMP '(' Iconst ')' opt_timezone
6297 : : | TIMESTAMP opt_timezone
6298 : : | TIME '(' Iconst ')' opt_timezone
6299 : : | TIME opt_timezone
6300 : : ;
6301 : :
6302 : :
6303 : : ConstInterval:
6304 : : INTERVAL
6305 : : ;
6306 : :
6307 : :
6308 : : opt_timezone:
6309 : : WITH_LA TIME ZONE
6310 : : | WITHOUT_LA TIME ZONE
6311 : : |
6312 : : ;
6313 : :
6314 : :
6315 : : opt_interval:
6316 : : YEAR_P %prec IS
6317 : : | MONTH_P
6318 : : | DAY_P %prec IS
6319 : : | HOUR_P %prec IS
6320 : : | MINUTE_P %prec IS
6321 : : | interval_second
6322 : : | YEAR_P TO MONTH_P
6323 : : | DAY_P TO HOUR_P
6324 : : | DAY_P TO MINUTE_P
6325 : : | DAY_P TO interval_second
6326 : : | HOUR_P TO MINUTE_P
6327 : : | HOUR_P TO interval_second
6328 : : | MINUTE_P TO interval_second
6329 : : |
6330 : : ;
6331 : :
6332 : :
6333 : : interval_second:
6334 : : SECOND_P
6335 : : | SECOND_P '(' Iconst ')'
6336 : : ;
6337 : :
6338 : :
6339 : : JsonType:
6340 : : JSON
6341 : : ;
6342 : :
6343 : :
6344 : : a_expr:
6345 : : c_expr
6346 : : | a_expr TYPECAST Typename
6347 : : | a_expr COLLATE any_name
6348 : : | a_expr AT TIME ZONE a_expr %prec AT
6349 : : | a_expr AT LOCAL %prec AT
6350 : : | '+' a_expr %prec UMINUS
6351 : : | '-' a_expr %prec UMINUS
6352 : : | a_expr '+' a_expr
6353 : : | a_expr '-' a_expr
6354 : : | a_expr '*' a_expr
6355 : : | a_expr '/' a_expr
6356 : : | a_expr '%' a_expr
6357 : : | a_expr '^' a_expr
6358 : : | a_expr '<' a_expr
6359 : : | a_expr '>' a_expr
6360 : : | a_expr '=' a_expr
6361 : : | a_expr LESS_EQUALS a_expr
6362 : : | a_expr GREATER_EQUALS a_expr
6363 : : | a_expr NOT_EQUALS a_expr
6364 : : | a_expr RIGHT_ARROW a_expr
6365 : : | a_expr '|' a_expr
6366 : : | a_expr qual_Op a_expr %prec Op
6367 : : | qual_Op a_expr %prec Op
6368 : : | a_expr AND a_expr
6369 : : | a_expr OR a_expr
6370 : : | NOT a_expr
6371 : : | NOT_LA a_expr %prec NOT
6372 : : | a_expr LIKE a_expr
6373 : : | a_expr LIKE a_expr ESCAPE a_expr %prec LIKE
6374 : : | a_expr NOT_LA LIKE a_expr %prec NOT_LA
6375 : : | a_expr NOT_LA LIKE a_expr ESCAPE a_expr %prec NOT_LA
6376 : : | a_expr ILIKE a_expr
6377 : : | a_expr ILIKE a_expr ESCAPE a_expr %prec ILIKE
6378 : : | a_expr NOT_LA ILIKE a_expr %prec NOT_LA
6379 : : | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr %prec NOT_LA
6380 : : | a_expr SIMILAR TO a_expr %prec SIMILAR
6381 : : | a_expr SIMILAR TO a_expr ESCAPE a_expr %prec SIMILAR
6382 : : | a_expr NOT_LA SIMILAR TO a_expr %prec NOT_LA
6383 : : | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr %prec NOT_LA
6384 : : | a_expr IS NULL_P %prec IS
6385 : : | a_expr ISNULL
6386 : : | a_expr IS NOT NULL_P %prec IS
6387 : : | a_expr NOTNULL
6388 : : | row OVERLAPS row
6389 : : | a_expr IS TRUE_P %prec IS
6390 : : | a_expr IS NOT TRUE_P %prec IS
6391 : : | a_expr IS FALSE_P %prec IS
6392 : : | a_expr IS NOT FALSE_P %prec IS
6393 : : | a_expr IS UNKNOWN %prec IS
6394 : : | a_expr IS NOT UNKNOWN %prec IS
6395 : : | a_expr IS DISTINCT FROM a_expr %prec IS
6396 : : | a_expr IS NOT DISTINCT FROM a_expr %prec IS
6397 : : | a_expr BETWEEN opt_asymmetric b_expr AND a_expr %prec BETWEEN
6398 : : | a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr %prec NOT_LA
6399 : : | a_expr BETWEEN SYMMETRIC b_expr AND a_expr %prec BETWEEN
6400 : : | a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr %prec NOT_LA
6401 : : | a_expr IN_P select_with_parens
6402 : : | a_expr IN_P '(' expr_list ')'
6403 : : | a_expr NOT_LA IN_P select_with_parens %prec NOT_LA
6404 : : | a_expr NOT_LA IN_P '(' expr_list ')'
6405 : : | a_expr subquery_Op sub_type select_with_parens %prec Op
6406 : : | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
6407 : : | UNIQUE opt_unique_null_treatment select_with_parens
6408 : : {
6409 : 0 : mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");
6410 : : }
6411 : : | a_expr IS DOCUMENT_P %prec IS
6412 : : | a_expr IS NOT DOCUMENT_P %prec IS
6413 : : | a_expr IS NORMALIZED %prec IS
6414 : : | a_expr IS unicode_normal_form NORMALIZED %prec IS
6415 : : | a_expr IS NOT NORMALIZED %prec IS
6416 : : | a_expr IS NOT unicode_normal_form NORMALIZED %prec IS
6417 : : | a_expr IS json_predicate_type_constraint json_key_uniqueness_constraint_opt %prec IS
6418 : : | a_expr IS NOT json_predicate_type_constraint json_key_uniqueness_constraint_opt %prec IS
6419 : : | DEFAULT
6420 : : ;
6421 : :
6422 : :
6423 : : b_expr:
6424 : : c_expr
6425 : : | b_expr TYPECAST Typename
6426 : : | '+' b_expr %prec UMINUS
6427 : : | '-' b_expr %prec UMINUS
6428 : : | b_expr '+' b_expr
6429 : : | b_expr '-' b_expr
6430 : : | b_expr '*' b_expr
6431 : : | b_expr '/' b_expr
6432 : : | b_expr '%' b_expr
6433 : : | b_expr '^' b_expr
6434 : : | b_expr '<' b_expr
6435 : : | b_expr '>' b_expr
6436 : : | b_expr '=' b_expr
6437 : : | b_expr LESS_EQUALS b_expr
6438 : : | b_expr GREATER_EQUALS b_expr
6439 : : | b_expr NOT_EQUALS b_expr
6440 : : | b_expr RIGHT_ARROW b_expr
6441 : : | b_expr '|' b_expr
6442 : : | b_expr qual_Op b_expr %prec Op
6443 : : | qual_Op b_expr %prec Op
6444 : : | b_expr IS DISTINCT FROM b_expr %prec IS
6445 : : | b_expr IS NOT DISTINCT FROM b_expr %prec IS
6446 : : | b_expr IS DOCUMENT_P %prec IS
6447 : : | b_expr IS NOT DOCUMENT_P %prec IS
6448 : : ;
6449 : :
6450 : :
6451 : : c_expr:
6452 : : columnref
6453 : : | AexprConst
6454 : : | ecpg_param opt_indirection
6455 : : | '(' a_expr ')' opt_indirection
6456 : : | case_expr
6457 : : | func_expr
6458 : : | select_with_parens %prec UMINUS
6459 : : | select_with_parens indirection
6460 : : | EXISTS select_with_parens
6461 : : | ARRAY select_with_parens
6462 : : | ARRAY array_expr
6463 : : | explicit_row
6464 : : | implicit_row
6465 : : | GROUPING '(' expr_list ')'
6466 : : ;
6467 : :
6468 : :
6469 : : func_application:
6470 : : func_name '(' ')'
6471 : : | func_name '(' func_arg_list opt_sort_clause ')'
6472 : : | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
6473 : : | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
6474 : : | func_name '(' ALL func_arg_list opt_sort_clause ')'
6475 : : | func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
6476 : : | func_name '(' '*' ')'
6477 : : ;
6478 : :
6479 : :
6480 : : func_expr:
6481 : : func_application within_group_clause filter_clause null_treatment over_clause
6482 : : | json_aggregate_func filter_clause over_clause
6483 : : | func_expr_common_subexpr
6484 : : ;
6485 : :
6486 : :
6487 : : func_expr_windowless:
6488 : : func_application
6489 : : | func_expr_common_subexpr
6490 : : | json_aggregate_func
6491 : : ;
6492 : :
6493 : :
6494 : : func_expr_common_subexpr:
6495 : : COLLATION FOR '(' a_expr ')'
6496 : : | CURRENT_DATE
6497 : : | CURRENT_TIME
6498 : : | CURRENT_TIME '(' Iconst ')'
6499 : : | CURRENT_TIMESTAMP
6500 : : | CURRENT_TIMESTAMP '(' Iconst ')'
6501 : : | LOCALTIME
6502 : : | LOCALTIME '(' Iconst ')'
6503 : : | LOCALTIMESTAMP
6504 : : | LOCALTIMESTAMP '(' Iconst ')'
6505 : : | CURRENT_ROLE
6506 : : | CURRENT_USER
6507 : : | SESSION_USER
6508 : : | SYSTEM_USER
6509 : : | USER
6510 : : | CURRENT_CATALOG
6511 : : | CURRENT_SCHEMA
6512 : : | CAST '(' a_expr AS Typename ')'
6513 : : | EXTRACT '(' extract_list ')'
6514 : : | NORMALIZE '(' a_expr ')'
6515 : : | NORMALIZE '(' a_expr ',' unicode_normal_form ')'
6516 : : | OVERLAY '(' overlay_list ')'
6517 : : | OVERLAY '(' func_arg_list_opt ')'
6518 : : | POSITION '(' position_list ')'
6519 : : | SUBSTRING '(' substr_list ')'
6520 : : | SUBSTRING '(' func_arg_list_opt ')'
6521 : : | TREAT '(' a_expr AS Typename ')'
6522 : : | TRIM '(' BOTH trim_list ')'
6523 : : | TRIM '(' LEADING trim_list ')'
6524 : : | TRIM '(' TRAILING trim_list ')'
6525 : : | TRIM '(' trim_list ')'
6526 : : | NULLIF '(' a_expr ',' a_expr ')'
6527 : : | COALESCE '(' expr_list ')'
6528 : : | GREATEST '(' expr_list ')'
6529 : : | LEAST '(' expr_list ')'
6530 : : | XMLCONCAT '(' expr_list ')'
6531 : : | XMLELEMENT '(' NAME_P ColLabel ')'
6532 : : | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
6533 : : | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
6534 : : | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
6535 : : | XMLEXISTS '(' c_expr xmlexists_argument ')'
6536 : : | XMLFOREST '(' labeled_expr_list ')'
6537 : : | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
6538 : : | XMLPI '(' NAME_P ColLabel ')'
6539 : : | XMLPI '(' NAME_P ColLabel ',' a_expr ')'
6540 : : | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
6541 : : | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename xml_indent_option ')'
6542 : : | JSON_OBJECT '(' func_arg_list ')'
6543 : : | JSON_OBJECT '(' json_name_and_value_list json_object_constructor_null_clause_opt json_key_uniqueness_constraint_opt json_returning_clause_opt ')'
6544 : : | JSON_OBJECT '(' json_returning_clause_opt ')'
6545 : : | JSON_ARRAY '(' json_value_expr_list json_array_constructor_null_clause_opt json_returning_clause_opt ')'
6546 : : | JSON_ARRAY '(' select_no_parens json_format_clause_opt json_returning_clause_opt ')'
6547 : : | JSON_ARRAY '(' json_returning_clause_opt ')'
6548 : : | JSON '(' json_value_expr json_key_uniqueness_constraint_opt ')'
6549 : : | JSON_SCALAR '(' a_expr ')'
6550 : : | JSON_SERIALIZE '(' json_value_expr json_returning_clause_opt ')'
6551 : : | MERGE_ACTION '(' ')'
6552 : : | JSON_QUERY '(' json_value_expr ',' a_expr json_passing_clause_opt json_returning_clause_opt json_wrapper_behavior json_quotes_clause_opt json_behavior_clause_opt ')'
6553 : : | JSON_EXISTS '(' json_value_expr ',' a_expr json_passing_clause_opt json_on_error_clause_opt ')'
6554 : : | JSON_VALUE '(' json_value_expr ',' a_expr json_passing_clause_opt json_returning_clause_opt json_behavior_clause_opt ')'
6555 : : ;
6556 : :
6557 : :
6558 : : xml_root_version:
6559 : : VERSION_P a_expr
6560 : : | VERSION_P NO VALUE_P
6561 : : ;
6562 : :
6563 : :
6564 : : opt_xml_root_standalone:
6565 : : ',' STANDALONE_P YES_P
6566 : : | ',' STANDALONE_P NO
6567 : : | ',' STANDALONE_P NO VALUE_P
6568 : : |
6569 : : ;
6570 : :
6571 : :
6572 : : xml_attributes:
6573 : : XMLATTRIBUTES '(' labeled_expr_list ')'
6574 : : ;
6575 : :
6576 : :
6577 : : labeled_expr_list:
6578 : : labeled_expr
6579 : : | labeled_expr_list ',' labeled_expr
6580 : : ;
6581 : :
6582 : :
6583 : : labeled_expr:
6584 : : a_expr AS ColLabel
6585 : : | a_expr
6586 : : ;
6587 : :
6588 : :
6589 : : document_or_content:
6590 : : DOCUMENT_P
6591 : : | CONTENT_P
6592 : : ;
6593 : :
6594 : :
6595 : : xml_indent_option:
6596 : : INDENT
6597 : : | NO INDENT
6598 : : |
6599 : : ;
6600 : :
6601 : :
6602 : : xml_whitespace_option:
6603 : : PRESERVE WHITESPACE_P
6604 : : | STRIP_P WHITESPACE_P
6605 : : |
6606 : : ;
6607 : :
6608 : :
6609 : : xmlexists_argument:
6610 : : PASSING c_expr
6611 : : | PASSING c_expr xml_passing_mech
6612 : : | PASSING xml_passing_mech c_expr
6613 : : | PASSING xml_passing_mech c_expr xml_passing_mech
6614 : : ;
6615 : :
6616 : :
6617 : : xml_passing_mech:
6618 : : BY REF_P
6619 : : | BY VALUE_P
6620 : : ;
6621 : :
6622 : :
6623 : : WaitStmt:
6624 : : WAIT FOR LSN_P ecpg_sconst opt_wait_with_clause
6625 : : ;
6626 : :
6627 : :
6628 : : opt_wait_with_clause:
6629 : : WITH '(' utility_option_list ')'
6630 : : |
6631 : : ;
6632 : :
6633 : :
6634 : : within_group_clause:
6635 : : WITHIN GROUP_P '(' sort_clause ')'
6636 : : |
6637 : : ;
6638 : :
6639 : :
6640 : : filter_clause:
6641 : : FILTER '(' WHERE a_expr ')'
6642 : : |
6643 : : ;
6644 : :
6645 : :
6646 : : null_treatment:
6647 : : IGNORE_P NULLS_P
6648 : : | RESPECT_P NULLS_P
6649 : : |
6650 : : ;
6651 : :
6652 : :
6653 : : window_clause:
6654 : : WINDOW window_definition_list
6655 : : |
6656 : : ;
6657 : :
6658 : :
6659 : : window_definition_list:
6660 : : window_definition
6661 : : | window_definition_list ',' window_definition
6662 : : ;
6663 : :
6664 : :
6665 : : window_definition:
6666 : : ColId AS window_specification
6667 : : ;
6668 : :
6669 : :
6670 : : over_clause:
6671 : : OVER window_specification
6672 : : | OVER ColId
6673 : : |
6674 : : ;
6675 : :
6676 : :
6677 : : window_specification:
6678 : : '(' opt_existing_window_name opt_partition_clause opt_sort_clause opt_frame_clause ')'
6679 : : ;
6680 : :
6681 : :
6682 : : opt_existing_window_name:
6683 : : ColId
6684 : : | %prec Op
6685 : : ;
6686 : :
6687 : :
6688 : : opt_partition_clause:
6689 : : PARTITION BY expr_list
6690 : : |
6691 : : ;
6692 : :
6693 : :
6694 : : opt_frame_clause:
6695 : : RANGE frame_extent opt_window_exclusion_clause
6696 : : | ROWS frame_extent opt_window_exclusion_clause
6697 : : | GROUPS frame_extent opt_window_exclusion_clause
6698 : : |
6699 : : ;
6700 : :
6701 : :
6702 : : frame_extent:
6703 : : frame_bound
6704 : : | BETWEEN frame_bound AND frame_bound
6705 : : ;
6706 : :
6707 : :
6708 : : frame_bound:
6709 : : UNBOUNDED PRECEDING
6710 : : | UNBOUNDED FOLLOWING
6711 : : | CURRENT_P ROW
6712 : : | a_expr PRECEDING
6713 : : | a_expr FOLLOWING
6714 : : ;
6715 : :
6716 : :
6717 : : opt_window_exclusion_clause:
6718 : : EXCLUDE CURRENT_P ROW
6719 : : | EXCLUDE GROUP_P
6720 : : | EXCLUDE TIES
6721 : : | EXCLUDE NO OTHERS
6722 : : |
6723 : : ;
6724 : :
6725 : :
6726 : : row:
6727 : : ROW '(' expr_list ')'
6728 : : | ROW '(' ')'
6729 : : | '(' expr_list ',' a_expr ')'
6730 : : ;
6731 : :
6732 : :
6733 : : explicit_row:
6734 : : ROW '(' expr_list ')'
6735 : : | ROW '(' ')'
6736 : : ;
6737 : :
6738 : :
6739 : : implicit_row:
6740 : : '(' expr_list ',' a_expr ')'
6741 : : ;
6742 : :
6743 : :
6744 : : sub_type:
6745 : : ANY
6746 : : | SOME
6747 : : | ALL
6748 : : ;
6749 : :
6750 : :
6751 : : all_Op:
6752 : : Op
6753 : : | MathOp
6754 : : ;
6755 : :
6756 : :
6757 : : MathOp:
6758 : : '+'
6759 : : | '-'
6760 : : | '*'
6761 : : | '/'
6762 : : | '%'
6763 : : | '^'
6764 : : | '<'
6765 : : | '>'
6766 : : | '='
6767 : : | LESS_EQUALS
6768 : : | GREATER_EQUALS
6769 : : | NOT_EQUALS
6770 : : | RIGHT_ARROW
6771 : : | '|'
6772 : : ;
6773 : :
6774 : :
6775 : : qual_Op:
6776 : : Op
6777 : : | OPERATOR '(' any_operator ')'
6778 : : ;
6779 : :
6780 : :
6781 : : qual_all_Op:
6782 : : all_Op
6783 : : | OPERATOR '(' any_operator ')'
6784 : : ;
6785 : :
6786 : :
6787 : : subquery_Op:
6788 : : all_Op
6789 : : | OPERATOR '(' any_operator ')'
6790 : : | LIKE
6791 : : | NOT_LA LIKE
6792 : : | ILIKE
6793 : : | NOT_LA ILIKE
6794 : : ;
6795 : :
6796 : :
6797 : : expr_list:
6798 : : a_expr
6799 : : | expr_list ',' a_expr
6800 : : ;
6801 : :
6802 : :
6803 : : func_arg_list:
6804 : : func_arg_expr
6805 : : | func_arg_list ',' func_arg_expr
6806 : : ;
6807 : :
6808 : :
6809 : : func_arg_expr:
6810 : : a_expr
6811 : : | param_name COLON_EQUALS a_expr
6812 : : | param_name EQUALS_GREATER a_expr
6813 : : ;
6814 : :
6815 : :
6816 : : func_arg_list_opt:
6817 : : func_arg_list
6818 : : |
6819 : : ;
6820 : :
6821 : :
6822 : : type_list:
6823 : : Typename
6824 : : | type_list ',' Typename
6825 : : ;
6826 : :
6827 : :
6828 : : array_expr:
6829 : : '[' expr_list ']'
6830 : : | '[' array_expr_list ']'
6831 : : | '[' ']'
6832 : : ;
6833 : :
6834 : :
6835 : : array_expr_list:
6836 : : array_expr
6837 : : | array_expr_list ',' array_expr
6838 : : ;
6839 : :
6840 : :
6841 : : extract_list:
6842 : : extract_arg FROM a_expr
6843 : : ;
6844 : :
6845 : :
6846 : : extract_arg:
6847 : : ecpg_ident
6848 : : | YEAR_P
6849 : : | MONTH_P
6850 : : | DAY_P
6851 : : | HOUR_P
6852 : : | MINUTE_P
6853 : : | SECOND_P
6854 : : | ecpg_sconst
6855 : : ;
6856 : :
6857 : :
6858 : : unicode_normal_form:
6859 : : NFC
6860 : : | NFD
6861 : : | NFKC
6862 : : | NFKD
6863 : : ;
6864 : :
6865 : :
6866 : : overlay_list:
6867 : : a_expr PLACING a_expr FROM a_expr FOR a_expr
6868 : : | a_expr PLACING a_expr FROM a_expr
6869 : : ;
6870 : :
6871 : :
6872 : : position_list:
6873 : : b_expr IN_P b_expr
6874 : : ;
6875 : :
6876 : :
6877 : : substr_list:
6878 : : a_expr FROM a_expr FOR a_expr
6879 : : | a_expr FOR a_expr FROM a_expr
6880 : : | a_expr FROM a_expr
6881 : : | a_expr FOR a_expr
6882 : : | a_expr SIMILAR a_expr ESCAPE a_expr
6883 : : ;
6884 : :
6885 : :
6886 : : trim_list:
6887 : : a_expr FROM expr_list
6888 : : | FROM expr_list
6889 : : | expr_list
6890 : : ;
6891 : :
6892 : :
6893 : : case_expr:
6894 : : CASE case_arg when_clause_list case_default END_P
6895 : : ;
6896 : :
6897 : :
6898 : : when_clause_list:
6899 : : when_clause
6900 : : | when_clause_list when_clause
6901 : : ;
6902 : :
6903 : :
6904 : : when_clause:
6905 : : WHEN a_expr THEN a_expr
6906 : : ;
6907 : :
6908 : :
6909 : : case_default:
6910 : : ELSE a_expr
6911 : : |
6912 : : ;
6913 : :
6914 : :
6915 : : case_arg:
6916 : : a_expr
6917 : : |
6918 : : ;
6919 : :
6920 : :
6921 : : columnref:
6922 : : ColId
6923 : : | ColId indirection
6924 : : ;
6925 : :
6926 : :
6927 : : indirection_el:
6928 : : '.' attr_name
6929 : : | '.' '*'
6930 : : | '[' a_expr ']'
6931 : : | '[' opt_slice_bound ':' opt_slice_bound ']'
6932 : : ;
6933 : :
6934 : :
6935 : : opt_slice_bound:
6936 : : a_expr
6937 : : |
6938 : : ;
6939 : :
6940 : :
6941 : : indirection:
6942 : : indirection_el
6943 : : | indirection indirection_el
6944 : : ;
6945 : :
6946 : :
6947 : : opt_indirection:
6948 : :
6949 : : | opt_indirection indirection_el
6950 : : ;
6951 : :
6952 : :
6953 : : opt_asymmetric:
6954 : : ASYMMETRIC
6955 : : |
6956 : : ;
6957 : :
6958 : :
6959 : : json_passing_clause_opt:
6960 : : PASSING json_arguments
6961 : : |
6962 : : ;
6963 : :
6964 : :
6965 : : json_arguments:
6966 : : json_argument
6967 : : | json_arguments ',' json_argument
6968 : : ;
6969 : :
6970 : :
6971 : : json_argument:
6972 : : json_value_expr AS ColLabel
6973 : : ;
6974 : :
6975 : :
6976 : : json_wrapper_behavior:
6977 : : WITHOUT WRAPPER
6978 : : | WITHOUT ARRAY WRAPPER
6979 : : | WITH WRAPPER
6980 : : | WITH ARRAY WRAPPER
6981 : : | WITH CONDITIONAL ARRAY WRAPPER
6982 : : | WITH UNCONDITIONAL ARRAY WRAPPER
6983 : : | WITH CONDITIONAL WRAPPER
6984 : : | WITH UNCONDITIONAL WRAPPER
6985 : : |
6986 : : ;
6987 : :
6988 : :
6989 : : json_behavior:
6990 : : DEFAULT a_expr
6991 : : | json_behavior_type
6992 : : ;
6993 : :
6994 : :
6995 : : json_behavior_type:
6996 : : ERROR_P
6997 : : | NULL_P
6998 : : | TRUE_P
6999 : : | FALSE_P
7000 : : | UNKNOWN
7001 : : | EMPTY_P ARRAY
7002 : : | EMPTY_P OBJECT_P
7003 : : | EMPTY_P
7004 : : ;
7005 : :
7006 : :
7007 : : json_behavior_clause_opt:
7008 : : json_behavior ON EMPTY_P
7009 : : | json_behavior ON ERROR_P
7010 : : | json_behavior ON EMPTY_P json_behavior ON ERROR_P
7011 : : |
7012 : : ;
7013 : :
7014 : :
7015 : : json_on_error_clause_opt:
7016 : : json_behavior ON ERROR_P
7017 : : |
7018 : : ;
7019 : :
7020 : :
7021 : : json_value_expr:
7022 : : a_expr json_format_clause_opt
7023 : : ;
7024 : :
7025 : :
7026 : : json_format_clause:
7027 : : FORMAT_LA JSON ENCODING name
7028 : : | FORMAT_LA JSON
7029 : : ;
7030 : :
7031 : :
7032 : : json_format_clause_opt:
7033 : : json_format_clause
7034 : : |
7035 : : ;
7036 : :
7037 : :
7038 : : json_quotes_clause_opt:
7039 : : KEEP QUOTES ON SCALAR STRING_P
7040 : : | KEEP QUOTES
7041 : : | OMIT QUOTES ON SCALAR STRING_P
7042 : : | OMIT QUOTES
7043 : : |
7044 : : ;
7045 : :
7046 : :
7047 : : json_returning_clause_opt:
7048 : : RETURNING Typename json_format_clause_opt
7049 : : |
7050 : : ;
7051 : :
7052 : :
7053 : : json_predicate_type_constraint:
7054 : : JSON %prec UNBOUNDED
7055 : : | JSON VALUE_P
7056 : : | JSON ARRAY
7057 : : | JSON OBJECT_P
7058 : : | JSON SCALAR
7059 : : ;
7060 : :
7061 : :
7062 : : json_key_uniqueness_constraint_opt:
7063 : : WITH UNIQUE KEYS
7064 : : | WITH UNIQUE %prec UNBOUNDED
7065 : : | WITHOUT UNIQUE KEYS
7066 : : | WITHOUT UNIQUE %prec UNBOUNDED
7067 : : | %prec UNBOUNDED
7068 : : ;
7069 : :
7070 : :
7071 : : json_name_and_value_list:
7072 : : json_name_and_value
7073 : : | json_name_and_value_list ',' json_name_and_value
7074 : : ;
7075 : :
7076 : :
7077 : : json_name_and_value:
7078 : : c_expr VALUE_P json_value_expr
7079 : : | a_expr ':' json_value_expr
7080 : : ;
7081 : :
7082 : :
7083 : : json_object_constructor_null_clause_opt:
7084 : : NULL_P ON NULL_P
7085 : : | ABSENT ON NULL_P
7086 : : |
7087 : : ;
7088 : :
7089 : :
7090 : : json_array_constructor_null_clause_opt:
7091 : : NULL_P ON NULL_P
7092 : : | ABSENT ON NULL_P
7093 : : |
7094 : : ;
7095 : :
7096 : :
7097 : : json_value_expr_list:
7098 : : json_value_expr
7099 : : | json_value_expr_list ',' json_value_expr
7100 : : ;
7101 : :
7102 : :
7103 : : json_aggregate_func:
7104 : : JSON_OBJECTAGG '(' json_name_and_value json_object_constructor_null_clause_opt json_key_uniqueness_constraint_opt json_returning_clause_opt ')'
7105 : : | JSON_ARRAYAGG '(' json_value_expr json_array_aggregate_order_by_clause_opt json_array_constructor_null_clause_opt json_returning_clause_opt ')'
7106 : : ;
7107 : :
7108 : :
7109 : : json_array_aggregate_order_by_clause_opt:
7110 : : ORDER BY sortby_list
7111 : : |
7112 : : ;
7113 : :
7114 : :
7115 : : graph_pattern:
7116 : : path_pattern_list where_clause
7117 : : ;
7118 : :
7119 : :
7120 : : path_pattern_list:
7121 : : path_pattern
7122 : : | path_pattern_list ',' path_pattern
7123 : : ;
7124 : :
7125 : :
7126 : : path_pattern:
7127 : : path_pattern_expression
7128 : : ;
7129 : :
7130 : :
7131 : : path_pattern_expression:
7132 : : path_term
7133 : : ;
7134 : :
7135 : :
7136 : : path_term:
7137 : : path_factor
7138 : : | path_term path_factor
7139 : : ;
7140 : :
7141 : :
7142 : : path_factor:
7143 : : path_primary opt_graph_pattern_quantifier
7144 : : ;
7145 : :
7146 : :
7147 : : path_primary:
7148 : : '(' opt_colid opt_is_label_expression where_clause ')'
7149 : : | '<' '-' '[' opt_colid opt_is_label_expression where_clause ']' '-'
7150 : : | '-' '[' opt_colid opt_is_label_expression where_clause ']' '-' '>'
7151 : : | '-' '[' opt_colid opt_is_label_expression where_clause ']' RIGHT_ARROW
7152 : : | '-' '[' opt_colid opt_is_label_expression where_clause ']' '-'
7153 : : | '<' '-'
7154 : : | '-' '>'
7155 : : | RIGHT_ARROW
7156 : : | '-'
7157 : : | '(' path_pattern_expression where_clause ')'
7158 : : ;
7159 : :
7160 : :
7161 : : opt_colid:
7162 : : ColId
7163 : : |
7164 : : ;
7165 : :
7166 : :
7167 : : opt_is_label_expression:
7168 : : IS label_expression
7169 : : |
7170 : : ;
7171 : :
7172 : :
7173 : : opt_graph_pattern_quantifier:
7174 : : '{' Iconst '}'
7175 : : | '{' ',' Iconst '}'
7176 : : | '{' Iconst ',' Iconst '}'
7177 : : |
7178 : : ;
7179 : :
7180 : :
7181 : : label_expression:
7182 : : label_term
7183 : : | label_disjunction
7184 : : ;
7185 : :
7186 : :
7187 : : label_disjunction:
7188 : : label_expression '|' label_term
7189 : : ;
7190 : :
7191 : :
7192 : : label_term:
7193 : : name
7194 : : ;
7195 : :
7196 : :
7197 : : opt_target_list:
7198 : : target_list
7199 : : |
7200 : : ;
7201 : :
7202 : :
7203 : : target_list:
7204 : : target_el
7205 : : | target_list ',' target_el
7206 : : ;
7207 : :
7208 : :
7209 : : target_el:
7210 : : a_expr AS ColLabel
7211 : : | a_expr BareColLabel
7212 : : | a_expr
7213 : : | '*'
7214 : : ;
7215 : :
7216 : :
7217 : : qualified_name_list:
7218 : : qualified_name
7219 : : | qualified_name_list ',' qualified_name
7220 : : ;
7221 : :
7222 : :
7223 : : qualified_name:
7224 : : ColId
7225 : : | ColId indirection
7226 : : ;
7227 : :
7228 : :
7229 : : name_list:
7230 : : name
7231 : : | name_list ',' name
7232 : : ;
7233 : :
7234 : :
7235 : : name:
7236 : : ColId
7237 : : ;
7238 : :
7239 : :
7240 : : attr_name:
7241 : : ColLabel
7242 : : ;
7243 : :
7244 : :
7245 : : file_name:
7246 : : ecpg_sconst
7247 : : ;
7248 : :
7249 : :
7250 : : func_name:
7251 : : type_function_name
7252 : : | ColId indirection
7253 : : ;
7254 : :
7255 : :
7256 : : AexprConst:
7257 : : Iconst
7258 : : | ecpg_fconst
7259 : : | ecpg_sconst
7260 : : | ecpg_bconst
7261 : : | ecpg_xconst
7262 : : | func_name ecpg_sconst
7263 : : | func_name '(' func_arg_list opt_sort_clause ')' ecpg_sconst
7264 : : | ConstTypename ecpg_sconst
7265 : : | ConstInterval ecpg_sconst opt_interval
7266 : : | ConstInterval '(' Iconst ')' ecpg_sconst
7267 : : | TRUE_P
7268 : : | FALSE_P
7269 : : | NULL_P
7270 : : | civar
7271 : : | civarind
7272 : : ;
7273 : :
7274 : :
7275 : : Iconst:
7276 : : ICONST
7277 : : ;
7278 : :
7279 : :
7280 : : SignedIconst:
7281 : : Iconst
7282 : : | civar
7283 : : | '+' Iconst
7284 : : | '-' Iconst
7285 : : ;
7286 : :
7287 : :
7288 : : RoleId:
7289 : : RoleSpec
7290 : : ;
7291 : :
7292 : :
7293 : : RoleSpec:
7294 : : NonReservedWord
7295 : : | CURRENT_ROLE
7296 : : | CURRENT_USER
7297 : : | SESSION_USER
7298 : : ;
7299 : :
7300 : :
7301 : : role_list:
7302 : : RoleSpec
7303 : : | role_list ',' RoleSpec
7304 : : ;
7305 : :
7306 : :
7307 : : NonReservedWord:
7308 : : ecpg_ident
7309 : : | unreserved_keyword
7310 : : | col_name_keyword
7311 : : | type_func_name_keyword
7312 : : ;
7313 : :
7314 : :
7315 : : BareColLabel:
7316 : : ecpg_ident
7317 : : | bare_label_keyword
7318 : : ;
7319 : :
7320 : :
7321 : : unreserved_keyword:
7322 : : ABORT_P
7323 : : | ABSENT
7324 : : | ABSOLUTE_P
7325 : : | ACCESS
7326 : : | ACTION
7327 : : | ADD_P
7328 : : | ADMIN
7329 : : | AFTER
7330 : : | AGGREGATE
7331 : : | ALSO
7332 : : | ALTER
7333 : : | ALWAYS
7334 : : | ASENSITIVE
7335 : : | ASSERTION
7336 : : | ASSIGNMENT
7337 : : | AT
7338 : : | ATOMIC
7339 : : | ATTACH
7340 : : | ATTRIBUTE
7341 : : | BACKWARD
7342 : : | BEFORE
7343 : : | BEGIN_P
7344 : : | BREADTH
7345 : : | BY
7346 : : | CACHE
7347 : : | CALL
7348 : : | CALLED
7349 : : | CASCADE
7350 : : | CASCADED
7351 : : | CATALOG_P
7352 : : | CHAIN
7353 : : | CHARACTERISTICS
7354 : : | CHECKPOINT
7355 : : | CLASS
7356 : : | CLOSE
7357 : : | CLUSTER
7358 : : | COLUMNS
7359 : : | COMMENT
7360 : : | COMMENTS
7361 : : | COMMIT
7362 : : | COMMITTED
7363 : : | COMPRESSION
7364 : : | CONDITIONAL
7365 : : | CONFIGURATION
7366 : : | CONFLICT
7367 : : | CONSTRAINTS
7368 : : | CONTENT_P
7369 : : | CONTINUE_P
7370 : : | CONVERSION_P
7371 : : | COPY
7372 : : | COST
7373 : : | CSV
7374 : : | CUBE
7375 : : | CURSOR
7376 : : | CYCLE
7377 : : | DATA_P
7378 : : | DATABASE
7379 : : | DEALLOCATE
7380 : : | DECLARE
7381 : : | DEFAULTS
7382 : : | DEFERRED
7383 : : | DEFINER
7384 : : | DELETE_P
7385 : : | DELIMITER
7386 : : | DELIMITERS
7387 : : | DEPENDS
7388 : : | DEPTH
7389 : : | DESTINATION
7390 : : | DETACH
7391 : : | DICTIONARY
7392 : : | DISABLE_P
7393 : : | DISCARD
7394 : : | DOCUMENT_P
7395 : : | DOMAIN_P
7396 : : | DOUBLE_P
7397 : : | DROP
7398 : : | EACH
7399 : : | EDGE
7400 : : | EMPTY_P
7401 : : | ENABLE_P
7402 : : | ENCODING
7403 : : | ENCRYPTED
7404 : : | ENFORCED
7405 : : | ENUM_P
7406 : : | ERROR_P
7407 : : | ESCAPE
7408 : : | EVENT
7409 : : | EXCLUDE
7410 : : | EXCLUDING
7411 : : | EXCLUSIVE
7412 : : | EXECUTE
7413 : : | EXPLAIN
7414 : : | EXPRESSION
7415 : : | EXTENSION
7416 : : | EXTERNAL
7417 : : | FAMILY
7418 : : | FILTER
7419 : : | FINALIZE
7420 : : | FIRST_P
7421 : : | FOLLOWING
7422 : : | FORCE
7423 : : | FORMAT
7424 : : | FORWARD
7425 : : | FUNCTION
7426 : : | FUNCTIONS
7427 : : | GENERATED
7428 : : | GLOBAL
7429 : : | GRANTED
7430 : : | GRAPH
7431 : : | GROUPS
7432 : : | HANDLER
7433 : : | HEADER_P
7434 : : | HOLD
7435 : : | IDENTITY_P
7436 : : | IF_P
7437 : : | IGNORE_P
7438 : : | IMMEDIATE
7439 : : | IMMUTABLE
7440 : : | IMPLICIT_P
7441 : : | IMPORT_P
7442 : : | INCLUDE
7443 : : | INCLUDING
7444 : : | INCREMENT
7445 : : | INDENT
7446 : : | INDEX
7447 : : | INDEXES
7448 : : | INHERIT
7449 : : | INHERITS
7450 : : | INLINE_P
7451 : : | INSENSITIVE
7452 : : | INSERT
7453 : : | INSTEAD
7454 : : | INVOKER
7455 : : | ISOLATION
7456 : : | KEEP
7457 : : | KEY
7458 : : | KEYS
7459 : : | LABEL
7460 : : | LANGUAGE
7461 : : | LARGE_P
7462 : : | LAST_P
7463 : : | LEAKPROOF
7464 : : | LEVEL
7465 : : | LISTEN
7466 : : | LOAD
7467 : : | LOCAL
7468 : : | LOCATION
7469 : : | LOCK_P
7470 : : | LOCKED
7471 : : | LOGGED
7472 : : | LSN_P
7473 : : | MAPPING
7474 : : | MATCH
7475 : : | MATCHED
7476 : : | MATERIALIZED
7477 : : | MAXVALUE
7478 : : | MERGE
7479 : : | METHOD
7480 : : | MINVALUE
7481 : : | MODE
7482 : : | MOVE
7483 : : | NAME_P
7484 : : | NAMES
7485 : : | NESTED
7486 : : | NEW
7487 : : | NEXT
7488 : : | NFC
7489 : : | NFD
7490 : : | NFKC
7491 : : | NFKD
7492 : : | NO
7493 : : | NODE
7494 : : | NORMALIZED
7495 : : | NOTHING
7496 : : | NOTIFY
7497 : : | NOWAIT
7498 : : | NULLS_P
7499 : : | OBJECT_P
7500 : : | OBJECTS_P
7501 : : | OF
7502 : : | OFF
7503 : : | OIDS
7504 : : | OLD
7505 : : | OMIT
7506 : : | OPERATOR
7507 : : | OPTION
7508 : : | OPTIONS
7509 : : | ORDINALITY
7510 : : | OTHERS
7511 : : | OVER
7512 : : | OVERRIDING
7513 : : | OWNED
7514 : : | OWNER
7515 : : | PARALLEL
7516 : : | PARAMETER
7517 : : | PARSER
7518 : : | PARTIAL
7519 : : | PARTITION
7520 : : | PARTITIONS
7521 : : | PASSING
7522 : : | PASSWORD
7523 : : | PATH
7524 : : | PERIOD
7525 : : | PLAN
7526 : : | PLANS
7527 : : | POLICY
7528 : : | PORTION
7529 : : | PRECEDING
7530 : : | PREPARE
7531 : : | PREPARED
7532 : : | PRESERVE
7533 : : | PRIOR
7534 : : | PRIVILEGES
7535 : : | PROCEDURAL
7536 : : | PROCEDURE
7537 : : | PROCEDURES
7538 : : | PROGRAM
7539 : : | PROPERTIES
7540 : : | PROPERTY
7541 : : | PUBLICATION
7542 : : | QUOTE
7543 : : | QUOTES
7544 : : | RANGE
7545 : : | READ
7546 : : | REASSIGN
7547 : : | RECURSIVE
7548 : : | REF_P
7549 : : | REFERENCING
7550 : : | REFRESH
7551 : : | REINDEX
7552 : : | RELATIONSHIP
7553 : : | RELATIVE_P
7554 : : | RELEASE
7555 : : | RENAME
7556 : : | REPACK
7557 : : | REPEATABLE
7558 : : | REPLACE
7559 : : | REPLICA
7560 : : | RESET
7561 : : | RESPECT_P
7562 : : | RESTART
7563 : : | RESTRICT
7564 : : | RETURN
7565 : : | RETURNS
7566 : : | REVOKE
7567 : : | ROLE
7568 : : | ROLLBACK
7569 : : | ROLLUP
7570 : : | ROUTINE
7571 : : | ROUTINES
7572 : : | ROWS
7573 : : | RULE
7574 : : | SAVEPOINT
7575 : : | SCALAR
7576 : : | SCHEMA
7577 : : | SCHEMAS
7578 : : | SCROLL
7579 : : | SEARCH
7580 : : | SECURITY
7581 : : | SEQUENCE
7582 : : | SEQUENCES
7583 : : | SERIALIZABLE
7584 : : | SERVER
7585 : : | SESSION
7586 : : | SET
7587 : : | SETS
7588 : : | SHARE
7589 : : | SHOW
7590 : : | SIMPLE
7591 : : | SKIP
7592 : : | SNAPSHOT
7593 : : | SOURCE
7594 : : | SPLIT
7595 : : | SQL_P
7596 : : | STABLE
7597 : : | STANDALONE_P
7598 : : | START
7599 : : | STATEMENT
7600 : : | STATISTICS
7601 : : | STDIN
7602 : : | STDOUT
7603 : : | STORAGE
7604 : : | STORED
7605 : : | STRICT_P
7606 : : | STRING_P
7607 : : | STRIP_P
7608 : : | SUBSCRIPTION
7609 : : | SUPPORT
7610 : : | SYSID
7611 : : | SYSTEM_P
7612 : : | TABLES
7613 : : | TABLESPACE
7614 : : | TARGET
7615 : : | TEMP
7616 : : | TEMPLATE
7617 : : | TEMPORARY
7618 : : | TEXT_P
7619 : : | TIES
7620 : : | TRANSACTION
7621 : : | TRANSFORM
7622 : : | TRIGGER
7623 : : | TRUNCATE
7624 : : | TRUSTED
7625 : : | TYPE_P
7626 : : | TYPES_P
7627 : : | UESCAPE
7628 : : | UNBOUNDED
7629 : : | UNCOMMITTED
7630 : : | UNCONDITIONAL
7631 : : | UNENCRYPTED
7632 : : | UNKNOWN
7633 : : | UNLISTEN
7634 : : | UNLOGGED
7635 : : | UNTIL
7636 : : | UPDATE
7637 : : | VACUUM
7638 : : | VALID
7639 : : | VALIDATE
7640 : : | VALIDATOR
7641 : : | VALUE_P
7642 : : | VARYING
7643 : : | VERSION_P
7644 : : | VERTEX
7645 : : | VIEW
7646 : : | VIEWS
7647 : : | VIRTUAL
7648 : : | VOLATILE
7649 : : | WAIT
7650 : : | WHITESPACE_P
7651 : : | WITHIN
7652 : : | WITHOUT
7653 : : | WORK
7654 : : | WRAPPER
7655 : : | WRITE
7656 : : | XML_P
7657 : : | YES_P
7658 : : | ZONE
7659 : : ;
7660 : :
7661 : :
7662 : : col_name_keyword:
7663 : : BETWEEN
7664 : : | BIGINT
7665 : : | BIT
7666 : : | BOOLEAN_P
7667 : : | CHARACTER
7668 : : | COALESCE
7669 : : | DEC
7670 : : | DECIMAL_P
7671 : : | EXISTS
7672 : : | EXTRACT
7673 : : | FLOAT_P
7674 : : | GRAPH_TABLE
7675 : : | GREATEST
7676 : : | GROUPING
7677 : : | INOUT
7678 : : | INTEGER
7679 : : | INTERVAL
7680 : : | JSON
7681 : : | JSON_ARRAY
7682 : : | JSON_ARRAYAGG
7683 : : | JSON_EXISTS
7684 : : | JSON_OBJECT
7685 : : | JSON_OBJECTAGG
7686 : : | JSON_QUERY
7687 : : | JSON_SCALAR
7688 : : | JSON_SERIALIZE
7689 : : | JSON_TABLE
7690 : : | JSON_VALUE
7691 : : | LEAST
7692 : : | MERGE_ACTION
7693 : : | NATIONAL
7694 : : | NCHAR
7695 : : | NONE
7696 : : | NORMALIZE
7697 : : | NULLIF
7698 : : | NUMERIC
7699 : : | OUT_P
7700 : : | OVERLAY
7701 : : | POSITION
7702 : : | PRECISION
7703 : : | REAL
7704 : : | ROW
7705 : : | SETOF
7706 : : | SMALLINT
7707 : : | SUBSTRING
7708 : : | TIME
7709 : : | TIMESTAMP
7710 : : | TREAT
7711 : : | TRIM
7712 : : | VARCHAR
7713 : : | XMLATTRIBUTES
7714 : : | XMLCONCAT
7715 : : | XMLELEMENT
7716 : : | XMLEXISTS
7717 : : | XMLFOREST
7718 : : | XMLNAMESPACES
7719 : : | XMLPARSE
7720 : : | XMLPI
7721 : : | XMLROOT
7722 : : | XMLSERIALIZE
7723 : : | XMLTABLE
7724 : : ;
7725 : :
7726 : :
7727 : : type_func_name_keyword:
7728 : : AUTHORIZATION
7729 : : | BINARY
7730 : : | COLLATION
7731 : : | CONCURRENTLY
7732 : : | CROSS
7733 : : | CURRENT_SCHEMA
7734 : : | FREEZE
7735 : : | FULL
7736 : : | ILIKE
7737 : : | INNER_P
7738 : : | IS
7739 : : | ISNULL
7740 : : | JOIN
7741 : : | LEFT
7742 : : | LIKE
7743 : : | NATURAL
7744 : : | NOTNULL
7745 : : | OUTER_P
7746 : : | OVERLAPS
7747 : : | RIGHT
7748 : : | SIMILAR
7749 : : | TABLESAMPLE
7750 : : | VERBOSE
7751 : : ;
7752 : :
7753 : :
7754 : : reserved_keyword:
7755 : : ALL
7756 : : | ANALYSE
7757 : : | ANALYZE
7758 : : | AND
7759 : : | ANY
7760 : : | ARRAY
7761 : : | AS
7762 : : | ASC
7763 : : | ASYMMETRIC
7764 : : | BOTH
7765 : : | CASE
7766 : : | CAST
7767 : : | CHECK
7768 : : | COLLATE
7769 : : | COLUMN
7770 : : | CONSTRAINT
7771 : : | CREATE
7772 : : | CURRENT_CATALOG
7773 : : | CURRENT_DATE
7774 : : | CURRENT_ROLE
7775 : : | CURRENT_TIME
7776 : : | CURRENT_TIMESTAMP
7777 : : | CURRENT_USER
7778 : : | DEFAULT
7779 : : | DEFERRABLE
7780 : : | DESC
7781 : : | DISTINCT
7782 : : | DO
7783 : : | ELSE
7784 : : | END_P
7785 : : | EXCEPT
7786 : : | FALSE_P
7787 : : | FETCH
7788 : : | FOR
7789 : : | FOREIGN
7790 : : | FROM
7791 : : | GRANT
7792 : : | GROUP_P
7793 : : | HAVING
7794 : : | IN_P
7795 : : | INITIALLY
7796 : : | INTERSECT
7797 : : | INTO
7798 : : | LATERAL_P
7799 : : | LEADING
7800 : : | LIMIT
7801 : : | LOCALTIME
7802 : : | LOCALTIMESTAMP
7803 : : | NOT
7804 : : | NULL_P
7805 : : | OFFSET
7806 : : | ON
7807 : : | ONLY
7808 : : | OR
7809 : : | ORDER
7810 : : | PLACING
7811 : : | PRIMARY
7812 : : | REFERENCES
7813 : : | RETURNING
7814 : : | SELECT
7815 : : | SESSION_USER
7816 : : | SOME
7817 : : | SYMMETRIC
7818 : : | SYSTEM_USER
7819 : : | TABLE
7820 : : | THEN
7821 : : | TRAILING
7822 : : | TRUE_P
7823 : : | UNIQUE
7824 : : | USER
7825 : : | USING
7826 : : | VARIADIC
7827 : : | WHEN
7828 : : | WHERE
7829 : : | WINDOW
7830 : : | WITH
7831 : : ;
7832 : :
7833 : :
7834 : : bare_label_keyword:
7835 : : ABORT_P
7836 : : | ABSENT
7837 : : | ABSOLUTE_P
7838 : : | ACCESS
7839 : : | ACTION
7840 : : | ADD_P
7841 : : | ADMIN
7842 : : | AFTER
7843 : : | AGGREGATE
7844 : : | ALL
7845 : : | ALSO
7846 : : | ALTER
7847 : : | ALWAYS
7848 : : | ANALYSE
7849 : : | ANALYZE
7850 : : | AND
7851 : : | ANY
7852 : : | ASC
7853 : : | ASENSITIVE
7854 : : | ASSERTION
7855 : : | ASSIGNMENT
7856 : : | ASYMMETRIC
7857 : : | AT
7858 : : | ATOMIC
7859 : : | ATTACH
7860 : : | ATTRIBUTE
7861 : : | AUTHORIZATION
7862 : : | BACKWARD
7863 : : | BEFORE
7864 : : | BEGIN_P
7865 : : | BETWEEN
7866 : : | BIGINT
7867 : : | BINARY
7868 : : | BIT
7869 : : | BOOLEAN_P
7870 : : | BOTH
7871 : : | BREADTH
7872 : : | BY
7873 : : | CACHE
7874 : : | CALL
7875 : : | CALLED
7876 : : | CASCADE
7877 : : | CASCADED
7878 : : | CASE
7879 : : | CAST
7880 : : | CATALOG_P
7881 : : | CHAIN
7882 : : | CHARACTERISTICS
7883 : : | CHECK
7884 : : | CHECKPOINT
7885 : : | CLASS
7886 : : | CLOSE
7887 : : | CLUSTER
7888 : : | COALESCE
7889 : : | COLLATE
7890 : : | COLLATION
7891 : : | COLUMN
7892 : : | COLUMNS
7893 : : | COMMENT
7894 : : | COMMENTS
7895 : : | COMMIT
7896 : : | COMMITTED
7897 : : | COMPRESSION
7898 : : | CONCURRENTLY
7899 : : | CONDITIONAL
7900 : : | CONFIGURATION
7901 : : | CONFLICT
7902 : : | CONNECTION
7903 : : | CONSTRAINT
7904 : : | CONSTRAINTS
7905 : : | CONTENT_P
7906 : : | CONTINUE_P
7907 : : | CONVERSION_P
7908 : : | COPY
7909 : : | COST
7910 : : | CROSS
7911 : : | CSV
7912 : : | CUBE
7913 : : | CURRENT_P
7914 : : | CURRENT_CATALOG
7915 : : | CURRENT_DATE
7916 : : | CURRENT_ROLE
7917 : : | CURRENT_SCHEMA
7918 : : | CURRENT_TIME
7919 : : | CURRENT_TIMESTAMP
7920 : : | CURRENT_USER
7921 : : | CURSOR
7922 : : | CYCLE
7923 : : | DATA_P
7924 : : | DATABASE
7925 : : | DEALLOCATE
7926 : : | DEC
7927 : : | DECIMAL_P
7928 : : | DECLARE
7929 : : | DEFAULT
7930 : : | DEFAULTS
7931 : : | DEFERRABLE
7932 : : | DEFERRED
7933 : : | DEFINER
7934 : : | DELETE_P
7935 : : | DELIMITER
7936 : : | DELIMITERS
7937 : : | DEPENDS
7938 : : | DEPTH
7939 : : | DESC
7940 : : | DESTINATION
7941 : : | DETACH
7942 : : | DICTIONARY
7943 : : | DISABLE_P
7944 : : | DISCARD
7945 : : | DISTINCT
7946 : : | DO
7947 : : | DOCUMENT_P
7948 : : | DOMAIN_P
7949 : : | DOUBLE_P
7950 : : | DROP
7951 : : | EACH
7952 : : | EDGE
7953 : : | ELSE
7954 : : | EMPTY_P
7955 : : | ENABLE_P
7956 : : | ENCODING
7957 : : | ENCRYPTED
7958 : : | END_P
7959 : : | ENFORCED
7960 : : | ENUM_P
7961 : : | ERROR_P
7962 : : | ESCAPE
7963 : : | EVENT
7964 : : | EXCLUDE
7965 : : | EXCLUDING
7966 : : | EXCLUSIVE
7967 : : | EXECUTE
7968 : : | EXISTS
7969 : : | EXPLAIN
7970 : : | EXPRESSION
7971 : : | EXTENSION
7972 : : | EXTERNAL
7973 : : | EXTRACT
7974 : : | FALSE_P
7975 : : | FAMILY
7976 : : | FINALIZE
7977 : : | FIRST_P
7978 : : | FLOAT_P
7979 : : | FOLLOWING
7980 : : | FORCE
7981 : : | FOREIGN
7982 : : | FORMAT
7983 : : | FORWARD
7984 : : | FREEZE
7985 : : | FULL
7986 : : | FUNCTION
7987 : : | FUNCTIONS
7988 : : | GENERATED
7989 : : | GLOBAL
7990 : : | GRANTED
7991 : : | GRAPH
7992 : : | GRAPH_TABLE
7993 : : | GREATEST
7994 : : | GROUPING
7995 : : | GROUPS
7996 : : | HANDLER
7997 : : | HEADER_P
7998 : : | HOLD
7999 : : | IDENTITY_P
8000 : : | IF_P
8001 : : | ILIKE
8002 : : | IMMEDIATE
8003 : : | IMMUTABLE
8004 : : | IMPLICIT_P
8005 : : | IMPORT_P
8006 : : | IN_P
8007 : : | INCLUDE
8008 : : | INCLUDING
8009 : : | INCREMENT
8010 : : | INDENT
8011 : : | INDEX
8012 : : | INDEXES
8013 : : | INHERIT
8014 : : | INHERITS
8015 : : | INITIALLY
8016 : : | INLINE_P
8017 : : | INNER_P
8018 : : | INOUT
8019 : : | INPUT_P
8020 : : | INSENSITIVE
8021 : : | INSERT
8022 : : | INSTEAD
8023 : : | INT_P
8024 : : | INTEGER
8025 : : | INTERVAL
8026 : : | INVOKER
8027 : : | IS
8028 : : | ISOLATION
8029 : : | JOIN
8030 : : | JSON
8031 : : | JSON_ARRAY
8032 : : | JSON_ARRAYAGG
8033 : : | JSON_EXISTS
8034 : : | JSON_OBJECT
8035 : : | JSON_OBJECTAGG
8036 : : | JSON_QUERY
8037 : : | JSON_SCALAR
8038 : : | JSON_SERIALIZE
8039 : : | JSON_TABLE
8040 : : | JSON_VALUE
8041 : : | KEEP
8042 : : | KEY
8043 : : | KEYS
8044 : : | LABEL
8045 : : | LANGUAGE
8046 : : | LARGE_P
8047 : : | LAST_P
8048 : : | LATERAL_P
8049 : : | LEADING
8050 : : | LEAKPROOF
8051 : : | LEAST
8052 : : | LEFT
8053 : : | LEVEL
8054 : : | LIKE
8055 : : | LISTEN
8056 : : | LOAD
8057 : : | LOCAL
8058 : : | LOCALTIME
8059 : : | LOCALTIMESTAMP
8060 : : | LOCATION
8061 : : | LOCK_P
8062 : : | LOCKED
8063 : : | LOGGED
8064 : : | LSN_P
8065 : : | MAPPING
8066 : : | MATCH
8067 : : | MATCHED
8068 : : | MATERIALIZED
8069 : : | MAXVALUE
8070 : : | MERGE
8071 : : | MERGE_ACTION
8072 : : | METHOD
8073 : : | MINVALUE
8074 : : | MODE
8075 : : | MOVE
8076 : : | NAME_P
8077 : : | NAMES
8078 : : | NATIONAL
8079 : : | NATURAL
8080 : : | NCHAR
8081 : : | NESTED
8082 : : | NEW
8083 : : | NEXT
8084 : : | NFC
8085 : : | NFD
8086 : : | NFKC
8087 : : | NFKD
8088 : : | NO
8089 : : | NODE
8090 : : | NONE
8091 : : | NORMALIZE
8092 : : | NORMALIZED
8093 : : | NOT
8094 : : | NOTHING
8095 : : | NOTIFY
8096 : : | NOWAIT
8097 : : | NULL_P
8098 : : | NULLIF
8099 : : | NULLS_P
8100 : : | NUMERIC
8101 : : | OBJECT_P
8102 : : | OBJECTS_P
8103 : : | OF
8104 : : | OFF
8105 : : | OIDS
8106 : : | OLD
8107 : : | OMIT
8108 : : | ONLY
8109 : : | OPERATOR
8110 : : | OPTION
8111 : : | OPTIONS
8112 : : | OR
8113 : : | ORDINALITY
8114 : : | OTHERS
8115 : : | OUT_P
8116 : : | OUTER_P
8117 : : | OVERLAY
8118 : : | OVERRIDING
8119 : : | OWNED
8120 : : | OWNER
8121 : : | PARALLEL
8122 : : | PARAMETER
8123 : : | PARSER
8124 : : | PARTIAL
8125 : : | PARTITION
8126 : : | PARTITIONS
8127 : : | PASSING
8128 : : | PASSWORD
8129 : : | PATH
8130 : : | PERIOD
8131 : : | PLACING
8132 : : | PLAN
8133 : : | PLANS
8134 : : | POLICY
8135 : : | PORTION
8136 : : | POSITION
8137 : : | PRECEDING
8138 : : | PREPARE
8139 : : | PREPARED
8140 : : | PRESERVE
8141 : : | PRIMARY
8142 : : | PRIOR
8143 : : | PRIVILEGES
8144 : : | PROCEDURAL
8145 : : | PROCEDURE
8146 : : | PROCEDURES
8147 : : | PROGRAM
8148 : : | PROPERTIES
8149 : : | PROPERTY
8150 : : | PUBLICATION
8151 : : | QUOTE
8152 : : | QUOTES
8153 : : | RANGE
8154 : : | READ
8155 : : | REAL
8156 : : | REASSIGN
8157 : : | RECURSIVE
8158 : : | REF_P
8159 : : | REFERENCES
8160 : : | REFERENCING
8161 : : | REFRESH
8162 : : | REINDEX
8163 : : | RELATIONSHIP
8164 : : | RELATIVE_P
8165 : : | RELEASE
8166 : : | RENAME
8167 : : | REPACK
8168 : : | REPEATABLE
8169 : : | REPLACE
8170 : : | REPLICA
8171 : : | RESET
8172 : : | RESTART
8173 : : | RESTRICT
8174 : : | RETURN
8175 : : | RETURNS
8176 : : | REVOKE
8177 : : | RIGHT
8178 : : | ROLE
8179 : : | ROLLBACK
8180 : : | ROLLUP
8181 : : | ROUTINE
8182 : : | ROUTINES
8183 : : | ROW
8184 : : | ROWS
8185 : : | RULE
8186 : : | SAVEPOINT
8187 : : | SCALAR
8188 : : | SCHEMA
8189 : : | SCHEMAS
8190 : : | SCROLL
8191 : : | SEARCH
8192 : : | SECURITY
8193 : : | SELECT
8194 : : | SEQUENCE
8195 : : | SEQUENCES
8196 : : | SERIALIZABLE
8197 : : | SERVER
8198 : : | SESSION
8199 : : | SESSION_USER
8200 : : | SET
8201 : : | SETOF
8202 : : | SETS
8203 : : | SHARE
8204 : : | SHOW
8205 : : | SIMILAR
8206 : : | SIMPLE
8207 : : | SKIP
8208 : : | SMALLINT
8209 : : | SNAPSHOT
8210 : : | SOME
8211 : : | SOURCE
8212 : : | SPLIT
8213 : : | SQL_P
8214 : : | STABLE
8215 : : | STANDALONE_P
8216 : : | START
8217 : : | STATEMENT
8218 : : | STATISTICS
8219 : : | STDIN
8220 : : | STDOUT
8221 : : | STORAGE
8222 : : | STORED
8223 : : | STRICT_P
8224 : : | STRING_P
8225 : : | STRIP_P
8226 : : | SUBSCRIPTION
8227 : : | SUBSTRING
8228 : : | SUPPORT
8229 : : | SYMMETRIC
8230 : : | SYSID
8231 : : | SYSTEM_P
8232 : : | SYSTEM_USER
8233 : : | TABLE
8234 : : | TABLES
8235 : : | TABLESAMPLE
8236 : : | TABLESPACE
8237 : : | TARGET
8238 : : | TEMP
8239 : : | TEMPLATE
8240 : : | TEMPORARY
8241 : : | TEXT_P
8242 : : | THEN
8243 : : | TIES
8244 : : | TIME
8245 : : | TIMESTAMP
8246 : : | TRAILING
8247 : : | TRANSACTION
8248 : : | TRANSFORM
8249 : : | TREAT
8250 : : | TRIGGER
8251 : : | TRIM
8252 : : | TRUE_P
8253 : : | TRUNCATE
8254 : : | TRUSTED
8255 : : | TYPE_P
8256 : : | TYPES_P
8257 : : | UESCAPE
8258 : : | UNBOUNDED
8259 : : | UNCOMMITTED
8260 : : | UNCONDITIONAL
8261 : : | UNENCRYPTED
8262 : : | UNIQUE
8263 : : | UNKNOWN
8264 : : | UNLISTEN
8265 : : | UNLOGGED
8266 : : | UNTIL
8267 : : | UPDATE
8268 : : | USER
8269 : : | USING
8270 : : | VACUUM
8271 : : | VALID
8272 : : | VALIDATE
8273 : : | VALIDATOR
8274 : : | VALUE_P
8275 : : | VALUES
8276 : : | VARCHAR
8277 : : | VARIADIC
8278 : : | VERBOSE
8279 : : | VERSION_P
8280 : : | VERTEX
8281 : : | VIEW
8282 : : | VIEWS
8283 : : | VIRTUAL
8284 : : | VOLATILE
8285 : : | WAIT
8286 : : | WHEN
8287 : : | WHITESPACE_P
8288 : : | WORK
8289 : : | WRAPPER
8290 : : | WRITE
8291 : : | XML_P
8292 : : | XMLATTRIBUTES
8293 : : | XMLCONCAT
8294 : : | XMLELEMENT
8295 : : | XMLEXISTS
8296 : : | XMLFOREST
8297 : : | XMLNAMESPACES
8298 : : | XMLPARSE
8299 : : | XMLPI
8300 : : | XMLROOT
8301 : : | XMLSERIALIZE
8302 : : | XMLTABLE
8303 : : | YES_P
8304 : : | ZONE
8305 : : ;
8306 : :
8307 : :
8308 : : /* trailer */
8309 : : /* src/interfaces/ecpg/preproc/ecpg.trailer */
8310 : :
8311 : : statements: /* EMPTY */
8312 : : | statements statement
8313 : : {
8314 : : /* Reclaim local storage used while processing statement */
8315 : 24480 : reclaim_local_storage();
8316 : : /* Clean up now-dangling location pointer */
8317 : 24480 : @$ = "";
8318 : : }
8319 : : ;
8320 : :
8321 : : statement: ecpgstart at toplevel_stmt ';'
8322 : : {
8323 [ + - ]: 109 : if (connection)
8324 : 109 : free(connection);
8325 : 109 : connection = NULL;
8326 : : }
8327 : : | ecpgstart toplevel_stmt ';'
8328 : : {
8329 [ + + ]: 1142 : if (connection)
8330 : 13 : free(connection);
8331 : 1142 : connection = NULL;
8332 : : }
8333 : : | ecpgstart ECPGVarDeclaration
8334 : : {
8335 : 24 : fprintf(base_yyout, "%s", @$);
8336 : 24 : output_line_number();
8337 : : }
8338 : : | ECPGDeclaration
8339 : : | c_thing
8340 : : {
8341 : 21738 : fprintf(base_yyout, "%s", @$);
8342 : : }
8343 : : | CPP_LINE
8344 : : {
8345 : 731 : fprintf(base_yyout, "%s", @$);
8346 : : }
8347 : : | '{'
8348 : : {
8349 : 335 : braces_open++;
8350 : 335 : fputs("{", base_yyout);
8351 : : }
8352 : : | '}'
8353 : : {
8354 [ + - ]: 334 : if (braces_open > 0)
8355 : : {
8356 : 334 : remove_typedefs(braces_open);
8357 : 334 : remove_variables(braces_open);
8358 [ + + ]: 334 : if (--braces_open == 0)
8359 : : {
8360 : 148 : free(current_function);
8361 : 148 : current_function = NULL;
8362 : : }
8363 : : }
8364 : 334 : fputs("}", base_yyout);
8365 : : }
8366 : : ;
8367 : :
8368 : : CreateAsStmt: CREATE OptTemp TABLE create_as_target AS
8369 : : {
8370 : 1 : FoundInto = 0;
8371 : : } SelectStmt opt_with_data
8372 : : {
8373 [ - + ]: 1 : if (FoundInto == 1)
8374 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
8375 : : }
8376 : : | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS
8377 : : {
8378 : 1 : FoundInto = 0;
8379 : : } SelectStmt opt_with_data
8380 : : {
8381 [ - + ]: 1 : if (FoundInto == 1)
8382 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE AS cannot specify INTO");
8383 : : }
8384 : : ;
8385 : :
8386 : : at: AT connection_object
8387 : : {
8388 [ - + ]: 109 : if (connection)
8389 : 0 : free(connection);
8390 : 109 : connection = mm_strdup(@2);
8391 : :
8392 : : /*
8393 : : * Do we have a variable as connection target? Remove the variable
8394 : : * from the variable list or else it will be used twice.
8395 : : */
8396 [ - + ]: 109 : if (argsinsert != NULL)
8397 : 0 : argsinsert = NULL;
8398 : : }
8399 : : ;
8400 : :
8401 : : /*
8402 : : * the exec sql connect statement: connect to the given database
8403 : : */
8404 : : ECPGConnect: SQL_CONNECT TO connection_target opt_connection_name opt_user
8405 : : {
8406 : 98 : @$ = cat_str(5, @3, ",", @5, ",", @4);
8407 : : }
8408 : : | SQL_CONNECT TO DEFAULT
8409 : : {
8410 : 0 : @$ = "NULL, NULL, NULL, \"DEFAULT\"";
8411 : : }
8412 : : /* also allow ORACLE syntax */
8413 : : | SQL_CONNECT ora_user
8414 : : {
8415 : 0 : @$ = cat_str(3, "NULL,", @2, ", NULL");
8416 : : }
8417 : : | DATABASE connection_target
8418 : : {
8419 : 0 : @$ = cat2_str(@2, ", NULL, NULL, NULL");
8420 : : }
8421 : : ;
8422 : :
8423 : : connection_target: opt_database_name opt_server opt_port
8424 : : {
8425 : : /* old style: dbname[@server][:port] */
8426 [ + + - + ]: 84 : if (strlen(@2) > 0 && *(@2) != '@')
8427 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\", found \"%s\"", @2);
8428 : :
8429 : : /* C strings need to be handled differently */
8430 [ + + ]: 84 : if (@1[0] == '\"')
8431 : 5 : @$ = @1;
8432 : : else
8433 : 79 : @$ = make3_str("\"", make3_str(@1, @2, @3), "\"");
8434 : : }
8435 : : | db_prefix ':' server opt_port '/' opt_database_name opt_options
8436 : : {
8437 : : /* new style: <tcp|unix>:postgresql://server[:port][/dbname] */
8438 [ + + - + ]: 9 : if (strncmp(@1, "unix:postgresql", strlen("unix:postgresql")) != 0 && strncmp(@1, "tcp:postgresql", strlen("tcp:postgresql")) != 0)
8439 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported");
8440 : :
8441 [ - + ]: 9 : if (strncmp(@3, "//", strlen("//")) != 0)
8442 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "expected \"://\", found \"%s\"", @3);
8443 : :
8444 [ + + ]: 9 : if (strncmp(@1, "unix", strlen("unix")) == 0 &&
8445 [ - + ]: 5 : strncmp(@3 + strlen("//"), "localhost", strlen("localhost")) != 0 &&
8446 [ # # ]: 0 : strncmp(@3 + strlen("//"), "127.0.0.1", strlen("127.0.0.1")) != 0)
8447 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "Unix-domain sockets only work on \"localhost\" but not on \"%s\"", @3 + strlen("//"));
8448 : :
8449 : 9 : @$ = make3_str(make3_str("\"", @1, ":"), @3, make3_str(make3_str(@4, "/", @6), @7, "\""));
8450 : : }
8451 : : | char_variable
8452 : : | ecpg_sconst
8453 : : {
8454 : : /*
8455 : : * We can only process double quoted strings not single quoted ones,
8456 : : * so we change the quotes. Note that the rule for ecpg_sconst adds
8457 : : * these single quotes.
8458 : : */
8459 : 2 : char *str = loc_strdup(@1);
8460 : :
8461 : 2 : str[0] = '\"';
8462 : 2 : str[strlen(str) - 1] = '\"';
8463 : 2 : @$ = str;
8464 : : }
8465 : : ;
8466 : :
8467 : : opt_database_name: name
8468 : : | /* EMPTY */
8469 : : ;
8470 : :
8471 : : db_prefix: ecpg_ident cvariable
8472 : : {
8473 [ - + - - ]: 9 : if (strcmp(@2, "postgresql") != 0 && strcmp(@2, "postgres") != 0)
8474 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "expected \"postgresql\", found \"%s\"", @2);
8475 : :
8476 [ + + - + ]: 9 : if (strcmp(@1, "tcp") != 0 && strcmp(@1, "unix") != 0)
8477 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "invalid connection type: %s", @1);
8478 : :
8479 : 9 : @$ = make3_str(@1, ":", @2);
8480 : : }
8481 : : ;
8482 : :
8483 : : server: Op server_name
8484 : : {
8485 [ + + - + ]: 11 : if (strcmp(@1, "@") != 0 && strcmp(@1, "//") != 0)
8486 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "expected \"@\" or \"://\", found \"%s\"", @1);
8487 : :
8488 : 11 : @$ = make2_str(@1, @2);
8489 : : }
8490 : : ;
8491 : :
8492 : : opt_server: server
8493 : : | /* EMPTY */
8494 : : ;
8495 : :
8496 : : server_name: ColId
8497 : : | ColId '.' server_name
8498 : : | IP
8499 : : ;
8500 : :
8501 : : opt_port: ':' Iconst
8502 : : {
8503 : 1 : @$ = make2_str(":", @2);
8504 : : }
8505 : : | /* EMPTY */
8506 : : ;
8507 : :
8508 : : opt_connection_name: AS connection_object
8509 : : {
8510 : 42 : @$ = @2;
8511 : : }
8512 : : | /* EMPTY */
8513 : : {
8514 : 56 : @$ = "NULL";
8515 : : }
8516 : : ;
8517 : :
8518 : : opt_user: USER ora_user
8519 : : {
8520 : 16 : @$ = @2;
8521 : : }
8522 : : | /* EMPTY */
8523 : : {
8524 : 82 : @$ = "NULL, NULL";
8525 : : }
8526 : : ;
8527 : :
8528 : : ora_user: user_name
8529 : : {
8530 : 3 : @$ = cat2_str(@1, ", NULL");
8531 : : }
8532 : : | user_name '/' user_name
8533 : : {
8534 : 5 : @$ = cat_str(3, @1, ",", @3);
8535 : : }
8536 : : | user_name SQL_IDENTIFIED BY user_name
8537 : : {
8538 : 5 : @$ = cat_str(3, @1, ",", @4);
8539 : : }
8540 : : | user_name USING user_name
8541 : : {
8542 : 3 : @$ = cat_str(3, @1, ",", @3);
8543 : : }
8544 : : ;
8545 : :
8546 : : user_name: RoleId
8547 : : {
8548 [ + + ]: 27 : if (@1[0] == '\"')
8549 : 3 : @$ = @1;
8550 : : else
8551 : 24 : @$ = make3_str("\"", @1, "\"");
8552 : : }
8553 : : | ecpg_sconst
8554 : : {
8555 [ # # ]: 0 : if (@1[0] == '\"')
8556 : 0 : @$ = @1;
8557 : : else
8558 : 0 : @$ = make3_str("\"", @1, "\"");
8559 : : }
8560 : : | civar
8561 : : {
8562 : 2 : enum ECPGttype type = argsinsert->variable->type->type;
8563 : :
8564 : : /* if array see what's inside */
8565 [ - + ]: 2 : if (type == ECPGt_array)
8566 : 0 : type = argsinsert->variable->type->u.element->type;
8567 : :
8568 : : /* handle varchars */
8569 [ - + ]: 2 : if (type == ECPGt_varchar)
8570 : 0 : @$ = make2_str(argsinsert->variable->name, ".arr");
8571 : : else
8572 : 2 : @$ = argsinsert->variable->name;
8573 : : }
8574 : : ;
8575 : :
8576 : : char_variable: cvariable
8577 : : {
8578 : : /* check if we have a string variable */
8579 : 132 : struct variable *p = find_variable(@1);
8580 : 132 : enum ECPGttype type = p->type->type;
8581 : :
8582 : : /* If we have just one character this is not a string */
8583 [ - + ]: 132 : if (atol(p->type->size) == 1)
8584 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
8585 : : else
8586 : : {
8587 : : /* if array see what's inside */
8588 [ - + ]: 132 : if (type == ECPGt_array)
8589 : 0 : type = p->type->u.element->type;
8590 : :
8591 [ + + - ]: 132 : switch (type)
8592 : : {
8593 : 122 : case ECPGt_char:
8594 : : case ECPGt_unsigned_char:
8595 : : case ECPGt_string:
8596 : 122 : @$ = @1;
8597 : 122 : break;
8598 : 10 : case ECPGt_varchar:
8599 : 10 : @$ = make2_str(@1, ".arr");
8600 : 10 : break;
8601 : 0 : default:
8602 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "invalid data type");
8603 : 0 : @$ = @1;
8604 : 0 : break;
8605 : : }
8606 : : }
8607 : : }
8608 : : ;
8609 : :
8610 : : opt_options: Op connect_options
8611 : : {
8612 [ - + ]: 2 : if (strlen(@1) == 0)
8613 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
8614 : :
8615 [ - + ]: 2 : if (strcmp(@1, "?") != 0)
8616 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", @1);
8617 : :
8618 : 2 : @$ = make2_str("?", @2);
8619 : : }
8620 : : | /* EMPTY */
8621 : : ;
8622 : :
8623 : : connect_options: ColId opt_opt_value
8624 : : {
8625 : 2 : @$ = make2_str(@1, @2);
8626 : : }
8627 : : | ColId opt_opt_value Op connect_options
8628 : : {
8629 [ - + ]: 1 : if (strlen(@3) == 0)
8630 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "incomplete statement");
8631 : :
8632 [ - + ]: 1 : if (strcmp(@3, "&") != 0)
8633 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "unrecognized token \"%s\"", @3);
8634 : :
8635 : 1 : @$ = make3_str(make2_str(@1, @2), @3, @4);
8636 : : }
8637 : : ;
8638 : :
8639 : : opt_opt_value: /* EMPTY */
8640 : : | '=' Iconst
8641 : : {
8642 : 2 : @$ = make2_str("=", @2);
8643 : : }
8644 : : | '=' ecpg_ident
8645 : : {
8646 : 1 : @$ = make2_str("=", @2);
8647 : : }
8648 : : | '=' civar
8649 : : {
8650 : 0 : @$ = make2_str("=", @2);
8651 : : }
8652 : : ;
8653 : :
8654 : : prepared_name: name
8655 : : {
8656 : 162 : size_t slen = strlen(@1);
8657 : :
8658 [ + + + - ]: 162 : if (@1[0] == '\"' && @1[slen - 1] == '\"') /* already quoted? */
8659 : 25 : @$ = @1;
8660 : : else /* not quoted => convert to lowercase */
8661 : : {
8662 : 137 : char *str = loc_alloc(slen + 3);
8663 : :
8664 : 137 : str[0] = '\"';
8665 [ + + ]: 888 : for (size_t i = 0; i < slen; i++)
8666 : 751 : str[i + 1] = tolower((unsigned char) @1[i]);
8667 : 137 : str[slen + 1] = '\"';
8668 : 137 : str[slen + 2] = '\0';
8669 : 137 : @$ = str;
8670 : : }
8671 : : }
8672 : : | char_variable
8673 : : ;
8674 : :
8675 : : /*
8676 : : * Declare Statement
8677 : : */
8678 : : ECPGDeclareStmt: DECLARE prepared_name STATEMENT
8679 : : {
8680 : : struct declared_list *ptr;
8681 : :
8682 : : /* Check whether the declared name has been defined or not */
8683 [ + + ]: 15 : for (ptr = g_declared_list; ptr != NULL; ptr = ptr->next)
8684 : : {
8685 [ - + ]: 10 : if (strcmp(@2, ptr->name) == 0)
8686 : : {
8687 : : /* re-definition is not allowed */
8688 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "name \"%s\" is already declared", ptr->name);
8689 : : }
8690 : : }
8691 : :
8692 : : /* Add a new declared name into the g_declared_list */
8693 : 5 : ptr = (struct declared_list *) mm_alloc(sizeof(struct declared_list));
8694 [ + - ]: 5 : if (ptr)
8695 : : {
8696 : : /* initial definition */
8697 : 5 : ptr->name = mm_strdup(@2);
8698 [ + + ]: 5 : if (connection)
8699 : 2 : ptr->connection = mm_strdup(connection);
8700 : : else
8701 : 3 : ptr->connection = NULL;
8702 : :
8703 : 5 : ptr->next = g_declared_list;
8704 : 5 : g_declared_list = ptr;
8705 : : }
8706 : :
8707 : 5 : @$ = cat_str(3, "/* declare ", @2, " as an SQL identifier */");
8708 : : }
8709 : : ;
8710 : :
8711 : : /*
8712 : : * Declare a prepared cursor. The syntax is different from the standard
8713 : : * declare statement, so we create a new rule.
8714 : : */
8715 : : ECPGCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR prepared_name
8716 : : {
8717 : : struct cursor *ptr,
8718 : : *this;
8719 [ + + ]: 21 : const char *cursor_marker = @2[0] == ':' ? "$0" : @2;
8720 [ + + - + ]: 21 : int (*strcmp_fn) (const char *, const char *) = ((@2[0] == ':' || @2[0] == '"') ? strcmp : pg_strcasecmp);
8721 : 21 : struct variable *thisquery = (struct variable *) mm_alloc(sizeof(struct variable));
8722 : : char *comment;
8723 : : char *con;
8724 : :
8725 [ + + - + : 21 : if (INFORMIX_MODE && pg_strcasecmp(@2, "database") == 0)
- + ]
8726 : 0 : mmfatal(PARSE_ERROR, "\"database\" cannot be used as cursor name in INFORMIX mode");
8727 : :
8728 : 21 : check_declared_list(@7);
8729 [ + + ]: 21 : con = connection ? connection : "NULL";
8730 [ + + ]: 43 : for (ptr = cur; ptr != NULL; ptr = ptr->next)
8731 : : {
8732 [ - + ]: 22 : if (strcmp_fn(@2, ptr->name) == 0)
8733 : : {
8734 : : /* re-definition is a bug */
8735 [ # # ]: 0 : if (@2[0] == ':')
8736 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "using variable \"%s\" in different declare statements is not supported", @2 + 1);
8737 : : else
8738 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "cursor \"%s\" is already defined", @2);
8739 : : }
8740 : : }
8741 : :
8742 : 21 : this = (struct cursor *) mm_alloc(sizeof(struct cursor));
8743 : :
8744 : : /* initial definition */
8745 : 21 : this->next = cur;
8746 : 21 : this->name = mm_strdup(@2);
8747 [ + - ]: 21 : this->function = (current_function ? mm_strdup(current_function) : NULL);
8748 [ + + ]: 21 : this->connection = connection ? mm_strdup(connection) : NULL;
8749 : 21 : this->opened = false;
8750 : 21 : this->command = mm_strdup(cat_str(6, "declare", cursor_marker, @3, "cursor", @5, "for $1"));
8751 : 21 : this->argsresult = NULL;
8752 : 21 : this->argsresult_oos = NULL;
8753 : :
8754 : 21 : thisquery->type = &ecpg_query;
8755 : 21 : thisquery->brace_level = 0;
8756 : 21 : thisquery->next = NULL;
8757 : 21 : thisquery->name = (char *) mm_alloc(sizeof("ECPGprepared_statement(, , __LINE__)") + strlen(con) + strlen(@7));
8758 : 21 : sprintf(thisquery->name, "ECPGprepared_statement(%s, %s, __LINE__)", con, @7);
8759 : :
8760 : 21 : this->argsinsert = NULL;
8761 : 21 : this->argsinsert_oos = NULL;
8762 [ + + ]: 21 : if (@2[0] == ':')
8763 : : {
8764 : 3 : struct variable *var = find_variable(@2 + 1);
8765 : :
8766 : 3 : remove_variable_from_list(&argsinsert, var);
8767 : 3 : add_variable_to_head(&(this->argsinsert), var, &no_indicator);
8768 : : }
8769 : 21 : add_variable_to_head(&(this->argsinsert), thisquery, &no_indicator);
8770 : :
8771 : 21 : cur = this;
8772 : :
8773 : 21 : comment = cat_str(3, "/*", this->command, "*/");
8774 : :
8775 : 21 : @$ = cat_str(2, adjust_outofscope_cursor_vars(this),
8776 : : comment);
8777 : : }
8778 : : ;
8779 : :
8780 : : ECPGExecuteImmediateStmt: EXECUTE IMMEDIATE execstring
8781 : : {
8782 : : /*
8783 : : * execute immediate means prepare the statement and immediately
8784 : : * execute it
8785 : : */
8786 : 7 : @$ = @3;
8787 : : }
8788 : : ;
8789 : :
8790 : : /*
8791 : : * variable declaration outside exec sql declare block
8792 : : */
8793 : : ECPGVarDeclaration: single_vt_declaration;
8794 : :
8795 : : single_vt_declaration: type_declaration
8796 : : | var_declaration
8797 : : ;
8798 : :
8799 : : precision: NumericOnly
8800 : : ;
8801 : :
8802 : : opt_scale: ',' NumericOnly
8803 : : {
8804 : 1 : @$ = @2;
8805 : : }
8806 : : | /* EMPTY */
8807 : : ;
8808 : :
8809 : : ecpg_interval: opt_interval
8810 : : | YEAR_P TO MINUTE_P
8811 : : | YEAR_P TO SECOND_P
8812 : : | DAY_P TO DAY_P
8813 : : | MONTH_P TO MONTH_P
8814 : : ;
8815 : :
8816 : : /*
8817 : : * variable declaration inside exec sql declare block
8818 : : */
8819 : : ECPGDeclaration: sql_startdeclare
8820 : : {
8821 : 67 : fputs("/* exec sql begin declare section */", base_yyout);
8822 : : }
8823 : : var_type_declarations sql_enddeclare
8824 : : {
8825 : 67 : fprintf(base_yyout, "%s/* exec sql end declare section */", @3);
8826 : 67 : output_line_number();
8827 : : }
8828 : : ;
8829 : :
8830 : : sql_startdeclare: ecpgstart BEGIN_P DECLARE SQL_SECTION ';'
8831 : : {
8832 : : }
8833 : : ;
8834 : :
8835 : : sql_enddeclare: ecpgstart END_P DECLARE SQL_SECTION ';'
8836 : : {
8837 : : }
8838 : : ;
8839 : :
8840 : : var_type_declarations: /* EMPTY */
8841 : : | vt_declarations
8842 : : ;
8843 : :
8844 : : vt_declarations: single_vt_declaration
8845 : : | CPP_LINE
8846 : : | vt_declarations single_vt_declaration
8847 : : | vt_declarations CPP_LINE
8848 : : ;
8849 : :
8850 : : variable_declarations: var_declaration
8851 : : | variable_declarations var_declaration
8852 : : ;
8853 : :
8854 : : type_declaration: S_TYPEDEF
8855 : : {
8856 : : /* reset this variable so we see if there was */
8857 : : /* an initializer specified */
8858 : 9 : initializer = 0;
8859 : : }
8860 : : var_type opt_pointer ECPGColLabel opt_array_bounds ';'
8861 : : {
8862 : 9 : add_typedef(@5, $6.index1, $6.index2, $3.type_enum, $3.type_dimension, $3.type_index, initializer, *@4 ? 1 : 0);
8863 : :
8864 [ - + ]: 9 : fprintf(base_yyout, "typedef %s %s %s %s;\n", $3.type_str, *@4 ? "*" : "", @5, $6.str);
8865 : 9 : output_line_number();
8866 : 9 : @$ = "";
8867 : : }
8868 : : ;
8869 : :
8870 : : var_declaration:
8871 : : storage_declaration var_type
8872 : : {
8873 : 3 : actual_type[struct_level].type_storage = loc_strdup(@1);
8874 : 3 : actual_type[struct_level].type_enum = $2.type_enum;
8875 : 3 : actual_type[struct_level].type_str = $2.type_str;
8876 : 3 : actual_type[struct_level].type_dimension = $2.type_dimension;
8877 : 3 : actual_type[struct_level].type_index = $2.type_index;
8878 : 3 : actual_type[struct_level].type_sizeof = $2.type_sizeof;
8879 : :
8880 : 3 : actual_startline[struct_level] = hashline_number();
8881 : : }
8882 : : variable_list ';'
8883 : : {
8884 : 3 : @$ = cat_str(5, actual_startline[struct_level], @1, $2.type_str, @4, ";\n");
8885 : : }
8886 : : | var_type
8887 : : {
8888 : 308 : actual_type[struct_level].type_storage = loc_strdup("");
8889 : 308 : actual_type[struct_level].type_enum = $1.type_enum;
8890 : 308 : actual_type[struct_level].type_str = $1.type_str;
8891 : 308 : actual_type[struct_level].type_dimension = $1.type_dimension;
8892 : 308 : actual_type[struct_level].type_index = $1.type_index;
8893 : 308 : actual_type[struct_level].type_sizeof = $1.type_sizeof;
8894 : :
8895 : 308 : actual_startline[struct_level] = hashline_number();
8896 : : }
8897 : : variable_list ';'
8898 : : {
8899 : 308 : @$ = cat_str(4, actual_startline[struct_level], $1.type_str, @3, ";\n");
8900 : : }
8901 : : | struct_union_type_with_symbol ';'
8902 : : ;
8903 : :
8904 : : opt_bit_field: ':' Iconst
8905 : : | /* EMPTY */
8906 : : ;
8907 : :
8908 : : storage_declaration: storage_clause storage_modifier
8909 : : | storage_clause
8910 : : | storage_modifier
8911 : : ;
8912 : :
8913 : : storage_clause: S_EXTERN
8914 : : | S_STATIC
8915 : : | S_REGISTER
8916 : : | S_AUTO
8917 : : ;
8918 : :
8919 : : storage_modifier: S_CONST
8920 : : | S_VOLATILE
8921 : : ;
8922 : :
8923 : : var_type: simple_type
8924 : : {
8925 : 240 : $$.type_enum = $1;
8926 : 240 : $$.type_str = loc_strdup(ecpg_type_name($1));
8927 : 240 : $$.type_dimension = "-1";
8928 : 240 : $$.type_index = "-1";
8929 : 240 : $$.type_sizeof = NULL;
8930 : : }
8931 : : | struct_union_type
8932 : : {
8933 : 18 : $$.type_str = loc_strdup(@1);
8934 : 18 : $$.type_dimension = "-1";
8935 : 18 : $$.type_index = "-1";
8936 : :
8937 [ + + ]: 18 : if (strncmp(@1, "struct", sizeof("struct") - 1) == 0)
8938 : : {
8939 : 16 : $$.type_enum = ECPGt_struct;
8940 : 16 : $$.type_sizeof = ECPGstruct_sizeof;
8941 : : }
8942 : : else
8943 : : {
8944 : 2 : $$.type_enum = ECPGt_union;
8945 : 2 : $$.type_sizeof = NULL;
8946 : : }
8947 : : }
8948 : : | enum_type
8949 : : {
8950 : 0 : $$.type_str = loc_strdup(@1);
8951 : 0 : $$.type_enum = ECPGt_int;
8952 : 0 : $$.type_dimension = "-1";
8953 : 0 : $$.type_index = "-1";
8954 : 0 : $$.type_sizeof = NULL;
8955 : : }
8956 : : | NUMERIC '(' precision opt_scale ')'
8957 : : {
8958 : 0 : $$.type_enum = ECPGt_numeric;
8959 : 0 : $$.type_str = "numeric";
8960 : 0 : $$.type_dimension = "-1";
8961 : 0 : $$.type_index = "-1";
8962 : 0 : $$.type_sizeof = NULL;
8963 : : }
8964 : : | DECIMAL_P '(' precision opt_scale ')'
8965 : : {
8966 : 0 : $$.type_enum = ECPGt_decimal;
8967 : 0 : $$.type_str = "decimal";
8968 : 0 : $$.type_dimension = "-1";
8969 : 0 : $$.type_index = "-1";
8970 : 0 : $$.type_sizeof = NULL;
8971 : : }
8972 : : | IDENT '(' precision opt_scale ')'
8973 : : {
8974 : : /*
8975 : : * In C parsing mode, NUMERIC and DECIMAL are not keywords, so they
8976 : : * will show up here as a plain identifier, and we need this duplicate
8977 : : * code to recognize them.
8978 : : */
8979 [ + - ]: 1 : if (strcmp(@1, "numeric") == 0)
8980 : : {
8981 : 1 : $$.type_enum = ECPGt_numeric;
8982 : 1 : $$.type_str = "numeric";
8983 : : }
8984 [ # # ]: 0 : else if (strcmp(@1, "decimal") == 0)
8985 : : {
8986 : 0 : $$.type_enum = ECPGt_decimal;
8987 : 0 : $$.type_str = "decimal";
8988 : : }
8989 : : else
8990 : : {
8991 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "only data types numeric and decimal have precision/scale argument");
8992 : 0 : $$.type_enum = ECPGt_numeric;
8993 : 0 : $$.type_str = "numeric";
8994 : : }
8995 : :
8996 : 1 : $$.type_dimension = "-1";
8997 : 1 : $$.type_index = "-1";
8998 : 1 : $$.type_sizeof = NULL;
8999 : : }
9000 : : | VARCHAR
9001 : : {
9002 : 14 : $$.type_enum = ECPGt_varchar;
9003 : 14 : $$.type_str = ""; /* "varchar"; */
9004 : 14 : $$.type_dimension = "-1";
9005 : 14 : $$.type_index = "-1";
9006 : 14 : $$.type_sizeof = NULL;
9007 : : }
9008 : : | FLOAT_P
9009 : : {
9010 : : /* Note: DOUBLE is handled in simple_type */
9011 : 3 : $$.type_enum = ECPGt_float;
9012 : 3 : $$.type_str = "float";
9013 : 3 : $$.type_dimension = "-1";
9014 : 3 : $$.type_index = "-1";
9015 : 3 : $$.type_sizeof = NULL;
9016 : : }
9017 : : | NUMERIC
9018 : : {
9019 : 0 : $$.type_enum = ECPGt_numeric;
9020 : 0 : $$.type_str = "numeric";
9021 : 0 : $$.type_dimension = "-1";
9022 : 0 : $$.type_index = "-1";
9023 : 0 : $$.type_sizeof = NULL;
9024 : : }
9025 : : | DECIMAL_P
9026 : : {
9027 : 2 : $$.type_enum = ECPGt_decimal;
9028 : 2 : $$.type_str = "decimal";
9029 : 2 : $$.type_dimension = "-1";
9030 : 2 : $$.type_index = "-1";
9031 : 2 : $$.type_sizeof = NULL;
9032 : : }
9033 : : | TIMESTAMP
9034 : : {
9035 : 1 : $$.type_enum = ECPGt_timestamp;
9036 : 1 : $$.type_str = "timestamp";
9037 : 1 : $$.type_dimension = "-1";
9038 : 1 : $$.type_index = "-1";
9039 : 1 : $$.type_sizeof = NULL;
9040 : : }
9041 : : | STRING_P
9042 : : {
9043 [ - + - - ]: 1 : if (INFORMIX_MODE)
9044 : : {
9045 : : /* In Informix mode, "string" is automatically a typedef */
9046 : 1 : $$.type_enum = ECPGt_string;
9047 : 1 : $$.type_str = "char";
9048 : 1 : $$.type_dimension = "-1";
9049 : 1 : $$.type_index = "-1";
9050 : 1 : $$.type_sizeof = NULL;
9051 : : }
9052 : : else
9053 : : {
9054 : : /* Otherwise, legal only if user typedef'ed it */
9055 : 0 : struct typedefs *this = get_typedef("string", false);
9056 : :
9057 [ # # # # ]: 0 : $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? mm_strdup("") : mm_strdup(this->name);
9058 : 0 : $$.type_enum = this->type->type_enum;
9059 : 0 : $$.type_dimension = this->type->type_dimension;
9060 : 0 : $$.type_index = this->type->type_index;
9061 [ # # # # ]: 0 : if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
9062 : 0 : $$.type_sizeof = this->type->type_sizeof;
9063 : : else
9064 : 0 : $$.type_sizeof = cat_str(3, "sizeof(", this->name, ")");
9065 : :
9066 : 0 : ECPGfree_struct_member(struct_member_list[struct_level]);
9067 : 0 : struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
9068 : : }
9069 : : }
9070 : : | INTERVAL ecpg_interval
9071 : : {
9072 : 0 : $$.type_enum = ECPGt_interval;
9073 : 0 : $$.type_str = "interval";
9074 : 0 : $$.type_dimension = "-1";
9075 : 0 : $$.type_index = "-1";
9076 : 0 : $$.type_sizeof = NULL;
9077 : : }
9078 : : | IDENT ecpg_interval
9079 : : {
9080 : : /*
9081 : : * In C parsing mode, the above SQL type names are not keywords, so
9082 : : * they will show up here as a plain identifier, and we need this
9083 : : * duplicate code to recognize them.
9084 : : *
9085 : : * Note that we also handle the type names bytea, date, and datetime
9086 : : * here, but not above because those are not currently SQL keywords.
9087 : : * If they ever become so, they must gain duplicate productions above.
9088 : : */
9089 [ - + - - : 53 : if (strlen(@2) != 0 && strcmp(@1, "datetime") != 0 && strcmp(@1, "interval") != 0)
- - ]
9090 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "interval specification not allowed here");
9091 : :
9092 [ - + ]: 53 : if (strcmp(@1, "varchar") == 0)
9093 : : {
9094 : 0 : $$.type_enum = ECPGt_varchar;
9095 : 0 : $$.type_str = ""; /* "varchar"; */
9096 : 0 : $$.type_dimension = "-1";
9097 : 0 : $$.type_index = "-1";
9098 : 0 : $$.type_sizeof = NULL;
9099 : : }
9100 [ + + ]: 53 : else if (strcmp(@1, "bytea") == 0)
9101 : : {
9102 : 4 : $$.type_enum = ECPGt_bytea;
9103 : 4 : $$.type_str = "";
9104 : 4 : $$.type_dimension = "-1";
9105 : 4 : $$.type_index = "-1";
9106 : 4 : $$.type_sizeof = NULL;
9107 : : }
9108 [ - + ]: 49 : else if (strcmp(@1, "float") == 0)
9109 : : {
9110 : 0 : $$.type_enum = ECPGt_float;
9111 : 0 : $$.type_str = "float";
9112 : 0 : $$.type_dimension = "-1";
9113 : 0 : $$.type_index = "-1";
9114 : 0 : $$.type_sizeof = NULL;
9115 : : }
9116 [ + + ]: 49 : else if (strcmp(@1, "double") == 0)
9117 : : {
9118 : 6 : $$.type_enum = ECPGt_double;
9119 : 6 : $$.type_str = "double";
9120 : 6 : $$.type_dimension = "-1";
9121 : 6 : $$.type_index = "-1";
9122 : 6 : $$.type_sizeof = NULL;
9123 : : }
9124 [ + + ]: 43 : else if (strcmp(@1, "numeric") == 0)
9125 : : {
9126 : 2 : $$.type_enum = ECPGt_numeric;
9127 : 2 : $$.type_str = "numeric";
9128 : 2 : $$.type_dimension = "-1";
9129 : 2 : $$.type_index = "-1";
9130 : 2 : $$.type_sizeof = NULL;
9131 : : }
9132 [ - + ]: 41 : else if (strcmp(@1, "decimal") == 0)
9133 : : {
9134 : 0 : $$.type_enum = ECPGt_decimal;
9135 : 0 : $$.type_str = "decimal";
9136 : 0 : $$.type_dimension = "-1";
9137 : 0 : $$.type_index = "-1";
9138 : 0 : $$.type_sizeof = NULL;
9139 : : }
9140 [ + + ]: 41 : else if (strcmp(@1, "date") == 0)
9141 : : {
9142 : 5 : $$.type_enum = ECPGt_date;
9143 : 5 : $$.type_str = "date";
9144 : 5 : $$.type_dimension = "-1";
9145 : 5 : $$.type_index = "-1";
9146 : 5 : $$.type_sizeof = NULL;
9147 : : }
9148 [ + + ]: 36 : else if (strcmp(@1, "timestamp") == 0)
9149 : : {
9150 : 6 : $$.type_enum = ECPGt_timestamp;
9151 : 6 : $$.type_str = "timestamp";
9152 : 6 : $$.type_dimension = "-1";
9153 : 6 : $$.type_index = "-1";
9154 : 6 : $$.type_sizeof = NULL;
9155 : : }
9156 [ + + ]: 30 : else if (strcmp(@1, "interval") == 0)
9157 : : {
9158 : 4 : $$.type_enum = ECPGt_interval;
9159 : 4 : $$.type_str = "interval";
9160 : 4 : $$.type_dimension = "-1";
9161 : 4 : $$.type_index = "-1";
9162 : 4 : $$.type_sizeof = NULL;
9163 : : }
9164 [ - + ]: 26 : else if (strcmp(@1, "datetime") == 0)
9165 : : {
9166 : 0 : $$.type_enum = ECPGt_timestamp;
9167 : 0 : $$.type_str = "timestamp";
9168 : 0 : $$.type_dimension = "-1";
9169 : 0 : $$.type_index = "-1";
9170 : 0 : $$.type_sizeof = NULL;
9171 : : }
9172 [ + + + - : 26 : else if ((strcmp(@1, "string") == 0) && INFORMIX_MODE)
- + ]
9173 : : {
9174 : 0 : $$.type_enum = ECPGt_string;
9175 : 0 : $$.type_str = "char";
9176 : 0 : $$.type_dimension = "-1";
9177 : 0 : $$.type_index = "-1";
9178 : 0 : $$.type_sizeof = NULL;
9179 : : }
9180 : : else
9181 : : {
9182 : : /* Otherwise, it must be a user-defined typedef name */
9183 : 26 : struct typedefs *this = get_typedef(@1, false);
9184 : :
9185 [ + + + - ]: 26 : $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? "" : this->name;
9186 : 26 : $$.type_enum = this->type->type_enum;
9187 : 26 : $$.type_dimension = this->type->type_dimension;
9188 : 26 : $$.type_index = this->type->type_index;
9189 [ + + + + ]: 26 : if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0)
9190 : 4 : $$.type_sizeof = this->type->type_sizeof;
9191 : : else
9192 : 22 : $$.type_sizeof = cat_str(3, "sizeof(", this->name, ")");
9193 : :
9194 : 26 : ECPGfree_struct_member(struct_member_list[struct_level]);
9195 : 26 : struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
9196 : : }
9197 : : }
9198 : : | s_struct_union_symbol
9199 : : {
9200 : : /* this is for named structs/unions */
9201 : : char *name;
9202 : : struct typedefs *this;
9203 [ + + - + : 6 : bool forward = (forward_name != NULL && strcmp($1.symbol, forward_name) == 0 && strcmp($1.su, "struct") == 0);
- - ]
9204 : :
9205 : 6 : name = cat2_str($1.su, $1.symbol);
9206 : : /* Do we have a forward definition? */
9207 [ + - ]: 6 : if (!forward)
9208 : : {
9209 : : /* No */
9210 : :
9211 : 6 : this = get_typedef(name, false);
9212 : 6 : $$.type_str = this->name;
9213 : 6 : $$.type_enum = this->type->type_enum;
9214 : 6 : $$.type_dimension = this->type->type_dimension;
9215 : 6 : $$.type_index = this->type->type_index;
9216 : 6 : $$.type_sizeof = this->type->type_sizeof;
9217 : 6 : ECPGfree_struct_member(struct_member_list[struct_level]);
9218 : 6 : struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
9219 : : }
9220 : : else
9221 : : {
9222 : 0 : $$.type_str = name;
9223 : 0 : $$.type_enum = ECPGt_long;
9224 : 0 : $$.type_dimension = "-1";
9225 : 0 : $$.type_index = "-1";
9226 : 0 : $$.type_sizeof = "";
9227 : 0 : ECPGfree_struct_member(struct_member_list[struct_level]);
9228 : 0 : struct_member_list[struct_level] = NULL;
9229 : : }
9230 : : }
9231 : : ;
9232 : :
9233 : : enum_type: ENUM_P symbol enum_definition
9234 : : | ENUM_P enum_definition
9235 : : | ENUM_P symbol
9236 : : ;
9237 : :
9238 : : enum_definition: '{' c_list '}'
9239 : : ;
9240 : :
9241 : : struct_union_type_with_symbol: s_struct_union_symbol
9242 : : {
9243 : 16 : ECPGfree_struct_member(struct_member_list[struct_level]);
9244 : 16 : struct_member_list[struct_level++] = NULL;
9245 [ - + ]: 16 : if (struct_level >= STRUCT_DEPTH)
9246 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
9247 : 16 : forward_name = mm_strdup($1.symbol);
9248 : : }
9249 : : '{' variable_declarations '}'
9250 : : {
9251 : : struct typedefs *ptr,
9252 : : *this;
9253 : : struct this_type su_type;
9254 : :
9255 : 16 : ECPGfree_struct_member(struct_member_list[struct_level]);
9256 : 16 : struct_member_list[struct_level] = NULL;
9257 : 16 : struct_level--;
9258 [ + - ]: 16 : if (strcmp($1.su, "struct") == 0)
9259 : 16 : su_type.type_enum = ECPGt_struct;
9260 : : else
9261 : 0 : su_type.type_enum = ECPGt_union;
9262 : 16 : su_type.type_str = cat2_str($1.su, $1.symbol);
9263 : 16 : free(forward_name);
9264 : 16 : forward_name = NULL;
9265 : :
9266 : : /*
9267 : : * This is essentially a typedef but needs the keyword struct/union as
9268 : : * well. So we create the typedef for each struct definition with
9269 : : * symbol
9270 : : */
9271 [ + + ]: 80 : for (ptr = types; ptr != NULL; ptr = ptr->next)
9272 : : {
9273 [ - + ]: 64 : if (strcmp(su_type.type_str, ptr->name) == 0)
9274 : : /* re-definition is a bug */
9275 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "type \"%s\" is already defined", su_type.type_str);
9276 : : }
9277 : :
9278 : 16 : this = (struct typedefs *) mm_alloc(sizeof(struct typedefs));
9279 : :
9280 : : /* initial definition */
9281 : 16 : this->next = types;
9282 : 16 : this->name = mm_strdup(su_type.type_str);
9283 : 16 : this->brace_level = braces_open;
9284 : 16 : this->type = (struct this_type *) mm_alloc(sizeof(struct this_type));
9285 : 16 : this->type->type_storage = NULL;
9286 : 16 : this->type->type_enum = su_type.type_enum;
9287 : 16 : this->type->type_str = mm_strdup(su_type.type_str);
9288 : 16 : this->type->type_dimension = mm_strdup("-1"); /* dimension of array */
9289 : 16 : this->type->type_index = mm_strdup("-1"); /* length of string */
9290 [ + - ]: 16 : this->type->type_sizeof = ECPGstruct_sizeof ? mm_strdup(ECPGstruct_sizeof) : NULL;
9291 : 16 : this->struct_member_list = ECPGstruct_member_dup(struct_member_list[struct_level]);
9292 : :
9293 : 16 : types = this;
9294 : 16 : @$ = cat_str(4, su_type.type_str, "{", @4, "}");
9295 : : }
9296 : : ;
9297 : :
9298 : : struct_union_type: struct_union_type_with_symbol
9299 : : | s_struct_union
9300 : : {
9301 : 9 : ECPGfree_struct_member(struct_member_list[struct_level]);
9302 : 9 : struct_member_list[struct_level++] = NULL;
9303 [ - + ]: 9 : if (struct_level >= STRUCT_DEPTH)
9304 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "too many levels in nested structure/union definition");
9305 : : }
9306 : : '{' variable_declarations '}'
9307 : : {
9308 : 9 : ECPGfree_struct_member(struct_member_list[struct_level]);
9309 : 9 : struct_member_list[struct_level] = NULL;
9310 : 9 : struct_level--;
9311 : 9 : @$ = cat_str(4, @1, "{", @4, "}");
9312 : : }
9313 : : ;
9314 : :
9315 : : s_struct_union_symbol: SQL_STRUCT symbol
9316 : : {
9317 : 22 : $$.su = "struct";
9318 : 22 : $$.symbol = @2;
9319 : 22 : free(ECPGstruct_sizeof);
9320 : 22 : ECPGstruct_sizeof = mm_strdup(cat_str(3, "sizeof(",
9321 : : cat2_str($$.su, $$.symbol),
9322 : : ")"));
9323 : : }
9324 : : | UNION symbol
9325 : : {
9326 : 0 : $$.su = "union";
9327 : 0 : $$.symbol = @2;
9328 : : }
9329 : : ;
9330 : :
9331 : : s_struct_union: SQL_STRUCT
9332 : : {
9333 : 7 : free(ECPGstruct_sizeof);
9334 : 7 : ECPGstruct_sizeof = mm_strdup(""); /* This must not be NULL to
9335 : : * distinguish from simple types. */
9336 : 7 : @$ = "struct";
9337 : : }
9338 : : | UNION
9339 : : {
9340 : 2 : @$ = "union";
9341 : : }
9342 : : ;
9343 : :
9344 : : simple_type: unsigned_type
9345 : 240 : | opt_signed signed_type { $$ = $2; }
9346 : : ;
9347 : :
9348 : 0 : unsigned_type: SQL_UNSIGNED SQL_SHORT { $$ = ECPGt_unsigned_short; }
9349 : 0 : | SQL_UNSIGNED SQL_SHORT INT_P { $$ = ECPGt_unsigned_short; }
9350 : 0 : | SQL_UNSIGNED { $$ = ECPGt_unsigned_int; }
9351 : 0 : | SQL_UNSIGNED INT_P { $$ = ECPGt_unsigned_int; }
9352 : 0 : | SQL_UNSIGNED SQL_LONG { $$ = ECPGt_unsigned_long; }
9353 : 0 : | SQL_UNSIGNED SQL_LONG INT_P { $$ = ECPGt_unsigned_long; }
9354 : 0 : | SQL_UNSIGNED SQL_LONG SQL_LONG { $$ = ECPGt_unsigned_long_long; }
9355 : 0 : | SQL_UNSIGNED SQL_LONG SQL_LONG INT_P { $$ = ECPGt_unsigned_long_long; }
9356 : 0 : | SQL_UNSIGNED CHAR_P { $$ = ECPGt_unsigned_char; }
9357 : : ;
9358 : :
9359 : 14 : signed_type: SQL_SHORT { $$ = ECPGt_short; }
9360 : 0 : | SQL_SHORT INT_P { $$ = ECPGt_short; }
9361 : 108 : | INT_P { $$ = ECPGt_int; }
9362 : 6 : | SQL_LONG { $$ = ECPGt_long; }
9363 : 0 : | SQL_LONG INT_P { $$ = ECPGt_long; }
9364 : 0 : | SQL_LONG SQL_LONG { $$ = ECPGt_long_long; }
9365 : 0 : | SQL_LONG SQL_LONG INT_P { $$ = ECPGt_long_long; }
9366 : 4 : | SQL_BOOL { $$ = ECPGt_bool; }
9367 : 107 : | CHAR_P { $$ = ECPGt_char; }
9368 : 1 : | DOUBLE_P { $$ = ECPGt_double; }
9369 : : ;
9370 : :
9371 : : opt_signed: SQL_SIGNED
9372 : : | /* EMPTY */
9373 : : ;
9374 : :
9375 : : variable_list: variable
9376 : : | variable_list ',' variable
9377 : : {
9378 [ + + - + ]: 61 : if (actual_type[struct_level].type_enum == ECPGt_varchar || actual_type[struct_level].type_enum == ECPGt_bytea)
9379 : 2 : @$ = cat_str(4, @1, ";", actual_type[struct_level].type_storage, @3);
9380 : : else
9381 : 59 : @$ = cat_str(3, @1, ",", @3);
9382 : : }
9383 : : ;
9384 : :
9385 : : variable: opt_pointer ECPGColLabel opt_array_bounds opt_bit_field opt_initializer
9386 : : {
9387 : : struct ECPGtype *type;
9388 : 372 : const char *dimension = $3.index1; /* dimension of array */
9389 : 372 : const char *length = $3.index2; /* length of string */
9390 : : char *dim_str;
9391 : : char vcn[32];
9392 : : int *varlen_type_counter;
9393 : : char *struct_name;
9394 : :
9395 : 372 : adjust_array(actual_type[struct_level].type_enum,
9396 : : &dimension, &length,
9397 : 372 : actual_type[struct_level].type_dimension,
9398 : 372 : actual_type[struct_level].type_index,
9399 : 372 : strlen(@1), false);
9400 [ + + + + ]: 372 : switch (actual_type[struct_level].type_enum)
9401 : : {
9402 : 28 : case ECPGt_struct:
9403 : : case ECPGt_union:
9404 [ + + ]: 28 : if (atoi(dimension) < 0)
9405 : 13 : type = ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_str, actual_type[struct_level].type_sizeof);
9406 : : else
9407 : 15 : type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], actual_type[struct_level].type_enum, actual_type[struct_level].type_str, actual_type[struct_level].type_sizeof), dimension);
9408 : :
9409 : 28 : @$ = cat_str(5, @1, @2, $3.str, @4, @5);
9410 : 28 : break;
9411 : :
9412 : 20 : case ECPGt_varchar:
9413 : : case ECPGt_bytea:
9414 [ + + ]: 20 : if (actual_type[struct_level].type_enum == ECPGt_varchar)
9415 : : {
9416 : 16 : varlen_type_counter = &varchar_counter;
9417 : 16 : struct_name = " struct varchar_";
9418 : : }
9419 : : else
9420 : : {
9421 : 4 : varlen_type_counter = &bytea_counter;
9422 : 4 : struct_name = " struct bytea_";
9423 : : }
9424 [ + + ]: 20 : if (atoi(dimension) < 0)
9425 : 15 : type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter);
9426 : : else
9427 : 5 : type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, *varlen_type_counter), dimension);
9428 : :
9429 [ + + + + ]: 20 : if (strcmp(dimension, "0") == 0 || abs(atoi(dimension)) == 1)
9430 : 16 : dim_str = "";
9431 : : else
9432 : 4 : dim_str = cat_str(3, "[", dimension, "]");
9433 : :
9434 : : /*
9435 : : * cannot check for atoi <= 0 because a defined constant will
9436 : : * yield 0 here as well
9437 : : */
9438 [ + - - + ]: 20 : if (atoi(length) < 0 || strcmp(length, "0") == 0)
9439 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "pointers to varchar are not implemented");
9440 : :
9441 : : /*
9442 : : * make sure varchar struct name is unique by adding a unique
9443 : : * counter to its definition
9444 : : */
9445 : 20 : snprintf(vcn, sizeof(vcn), "%d", *varlen_type_counter);
9446 [ + + ]: 20 : if (strcmp(dimension, "0") == 0)
9447 : 1 : @$ = cat_str(7, make2_str(struct_name, vcn), " { int len; char arr[", length, "]; } *", @2, @4, @5);
9448 : : else
9449 : 19 : @$ = cat_str(8, make2_str(struct_name, vcn), " { int len; char arr[", length, "]; } ", @2, dim_str, @4, @5);
9450 : 20 : (*varlen_type_counter)++;
9451 : 20 : break;
9452 : :
9453 : 127 : case ECPGt_char:
9454 : : case ECPGt_unsigned_char:
9455 : : case ECPGt_string:
9456 [ + + ]: 127 : if (atoi(dimension) == -1)
9457 : : {
9458 : 112 : int i = strlen(@5);
9459 : :
9460 [ + + + - ]: 112 : if (atoi(length) == -1 && i > 0) /* char <var>[] =
9461 : : * "string" */
9462 : : {
9463 : : /*
9464 : : * if we have an initializer but no string size set,
9465 : : * let's use the initializer's length
9466 : : */
9467 : 2 : char *buf = loc_alloc(32);
9468 : :
9469 : 2 : snprintf(buf, 32, "sizeof(%s)", @5 + 2);
9470 : 2 : length = buf;
9471 : : }
9472 : 112 : type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0);
9473 : : }
9474 : : else
9475 : 15 : type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length, 0), dimension);
9476 : :
9477 : 127 : @$ = cat_str(5, @1, @2, $3.str, @4, @5);
9478 : 127 : break;
9479 : :
9480 : 197 : default:
9481 [ + + ]: 197 : if (atoi(dimension) < 0)
9482 : 158 : type = ECPGmake_simple_type(actual_type[struct_level].type_enum, "1", 0);
9483 : : else
9484 : 39 : type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, "1", 0), dimension);
9485 : :
9486 : 197 : @$ = cat_str(5, @1, @2, $3.str, @4, @5);
9487 : 197 : break;
9488 : : }
9489 : :
9490 [ + + ]: 372 : if (struct_level == 0)
9491 : 316 : new_variable(@2, type, braces_open);
9492 : : else
9493 : 56 : ECPGmake_struct_member(@2, type, &(struct_member_list[struct_level - 1]));
9494 : : }
9495 : : ;
9496 : :
9497 : : opt_initializer: /* EMPTY */
9498 : : | '=' c_term
9499 : : {
9500 : 115 : initializer = 1;
9501 : : }
9502 : : ;
9503 : :
9504 : : opt_pointer: /* EMPTY */
9505 : : | '*'
9506 : : | '*' '*'
9507 : : {
9508 : 8 : @$ = "**";
9509 : : }
9510 : : ;
9511 : :
9512 : : /*
9513 : : * We try to simulate the correct DECLARE syntax here so we get dynamic SQL
9514 : : */
9515 : : ECPGDeclare: DECLARE STATEMENT ecpg_ident
9516 : : {
9517 : : /* this is only supported for compatibility */
9518 : 0 : @$ = cat_str(3, "/* declare statement", @3, "*/");
9519 : : }
9520 : : ;
9521 : : /*
9522 : : * the exec sql disconnect statement: disconnect from the given database
9523 : : */
9524 : : ECPGDisconnect: SQL_DISCONNECT dis_name
9525 : : {
9526 : 89 : @$ = @2;
9527 : : }
9528 : : ;
9529 : :
9530 : : dis_name: connection_object
9531 : : | CURRENT_P
9532 : : {
9533 : 3 : @$ = "\"CURRENT\"";
9534 : : }
9535 : : | ALL
9536 : : {
9537 : 15 : @$ = "\"ALL\"";
9538 : : }
9539 : : | /* EMPTY */
9540 : : {
9541 : 46 : @$ = "\"CURRENT\"";
9542 : : }
9543 : : ;
9544 : :
9545 : : connection_object: name
9546 : : {
9547 : 160 : @$ = make3_str("\"", @1, "\"");
9548 : : }
9549 : : | DEFAULT
9550 : : {
9551 : 3 : @$ = "\"DEFAULT\"";
9552 : : }
9553 : : | char_variable
9554 : : ;
9555 : :
9556 : : execstring: char_variable
9557 : : | CSTRING
9558 : : {
9559 : 7 : @$ = make3_str("\"", @1, "\"");
9560 : : }
9561 : : ;
9562 : :
9563 : : /*
9564 : : * the exec sql free command to deallocate a previously
9565 : : * prepared statement
9566 : : */
9567 : : ECPGFree: SQL_FREE cursor_name
9568 : : {
9569 : 1 : @$ = @2;
9570 : : }
9571 : : | SQL_FREE ALL
9572 : : {
9573 : 0 : @$ = "all";
9574 : : }
9575 : : ;
9576 : :
9577 : : /*
9578 : : * open is an open cursor, at the moment this has to be removed
9579 : : */
9580 : : ECPGOpen: SQL_OPEN cursor_name opt_ecpg_using
9581 : : {
9582 [ + + ]: 40 : if (@2[0] == ':')
9583 : 5 : remove_variable_from_list(&argsinsert, find_variable(@2 + 1));
9584 : 40 : @$ = @2;
9585 : : }
9586 : : ;
9587 : :
9588 : : opt_ecpg_using: /* EMPTY */
9589 : : | ecpg_using
9590 : : ;
9591 : :
9592 : : ecpg_using: USING using_list
9593 : : {
9594 : 15 : @$ = "";
9595 : : }
9596 : : | using_descriptor
9597 : : ;
9598 : :
9599 : : using_descriptor: USING SQL_P SQL_DESCRIPTOR quoted_ident_stringvar
9600 : : {
9601 : 12 : add_variable_to_head(&argsinsert, descriptor_variable(@4, 0), &no_indicator);
9602 : 12 : @$ = "";
9603 : : }
9604 : : | USING SQL_DESCRIPTOR name
9605 : : {
9606 : 9 : add_variable_to_head(&argsinsert, sqlda_variable(@3), &no_indicator);
9607 : 9 : @$ = "";
9608 : : }
9609 : : ;
9610 : :
9611 : : into_descriptor: INTO SQL_P SQL_DESCRIPTOR quoted_ident_stringvar
9612 : : {
9613 : 12 : add_variable_to_head(&argsresult, descriptor_variable(@4, 1), &no_indicator);
9614 : 12 : @$ = "";
9615 : : }
9616 : : | INTO SQL_DESCRIPTOR name
9617 : : {
9618 : 12 : add_variable_to_head(&argsresult, sqlda_variable(@3), &no_indicator);
9619 : 12 : @$ = "";
9620 : : }
9621 : : ;
9622 : :
9623 : : into_sqlda: INTO name
9624 : : {
9625 : 4 : add_variable_to_head(&argsresult, sqlda_variable(@2), &no_indicator);
9626 : 4 : @$ = "";
9627 : : }
9628 : : ;
9629 : :
9630 : : using_list: UsingValue | UsingValue ',' using_list
9631 : : ;
9632 : :
9633 : : UsingValue: UsingConst
9634 : : {
9635 : : char length[32];
9636 : :
9637 : 4 : snprintf(length, sizeof(length), "%zu", strlen(@1));
9638 : 4 : add_variable_to_head(&argsinsert, new_variable(@1, ECPGmake_simple_type(ECPGt_const, length, 0), 0), &no_indicator);
9639 : : }
9640 : : | civar
9641 : : {
9642 : 18 : @$ = "";
9643 : : }
9644 : : | civarind
9645 : : {
9646 : 0 : @$ = "";
9647 : : }
9648 : : ;
9649 : :
9650 : : UsingConst: Iconst
9651 : : | '+' Iconst
9652 : : | '-' Iconst
9653 : : | ecpg_fconst
9654 : : | '+' ecpg_fconst
9655 : : | '-' ecpg_fconst
9656 : : | ecpg_sconst
9657 : : | ecpg_bconst
9658 : : | ecpg_xconst
9659 : : ;
9660 : :
9661 : : /*
9662 : : * We accept DESCRIBE [OUTPUT] but do nothing with DESCRIBE INPUT so far.
9663 : : */
9664 : : ECPGDescribe: SQL_DESCRIBE INPUT_P prepared_name using_descriptor
9665 : : {
9666 : 0 : $$.input = 1;
9667 : 0 : $$.stmt_name = @3;
9668 : : }
9669 : : | SQL_DESCRIBE opt_output prepared_name using_descriptor
9670 : : {
9671 : : struct variable *var;
9672 : :
9673 : 8 : var = argsinsert->variable;
9674 : 8 : remove_variable_from_list(&argsinsert, var);
9675 : 8 : add_variable_to_head(&argsresult, var, &no_indicator);
9676 : :
9677 : 8 : $$.input = 0;
9678 : 8 : $$.stmt_name = @3;
9679 : : }
9680 : : | SQL_DESCRIBE opt_output prepared_name into_descriptor
9681 : : {
9682 : 9 : $$.input = 0;
9683 : 9 : $$.stmt_name = @3;
9684 : : }
9685 : : | SQL_DESCRIBE INPUT_P prepared_name into_sqlda
9686 : : {
9687 : 0 : $$.input = 1;
9688 : 0 : $$.stmt_name = @3;
9689 : : }
9690 : : | SQL_DESCRIBE opt_output prepared_name into_sqlda
9691 : : {
9692 : 4 : $$.input = 0;
9693 : 4 : $$.stmt_name = @3;
9694 : : }
9695 : : ;
9696 : :
9697 : : opt_output: SQL_OUTPUT
9698 : : | /* EMPTY */
9699 : : ;
9700 : :
9701 : : /*
9702 : : * dynamic SQL: descriptor based access
9703 : : * originally written by Christof Petig <christof.petig@wtal.de>
9704 : : * and Peter Eisentraut <peter.eisentraut@credativ.de>
9705 : : */
9706 : :
9707 : : /*
9708 : : * allocate a descriptor
9709 : : */
9710 : : ECPGAllocateDescr: SQL_ALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
9711 : : {
9712 : 20 : add_descriptor(@3, connection);
9713 : 20 : @$ = @3;
9714 : : }
9715 : : ;
9716 : :
9717 : :
9718 : : /*
9719 : : * deallocate a descriptor
9720 : : */
9721 : : ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar
9722 : : {
9723 : 16 : drop_descriptor(@3, connection);
9724 : 16 : @$ = @3;
9725 : : }
9726 : : ;
9727 : :
9728 : : /*
9729 : : * manipulate a descriptor header
9730 : : */
9731 : :
9732 : : ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItem
9733 : : {
9734 : 11 : @$ = @3;
9735 : : }
9736 : : ;
9737 : :
9738 : : ECPGGetDescHeaderItem: cvariable '=' desc_header_item
9739 : : {
9740 : 11 : push_assignment(@1, $3);
9741 : : }
9742 : : ;
9743 : :
9744 : : ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItem
9745 : : {
9746 : 1 : @$ = @3;
9747 : : }
9748 : : ;
9749 : :
9750 : : ECPGSetDescHeaderItem: desc_header_item '=' IntConstVar
9751 : : {
9752 : 1 : push_assignment(@3, $1);
9753 : : }
9754 : : ;
9755 : :
9756 : : IntConstVar: Iconst
9757 : : {
9758 : : char length[32];
9759 : :
9760 : 33 : snprintf(length, sizeof(length), "%zu", strlen(@1));
9761 : 33 : new_variable(@1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
9762 : : }
9763 : : | cvariable
9764 : : ;
9765 : :
9766 : : desc_header_item: SQL_COUNT
9767 : : {
9768 : 12 : $$ = ECPGd_count;
9769 : : }
9770 : : ;
9771 : :
9772 : : /*
9773 : : * manipulate a descriptor
9774 : : */
9775 : :
9776 : : ECPGGetDescriptor: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGGetDescItems
9777 : : {
9778 : 32 : $$.str = @5;
9779 : 32 : $$.name = @3;
9780 : : }
9781 : : ;
9782 : :
9783 : : ECPGGetDescItems: ECPGGetDescItem
9784 : : | ECPGGetDescItems ',' ECPGGetDescItem
9785 : : ;
9786 : :
9787 : : ECPGGetDescItem: cvariable '=' descriptor_item
9788 : : {
9789 : 52 : push_assignment(@1, $3);
9790 : : }
9791 : : ;
9792 : :
9793 : : ECPGSetDescriptor: SET SQL_DESCRIPTOR quoted_ident_stringvar VALUE_P IntConstVar ECPGSetDescItems
9794 : : {
9795 : 13 : $$.str = @5;
9796 : 13 : $$.name = @3;
9797 : : }
9798 : : ;
9799 : :
9800 : : ECPGSetDescItems: ECPGSetDescItem
9801 : : | ECPGSetDescItems ',' ECPGSetDescItem
9802 : : ;
9803 : :
9804 : : ECPGSetDescItem: descriptor_item '=' AllConstVar
9805 : : {
9806 : 17 : push_assignment(@3, $1);
9807 : : }
9808 : : ;
9809 : :
9810 : : AllConstVar: ecpg_fconst
9811 : : {
9812 : : char length[32];
9813 : :
9814 : 0 : snprintf(length, sizeof(length), "%zu", strlen(@1));
9815 : 0 : new_variable(@1, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
9816 : : }
9817 : : | IntConstVar
9818 : : | '-' ecpg_fconst
9819 : : {
9820 : : char length[32];
9821 : 0 : char *var = cat2_str("-", @2);
9822 : :
9823 : 0 : snprintf(length, sizeof(length), "%zu", strlen(var));
9824 : 0 : new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
9825 : 0 : @$ = var;
9826 : : }
9827 : : | '-' Iconst
9828 : : {
9829 : : char length[32];
9830 : 0 : char *var = cat2_str("-", @2);
9831 : :
9832 : 0 : snprintf(length, sizeof(length), "%zu", strlen(var));
9833 : 0 : new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
9834 : 0 : @$ = var;
9835 : : }
9836 : : | ecpg_sconst
9837 : : {
9838 : : char length[32];
9839 : : char *var;
9840 : :
9841 : : /* Strip single quotes from ecpg_sconst */
9842 : 1 : var = loc_strdup(@1 + 1);
9843 : 1 : var[strlen(var) - 1] = '\0';
9844 : 1 : snprintf(length, sizeof(length), "%zu", strlen(var));
9845 : 1 : new_variable(var, ECPGmake_simple_type(ECPGt_const, length, 0), 0);
9846 : 1 : @$ = var;
9847 : : }
9848 : : ;
9849 : :
9850 : 0 : descriptor_item: SQL_CARDINALITY { $$ = ECPGd_cardinality; }
9851 : 34 : | DATA_P { $$ = ECPGd_data; }
9852 : 2 : | SQL_DATETIME_INTERVAL_CODE { $$ = ECPGd_di_code; }
9853 : 0 : | SQL_DATETIME_INTERVAL_PRECISION { $$ = ECPGd_di_precision; }
9854 : 17 : | SQL_INDICATOR { $$ = ECPGd_indicator; }
9855 : 0 : | SQL_KEY_MEMBER { $$ = ECPGd_key_member; }
9856 : 2 : | SQL_LENGTH { $$ = ECPGd_length; }
9857 : 9 : | NAME_P { $$ = ECPGd_name; }
9858 : 0 : | SQL_NULLABLE { $$ = ECPGd_nullable; }
9859 : 1 : | SQL_OCTET_LENGTH { $$ = ECPGd_octet; }
9860 : 1 : | PRECISION { $$ = ECPGd_precision; }
9861 : 0 : | SQL_RETURNED_LENGTH { $$ = ECPGd_length; }
9862 : 1 : | SQL_RETURNED_OCTET_LENGTH { $$ = ECPGd_ret_octet; }
9863 : 1 : | SQL_SCALE { $$ = ECPGd_scale; }
9864 : 1 : | TYPE_P { $$ = ECPGd_type; }
9865 : : ;
9866 : :
9867 : : /*
9868 : : * set/reset the automatic transaction mode, this needs a different handling
9869 : : * as the other set commands
9870 : : */
9871 : : ECPGSetAutocommit: SET SQL_AUTOCOMMIT '=' on_off
9872 : : {
9873 : 4 : @$ = @4;
9874 : : }
9875 : : | SET SQL_AUTOCOMMIT TO on_off
9876 : : {
9877 : 9 : @$ = @4;
9878 : : }
9879 : : ;
9880 : :
9881 : : on_off: ON
9882 : : | OFF
9883 : : ;
9884 : :
9885 : : /*
9886 : : * set the actual connection, this needs a different handling as the other
9887 : : * set commands
9888 : : */
9889 : : ECPGSetConnection: SET CONNECTION TO connection_object
9890 : : {
9891 : 2 : @$ = @4;
9892 : : }
9893 : : | SET CONNECTION '=' connection_object
9894 : : {
9895 : 0 : @$ = @4;
9896 : : }
9897 : : | SET CONNECTION connection_object
9898 : : {
9899 : 1 : @$ = @3;
9900 : : }
9901 : : ;
9902 : :
9903 : : /*
9904 : : * define a new type for embedded SQL
9905 : : */
9906 : : ECPGTypedef: TYPE_P
9907 : : {
9908 : : /* reset this variable so we see if there was */
9909 : : /* an initializer specified */
9910 : 16 : initializer = 0;
9911 : : }
9912 : : ECPGColLabel IS var_type opt_array_bounds opt_reference
9913 : : {
9914 : 16 : add_typedef(@3, $6.index1, $6.index2, $5.type_enum, $5.type_dimension, $5.type_index, initializer, *@7 ? 1 : 0);
9915 : :
9916 [ + + ]: 16 : if (auto_create_c == false)
9917 : 10 : @$ = cat_str(7, "/* exec sql type", @3, "is", $5.type_str, $6.str, @7, "*/");
9918 : : else
9919 [ - + ]: 6 : @$ = cat_str(6, "typedef ", $5.type_str, *@7 ? "*" : "", @3, $6.str, ";");
9920 : : }
9921 : : ;
9922 : :
9923 : : opt_reference: SQL_REFERENCE
9924 : : | /* EMPTY */
9925 : : ;
9926 : :
9927 : : /*
9928 : : * define the type of one variable for embedded SQL
9929 : : */
9930 : : ECPGVar: SQL_VAR
9931 : : {
9932 : : /* reset this variable so we see if there was */
9933 : : /* an initializer specified */
9934 : 3 : initializer = 0;
9935 : : }
9936 : : ColLabel IS var_type opt_array_bounds opt_reference
9937 : : {
9938 : 3 : struct variable *p = find_variable(@3);
9939 : 3 : const char *dimension = $6.index1;
9940 : 3 : const char *length = $6.index2;
9941 : : struct ECPGtype *type;
9942 : :
9943 [ + - ]: 3 : if (($5.type_enum == ECPGt_struct ||
9944 [ - + ]: 3 : $5.type_enum == ECPGt_union) &&
9945 [ # # ]: 0 : initializer == 1)
9946 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "initializer not allowed in EXEC SQL VAR command");
9947 : : else
9948 : : {
9949 : 3 : adjust_array($5.type_enum, &dimension, &length,
9950 : 3 : $5.type_dimension, $5.type_index, *@7 ? 1 : 0, false);
9951 : :
9952 [ - + - + ]: 3 : switch ($5.type_enum)
9953 : : {
9954 : 0 : case ECPGt_struct:
9955 : : case ECPGt_union:
9956 [ # # ]: 0 : if (atoi(dimension) < 0)
9957 : 0 : type = ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof);
9958 : : else
9959 : 0 : type = ECPGmake_array_type(ECPGmake_struct_type(struct_member_list[struct_level], $5.type_enum, $5.type_str, $5.type_sizeof), dimension);
9960 : 0 : break;
9961 : :
9962 : 1 : case ECPGt_varchar:
9963 : : case ECPGt_bytea:
9964 [ + - ]: 1 : if (atoi(dimension) == -1)
9965 : 1 : type = ECPGmake_simple_type($5.type_enum, length, 0);
9966 : : else
9967 : 0 : type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
9968 : 1 : break;
9969 : :
9970 : 0 : case ECPGt_char:
9971 : : case ECPGt_unsigned_char:
9972 : : case ECPGt_string:
9973 [ # # ]: 0 : if (atoi(dimension) == -1)
9974 : 0 : type = ECPGmake_simple_type($5.type_enum, length, 0);
9975 : : else
9976 : 0 : type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, length, 0), dimension);
9977 : 0 : break;
9978 : :
9979 : 2 : default:
9980 [ - + ]: 2 : if (atoi(length) >= 0)
9981 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "multidimensional arrays for simple data types are not supported");
9982 : :
9983 [ + - ]: 2 : if (atoi(dimension) < 0)
9984 : 2 : type = ECPGmake_simple_type($5.type_enum, "1", 0);
9985 : : else
9986 : 0 : type = ECPGmake_array_type(ECPGmake_simple_type($5.type_enum, "1", 0), dimension);
9987 : 2 : break;
9988 : : }
9989 : :
9990 : 3 : ECPGfree_type(p->type);
9991 : 3 : p->type = type;
9992 : : }
9993 : :
9994 : 3 : @$ = cat_str(7, "/* exec sql var", @3, "is", $5.type_str, $6.str, @7, "*/");
9995 : : }
9996 : : ;
9997 : :
9998 : : /*
9999 : : * whenever statement: decide what to do in case of error/no data found
10000 : : * according to SQL standards we lack: SQLSTATE, CONSTRAINT and SQLEXCEPTION
10001 : : */
10002 : : ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action
10003 : : {
10004 : 63 : when_error.code = $3.code;
10005 : 63 : free(when_error.command);
10006 [ + + ]: 63 : when_error.command = $3.command ? mm_strdup($3.command) : NULL;
10007 : 63 : @$ = cat_str(3, "/* exec sql whenever sqlerror ", $3.str, "; */");
10008 : : }
10009 : : | SQL_WHENEVER NOT SQL_FOUND action
10010 : : {
10011 : 28 : when_nf.code = $4.code;
10012 : 28 : free(when_nf.command);
10013 [ - + ]: 28 : when_nf.command = $4.command ? mm_strdup($4.command) : NULL;
10014 : 28 : @$ = cat_str(3, "/* exec sql whenever not found ", $4.str, "; */");
10015 : : }
10016 : : | SQL_WHENEVER SQL_SQLWARNING action
10017 : : {
10018 : 13 : when_warn.code = $3.code;
10019 : 13 : free(when_warn.command);
10020 [ + + ]: 13 : when_warn.command = $3.command ? mm_strdup($3.command) : NULL;
10021 : 13 : @$ = cat_str(3, "/* exec sql whenever sql_warning ", $3.str, "; */");
10022 : : }
10023 : : ;
10024 : :
10025 : : action: CONTINUE_P
10026 : : {
10027 : 11 : $$.code = W_NOTHING;
10028 : 11 : $$.command = NULL;
10029 : 11 : $$.str = "continue";
10030 : : }
10031 : : | SQL_SQLPRINT
10032 : : {
10033 : 44 : $$.code = W_SQLPRINT;
10034 : 44 : $$.command = NULL;
10035 : 44 : $$.str = "sqlprint";
10036 : : }
10037 : : | SQL_STOP
10038 : : {
10039 : 15 : $$.code = W_STOP;
10040 : 15 : $$.command = NULL;
10041 : 15 : $$.str = "stop";
10042 : : }
10043 : : | SQL_GOTO name
10044 : : {
10045 : 1 : $$.code = W_GOTO;
10046 : 1 : $$.command = loc_strdup(@2);
10047 : 1 : $$.str = cat2_str("goto ", @2);
10048 : : }
10049 : : | SQL_GO TO name
10050 : : {
10051 : 0 : $$.code = W_GOTO;
10052 : 0 : $$.command = loc_strdup(@3);
10053 : 0 : $$.str = cat2_str("goto ", @3);
10054 : : }
10055 : : | DO name '(' c_args ')'
10056 : : {
10057 : 18 : $$.code = W_DO;
10058 : 18 : $$.command = cat_str(4, @2, "(", @4, ")");
10059 : 18 : $$.str = cat2_str("do", $$.command);
10060 : : }
10061 : : | DO SQL_BREAK
10062 : : {
10063 : 13 : $$.code = W_BREAK;
10064 : 13 : $$.command = NULL;
10065 : 13 : $$.str = "break";
10066 : : }
10067 : : | DO CONTINUE_P
10068 : : {
10069 : 1 : $$.code = W_CONTINUE;
10070 : 1 : $$.command = NULL;
10071 : 1 : $$.str = "continue";
10072 : : }
10073 : : | CALL name '(' c_args ')'
10074 : : {
10075 : 1 : $$.code = W_DO;
10076 : 1 : $$.command = cat_str(4, @2, "(", @4, ")");
10077 : 1 : $$.str = cat2_str("call", $$.command);
10078 : : }
10079 : : | CALL name
10080 : : {
10081 : 0 : $$.code = W_DO;
10082 : 0 : $$.command = cat2_str(@2, "()");
10083 : 0 : $$.str = cat2_str("call", $$.command);
10084 : : }
10085 : : ;
10086 : :
10087 : : /* some other stuff for ecpg */
10088 : :
10089 : : /* additional unreserved keywords */
10090 : : ECPGKeywords: ECPGKeywords_vanames
10091 : : | ECPGKeywords_rest
10092 : : ;
10093 : :
10094 : : ECPGKeywords_vanames: SQL_BREAK
10095 : : | SQL_CARDINALITY
10096 : : | SQL_COUNT
10097 : : | SQL_DATETIME_INTERVAL_CODE
10098 : : | SQL_DATETIME_INTERVAL_PRECISION
10099 : : | SQL_FOUND
10100 : : | SQL_GO
10101 : : | SQL_GOTO
10102 : : | SQL_IDENTIFIED
10103 : : | SQL_INDICATOR
10104 : : | SQL_KEY_MEMBER
10105 : : | SQL_LENGTH
10106 : : | SQL_NULLABLE
10107 : : | SQL_OCTET_LENGTH
10108 : : | SQL_RETURNED_LENGTH
10109 : : | SQL_RETURNED_OCTET_LENGTH
10110 : : | SQL_SCALE
10111 : : | SQL_SECTION
10112 : : | SQL_SQLERROR
10113 : : | SQL_SQLPRINT
10114 : : | SQL_SQLWARNING
10115 : : | SQL_STOP
10116 : : ;
10117 : :
10118 : : ECPGKeywords_rest: SQL_CONNECT
10119 : : | SQL_DESCRIBE
10120 : : | SQL_DISCONNECT
10121 : : | SQL_OPEN
10122 : : | SQL_VAR
10123 : : | SQL_WHENEVER
10124 : : ;
10125 : :
10126 : : /* additional keywords that can be SQL type names (but not ECPGColLabels) */
10127 : : ECPGTypeName: SQL_BOOL
10128 : : | SQL_LONG
10129 : : | SQL_OUTPUT
10130 : : | SQL_SHORT
10131 : : | SQL_STRUCT
10132 : : | SQL_SIGNED
10133 : : | SQL_UNSIGNED
10134 : : ;
10135 : :
10136 : : symbol: ColLabel
10137 : : ;
10138 : :
10139 : : ECPGColId: ecpg_ident
10140 : : | unreserved_keyword
10141 : : | col_name_keyword
10142 : : | ECPGunreserved_interval
10143 : : | ECPGKeywords
10144 : : | ECPGCKeywords
10145 : : | CHAR_P
10146 : : | VALUES
10147 : : ;
10148 : :
10149 : : /*
10150 : : * Name classification hierarchy.
10151 : : *
10152 : : * These productions should match those in the core grammar, except that
10153 : : * we use all_unreserved_keyword instead of unreserved_keyword, and
10154 : : * where possible include ECPG keywords as well as core keywords.
10155 : : */
10156 : :
10157 : : /* Column identifier --- names that can be column, table, etc names.
10158 : : */
10159 : : ColId: ecpg_ident
10160 : : | all_unreserved_keyword
10161 : : | col_name_keyword
10162 : : | ECPGKeywords
10163 : : | ECPGCKeywords
10164 : : | CHAR_P
10165 : : | VALUES
10166 : : ;
10167 : :
10168 : : /* Type/function identifier --- names that can be type or function names.
10169 : : */
10170 : : type_function_name: ecpg_ident
10171 : : | all_unreserved_keyword
10172 : : | type_func_name_keyword
10173 : : | ECPGKeywords
10174 : : | ECPGCKeywords
10175 : : | ECPGTypeName
10176 : : ;
10177 : :
10178 : : /* Column label --- allowed labels in "AS" clauses.
10179 : : * This presently includes *all* Postgres keywords.
10180 : : */
10181 : : ColLabel: ECPGColLabel
10182 : : | ECPGTypeName
10183 : : | CHAR_P
10184 : : | CURRENT_P
10185 : : | INPUT_P
10186 : : | INT_P
10187 : : | TO
10188 : : | UNION
10189 : : | VALUES
10190 : : | ECPGCKeywords
10191 : : | ECPGunreserved_interval
10192 : : ;
10193 : :
10194 : : ECPGColLabel: ecpg_ident
10195 : : | unreserved_keyword
10196 : : | col_name_keyword
10197 : : | type_func_name_keyword
10198 : : | reserved_keyword
10199 : : | ECPGKeywords_vanames
10200 : : | ECPGKeywords_rest
10201 : : | CONNECTION
10202 : : ;
10203 : :
10204 : : ECPGCKeywords: S_AUTO
10205 : : | S_CONST
10206 : : | S_EXTERN
10207 : : | S_REGISTER
10208 : : | S_STATIC
10209 : : | S_TYPEDEF
10210 : : | S_VOLATILE
10211 : : ;
10212 : :
10213 : : /* "Unreserved" keywords --- available for use as any kind of name.
10214 : : */
10215 : :
10216 : : /*
10217 : : * The following symbols must be excluded from ECPGColLabel and directly
10218 : : * included into ColLabel to enable C variables to get names from ECPGColLabel:
10219 : : * DAY_P, HOUR_P, MINUTE_P, MONTH_P, SECOND_P, YEAR_P.
10220 : : *
10221 : : * We also have to exclude CONNECTION, CURRENT, and INPUT for various reasons.
10222 : : * CONNECTION can be added back in all_unreserved_keyword, but CURRENT and
10223 : : * INPUT are reserved for ecpg purposes.
10224 : : *
10225 : : * The mentioned exclusions are done by $replace_line settings in parse.pl.
10226 : : */
10227 : : all_unreserved_keyword: unreserved_keyword
10228 : : | ECPGunreserved_interval
10229 : : | CONNECTION
10230 : : ;
10231 : :
10232 : : ECPGunreserved_interval: DAY_P
10233 : : | HOUR_P
10234 : : | MINUTE_P
10235 : : | MONTH_P
10236 : : | SECOND_P
10237 : : | YEAR_P
10238 : : ;
10239 : :
10240 : : into_list: coutputvariable | into_list ',' coutputvariable
10241 : : ;
10242 : :
10243 : : ecpgstart: SQL_START
10244 : : {
10245 : 1410 : reset_variables();
10246 : 1410 : pacounter = 1;
10247 : 1410 : @$ = "";
10248 : : }
10249 : : ;
10250 : :
10251 : : c_args: /* EMPTY */
10252 : : | c_list
10253 : : ;
10254 : :
10255 : : coutputvariable: cvariable indicator
10256 : : {
10257 : 28 : add_variable_to_head(&argsresult, find_variable(@1), find_variable(@2));
10258 : : }
10259 : : | cvariable
10260 : : {
10261 : 236 : add_variable_to_head(&argsresult, find_variable(@1), &no_indicator);
10262 : : }
10263 : : ;
10264 : :
10265 : :
10266 : : civarind: cvariable indicator
10267 : : {
10268 [ - + ]: 3 : if (find_variable(@2)->type->type == ECPGt_array)
10269 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "arrays of indicators are not allowed on input");
10270 : :
10271 : 3 : add_variable_to_head(&argsinsert, find_variable(@1), find_variable(@2));
10272 : 3 : @$ = create_questionmarks(@1, false);
10273 : : }
10274 : : ;
10275 : :
10276 : : char_civar: char_variable
10277 : : {
10278 : 45 : char *var = loc_strdup(@1);
10279 : 45 : char *ptr = strstr(var, ".arr");
10280 : :
10281 [ + + ]: 45 : if (ptr) /* varchar, we need the struct name here, not
10282 : : * the struct element */
10283 : 10 : *ptr = '\0';
10284 : 45 : add_variable_to_head(&argsinsert, find_variable(var), &no_indicator);
10285 : 45 : @$ = var;
10286 : : }
10287 : : ;
10288 : :
10289 : : civar: cvariable
10290 : : {
10291 : 130 : add_variable_to_head(&argsinsert, find_variable(@1), &no_indicator);
10292 : 130 : @$ = create_questionmarks(@1, false);
10293 : : }
10294 : : ;
10295 : :
10296 : : indicator: cvariable
10297 : : {
10298 : 31 : check_indicator((find_variable(@1))->type);
10299 : : }
10300 : : | SQL_INDICATOR cvariable
10301 : : {
10302 : 0 : check_indicator((find_variable(@2))->type);
10303 : 0 : @$ = @2;
10304 : : }
10305 : : | SQL_INDICATOR name
10306 : : {
10307 : 0 : check_indicator((find_variable(@2))->type);
10308 : 0 : @$ = @2;
10309 : : }
10310 : : ;
10311 : :
10312 : : cvariable: CVARIABLE
10313 : : {
10314 : : /*
10315 : : * As long as multidimensional arrays are not implemented we have to
10316 : : * check for those here
10317 : : */
10318 : 661 : const char *ptr = @1;
10319 : 661 : int brace_open = 0,
10320 : 661 : brace = false;
10321 : :
10322 [ + + ]: 4260 : for (; *ptr; ptr++)
10323 : : {
10324 [ + + - + ]: 3599 : switch (*ptr)
10325 : : {
10326 : 48 : case '[':
10327 [ - + ]: 48 : if (brace)
10328 : 0 : mmfatal(PARSE_ERROR, "multidimensional arrays for simple data types are not supported");
10329 : 48 : brace_open++;
10330 : 48 : break;
10331 : 48 : case ']':
10332 : 48 : brace_open--;
10333 [ + - ]: 48 : if (brace_open == 0)
10334 : 48 : brace = true;
10335 : 48 : break;
10336 : 0 : case '\t':
10337 : : case ' ':
10338 : 0 : break;
10339 : 3503 : default:
10340 [ + + ]: 3503 : if (brace_open == 0)
10341 : 3455 : brace = false;
10342 : 3503 : break;
10343 : : }
10344 : : }
10345 : : }
10346 : : ;
10347 : :
10348 : : ecpg_param: PARAM
10349 : : ;
10350 : :
10351 : : ecpg_bconst: BCONST
10352 : : ;
10353 : :
10354 : : ecpg_fconst: FCONST
10355 : : ;
10356 : :
10357 : : ecpg_sconst: SCONST
10358 : : ;
10359 : :
10360 : : ecpg_xconst: XCONST
10361 : : ;
10362 : :
10363 : : ecpg_ident: IDENT
10364 : : | CSTRING
10365 : : {
10366 : 1190 : @$ = make3_str("\"", @1, "\"");
10367 : : }
10368 : : ;
10369 : :
10370 : : quoted_ident_stringvar: name
10371 : : {
10372 : 113 : @$ = make3_str("\"", @1, "\"");
10373 : : }
10374 : : | char_variable
10375 : : {
10376 : 4 : @$ = make3_str("(", @1, ")");
10377 : : }
10378 : : ;
10379 : :
10380 : : /*
10381 : : * C stuff
10382 : : */
10383 : :
10384 : : c_stuff_item: c_anything
10385 : : | '(' ')'
10386 : : {
10387 : 0 : @$ = "()";
10388 : : }
10389 : : | '(' c_stuff ')'
10390 : : ;
10391 : :
10392 : : c_stuff: c_stuff_item
10393 : : | c_stuff c_stuff_item
10394 : : ;
10395 : :
10396 : : c_list: c_term
10397 : : | c_list ',' c_term
10398 : : ;
10399 : :
10400 : : c_term: c_stuff
10401 : : | '{' c_list '}'
10402 : : ;
10403 : :
10404 : : c_thing: c_anything
10405 : : | '('
10406 : : | ')'
10407 : : | ','
10408 : : | ';'
10409 : : ;
10410 : :
10411 : : /*
10412 : : * Note: NULL_P is treated specially to force it to be output in upper case,
10413 : : * since it's likely meant as a reference to the standard C macro NULL.
10414 : : */
10415 : : c_anything: ecpg_ident
10416 : : | Iconst
10417 : : | ecpg_fconst
10418 : : | ecpg_sconst
10419 : : | '*'
10420 : : | '+'
10421 : : | '-'
10422 : : | '/'
10423 : : | '%'
10424 : 2 : | NULL_P { @$ = "NULL"; }
10425 : : | S_ADD
10426 : : | S_AND
10427 : : | S_ANYTHING
10428 : : | S_AUTO
10429 : : | S_CONST
10430 : : | S_DEC
10431 : : | S_DIV
10432 : : | S_DOTPOINT
10433 : : | S_EQUAL
10434 : : | S_EXTERN
10435 : : | S_INC
10436 : : | S_LSHIFT
10437 : : | S_MEMBER
10438 : : | S_MEMPOINT
10439 : : | S_MOD
10440 : : | S_MUL
10441 : : | S_NEQUAL
10442 : : | S_OR
10443 : : | S_REGISTER
10444 : : | S_RSHIFT
10445 : : | S_STATIC
10446 : : | S_SUB
10447 : : | S_TYPEDEF
10448 : : | S_VOLATILE
10449 : : | SQL_BOOL
10450 : : | ENUM_P
10451 : : | HOUR_P
10452 : : | INT_P
10453 : : | SQL_LONG
10454 : : | MINUTE_P
10455 : : | MONTH_P
10456 : : | SECOND_P
10457 : : | SQL_SHORT
10458 : : | SQL_SIGNED
10459 : : | SQL_STRUCT
10460 : : | SQL_UNSIGNED
10461 : : | YEAR_P
10462 : : | CHAR_P
10463 : : | FLOAT_P
10464 : : | TO
10465 : : | UNION
10466 : : | VARCHAR
10467 : : | '['
10468 : : | ']'
10469 : : | '='
10470 : : | ':'
10471 : : ;
10472 : :
10473 : : DeallocateStmt: DEALLOCATE prepared_name
10474 : : {
10475 : 19 : check_declared_list(@2);
10476 : 19 : @$ = @2;
10477 : : }
10478 : : | DEALLOCATE PREPARE prepared_name
10479 : : {
10480 : 19 : check_declared_list(@3);
10481 : 19 : @$ = @3;
10482 : : }
10483 : : | DEALLOCATE ALL
10484 : : {
10485 : 3 : @$ = "all";
10486 : : }
10487 : : | DEALLOCATE PREPARE ALL
10488 : : {
10489 : 0 : @$ = "all";
10490 : : }
10491 : : ;
10492 : :
10493 : : Iresult: Iconst
10494 : : | '(' Iresult ')'
10495 : : | Iresult '+' Iresult
10496 : : | Iresult '-' Iresult
10497 : : | Iresult '*' Iresult
10498 : : | Iresult '/' Iresult
10499 : : | Iresult '%' Iresult
10500 : : | ecpg_sconst
10501 : : | ColId
10502 : : | ColId '(' var_type ')'
10503 : : {
10504 [ # # ]: 0 : if (pg_strcasecmp(@1, "sizeof") != 0)
10505 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "operator not allowed in variable definition");
10506 : : else
10507 : 0 : @$ = cat_str(4, @1, "(", $3.type_str, ")");
10508 : : }
10509 : : ;
10510 : :
10511 : : execute_rest: /* EMPTY */
10512 : : | ecpg_using opt_ecpg_into
10513 : : | ecpg_into ecpg_using
10514 : : | ecpg_into
10515 : : ;
10516 : :
10517 : : ecpg_into: INTO into_list
10518 : : {
10519 : : /* always suppress this from the constructed string */
10520 : 149 : @$ = "";
10521 : : }
10522 : : | into_descriptor
10523 : : ;
10524 : :
10525 : : opt_ecpg_into: /* EMPTY */
10526 : : | ecpg_into
10527 : : ;
10528 : :
10529 : : ecpg_fetch_into: ecpg_into
10530 : : | using_descriptor
10531 : : {
10532 : : struct variable *var;
10533 : :
10534 : 1 : var = argsinsert->variable;
10535 : 1 : remove_variable_from_list(&argsinsert, var);
10536 : 1 : add_variable_to_head(&argsresult, var, &no_indicator);
10537 : : }
10538 : : ;
10539 : :
10540 : : opt_ecpg_fetch_into: /* EMPTY */
10541 : : | ecpg_fetch_into
10542 : : ;
10543 : :
10544 : : %%
10545 : :
10546 : : void
10547 : 0 : base_yyerror(const char *error)
10548 : : {
10549 : : /* translator: %s is typically the translation of "syntax error" */
10550 : 0 : mmerror(PARSE_ERROR, ET_ERROR, "%s at or near \"%s\"",
10551 [ # # ]: 0 : _(error), token_start ? token_start : base_yytext);
10552 : 0 : }
10553 : :
10554 : : void
10555 : 0 : parser_init(void)
10556 : : {
10557 : : /*
10558 : : * This function is empty. It only exists for compatibility with the
10559 : : * backend parser right now.
10560 : : */
10561 : 0 : }
|