LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/preproc - preproc.y (source / functions) Hit Total Coverage
Test: PostgreSQL 19devel Lines: 950 1403 67.7 %
Date: 2025-12-22 10:18:16 Functions: 7 9 77.8 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.16