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