LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/preproc - preproc.y (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 67.8 % 1406 953
Test Date: 2026-07-12 22:15:32 Functions: 77.8 % 9 7
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 64.4 % 629 405

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

Generated by: LCOV version 2.0-1